From ad49ea81fa25101bd141f4e67e76eb5516c7ad07 Mon Sep 17 00:00:00 2001 From: Angelos Chatzimparmpas Date: Fri, 28 Jun 2019 20:57:54 +0200 Subject: [PATCH] Initialization of the project --- .vscode/settings.json | 3 + LICENSE | 21 + README.md | 36 +- __pycache__/run.cpython-37.pyc | Bin 0 -> 940 bytes backend/requirements.txt | 8 + dist/index.html | 1 + frontend/.babelrc | 18 + frontend/.editorconfig | 9 + frontend/.eslintignore | 2 + frontend/.eslintrc.js | 27 + frontend/.gitignore | 14 + frontend/.postcssrc.js | 8 + frontend/build/build.js | 41 + frontend/build/check-versions.js | 49 + frontend/build/dev-client.js | 10 + frontend/build/dev-server.js | 105 + frontend/build/utils.js | 72 + frontend/build/vue-loader.conf.js | 19 + frontend/build/webpack.base.conf.js | 75 + frontend/build/webpack.dev.conf.js | 36 + frontend/build/webpack.prod.conf.js | 124 + frontend/config/dev.env.js | 7 + frontend/config/index.js | 42 + frontend/config/prod.env.js | 4 + frontend/index.html | 11 + frontend/package-lock.json | 10535 ++++++++++++++++ frontend/package.json | 73 + frontend/src/App.vue | 23 + frontend/src/assets/logo.png | Bin 0 -> 6849 bytes frontend/src/components/About.vue | 5 + frontend/src/components/HelloWorld.vue | 53 + frontend/src/components/Home.vue | 43 + frontend/src/components/NotFound.vue | 5 + frontend/src/main.js | 12 + frontend/src/router/index.js | 18 + frontend/static/.gitkeep | 0 myenv/bin/activate | 76 + myenv/bin/activate.csh | 37 + myenv/bin/activate.fish | 75 + myenv/bin/easy_install | 11 + myenv/bin/easy_install-3.7 | 11 + myenv/bin/pip | 11 + myenv/bin/pip3 | 11 + myenv/bin/pip3.7 | 11 + myenv/bin/python | 1 + myenv/bin/python3 | 1 + myenv/bin/python3.7 | 1 + .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 333 bytes .../python3.7/site-packages/easy_install.py | 5 + .../pip-10.0.1.dist-info/INSTALLER | 1 + .../pip-10.0.1.dist-info/LICENSE.txt | 20 + .../pip-10.0.1.dist-info/METADATA | 78 + .../site-packages/pip-10.0.1.dist-info/RECORD | 580 + .../site-packages/pip-10.0.1.dist-info/WHEEL | 6 + .../pip-10.0.1.dist-info/entry_points.txt | 5 + .../pip-10.0.1.dist-info/top_level.txt | 1 + .../python3.7/site-packages/pip/__init__.py | 1 + .../python3.7/site-packages/pip/__main__.py | 19 + .../pip/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../pip/__pycache__/__main__.cpython-37.pyc | Bin 0 -> 458 bytes .../site-packages/pip/_internal/__init__.py | 246 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 6200 bytes .../__pycache__/basecommand.cpython-37.pyc | Bin 0 -> 8163 bytes .../__pycache__/baseparser.cpython-37.pyc | Bin 0 -> 8305 bytes .../__pycache__/build_env.cpython-37.pyc | Bin 0 -> 3095 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 6838 bytes .../__pycache__/cmdoptions.cpython-37.pyc | Bin 0 -> 12713 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 5465 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 9779 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 20957 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10748 bytes .../__pycache__/index.cpython-37.pyc | Bin 0 -> 30625 bytes .../__pycache__/locations.cpython-37.pyc | Bin 0 -> 4248 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7265 bytes .../__pycache__/resolve.cpython-37.pyc | Bin 0 -> 8501 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 406 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 20684 bytes .../pip/_internal/basecommand.py | 373 + .../site-packages/pip/_internal/baseparser.py | 240 + .../site-packages/pip/_internal/build_env.py | 92 + .../site-packages/pip/_internal/cache.py | 202 + .../site-packages/pip/_internal/cmdoptions.py | 609 + .../pip/_internal/commands/__init__.py | 79 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2504 bytes .../commands/__pycache__/check.cpython-37.pyc | Bin 0 -> 1382 bytes .../__pycache__/completion.cpython-37.pyc | Bin 0 -> 3078 bytes .../__pycache__/configuration.cpython-37.pyc | Bin 0 -> 6426 bytes .../__pycache__/download.cpython-37.pyc | Bin 0 -> 6019 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 2855 bytes .../commands/__pycache__/hash.cpython-37.pyc | Bin 0 -> 2064 bytes .../commands/__pycache__/help.cpython-37.pyc | Bin 0 -> 1200 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 11150 bytes .../commands/__pycache__/list.cpython-37.pyc | Bin 0 -> 9789 bytes .../__pycache__/search.cpython-37.pyc | Bin 0 -> 4294 bytes .../commands/__pycache__/show.cpython-37.pyc | Bin 0 -> 5821 bytes .../__pycache__/uninstall.cpython-37.pyc | Bin 0 -> 2532 bytes .../commands/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 4767 bytes .../pip/_internal/commands/check.py | 42 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 233 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 36 + .../pip/_internal/commands/install.py | 502 + .../pip/_internal/commands/list.py | 343 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 164 + .../pip/_internal/commands/uninstall.py | 71 + .../pip/_internal/commands/wheel.py | 179 + .../site-packages/pip/_internal/compat.py | 235 + .../pip/_internal/configuration.py | 378 + .../site-packages/pip/_internal/download.py | 922 ++ .../site-packages/pip/_internal/exceptions.py | 249 + .../site-packages/pip/_internal/index.py | 1117 ++ .../site-packages/pip/_internal/locations.py | 194 + .../pip/_internal/models/__init__.py | 4 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 301 bytes .../models/__pycache__/index.cpython-37.pyc | Bin 0 -> 845 bytes .../pip/_internal/models/index.py | 15 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 205 bytes .../__pycache__/check.cpython-37.pyc | Bin 0 -> 2697 bytes .../__pycache__/freeze.cpython-37.pyc | Bin 0 -> 5892 bytes .../__pycache__/prepare.cpython-37.pyc | Bin 0 -> 10336 bytes .../pip/_internal/operations/check.py | 106 + .../pip/_internal/operations/freeze.py | 252 + .../pip/_internal/operations/prepare.py | 380 + .../site-packages/pip/_internal/pep425tags.py | 317 + .../pip/_internal/req/__init__.py | 69 + .../req/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1554 bytes .../req/__pycache__/req_file.cpython-37.pyc | Bin 0 -> 8653 bytes .../__pycache__/req_install.cpython-37.pyc | Bin 0 -> 29365 bytes .../req/__pycache__/req_set.cpython-37.pyc | Bin 0 -> 5784 bytes .../__pycache__/req_uninstall.cpython-37.pyc | Bin 0 -> 12769 bytes .../pip/_internal/req/req_file.py | 338 + .../pip/_internal/req/req_install.py | 1115 ++ .../pip/_internal/req/req_set.py | 164 + .../pip/_internal/req/req_uninstall.py | 455 + .../site-packages/pip/_internal/resolve.py | 354 + .../pip/_internal/status_codes.py | 8 + .../pip/_internal/utils/__init__.py | 0 .../utils/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 200 bytes .../utils/__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 7915 bytes .../__pycache__/deprecation.cpython-37.pyc | Bin 0 -> 1765 bytes .../utils/__pycache__/encoding.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/filesystem.cpython-37.pyc | Bin 0 -> 661 bytes .../utils/__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1558 bytes .../utils/__pycache__/hashes.cpython-37.pyc | Bin 0 -> 3335 bytes .../utils/__pycache__/logging.cpython-37.pyc | Bin 0 -> 4032 bytes .../utils/__pycache__/misc.cpython-37.pyc | Bin 0 -> 22090 bytes .../utils/__pycache__/outdated.cpython-37.pyc | Bin 0 -> 4341 bytes .../__pycache__/packaging.cpython-37.pyc | Bin 0 -> 2258 bytes .../setuptools_build.cpython-37.pyc | Bin 0 -> 395 bytes .../utils/__pycache__/temp_dir.cpython-37.pyc | Bin 0 -> 2812 bytes .../utils/__pycache__/typing.cpython-37.pyc | Bin 0 -> 1320 bytes .../utils/__pycache__/ui.cpython-37.pyc | Bin 0 -> 11863 bytes .../pip/_internal/utils/appdirs.py | 258 + .../pip/_internal/utils/deprecation.py | 77 + .../pip/_internal/utils/encoding.py | 33 + .../pip/_internal/utils/filesystem.py | 28 + .../pip/_internal/utils/glibc.py | 84 + .../pip/_internal/utils/hashes.py | 94 + .../pip/_internal/utils/logging.py | 132 + .../site-packages/pip/_internal/utils/misc.py | 851 ++ .../pip/_internal/utils/outdated.py | 163 + .../pip/_internal/utils/packaging.py | 70 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 82 + .../pip/_internal/utils/typing.py | 29 + .../site-packages/pip/_internal/utils/ui.py | 421 + .../pip/_internal/vcs/__init__.py | 471 + .../vcs/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 14147 bytes .../vcs/__pycache__/bazaar.cpython-37.pyc | Bin 0 -> 3848 bytes .../vcs/__pycache__/git.cpython-37.pyc | Bin 0 -> 8502 bytes .../vcs/__pycache__/mercurial.cpython-37.pyc | Bin 0 -> 3874 bytes .../vcs/__pycache__/subversion.cpython-37.pyc | Bin 0 -> 7472 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 113 + .../site-packages/pip/_internal/vcs/git.py | 311 + .../pip/_internal/vcs/mercurial.py | 105 + .../pip/_internal/vcs/subversion.py | 271 + .../site-packages/pip/_internal/wheel.py | 817 ++ .../site-packages/pip/_vendor/__init__.py | 109 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2851 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 20617 bytes .../_vendor/__pycache__/distro.cpython-37.pyc | Bin 0 -> 33491 bytes .../__pycache__/ipaddress.cpython-37.pyc | Bin 0 -> 66460 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 202102 bytes .../__pycache__/retrying.cpython-37.pyc | Bin 0 -> 8098 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 25003 bytes .../site-packages/pip/_vendor/appdirs.py | 604 + .../pip/_vendor/cachecontrol/__init__.py | 11 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 558 bytes .../__pycache__/_cmd.cpython-37.pyc | Bin 0 -> 1567 bytes .../__pycache__/adapter.cpython-37.pyc | Bin 0 -> 3067 bytes .../__pycache__/cache.cpython-37.pyc | Bin 0 -> 1769 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 765 bytes .../__pycache__/controller.cpython-37.pyc | Bin 0 -> 7648 bytes .../__pycache__/filewrapper.cpython-37.pyc | Bin 0 -> 2162 bytes .../__pycache__/heuristics.cpython-37.pyc | Bin 0 -> 4697 bytes .../__pycache__/serialize.cpython-37.pyc | Bin 0 -> 4255 bytes .../__pycache__/wrapper.cpython-37.pyc | Bin 0 -> 666 bytes .../pip/_vendor/cachecontrol/_cmd.py | 60 + .../pip/_vendor/cachecontrol/adapter.py | 134 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 302 bytes .../__pycache__/file_cache.cpython-37.pyc | Bin 0 -> 3222 bytes .../__pycache__/redis_cache.cpython-37.pyc | Bin 0 -> 1816 bytes .../_vendor/cachecontrol/caches/file_cache.py | 133 + .../cachecontrol/caches/redis_cache.py | 43 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 373 + .../pip/_vendor/cachecontrol/filewrapper.py | 78 + .../pip/_vendor/cachecontrol/heuristics.py | 138 + .../pip/_vendor/cachecontrol/serialize.py | 194 + .../pip/_vendor/cachecontrol/wrapper.py | 27 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 285 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 0 -> 256 bytes .../certifi/__pycache__/core.cpython-37.pyc | Bin 0 -> 1220 bytes .../pip/_vendor/certifi/cacert.pem | 4433 +++++++ .../site-packages/pip/_vendor/certifi/core.py | 37 + .../pip/_vendor/chardet/__init__.py | 39 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 852 bytes .../__pycache__/big5freq.cpython-37.pyc | Bin 0 -> 27187 bytes .../__pycache__/big5prober.cpython-37.pyc | Bin 0 -> 1128 bytes .../chardistribution.cpython-37.pyc | Bin 0 -> 6314 bytes .../charsetgroupprober.cpython-37.pyc | Bin 0 -> 2235 bytes .../__pycache__/charsetprober.cpython-37.pyc | Bin 0 -> 3445 bytes .../codingstatemachine.cpython-37.pyc | Bin 0 -> 2892 bytes .../chardet/__pycache__/compat.cpython-37.pyc | Bin 0 -> 363 bytes .../__pycache__/cp949prober.cpython-37.pyc | Bin 0 -> 1135 bytes .../chardet/__pycache__/enums.cpython-37.pyc | Bin 0 -> 2626 bytes .../__pycache__/escprober.cpython-37.pyc | Bin 0 -> 2613 bytes .../chardet/__pycache__/escsm.cpython-37.pyc | Bin 0 -> 7074 bytes .../__pycache__/eucjpprober.cpython-37.pyc | Bin 0 -> 2421 bytes .../__pycache__/euckrfreq.cpython-37.pyc | Bin 0 -> 12071 bytes .../__pycache__/euckrprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/euctwfreq.cpython-37.pyc | Bin 0 -> 27191 bytes .../__pycache__/euctwprober.cpython-37.pyc | Bin 0 -> 1136 bytes .../__pycache__/gb2312freq.cpython-37.pyc | Bin 0 -> 19115 bytes .../__pycache__/gb2312prober.cpython-37.pyc | Bin 0 -> 1144 bytes .../__pycache__/hebrewprober.cpython-37.pyc | Bin 0 -> 2978 bytes .../__pycache__/jisfreq.cpython-37.pyc | Bin 0 -> 22143 bytes .../chardet/__pycache__/jpcntx.cpython-37.pyc | Bin 0 -> 38022 bytes .../langbulgarianmodel.cpython-37.pyc | Bin 0 -> 23636 bytes .../langcyrillicmodel.cpython-37.pyc | Bin 0 -> 29092 bytes .../__pycache__/langgreekmodel.cpython-37.pyc | Bin 0 -> 23594 bytes .../langhebrewmodel.cpython-37.pyc | Bin 0 -> 22223 bytes .../langhungarianmodel.cpython-37.pyc | Bin 0 -> 23625 bytes .../__pycache__/langthaimodel.cpython-37.pyc | Bin 0 -> 22202 bytes .../langturkishmodel.cpython-37.pyc | Bin 0 -> 22225 bytes .../__pycache__/latin1prober.cpython-37.pyc | Bin 0 -> 2935 bytes .../mbcharsetprober.cpython-37.pyc | Bin 0 -> 2240 bytes .../mbcsgroupprober.cpython-37.pyc | Bin 0 -> 1131 bytes .../chardet/__pycache__/mbcssm.cpython-37.pyc | Bin 0 -> 15686 bytes .../sbcharsetprober.cpython-37.pyc | Bin 0 -> 2993 bytes .../sbcsgroupprober.cpython-37.pyc | Bin 0 -> 1621 bytes .../__pycache__/sjisprober.cpython-37.pyc | Bin 0 -> 2447 bytes .../universaldetector.cpython-37.pyc | Bin 0 -> 5837 bytes .../__pycache__/utf8prober.cpython-37.pyc | Bin 0 -> 1978 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 447 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 106 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 204 bytes .../cli/__pycache__/chardetect.cpython-37.pyc | Bin 0 -> 2693 bytes .../pip/_vendor/chardet/cli/chardetect.py | 85 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 34 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 228 + .../pip/_vendor/chardet/langcyrillicmodel.py | 333 + .../pip/_vendor/chardet/langgreekmodel.py | 225 + .../pip/_vendor/chardet/langhebrewmodel.py | 200 + .../pip/_vendor/chardet/langhungarianmodel.py | 225 + .../pip/_vendor/chardet/langthaimodel.py | 199 + .../pip/_vendor/chardet/langturkishmodel.py | 193 + .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/sbcharsetprober.py | 132 + .../pip/_vendor/chardet/sbcsgroupprober.py | 73 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 7 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 452 bytes .../colorama/__pycache__/ansi.cpython-37.pyc | Bin 0 -> 3350 bytes .../__pycache__/ansitowin32.cpython-37.pyc | Bin 0 -> 7063 bytes .../__pycache__/initialise.cpython-37.pyc | Bin 0 -> 1671 bytes .../colorama/__pycache__/win32.cpython-37.pyc | Bin 0 -> 3886 bytes .../__pycache__/winterm.cpython-37.pyc | Bin 0 -> 4575 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 236 + .../pip/_vendor/colorama/initialise.py | 82 + .../pip/_vendor/colorama/win32.py | 156 + .../pip/_vendor/colorama/winterm.py | 162 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1050 bytes .../distlib/__pycache__/compat.cpython-37.pyc | Bin 0 -> 32060 bytes .../__pycache__/database.cpython-37.pyc | Bin 0 -> 42533 bytes .../distlib/__pycache__/index.cpython-37.pyc | Bin 0 -> 17346 bytes .../__pycache__/locators.cpython-37.pyc | Bin 0 -> 38653 bytes .../__pycache__/manifest.cpython-37.pyc | Bin 0 -> 10298 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 4484 bytes .../__pycache__/metadata.cpython-37.pyc | Bin 0 -> 27693 bytes .../__pycache__/resources.cpython-37.pyc | Bin 0 -> 10894 bytes .../__pycache__/scripts.cpython-37.pyc | Bin 0 -> 11070 bytes .../distlib/__pycache__/util.cpython-37.pyc | Bin 0 -> 47891 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 20434 bytes .../distlib/__pycache__/wheel.cpython-37.pyc | Bin 0 -> 25084 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 492 bytes .../_backport/__pycache__/misc.cpython-37.pyc | Bin 0 -> 1089 bytes .../__pycache__/shutil.cpython-37.pyc | Bin 0 -> 21405 bytes .../__pycache__/sysconfig.cpython-37.pyc | Bin 0 -> 15870 bytes .../__pycache__/tarfile.cpython-37.pyc | Bin 0 -> 62735 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 761 ++ .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 788 ++ .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++++ .../pip/_vendor/distlib/compat.py | 1120 ++ .../pip/_vendor/distlib/database.py | 1336 ++ .../pip/_vendor/distlib/index.py | 516 + .../pip/_vendor/distlib/locators.py | 1292 ++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1091 ++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 415 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../site-packages/pip/_vendor/distlib/util.py | 1755 +++ .../pip/_vendor/distlib/version.py | 736 ++ .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 984 ++ .../site-packages/pip/_vendor/distro.py | 1104 ++ .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1321 bytes .../__pycache__/_ihatexml.cpython-37.pyc | Bin 0 -> 13768 bytes .../__pycache__/_inputstream.cpython-37.pyc | Bin 0 -> 22659 bytes .../__pycache__/_tokenizer.cpython-37.pyc | Bin 0 -> 41560 bytes .../__pycache__/_utils.cpython-37.pyc | Bin 0 -> 3313 bytes .../__pycache__/constants.cpython-37.pyc | Bin 0 -> 66225 bytes .../__pycache__/html5parser.cpython-37.pyc | Bin 0 -> 97822 bytes .../__pycache__/serializer.cpython-37.pyc | Bin 0 -> 10838 bytes .../pip/_vendor/html5lib/_ihatexml.py | 288 + .../pip/_vendor/html5lib/_inputstream.py | 923 ++ .../pip/_vendor/html5lib/_tokenizer.py | 1721 +++ .../pip/_vendor/html5lib/_trie/__init__.py | 14 + .../_trie/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 434 bytes .../_trie/__pycache__/_base.cpython-37.pyc | Bin 0 -> 1517 bytes .../_trie/__pycache__/datrie.cpython-37.pyc | Bin 0 -> 2036 bytes .../_trie/__pycache__/py.cpython-37.pyc | Bin 0 -> 2239 bytes .../pip/_vendor/html5lib/_trie/_base.py | 37 + .../pip/_vendor/html5lib/_trie/datrie.py | 44 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 124 + .../pip/_vendor/html5lib/constants.py | 2947 +++++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../alphabeticalattributes.cpython-37.pyc | Bin 0 -> 1325 bytes .../filters/__pycache__/base.cpython-37.pyc | Bin 0 -> 859 bytes .../inject_meta_charset.cpython-37.pyc | Bin 0 -> 1879 bytes .../filters/__pycache__/lint.cpython-37.pyc | Bin 0 -> 2643 bytes .../__pycache__/optionaltags.cpython-37.pyc | Bin 0 -> 2770 bytes .../__pycache__/sanitizer.cpython-37.pyc | Bin 0 -> 16445 bytes .../__pycache__/whitespace.cpython-37.pyc | Bin 0 -> 1363 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 896 ++ .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2791 ++++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 948 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1545 bytes .../__pycache__/sax.cpython-37.pyc | Bin 0 -> 1495 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3329 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 11252 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 9282 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 11861 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 11801 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 236 + .../_vendor/html5lib/treebuilders/etree.py | 340 + .../html5lib/treebuilders/etree_lxml.py | 366 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 4006 bytes .../__pycache__/base.cpython-37.pyc | Bin 0 -> 7002 bytes .../__pycache__/dom.cpython-37.pyc | Bin 0 -> 1731 bytes .../__pycache__/etree.cpython-37.pyc | Bin 0 -> 3538 bytes .../__pycache__/etree_lxml.cpython-37.pyc | Bin 0 -> 6647 bytes .../__pycache__/genshi.cpython-37.pyc | Bin 0 -> 1905 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 130 + .../html5lib/treewalkers/etree_lxml.py | 213 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 2 + .../idna/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 266 bytes .../idna/__pycache__/codec.cpython-37.pyc | Bin 0 -> 3073 bytes .../idna/__pycache__/compat.cpython-37.pyc | Bin 0 -> 626 bytes .../idna/__pycache__/core.cpython-37.pyc | Bin 0 -> 8892 bytes .../idna/__pycache__/idnadata.cpython-37.pyc | Bin 0 -> 17256 bytes .../idna/__pycache__/intranges.cpython-37.pyc | Bin 0 -> 1806 bytes .../__pycache__/package_data.cpython-37.pyc | Bin 0 -> 220 bytes .../idna/__pycache__/uts46data.cpython-37.pyc | Bin 0 -> 164492 bytes .../site-packages/pip/_vendor/idna/codec.py | 118 + .../site-packages/pip/_vendor/idna/compat.py | 12 + .../site-packages/pip/_vendor/idna/core.py | 387 + .../pip/_vendor/idna/idnadata.py | 1585 +++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 7634 +++++++++++ .../site-packages/pip/_vendor/ipaddress.py | 2419 ++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9916 bytes .../__pycache__/linklockfile.cpython-37.pyc | Bin 0 -> 2297 bytes .../__pycache__/mkdirlockfile.cpython-37.pyc | Bin 0 -> 2659 bytes .../__pycache__/pidlockfile.cpython-37.pyc | Bin 0 -> 4859 bytes .../__pycache__/sqlitelockfile.cpython-37.pyc | Bin 0 -> 3758 bytes .../symlinklockfile.cpython-37.pyc | Bin 0 -> 2182 bytes .../pip/_vendor/lockfile/linklockfile.py | 73 + .../pip/_vendor/lockfile/mkdirlockfile.py | 84 + .../pip/_vendor/lockfile/pidlockfile.py | 190 + .../pip/_vendor/lockfile/sqlitelockfile.py | 156 + .../pip/_vendor/lockfile/symlinklockfile.py | 70 + .../pip/_vendor/msgpack/__init__.py | 66 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2078 bytes .../__pycache__/_version.cpython-37.pyc | Bin 0 -> 227 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 2183 bytes .../__pycache__/fallback.cpython-37.pyc | Bin 0 -> 24555 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 21 + .../pip/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 728 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 566 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1018 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2870 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8869 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3887 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19796 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 1464 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 11982 bytes .../pip/_vendor/packaging/_compat.py | 30 + .../pip/_vendor/packaging/_structures.py | 70 + .../pip/_vendor/packaging/markers.py | 301 + .../pip/_vendor/packaging/requirements.py | 130 + .../pip/_vendor/packaging/specifiers.py | 774 ++ .../pip/_vendor/packaging/utils.py | 63 + .../pip/_vendor/packaging/version.py | 441 + .../pip/_vendor/pkg_resources/__init__.py | 3125 +++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 95301 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 685 bytes .../pip/_vendor/pkg_resources/py31compat.py | 22 + .../pip/_vendor/progress/__init__.py | 127 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3919 bytes .../progress/__pycache__/bar.cpython-37.pyc | Bin 0 -> 2649 bytes .../__pycache__/counter.cpython-37.pyc | Bin 0 -> 1583 bytes .../__pycache__/helpers.cpython-37.pyc | Bin 0 -> 2983 bytes .../__pycache__/spinner.cpython-37.pyc | Bin 0 -> 1500 bytes .../site-packages/pip/_vendor/progress/bar.py | 88 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../site-packages/pip/_vendor/pyparsing.py | 5720 +++++++++ .../pip/_vendor/pytoml/__init__.py | 3 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 339 bytes .../pytoml/__pycache__/core.cpython-37.pyc | Bin 0 -> 948 bytes .../pytoml/__pycache__/parser.cpython-37.pyc | Bin 0 -> 10963 bytes .../pytoml/__pycache__/writer.cpython-37.pyc | Bin 0 -> 3850 bytes .../site-packages/pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 374 + .../pip/_vendor/pytoml/writer.py | 127 + .../pip/_vendor/requests/__init__.py | 123 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 3390 bytes .../__pycache__/__version__.cpython-37.pyc | Bin 0 -> 559 bytes .../_internal_utils.cpython-37.pyc | Bin 0 -> 1317 bytes .../__pycache__/adapters.cpython-37.pyc | Bin 0 -> 16518 bytes .../requests/__pycache__/api.cpython-37.pyc | Bin 0 -> 6484 bytes .../requests/__pycache__/auth.cpython-37.pyc | Bin 0 -> 7845 bytes .../requests/__pycache__/certs.cpython-37.pyc | Bin 0 -> 642 bytes .../__pycache__/compat.cpython-37.pyc | Bin 0 -> 1539 bytes .../__pycache__/cookies.cpython-37.pyc | Bin 0 -> 18567 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 5330 bytes .../requests/__pycache__/help.cpython-37.pyc | Bin 0 -> 2703 bytes .../requests/__pycache__/hooks.cpython-37.pyc | Bin 0 -> 1006 bytes .../__pycache__/models.cpython-37.pyc | Bin 0 -> 23935 bytes .../__pycache__/packages.cpython-37.pyc | Bin 0 -> 519 bytes .../__pycache__/sessions.cpython-37.pyc | Bin 0 -> 18494 bytes .../__pycache__/status_codes.cpython-37.pyc | Bin 0 -> 3064 bytes .../__pycache__/structures.cpython-37.pyc | Bin 0 -> 4414 bytes .../requests/__pycache__/utils.cpython-37.pyc | Bin 0 -> 20605 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 525 + .../site-packages/pip/_vendor/requests/api.py | 152 + .../pip/_vendor/requests/auth.py | 293 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 73 + .../pip/_vendor/requests/cookies.py | 542 + .../pip/_vendor/requests/exceptions.py | 122 + .../pip/_vendor/requests/help.py | 120 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 948 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 737 ++ .../pip/_vendor/requests/status_codes.py | 91 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 904 ++ .../site-packages/pip/_vendor/retrying.py | 267 + .../site-packages/pip/_vendor/six.py | 891 ++ .../pip/_vendor/urllib3/__init__.py | 97 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2431 bytes .../__pycache__/_collections.cpython-37.pyc | Bin 0 -> 10537 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 8847 bytes .../__pycache__/connectionpool.cpython-37.pyc | Bin 0 -> 23718 bytes .../__pycache__/exceptions.cpython-37.pyc | Bin 0 -> 10408 bytes .../urllib3/__pycache__/fields.cpython-37.pyc | Bin 0 -> 5877 bytes .../__pycache__/filepost.cpython-37.pyc | Bin 0 -> 2678 bytes .../__pycache__/poolmanager.cpython-37.pyc | Bin 0 -> 12583 bytes .../__pycache__/request.cpython-37.pyc | Bin 0 -> 5573 bytes .../__pycache__/response.cpython-37.pyc | Bin 0 -> 16212 bytes .../pip/_vendor/urllib3/_collections.py | 319 + .../pip/_vendor/urllib3/connection.py | 373 + .../pip/_vendor/urllib3/connectionpool.py | 905 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 208 bytes .../__pycache__/appengine.cpython-37.pyc | Bin 0 -> 8846 bytes .../__pycache__/ntlmpool.cpython-37.pyc | Bin 0 -> 3256 bytes .../__pycache__/pyopenssl.cpython-37.pyc | Bin 0 -> 14115 bytes .../securetransport.cpython-37.pyc | Bin 0 -> 18029 bytes .../contrib/__pycache__/socks.cpython-37.pyc | Bin 0 -> 4817 bytes .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 225 bytes .../__pycache__/bindings.cpython-37.pyc | Bin 0 -> 10320 bytes .../__pycache__/low_level.cpython-37.pyc | Bin 0 -> 7465 bytes .../contrib/_securetransport/bindings.py | 593 + .../contrib/_securetransport/low_level.py | 343 + .../pip/_vendor/urllib3/contrib/appengine.py | 296 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 112 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 455 + .../urllib3/contrib/securetransport.py | 810 ++ .../pip/_vendor/urllib3/contrib/socks.py | 188 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 94 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 322 bytes .../__pycache__/ordered_dict.cpython-37.pyc | Bin 0 -> 8416 bytes .../packages/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 219 bytes .../__pycache__/makefile.cpython-37.pyc | Bin 0 -> 1317 bytes .../urllib3/packages/backports/makefile.py | 53 + .../_vendor/urllib3/packages/ordered_dict.py | 259 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 563 bytes .../_implementation.cpython-37.pyc | Bin 0 -> 3322 bytes .../ssl_match_hostname/_implementation.py | 157 + .../pip/_vendor/urllib3/poolmanager.py | 440 + .../pip/_vendor/urllib3/request.py | 148 + .../pip/_vendor/urllib3/response.py | 626 + .../pip/_vendor/urllib3/util/__init__.py | 54 + .../util/__pycache__/__init__.cpython-37.pyc | Bin 0 -> 1000 bytes .../__pycache__/connection.cpython-37.pyc | Bin 0 -> 3136 bytes .../util/__pycache__/request.cpython-37.pyc | Bin 0 -> 3230 bytes .../util/__pycache__/response.cpython-37.pyc | Bin 0 -> 1911 bytes .../util/__pycache__/retry.cpython-37.pyc | Bin 0 -> 12326 bytes .../util/__pycache__/selectors.cpython-37.pyc | Bin 0 -> 16397 bytes .../util/__pycache__/ssl_.cpython-37.pyc | Bin 0 -> 8958 bytes .../util/__pycache__/timeout.cpython-37.pyc | Bin 0 -> 8779 bytes .../util/__pycache__/url.cpython-37.pyc | Bin 0 -> 5189 bytes .../util/__pycache__/wait.cpython-37.pyc | Bin 0 -> 1673 bytes .../pip/_vendor/urllib3/util/connection.py | 130 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 81 + .../pip/_vendor/urllib3/util/retry.py | 401 + .../pip/_vendor/urllib3/util/selectors.py | 581 + .../pip/_vendor/urllib3/util/ssl_.py | 341 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 40 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 9684 bytes .../__pycache__/labels.cpython-37.pyc | Bin 0 -> 4098 bytes .../__pycache__/mklabels.cpython-37.pyc | Bin 0 -> 1920 bytes .../__pycache__/tests.cpython-37.pyc | Bin 0 -> 5061 bytes .../__pycache__/x_user_defined.cpython-37.pyc | Bin 0 -> 2673 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + .../site-packages/pkg_resources/__init__.py | 3125 +++++ .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 95350 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 680 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 209 bytes .../__pycache__/appdirs.cpython-37.pyc | Bin 0 -> 18603 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 200960 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24410 bytes .../pkg_resources/_vendor/appdirs.py | 552 + .../_vendor/packaging/__about__.py | 21 + .../_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 745 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 583 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1035 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2887 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8895 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3900 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19813 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 514 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10580 bytes .../_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../pkg_resources/_vendor/packaging/utils.py | 14 + .../_vendor/packaging/version.py | 393 + .../pkg_resources/_vendor/pyparsing.py | 5696 +++++++++ .../pkg_resources/_vendor/six.py | 868 ++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2424 bytes .../site-packages/pkg_resources/py31compat.py | 22 + .../DESCRIPTION.rst | 36 + .../setuptools-39.0.1.dist-info/INSTALLER | 1 + .../setuptools-39.0.1.dist-info/LICENSE.txt | 19 + .../setuptools-39.0.1.dist-info/METADATA | 71 + .../setuptools-39.0.1.dist-info/RECORD | 188 + .../setuptools-39.0.1.dist-info/WHEEL | 6 + .../dependency_links.txt | 2 + .../entry_points.txt | 65 + .../setuptools-39.0.1.dist-info/metadata.json | 1 + .../setuptools-39.0.1.dist-info/top_level.txt | 3 + .../setuptools-39.0.1.dist-info/zip-safe | 1 + .../site-packages/setuptools/__init__.py | 180 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 6301 bytes .../__pycache__/archive_util.cpython-37.pyc | Bin 0 -> 5145 bytes .../__pycache__/build_meta.cpython-37.pyc | Bin 0 -> 5925 bytes .../__pycache__/config.cpython-37.pyc | Bin 0 -> 14362 bytes .../__pycache__/dep_util.cpython-37.pyc | Bin 0 -> 871 bytes .../__pycache__/depends.cpython-37.pyc | Bin 0 -> 5280 bytes .../__pycache__/dist.cpython-37.pyc | Bin 0 -> 36763 bytes .../__pycache__/extension.cpython-37.pyc | Bin 0 -> 1991 bytes .../__pycache__/glibc.cpython-37.pyc | Bin 0 -> 1556 bytes .../__pycache__/glob.cpython-37.pyc | Bin 0 -> 3857 bytes .../__pycache__/launch.cpython-37.pyc | Bin 0 -> 870 bytes .../__pycache__/lib2to3_ex.cpython-37.pyc | Bin 0 -> 2449 bytes .../__pycache__/monkey.cpython-37.pyc | Bin 0 -> 5127 bytes .../__pycache__/msvc.cpython-37.pyc | Bin 0 -> 34459 bytes .../__pycache__/namespaces.cpython-37.pyc | Bin 0 -> 3628 bytes .../__pycache__/package_index.cpython-37.pyc | Bin 0 -> 32143 bytes .../__pycache__/pep425tags.cpython-37.pyc | Bin 0 -> 7196 bytes .../__pycache__/py27compat.cpython-37.pyc | Bin 0 -> 827 bytes .../__pycache__/py31compat.cpython-37.pyc | Bin 0 -> 1561 bytes .../__pycache__/py33compat.cpython-37.pyc | Bin 0 -> 1419 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 2208 bytes .../__pycache__/sandbox.cpython-37.pyc | Bin 0 -> 15552 bytes .../__pycache__/site-patch.cpython-37.pyc | Bin 0 -> 1518 bytes .../__pycache__/ssl_support.cpython-37.pyc | Bin 0 -> 6807 bytes .../__pycache__/unicode_utils.cpython-37.pyc | Bin 0 -> 1185 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 344 bytes .../__pycache__/wheel.cpython-37.pyc | Bin 0 -> 5813 bytes .../windows_support.cpython-37.pyc | Bin 0 -> 1027 bytes .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 206 bytes .../__pycache__/pyparsing.cpython-37.pyc | Bin 0 -> 200957 bytes .../_vendor/__pycache__/six.cpython-37.pyc | Bin 0 -> 24407 bytes .../setuptools/_vendor/packaging/__about__.py | 21 + .../setuptools/_vendor/packaging/__init__.py | 14 + .../__pycache__/__about__.cpython-37.pyc | Bin 0 -> 742 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 580 bytes .../__pycache__/_compat.cpython-37.pyc | Bin 0 -> 1032 bytes .../__pycache__/_structures.cpython-37.pyc | Bin 0 -> 2884 bytes .../__pycache__/markers.cpython-37.pyc | Bin 0 -> 8889 bytes .../__pycache__/requirements.cpython-37.pyc | Bin 0 -> 3891 bytes .../__pycache__/specifiers.cpython-37.pyc | Bin 0 -> 19810 bytes .../__pycache__/utils.cpython-37.pyc | Bin 0 -> 511 bytes .../__pycache__/version.cpython-37.pyc | Bin 0 -> 10577 bytes .../setuptools/_vendor/packaging/_compat.py | 30 + .../_vendor/packaging/_structures.py | 68 + .../setuptools/_vendor/packaging/markers.py | 301 + .../_vendor/packaging/requirements.py | 127 + .../_vendor/packaging/specifiers.py | 774 ++ .../setuptools/_vendor/packaging/utils.py | 14 + .../setuptools/_vendor/packaging/version.py | 393 + .../setuptools/_vendor/pyparsing.py | 5696 +++++++++ .../site-packages/setuptools/_vendor/six.py | 868 ++ .../site-packages/setuptools/archive_util.py | 173 + .../site-packages/setuptools/build_meta.py | 172 + .../site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 18 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 752 bytes .../command/__pycache__/alias.cpython-37.pyc | Bin 0 -> 2420 bytes .../__pycache__/bdist_egg.cpython-37.pyc | Bin 0 -> 14214 bytes .../__pycache__/bdist_rpm.cpython-37.pyc | Bin 0 -> 1799 bytes .../__pycache__/bdist_wininst.cpython-37.pyc | Bin 0 -> 990 bytes .../__pycache__/build_clib.cpython-37.pyc | Bin 0 -> 2469 bytes .../__pycache__/build_ext.cpython-37.pyc | Bin 0 -> 10039 bytes .../__pycache__/build_py.cpython-37.pyc | Bin 0 -> 8599 bytes .../__pycache__/develop.cpython-37.pyc | Bin 0 -> 6423 bytes .../__pycache__/dist_info.cpython-37.pyc | Bin 0 -> 1395 bytes .../__pycache__/easy_install.cpython-37.pyc | Bin 0 -> 64577 bytes .../__pycache__/egg_info.cpython-37.pyc | Bin 0 -> 21071 bytes .../__pycache__/install.cpython-37.pyc | Bin 0 -> 4027 bytes .../install_egg_info.cpython-37.pyc | Bin 0 -> 2428 bytes .../__pycache__/install_lib.cpython-37.pyc | Bin 0 -> 4104 bytes .../install_scripts.cpython-37.pyc | Bin 0 -> 2307 bytes .../__pycache__/py36compat.cpython-37.pyc | Bin 0 -> 4640 bytes .../__pycache__/register.cpython-37.pyc | Bin 0 -> 616 bytes .../command/__pycache__/rotate.cpython-37.pyc | Bin 0 -> 2546 bytes .../__pycache__/saveopts.cpython-37.pyc | Bin 0 -> 941 bytes .../command/__pycache__/sdist.cpython-37.pyc | Bin 0 -> 6237 bytes .../command/__pycache__/setopt.cpython-37.pyc | Bin 0 -> 4539 bytes .../command/__pycache__/test.cpython-37.pyc | Bin 0 -> 8114 bytes .../command/__pycache__/upload.cpython-37.pyc | Bin 0 -> 1408 bytes .../__pycache__/upload_docs.cpython-37.pyc | Bin 0 -> 6150 bytes .../site-packages/setuptools/command/alias.py | 80 + .../setuptools/command/bdist_egg.py | 502 + .../setuptools/command/bdist_rpm.py | 43 + .../setuptools/command/bdist_wininst.py | 21 + .../setuptools/command/build_clib.py | 98 + .../setuptools/command/build_ext.py | 331 + .../setuptools/command/build_py.py | 270 + .../setuptools/command/develop.py | 216 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2334 ++++ .../setuptools/command/egg_info.py | 696 + .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 121 + .../setuptools/command/install_scripts.py | 65 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 136 + .../setuptools/command/register.py | 10 + .../setuptools/command/rotate.py | 66 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 200 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 268 + .../setuptools/command/upload.py | 42 + .../setuptools/command/upload_docs.py | 206 + .../site-packages/setuptools/config.py | 556 + .../site-packages/setuptools/dep_util.py | 23 + .../site-packages/setuptools/depends.py | 186 + .../site-packages/setuptools/dist.py | 1070 ++ .../site-packages/setuptools/extension.py | 57 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 2434 bytes .../site-packages/setuptools/glibc.py | 86 + .../site-packages/setuptools/glob.py | 176 + .../site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../site-packages/setuptools/launch.py | 35 + .../site-packages/setuptools/lib2to3_ex.py | 62 + .../site-packages/setuptools/monkey.py | 197 + .../site-packages/setuptools/msvc.py | 1302 ++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1119 ++ .../site-packages/setuptools/pep425tags.py | 316 + .../site-packages/setuptools/py27compat.py | 28 + .../site-packages/setuptools/py31compat.py | 41 + .../site-packages/setuptools/py33compat.py | 54 + .../site-packages/setuptools/py36compat.py | 82 + .../site-packages/setuptools/sandbox.py | 491 + .../setuptools/script (dev).tmpl | 5 + .../site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/site-patch.py | 74 + .../site-packages/setuptools/ssl_support.py | 260 + .../site-packages/setuptools/unicode_utils.py | 44 + .../site-packages/setuptools/version.py | 6 + .../site-packages/setuptools/wheel.py | 163 + .../setuptools/windows_support.py | 29 + myenv/pyvenv.cfg | 3 + run.py | 23 + 812 files changed, 147100 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json create mode 100755 LICENSE mode change 100644 => 100755 README.md create mode 100644 __pycache__/run.cpython-37.pyc create mode 100755 backend/requirements.txt create mode 100755 dist/index.html create mode 100755 frontend/.babelrc create mode 100755 frontend/.editorconfig create mode 100755 frontend/.eslintignore create mode 100755 frontend/.eslintrc.js create mode 100755 frontend/.gitignore create mode 100755 frontend/.postcssrc.js create mode 100755 frontend/build/build.js create mode 100755 frontend/build/check-versions.js create mode 100755 frontend/build/dev-client.js create mode 100755 frontend/build/dev-server.js create mode 100755 frontend/build/utils.js create mode 100755 frontend/build/vue-loader.conf.js create mode 100755 frontend/build/webpack.base.conf.js create mode 100755 frontend/build/webpack.dev.conf.js create mode 100755 frontend/build/webpack.prod.conf.js create mode 100755 frontend/config/dev.env.js create mode 100755 frontend/config/index.js create mode 100755 frontend/config/prod.env.js create mode 100755 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100755 frontend/package.json create mode 100755 frontend/src/App.vue create mode 100755 frontend/src/assets/logo.png create mode 100755 frontend/src/components/About.vue create mode 100755 frontend/src/components/HelloWorld.vue create mode 100755 frontend/src/components/Home.vue create mode 100755 frontend/src/components/NotFound.vue create mode 100755 frontend/src/main.js create mode 100755 frontend/src/router/index.js create mode 100755 frontend/static/.gitkeep create mode 100644 myenv/bin/activate create mode 100644 myenv/bin/activate.csh create mode 100644 myenv/bin/activate.fish create mode 100755 myenv/bin/easy_install create mode 100755 myenv/bin/easy_install-3.7 create mode 100755 myenv/bin/pip create mode 100755 myenv/bin/pip3 create mode 100755 myenv/bin/pip3.7 create mode 120000 myenv/bin/python create mode 120000 myenv/bin/python3 create mode 120000 myenv/bin/python3.7 create mode 100644 myenv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/easy_install.py create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/LICENSE.txt create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/METADATA create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/RECORD create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/entry_points.txt create mode 100644 myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt create mode 100644 myenv/lib/python3.7/site-packages/pip/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/__main__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/basecommand.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/baseparser.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/build_env.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cache.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cmdoptions.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/status_codes.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/basecommand.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/baseparser.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/build_env.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/cache.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/cmdoptions.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/download.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/hash.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/help.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/install.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/show.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/check.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/completion.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/configuration.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/download.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/hash.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/help.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/install.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/list.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/search.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/show.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/configuration.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/download.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/exceptions.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/index.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/locations.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/index.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/models/index.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/check.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/check.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/pep425tags.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_install.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/req_file.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/req_install.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/req_set.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/resolve.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/status_codes.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/outdated.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/typing.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/appdirs.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/logging.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/misc.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/typing.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/utils/ui.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/git.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_internal/wheel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/appdirs.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py create mode 100755 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe create mode 100755 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py create mode 100755 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe create mode 100755 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/distro.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/core.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/api.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/help.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/models.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/retrying.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/six.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/selectors.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/selectors.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/pkg_resources/py31compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/INSTALLER create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/LICENSE.txt create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/METADATA create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/RECORD create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/dependency_links.txt create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/entry_points.txt create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/metadata.json create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/top_level.txt create mode 100644 myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/zip-safe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/_vendor/six.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/archive_util.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/build_meta.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/cli-32.exe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/cli-64.exe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/cli.exe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/alias.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/build_clib.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/build_ext.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/build_py.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/develop.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/dist_info.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/easy_install.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/egg_info.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/install.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/install_lib.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/install_scripts.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/py36compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/register.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/rotate.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/saveopts.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/sdist.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/setopt.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/test.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/upload.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/command/upload_docs.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/config.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/dep_util.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/depends.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/dist.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/extension.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/extern/__init__.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc create mode 100644 myenv/lib/python3.7/site-packages/setuptools/glibc.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/glob.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/gui-32.exe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/gui-64.exe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/gui.exe create mode 100644 myenv/lib/python3.7/site-packages/setuptools/launch.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/monkey.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/msvc.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/namespaces.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/package_index.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/pep425tags.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/py27compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/py31compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/py33compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/py36compat.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/sandbox.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/script (dev).tmpl create mode 100644 myenv/lib/python3.7/site-packages/setuptools/script.tmpl create mode 100644 myenv/lib/python3.7/site-packages/setuptools/site-patch.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/ssl_support.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/unicode_utils.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/version.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/wheel.py create mode 100644 myenv/lib/python3.7/site-packages/setuptools/windows_support.py create mode 100644 myenv/pyvenv.cfg create mode 100755 run.py diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..3b6641073 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100755 index 000000000..cc4456ab6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 oleg-agapov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md old mode 100644 new mode 100755 index af0528186..db5b43192 --- a/README.md +++ b/README.md @@ -1,2 +1,36 @@ -# iStacking +# flask-vue-spa +Vue.js SPA served over Flask microframework + +* Python: 3.6.3 +* Vue.js: 2.5.2 +* vue-router: 3.0.1 +* axios: 0.16.2 + +Tutorial on how I build this app: +https://medium.com/@oleg.agapov/full-stack-single-page-application-with-vue-js-and-flask-b1e036315532 + +## Build Setup + +``` bash +# install front-end +cd frontend +npm install + +# serve with hot reload at localhost:8080 +npm run dev + +# build for production/Flask with minification +npm run build + + +# install back-end +cd ../backend +virtualenv -p python3 venv +source venv/bin/activate +pip install -r requirements.txt +cd .. + +# serve back-end at localhost:5000 +FLASK_APP=run.py flask run +``` diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09a6ac39c371268c0cbee7d58f80d43a456b7ba1 GIT binary patch literal 940 zcmYjQOHbQC5Z?7OPT~a86rrAaH3ya>LI|N!^_WVeTr5@A;@!j!esy;(K?;}BWBCto zY=6>Td*Uzj)LExU9cgA~X6N~>{Vojq25HV%1O$5Y*%$cKT=NTqKk*(bi1(jENEO^DZ zNE9!df-0{4m8`3LaT8&U_dqyjAJ6Brb+}JhE)|iAsytnL8#A(WxbY;5x_~-*{8H$j zW9<>zVJ%q5nZ?6R>Z~mY%WqQ!GsVm8UA`yb?&ndZ(Tu4Hz zG^3QfuhX{Vm6GI~OHM_ak$kRbdX-npB&``IfWgKjqOJCu8y#+%Cso&d07a!~hU}3g z#-;@(+G(iDbT68jY`vQ))f^F0)F~~pTB@VNgTn*z^={qI;c>6`GgTImuWi~i+GYH*T^c05 zv|K8w?Il;*ThyYYN;`^QD`7+92#akvI+!+M1f~vBs?sc>MKJ+WdLWSP;RzORK#NA& zU6}7mz#oCSIvw=d+n^NpyIX)#NMUk?d0E{{l8Tl*NyHS)*fH1I6?Ln4hhbOyze&u~ hiEf=0.12.3 +Flask-Cors==3.0.3 +itsdangerous==0.24 +Jinja2>=2.10.1 +MarkupSafe==1.0 +six==1.11.0 +Werkzeug==0.12.2 diff --git a/dist/index.html b/dist/index.html new file mode 100755 index 000000000..cc0e79ac2 --- /dev/null +++ b/dist/index.html @@ -0,0 +1 @@ +frontend
\ No newline at end of file diff --git a/frontend/.babelrc b/frontend/.babelrc new file mode 100755 index 000000000..c06df4d53 --- /dev/null +++ b/frontend/.babelrc @@ -0,0 +1,18 @@ +{ + "presets": [ + ["env", { + "modules": false, + "targets": { + "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] + } + }], + "stage-2" + ], + "plugins": ["transform-runtime"], + "env": { + "test": { + "presets": ["env", "stage-2"], + "plugins": ["istanbul"] + } + } +} diff --git a/frontend/.editorconfig b/frontend/.editorconfig new file mode 100755 index 000000000..9d08a1a82 --- /dev/null +++ b/frontend/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/frontend/.eslintignore b/frontend/.eslintignore new file mode 100755 index 000000000..34af3774f --- /dev/null +++ b/frontend/.eslintignore @@ -0,0 +1,2 @@ +build/*.js +config/*.js diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js new file mode 100755 index 000000000..e0dd62d91 --- /dev/null +++ b/frontend/.eslintrc.js @@ -0,0 +1,27 @@ +// https://eslint.org/docs/user-guide/configuring + +module.exports = { + root: true, + parser: 'babel-eslint', + parserOptions: { + sourceType: 'module' + }, + env: { + browser: true, + }, + // https://github.com/standard/standard/blob/master/docs/RULES-en.md + extends: 'standard', + // required to lint *.vue files + plugins: [ + 'html' + ], + // add your custom rules here + 'rules': { + // allow paren-less arrow functions + 'arrow-parens': 0, + // allow async-await + 'generator-star-spacing': 0, + // allow debugger during development + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 + } +} diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100755 index 000000000..de748e1c4 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,14 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/frontend/.postcssrc.js b/frontend/.postcssrc.js new file mode 100755 index 000000000..09948d63e --- /dev/null +++ b/frontend/.postcssrc.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + "plugins": { + // to edit target browsers: use "browserslist" field in package.json + "autoprefixer": {} + } +} diff --git a/frontend/build/build.js b/frontend/build/build.js new file mode 100755 index 000000000..30f036a18 --- /dev/null +++ b/frontend/build/build.js @@ -0,0 +1,41 @@ +'use strict' +require('./check-versions')() + +process.env.NODE_ENV = 'production' + +const ora = require('ora') +const rm = require('rimraf') +const path = require('path') +const chalk = require('chalk') +const webpack = require('webpack') +const config = require('../config') +const webpackConfig = require('./webpack.prod.conf') + +const spinner = ora('building for production...') +spinner.start() + +rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { + if (err) throw err + webpack(webpackConfig, function (err, stats) { + spinner.stop() + if (err) throw err + process.stdout.write(stats.toString({ + colors: true, + modules: false, + children: false, + chunks: false, + chunkModules: false + }) + '\n\n') + + if (stats.hasErrors()) { + console.log(chalk.red(' Build failed with errors.\n')) + process.exit(1) + } + + console.log(chalk.cyan(' Build complete.\n')) + console.log(chalk.yellow( + ' Tip: built files are meant to be served over an HTTP server.\n' + + ' Opening index.html over file:// won\'t work.\n' + )) + }) +}) diff --git a/frontend/build/check-versions.js b/frontend/build/check-versions.js new file mode 100755 index 000000000..ca407bb16 --- /dev/null +++ b/frontend/build/check-versions.js @@ -0,0 +1,49 @@ +'use strict' +const chalk = require('chalk') +const semver = require('semver') +const packageConfig = require('../package.json') +const shell = require('shelljs') +function exec (cmd) { + return require('child_process').execSync(cmd).toString().trim() +} + +const versionRequirements = [ + { + name: 'node', + currentVersion: semver.clean(process.version), + versionRequirement: packageConfig.engines.node + } +] + +if (shell.which('npm')) { + versionRequirements.push({ + name: 'npm', + currentVersion: exec('npm --version'), + versionRequirement: packageConfig.engines.npm + }) +} + +module.exports = function () { + const warnings = [] + for (let i = 0; i < versionRequirements.length; i++) { + const mod = versionRequirements[i] + if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { + warnings.push(mod.name + ': ' + + chalk.red(mod.currentVersion) + ' should be ' + + chalk.green(mod.versionRequirement) + ) + } + } + + if (warnings.length) { + console.log('') + console.log(chalk.yellow('To use this template, you must update following to modules:')) + console.log() + for (let i = 0; i < warnings.length; i++) { + const warning = warnings[i] + console.log(' ' + warning) + } + console.log() + process.exit(1) + } +} diff --git a/frontend/build/dev-client.js b/frontend/build/dev-client.js new file mode 100755 index 000000000..2f75dd531 --- /dev/null +++ b/frontend/build/dev-client.js @@ -0,0 +1,10 @@ +/* eslint-disable */ +'use strict' +require('eventsource-polyfill') +var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true') + +hotClient.subscribe(function (event) { + if (event.action === 'reload') { + window.location.reload() + } +}) diff --git a/frontend/build/dev-server.js b/frontend/build/dev-server.js new file mode 100755 index 000000000..a503b5105 --- /dev/null +++ b/frontend/build/dev-server.js @@ -0,0 +1,105 @@ +'use strict' +require('./check-versions')() + +const config = require('../config') +if (!process.env.NODE_ENV) { + process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) +} + +const opn = require('opn') +const path = require('path') +const express = require('express') +const webpack = require('webpack') +const proxyMiddleware = require('http-proxy-middleware') +const webpackConfig = require('./webpack.dev.conf') + +// default port where dev server listens for incoming traffic +const port = process.env.PORT || config.dev.port +// automatically open browser, if not set will be false +const autoOpenBrowser = !!config.dev.autoOpenBrowser +// Define HTTP proxies to your custom API backend +// https://github.com/chimurai/http-proxy-middleware +const proxyTable = config.dev.proxyTable + +const app = express() +const compiler = webpack(webpackConfig) + +const devMiddleware = require('webpack-dev-middleware')(compiler, { + publicPath: webpackConfig.output.publicPath, + quiet: true +}) + +const hotMiddleware = require('webpack-hot-middleware')(compiler, { + log: false, + heartbeat: 2000 +}) +// force page reload when html-webpack-plugin template changes +// currently disabled until this is resolved: +// https://github.com/jantimon/html-webpack-plugin/issues/680 +// compiler.plugin('compilation', function (compilation) { +// compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { +// hotMiddleware.publish({ action: 'reload' }) +// cb() +// }) +// }) + +// enable hot-reload and state-preserving +// compilation error display +app.use(hotMiddleware) + +// proxy api requests +Object.keys(proxyTable).forEach(function (context) { + let options = proxyTable[context] + if (typeof options === 'string') { + options = { target: options } + } + app.use(proxyMiddleware(options.filter || context, options)) +}) + +// handle fallback for HTML5 history API +app.use(require('connect-history-api-fallback')()) + +// serve webpack bundle output +app.use(devMiddleware) + +// serve pure static assets +const staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) +app.use(staticPath, express.static('./static')) + +const uri = 'http://localhost:' + port + +var _resolve +var _reject +var readyPromise = new Promise((resolve, reject) => { + _resolve = resolve + _reject = reject +}) + +var server +var portfinder = require('portfinder') +portfinder.basePort = port + +console.log('> Starting dev server...') +devMiddleware.waitUntilValid(() => { + portfinder.getPort((err, port) => { + if (err) { + _reject(err) + } + process.env.PORT = port + var uri = 'http://localhost:' + port + console.log('> Listening at ' + uri + '\n') + // when env is testing, don't need open it + if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { + opn(uri) + } + server = app.listen(port) + _resolve() + }) +}) + +module.exports = { + ready: readyPromise, + close: () => { + server.close() + } +} diff --git a/frontend/build/utils.js b/frontend/build/utils.js new file mode 100755 index 000000000..4332862fc --- /dev/null +++ b/frontend/build/utils.js @@ -0,0 +1,72 @@ +'use strict' +const path = require('path') +const config = require('../config') +const ExtractTextPlugin = require('extract-text-webpack-plugin') + +exports.assetsPath = function (_path) { + const assetsSubDirectory = process.env.NODE_ENV === 'production' + ? config.build.assetsSubDirectory + : config.dev.assetsSubDirectory + return path.posix.join(assetsSubDirectory, _path) +} + +exports.cssLoaders = function (options) { + options = options || {} + + const cssLoader = { + loader: 'css-loader', + options: { + //minimize: process.env.NODE_ENV === 'production', + sourceMap: options.sourceMap + } + } + + // generate loader string to be used with extract text plugin + function generateLoaders (loader, loaderOptions) { + const loaders = [cssLoader] + if (loader) { + loaders.push({ + loader: loader + '-loader', + options: Object.assign({}, loaderOptions, { + sourceMap: options.sourceMap + }) + }) + } + + // Extract CSS when that option is specified + // (which is the case during production build) + if (options.extract) { + return ExtractTextPlugin.extract({ + use: loaders, + fallback: 'vue-style-loader' + }) + } else { + return ['vue-style-loader'].concat(loaders) + } + } + + // https://vue-loader.vuejs.org/en/configurations/extract-css.html + return { + css: generateLoaders(), + postcss: generateLoaders(), + less: generateLoaders('less'), + sass: generateLoaders('sass', { indentedSyntax: true }), + scss: generateLoaders('sass'), + stylus: generateLoaders('stylus'), + styl: generateLoaders('stylus') + } +} + +// Generate loaders for standalone style files (outside of .vue) +exports.styleLoaders = function (options) { + const output = [] + const loaders = exports.cssLoaders(options) + for (const extension in loaders) { + const loader = loaders[extension] + output.push({ + test: new RegExp('\\.' + extension + '$'), + use: loader + }) + } + return output +} diff --git a/frontend/build/vue-loader.conf.js b/frontend/build/vue-loader.conf.js new file mode 100755 index 000000000..eece58fe1 --- /dev/null +++ b/frontend/build/vue-loader.conf.js @@ -0,0 +1,19 @@ +'use strict' +const utils = require('./utils') +const config = require('../config') +const isProduction = process.env.NODE_ENV === 'production' + +module.exports = { + loaders: utils.cssLoaders({ + sourceMap: isProduction + ? config.build.productionSourceMap + : config.dev.cssSourceMap, + extract: isProduction + }), + transformToRequire: { + video: 'src', + source: 'src', + img: 'src', + image: 'xlink:href' + } +} diff --git a/frontend/build/webpack.base.conf.js b/frontend/build/webpack.base.conf.js new file mode 100755 index 000000000..83802373d --- /dev/null +++ b/frontend/build/webpack.base.conf.js @@ -0,0 +1,75 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const config = require('../config') +const vueLoaderConfig = require('./vue-loader.conf') + +function resolve (dir) { + return path.join(__dirname, '..', dir) +} + +module.exports = { + entry: { + app: './src/main.js' + }, + output: { + path: config.build.assetsRoot, + filename: '[name].js', + publicPath: process.env.NODE_ENV === 'production' + ? config.build.assetsPublicPath + : config.dev.assetsPublicPath + }, + resolve: { + extensions: ['.js', '.vue', '.json'], + alias: { + '@': resolve('src'), + } + }, + module: { + rules: [ + { + test: /\.(js|vue)$/, + loader: 'eslint-loader', + enforce: 'pre', + include: [resolve('src'), resolve('test')], + options: { + formatter: require('eslint-friendly-formatter') + } + }, + { + test: /\.vue$/, + loader: 'vue-loader', + options: vueLoaderConfig + }, + { + test: /\.js$/, + loader: 'babel-loader', + include: [resolve('src'), resolve('test')] + }, + { + test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('img/[name].[hash:7].[ext]') + } + }, + { + test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('media/[name].[hash:7].[ext]') + } + }, + { + test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, + loader: 'url-loader', + options: { + limit: 10000, + name: utils.assetsPath('fonts/[name].[hash:7].[ext]') + } + } + ] + } +} diff --git a/frontend/build/webpack.dev.conf.js b/frontend/build/webpack.dev.conf.js new file mode 100755 index 000000000..6f25d6345 --- /dev/null +++ b/frontend/build/webpack.dev.conf.js @@ -0,0 +1,36 @@ +'use strict' +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') + +// add hot-reload related code to entry chunks +Object.keys(baseWebpackConfig.entry).forEach(function (name) { + baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name]) +}) + +module.exports = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap }) + }, + // cheap-module-eval-source-map is faster for development + devtool: '#cheap-module-eval-source-map', + plugins: [ + new webpack.DefinePlugin({ + 'process.env': config.dev.env + }), + // https://github.com/glenjamin/webpack-hot-middleware#installation--usage + new webpack.HotModuleReplacementPlugin(), + new webpack.NoEmitOnErrorsPlugin(), + // https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: 'index.html', + template: 'index.html', + inject: true + }), + new FriendlyErrorsPlugin() + ] +}) diff --git a/frontend/build/webpack.prod.conf.js b/frontend/build/webpack.prod.conf.js new file mode 100755 index 000000000..dcb239d2c --- /dev/null +++ b/frontend/build/webpack.prod.conf.js @@ -0,0 +1,124 @@ +'use strict' +const path = require('path') +const utils = require('./utils') +const webpack = require('webpack') +const config = require('../config') +const merge = require('webpack-merge') +const baseWebpackConfig = require('./webpack.base.conf') +const CopyWebpackPlugin = require('copy-webpack-plugin') +const HtmlWebpackPlugin = require('html-webpack-plugin') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') + +const env = config.build.env + +const webpackConfig = merge(baseWebpackConfig, { + module: { + rules: utils.styleLoaders({ + sourceMap: config.build.productionSourceMap, + extract: true + }) + }, + devtool: config.build.productionSourceMap ? '#source-map' : false, + output: { + path: config.build.assetsRoot, + filename: utils.assetsPath('js/[name].[chunkhash].js'), + chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') + }, + plugins: [ + // http://vuejs.github.io/vue-loader/en/workflow/production.html + new webpack.DefinePlugin({ + 'process.env': env + }), + // UglifyJs do not support ES6+, you can also use babel-minify for better treeshaking: https://github.com/babel/minify + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false + }, + sourceMap: true + }), + // extract css into its own file + new ExtractTextPlugin({ + filename: utils.assetsPath('css/[name].[contenthash].css') + }), + // Compress extracted CSS. We are using this plugin so that possible + // duplicated CSS from different components can be deduped. + new OptimizeCSSPlugin({ + cssProcessorOptions: { + safe: true + } + }), + // generate dist index.html with correct asset hash for caching. + // you can customize output by editing /index.html + // see https://github.com/ampedandwired/html-webpack-plugin + new HtmlWebpackPlugin({ + filename: config.build.index, + template: 'index.html', + inject: true, + minify: { + removeComments: true, + collapseWhitespace: true, + removeAttributeQuotes: true + // more options: + // https://github.com/kangax/html-minifier#options-quick-reference + }, + // necessary to consistently work with multiple chunks via CommonsChunkPlugin + chunksSortMode: 'dependency' + }), + // keep module.id stable when vender modules does not change + new webpack.HashedModuleIdsPlugin(), + // split vendor js into its own file + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks: function (module) { + // any required modules inside node_modules are extracted to vendor + return ( + module.resource && + /\.js$/.test(module.resource) && + module.resource.indexOf( + path.join(__dirname, '../node_modules') + ) === 0 + ) + } + }), + // extract webpack runtime and module manifest to its own file in order to + // prevent vendor hash from being updated whenever app bundle is updated + new webpack.optimize.CommonsChunkPlugin({ + name: 'manifest', + chunks: ['vendor'] + }), + // copy custom static assets + new CopyWebpackPlugin([ + { + from: path.resolve(__dirname, '../static'), + to: config.build.assetsSubDirectory, + ignore: ['.*'] + } + ]) + ] +}) + +if (config.build.productionGzip) { + const CompressionWebpackPlugin = require('compression-webpack-plugin') + + webpackConfig.plugins.push( + new CompressionWebpackPlugin({ + asset: '[path].gz[query]', + algorithm: 'gzip', + test: new RegExp( + '\\.(' + + config.build.productionGzipExtensions.join('|') + + ')$' + ), + threshold: 10240, + minRatio: 0.8 + }) + ) +} + +if (config.build.bundleAnalyzerReport) { + const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin + webpackConfig.plugins.push(new BundleAnalyzerPlugin()) +} + +module.exports = webpackConfig diff --git a/frontend/config/dev.env.js b/frontend/config/dev.env.js new file mode 100755 index 000000000..1e22973ae --- /dev/null +++ b/frontend/config/dev.env.js @@ -0,0 +1,7 @@ +'use strict' +const merge = require('webpack-merge') +const prodEnv = require('./prod.env') + +module.exports = merge(prodEnv, { + NODE_ENV: '"development"' +}) diff --git a/frontend/config/index.js b/frontend/config/index.js new file mode 100755 index 000000000..a552adea5 --- /dev/null +++ b/frontend/config/index.js @@ -0,0 +1,42 @@ + +'use strict' +// Template version: 1.1.3 +// see http://vuejs-templates.github.io/webpack for documentation. + +const path = require('path') + +module.exports = { + build: { + env: require('./prod.env'), + index: path.resolve(__dirname, '../../dist/index.html'), + assetsRoot: path.resolve(__dirname, '../../dist'), + assetsSubDirectory: 'static', + assetsPublicPath: '/', + productionSourceMap: true, + // Gzip off by default as many popular static hosts such as + // Surge or Netlify already gzip all static assets for you. + // Before setting to `true`, make sure to: + // npm install --save-dev compression-webpack-plugin + productionGzip: false, + productionGzipExtensions: ['js', 'css'], + // Run the build command with an extra argument to + // View the bundle analyzer report after build finishes: + // `npm run build --report` + // Set to `true` or `false` to always turn it on or off + bundleAnalyzerReport: process.env.npm_config_report + }, + dev: { + env: require('./dev.env'), + port: process.env.PORT || 8080, + autoOpenBrowser: true, + assetsSubDirectory: 'static', + assetsPublicPath: '/', + proxyTable: {}, + // CSS Sourcemaps off by default because relative paths are "buggy" + // with this option, according to the CSS-Loader README + // (https://github.com/webpack/css-loader#sourcemaps) + // In our experience, they generally work as expected, + // just be aware of this issue when enabling this option. + cssSourceMap: false + } +} diff --git a/frontend/config/prod.env.js b/frontend/config/prod.env.js new file mode 100755 index 000000000..a6f997616 --- /dev/null +++ b/frontend/config/prod.env.js @@ -0,0 +1,4 @@ +'use strict' +module.exports = { + NODE_ENV: '"production"' +} diff --git a/frontend/index.html b/frontend/index.html new file mode 100755 index 000000000..fb63c5378 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,11 @@ + + + + + frontend + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 000000000..e6947cbbf --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,10535 @@ +{ + "name": "frontend", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "^4.0.3" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "^3.0.4" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "7.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.6.tgz", + "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", + "dev": true, + "requires": { + "browserslist": "^2.11.3", + "caniuse-lite": "^1.0.30000805", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^6.0.17", + "postcss-value-parser": "^3.2.3" + } + }, + "axios": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", + "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "^6.22.0", + "babel-traverse": "^6.23.1", + "babel-types": "^6.23.0", + "babylon": "^6.17.0" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "dev": true, + "requires": { + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-generators": "^6.5.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-plugin-syntax-class-properties": "^6.8.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "^6.24.1", + "babel-plugin-syntax-decorators": "^6.13.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + } + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + } + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "babel-plugin-transform-class-properties": "^6.24.1", + "babel-plugin-transform-decorators": "^6.24.1", + "babel-preset-stage-3": "^6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-generator-functions": "^6.24.1", + "babel-plugin-transform-async-to-generator": "^6.24.1", + "babel-plugin-transform-exponentiation-operator": "^6.24.1", + "babel-plugin-transform-object-rest-spread": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "^0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + } + } + }, + "caniuse-lite": { + "version": "1.0.30000978", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000978.tgz", + "integrity": "sha512-H6gK6kxUzG6oAwg/Jal279z8pHw0BzrpZfwo/CA9FFm/vA0l8IhDfkZtepyJNE2Y4V6Dp3P3ubz6czby1/Mgsw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, + "chokidar": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz", + "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + } + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "^1.0.1" + } + }, + "cli-spinners": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz", + "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==", + "dev": true + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "coalescy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/coalescy/-/coalescy-1.0.0.tgz", + "integrity": "sha1-SwZYRrg2NhrabEtKSr9LwcrDG/E=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "dev": true, + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz", + "integrity": "sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==", + "dev": true, + "requires": { + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "globby": "^7.1.1", + "is-glob": "^4.0.0", + "loader-utils": "^1.1.0", + "minimatch": "^3.0.4", + "p-limit": "^1.0.0", + "serialize-javascript": "^1.4.0" + } + }, + "core-js": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz", + "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.4.3", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "os-homedir": "^1.0.1", + "parse-json": "^2.2.0", + "require-from-string": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.0.0.tgz", + "integrity": "sha512-WR6KZuCkFbnMhRrGPlkwAA7SSCtwqPwpyXJAPhotYkYsc0mKU9n/fu5wufy4jl2WhBw9Ia8gUQMIp/1w98DuPw==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.17", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-value-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", + "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + }, + "dependencies": { + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + } + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.28", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.28.tgz", + "integrity": "sha512-joNNW1gCp3qFFzj4St6zk+Wh/NBv0vM5YbEreZk0SD4S23S+1xBKb6cLDg2uj4P4k/GUMlIm6cKIDqIG+vdt0w==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.1.tgz", + "integrity": "sha512-vrqULLffYU1Q2tLdJvaCYbONStnfkfimRxXNaGjxMldI0C7JPBC4rB1RyjhfdZ4m1frm8pM9uRPKH3d2knZ8gg==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.29" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.29", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.29.tgz", + "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", + "dev": true, + "requires": { + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", + "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.176", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.176.tgz", + "integrity": "sha512-hsQ/BH6x2iCvJ7WOIbNTAlsT39vsVGIVoJJ9i6ZkGXUE2LdzWsNv0xJI2uZ5/Hkqv1oTTLxAYjbtGKVJzqYbjA==", + "dev": true + }, + "elliptic": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.0.tgz", + "integrity": "sha512-eFOJTMyCYb7xtE/caJ6JJu+bhi67WCYNbkGSknu20pmM8Ke/bqOfdnZWxyoGN26JgfxTbXrsCkEw4KheCT/KGg==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.2.tgz", + "integrity": "sha512-E1fPutRDdIj/hohG0UpT5mayXNCxXP9d+snxFsPU9X0XgccOumKraa3juDMwTUyi7+Bu5+mCGagjg4IYeNbOdw==", + "dev": true, + "requires": { + "stackframe": "^1.0.4" + } + }, + "es-abstract": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" + } + }, + "es-to-primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.50", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-config-standard": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", + "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", + "dev": true + }, + "eslint-friendly-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-friendly-formatter/-/eslint-friendly-formatter-3.0.0.tgz", + "integrity": "sha1-J4h0Q1psRuwdlPoLH/SU4w7wQpA=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "coalescy": "1.0.0", + "extend": "^3.0.0", + "minimist": "^1.2.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "eslint-import-resolver-node": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", + "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-loader": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-1.9.0.tgz", + "integrity": "sha512-40aN976qSNPyb9ejTqjEthZITpls1SVKtwguahmH1dzGCwQU/vySE+xX33VZmD8csU0ahVNCtFlsPgKqRBiqgg==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-module-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", + "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", + "dev": true, + "requires": { + "debug": "^2.6.8", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "eslint-plugin-html": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-3.2.2.tgz", + "integrity": "sha512-sSuafathF6ImPrzF2vUKEJY6Llq06d/riMTMzlsruDRDhNsQMYp2viUKo+jx+JRr1QevskeUpQcuptp2gN1XVQ==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.2", + "semver": "^5.4.1" + } + }, + "eslint-plugin-import": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.0.tgz", + "integrity": "sha512-PZpAEC4gj/6DEMMoU2Df01C5c50r7zdGIN52Yfi7CvvWaYssG7Jt5R9nFG5gmqodxNOz9vQS87xk6Izdtpdrig==", + "dev": true, + "requires": { + "array-includes": "^3.0.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.0", + "has": "^1.0.3", + "lodash": "^4.17.11", + "minimatch": "^3.0.4", + "read-pkg-up": "^2.0.0", + "resolve": "^1.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + } + } + } + }, + "eslint-plugin-node": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", + "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "dev": true, + "requires": { + "ignore": "^3.3.6", + "minimatch": "^3.0.4", + "resolve": "^1.3.3", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", + "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", + "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", + "dev": true + }, + "espree": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "requires": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + } + }, + "esquery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", + "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "dev": true, + "requires": { + "estraverse": "^4.0.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "eventsource-polyfill": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/eventsource-polyfill/-/eventsource-polyfill-0.9.6.tgz", + "integrity": "sha1-EODRh/ERsWfyj9q5GIQ859gY8Tw=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "extract-text-webpack-plugin": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", + "dev": true, + "requires": { + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" + } + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + } + }, + "flatten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", + "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "friendly-errors-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-K27M3VK30wVoOarP651zDmb93R9zF28usW4ocaK3mfQeIEI5BPht/EzZs5E8QLLwbLRJQMwscAjDxYPb1FuNiw==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "error-stack-parser": "^2.0.0", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", + "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true, + "optional": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "requires": { + "is-property": "^1.0.2" + } + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-comment-regex": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", + "dev": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "^3.4.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "toposort": "^1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "dependencies": { + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "^1.0.1" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-svg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", + "dev": true, + "requires": { + "html-comment-regex": "^1.1.0" + } + }, + "is-symbol": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + } + } + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", + "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.4.tgz", + "integrity": "sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.24.tgz", + "integrity": "sha512-wym2jptfuKowMmkZsfCSTsn8qAVo8zm+UiQA6l5dNqUcpfChZSnS/vbbpOeXczf+VdPhutxh+99lWHhdd6xKzg==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-Rqm6sSjWtx9FchdP0uzTQDc7GXDKnwVEGoSxjezPkzMewx7gEWE9IMUYKmigTRC4U3RaNSwYVnUDLuIdtTpm0A==", + "dev": true, + "requires": { + "cssnano": "^4.1.0", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "ora": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", + "integrity": "sha512-iMK1DOQxzzh2MBlVsU42G80mnrvUhqsMh74phHtDlrcTZPK0pH6o7l7DRshK+0YsxDyEuaOkziVdvM3T0QTzpw==", + "dev": true, + "requires": { + "chalk": "^2.1.0", + "cli-cursor": "^2.1.0", + "cli-spinners": "^1.0.1", + "log-symbols": "^2.1.0" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", + "dev": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "dev": true, + "requires": { + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-calc": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.1.tgz", + "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0", + "postcss-load-options": "^1.2.0", + "postcss-load-plugins": "^2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.0", + "object-assign": "^4.1.0" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "^2.1.1", + "object-assign": "^4.1.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-value-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.0.tgz", + "integrity": "sha512-ESPktioptiSUchCKgggAkzdmkgzKfmp0EU8jXH+5kbIUB+unr0Y4CY9SRMvibuvYUBjNh1ACLbxqYNpdTQOteQ==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-scope": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz", + "integrity": "sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", + "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", + "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "^2.0.1", + "utila": "~0.4" + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "dependencies": { + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", + "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "dev": true, + "requires": { + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "^1.3.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "requires": { + "ajv": "^5.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + } + } + }, + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.7.0.tgz", + "integrity": "sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==", + "dev": true + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", + "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stackframe": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.0.4.tgz", + "integrity": "sha512-to7oADIniaYwS3MhtCa/sQhrxidCCQiF/qp4/m5iN3ipf0Y7Xlri0f6eG29r08aL7JYl8n32AF3Q5GYBZ7K8vw==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + } + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "svgo": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.2.2.tgz", + "integrity": "sha512-rAfulcwp2D9jjdGu+0CuqlrAUin6bBWrpoqXWwKDZZZJfXcUXQSxLJOFJCQCSA0x0pP2U0TxSlJu2ROq5Bq6qA==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.28", + "css-url-regex": "^1.1.0", + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.0.2.tgz", + "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + } + } + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "tapable": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.9.tgz", + "integrity": "sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "time-stamp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.2.0.tgz", + "integrity": "sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + } + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", + "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.0.1.tgz", + "integrity": "sha512-nd+jtHG6VgYx/NnXxXSWCJ7FtHIhuyk6Pe48HKhq29Avq3r5FSdIrenvzlbb67A3SNFaQyLk0/lMZfubj0+5ww==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.4.4", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.3.tgz", + "integrity": "sha512-fOi47nsJP5Wqefa43kyWSg80qF+Q3XA6MUkgi7Hp1HQaKDQW4cQrK2D0P7mmbFtsV1N89am55Yru/nyEwRubcw==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", + "dev": true + }, + "vue": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", + "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==" + }, + "vue-hot-reload-api": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz", + "integrity": "sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==", + "dev": true + }, + "vue-loader": { + "version": "13.7.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.3.tgz", + "integrity": "sha512-ACCwbfeC6HjY2pnDii+Zer+MZ6sdOtwvLmDXRK/BoD3WNR551V22R6KEagwHoTRJ0ZlIhpCBkptpCU6+Ri/05w==", + "dev": true, + "requires": { + "consolidate": "^0.14.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "lru-cache": "^4.1.1", + "postcss": "^6.0.8", + "postcss-load-config": "^1.1.0", + "postcss-selector-parser": "^2.0.0", + "prettier": "^1.7.0", + "resolve": "^1.4.0", + "source-map": "^0.6.1", + "vue-hot-reload-api": "^2.2.0", + "vue-style-loader": "^3.0.0", + "vue-template-es2015-compiler": "^1.6.0" + } + }, + "vue-router": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.6.tgz", + "integrity": "sha512-Ox0ciFLswtSGRTHYhGvx2L44sVbTPNS+uD2kRISuo8B39Y79rOo0Kw0hzupTmiVtftQYCZl87mwldhh2L9Aquw==" + }, + "vue-style-loader": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.2.tgz", + "integrity": "sha512-ICtVdK/p+qXWpdSs2alWtsXt9YnDoYjQe0w5616j9+/EhjoxZkbun34uWgsMFnC1MhrMMwaWiImz3K2jK1Yp2Q==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz", + "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", + "dev": true, + "requires": { + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" + }, + "dependencies": { + "ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", + "dev": true, + "requires": { + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "acorn": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", + "dev": true + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "dev": true, + "requires": { + "memory-fs": "~0.4.1", + "mime": "^1.5.0", + "path-is-absolute": "^1.0.0", + "range-parser": "^1.0.3", + "time-stamp": "^2.0.0" + } + }, + "webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.0.0" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100755 index 000000000..bfafe7f0e --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,73 @@ +{ + "name": "frontend", + "version": "1.0.0", + "description": "A Vue.js project", + "author": "Oleg Agapov ", + "private": true, + "scripts": { + "dev": "node build/dev-server.js", + "start": "npm run dev", + "build": "node build/build.js", + "lint": "eslint --ext .js,.vue src" + }, + "dependencies": { + "axios": "^0.19.0", + "vue": "^2.6.10", + "vue-router": "^3.0.6" + }, + "devDependencies": { + "autoprefixer": "^7.1.2", + "babel-core": "^6.22.1", + "babel-eslint": "^7.1.1", + "babel-loader": "^7.1.1", + "babel-plugin-transform-runtime": "^6.22.0", + "babel-preset-env": "^1.3.2", + "babel-preset-stage-2": "^6.22.0", + "babel-register": "^6.22.0", + "chalk": "^2.0.1", + "connect-history-api-fallback": "^1.3.0", + "copy-webpack-plugin": "^4.0.1", + "css-loader": "^3.0.0", + "eslint": "^3.19.0", + "eslint-config-standard": "^10.2.1", + "eslint-friendly-formatter": "^3.0.0", + "eslint-loader": "^1.7.1", + "eslint-plugin-html": "^3.0.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-node": "^5.2.0", + "eslint-plugin-promise": "^3.4.0", + "eslint-plugin-standard": "^3.0.1", + "eventsource-polyfill": "^0.9.6", + "express": "^4.14.1", + "extract-text-webpack-plugin": "^3.0.0", + "file-loader": "^1.1.4", + "friendly-errors-webpack-plugin": "^1.6.1", + "html-webpack-plugin": "^2.30.1", + "http-proxy-middleware": "^0.19.1", + "opn": "^5.1.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "ora": "^1.2.0", + "portfinder": "^1.0.13", + "rimraf": "^2.6.0", + "semver": "^5.3.0", + "shelljs": "^0.7.6", + "url-loader": "^2.0.1", + "vue-loader": "^13.3.0", + "vue-style-loader": "^3.0.1", + "vue-template-compiler": "^2.5.2", + "webpack": "^3.6.0", + "webpack-bundle-analyzer": ">=3.3.2", + "webpack-dev-middleware": "^1.12.0", + "webpack-hot-middleware": "^2.18.2", + "webpack-merge": "^4.1.0" + }, + "engines": { + "node": ">= 4.0.0", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not ie <= 8" + ] +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100755 index 000000000..029fb96ac --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/frontend/src/assets/logo.png b/frontend/src/assets/logo.png new file mode 100755 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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 +
+

About

+
+ diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue new file mode 100755 index 000000000..4c7db1154 --- /dev/null +++ b/frontend/src/components/HelloWorld.vue @@ -0,0 +1,53 @@ + + + + + + diff --git a/frontend/src/components/Home.vue b/frontend/src/components/Home.vue new file mode 100755 index 000000000..49da23c92 --- /dev/null +++ b/frontend/src/components/Home.vue @@ -0,0 +1,43 @@ + + + + diff --git a/frontend/src/components/NotFound.vue b/frontend/src/components/NotFound.vue new file mode 100755 index 000000000..a23c668ac --- /dev/null +++ b/frontend/src/components/NotFound.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100755 index 000000000..254e5c979 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,12 @@ +import Vue from 'vue' +import App from './App' +import router from './router' + +Vue.config.productionTip = false + +/* eslint-disable no-new */ +new Vue({ + el: '#app', + router, + render: h => h(App) +}) diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100755 index 000000000..c83cc3b7f --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,18 @@ +import Vue from 'vue' +import Router from 'vue-router' +const routerOptions = [ + { path: '/', component: 'Home' }, + { path: '/about', component: 'About' }, + { path: '*', component: 'NotFound' } +] +const routes = routerOptions.map(route => { + return { + ...route, + component: () => import(`@/components/${route.component}.vue`) + } +}) +Vue.use(Router) +export default new Router({ + routes, + mode: 'history' +}) diff --git a/frontend/static/.gitkeep b/frontend/static/.gitkeep new file mode 100755 index 000000000..e69de29bb diff --git a/myenv/bin/activate b/myenv/bin/activate new file mode 100644 index 000000000..0ab92ff4e --- /dev/null +++ b/myenv/bin/activate @@ -0,0 +1,76 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + # reset old environment variables + if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then + PATH="${_OLD_VIRTUAL_PATH:-}" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then + PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r + fi + + if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then + PS1="${_OLD_VIRTUAL_PS1:-}" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "$1" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) +# could use `if (set -u; : $PYTHONHOME) ;` in bash +if [ -n "${PYTHONHOME:-}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then + _OLD_VIRTUAL_PS1="${PS1:-}" + if [ "x(myenv) " != x ] ; then + PS1="(myenv) ${PS1:-}" + else + if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1" + fi + fi + export PS1 +fi + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then + hash -r +fi diff --git a/myenv/bin/activate.csh b/myenv/bin/activate.csh new file mode 100644 index 000000000..e7981cfd8 --- /dev/null +++ b/myenv/bin/activate.csh @@ -0,0 +1,37 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . +# Ported to Python 3.3 venv by Andrew Svetlov + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + +set _OLD_VIRTUAL_PROMPT="$prompt" + +if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then + if ("myenv" != "") then + set env_name = "myenv" + else + if (`basename "VIRTUAL_ENV"` == "__") then + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + set env_name = `basename \`dirname "$VIRTUAL_ENV"\`` + else + set env_name = `basename "$VIRTUAL_ENV"` + endif + endif + set prompt = "[$env_name] $prompt" + unset env_name +endif + +alias pydoc python -m pydoc + +rehash diff --git a/myenv/bin/activate.fish b/myenv/bin/activate.fish new file mode 100644 index 000000000..ffbcff708 --- /dev/null +++ b/myenv/bin/activate.fish @@ -0,0 +1,75 @@ +# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org) +# you cannot run it directly + +function deactivate -d "Exit virtualenv and return to normal shell environment" + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + functions -e fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + end + + set -e VIRTUAL_ENV + if test "$argv[1]" != "nondestructive" + # Self destruct! + functions -e deactivate + end +end + +# unset irrelevant variables +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# unset PYTHONHOME if set +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # fish uses a function instead of an env var to generate the prompt. + + # save the current fish_prompt function as the function _old_fish_prompt + functions -c fish_prompt _old_fish_prompt + + # with the original prompt function renamed, we can override with our own. + function fish_prompt + # Save the return status of the last command + set -l old_status $status + + # Prompt override? + if test -n "(myenv) " + printf "%s%s" "(myenv) " (set_color normal) + else + # ...Otherwise, prepend env + set -l _checkbase (basename "$VIRTUAL_ENV") + if test $_checkbase = "__" + # special case for Aspen magic directories + # see http://www.zetadev.com/software/aspen/ + printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) + else + printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal) + end + end + + # Restore the return status of the previous command. + echo "exit $old_status" | . + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/myenv/bin/easy_install b/myenv/bin/easy_install new file mode 100755 index 000000000..1d8ca79e2 --- /dev/null +++ b/myenv/bin/easy_install @@ -0,0 +1,11 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/easy_install-3.7 b/myenv/bin/easy_install-3.7 new file mode 100755 index 000000000..1d8ca79e2 --- /dev/null +++ b/myenv/bin/easy_install-3.7 @@ -0,0 +1,11 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/pip b/myenv/bin/pip new file mode 100755 index 000000000..f9e8cda9b --- /dev/null +++ b/myenv/bin/pip @@ -0,0 +1,11 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/pip3 b/myenv/bin/pip3 new file mode 100755 index 000000000..f9e8cda9b --- /dev/null +++ b/myenv/bin/pip3 @@ -0,0 +1,11 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/pip3.7 b/myenv/bin/pip3.7 new file mode 100755 index 000000000..f9e8cda9b --- /dev/null +++ b/myenv/bin/pip3.7 @@ -0,0 +1,11 @@ +#!/Users/anchaa/Documents/Research/iStacking_code/istacking/myenv/bin/python3.7 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/myenv/bin/python b/myenv/bin/python new file mode 120000 index 000000000..940bee389 --- /dev/null +++ b/myenv/bin/python @@ -0,0 +1 @@ +python3.7 \ No newline at end of file diff --git a/myenv/bin/python3 b/myenv/bin/python3 new file mode 120000 index 000000000..940bee389 --- /dev/null +++ b/myenv/bin/python3 @@ -0,0 +1 @@ +python3.7 \ No newline at end of file diff --git a/myenv/bin/python3.7 b/myenv/bin/python3.7 new file mode 120000 index 000000000..a81f0f9cb --- /dev/null +++ b/myenv/bin/python3.7 @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7 \ No newline at end of file diff --git a/myenv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc b/myenv/lib/python3.7/site-packages/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d630db22644686d14df031280e3b4b9aaadd0202 GIT binary patch literal 333 zcmYk0&q~BF5XO_XY7zJ9MbP4{hi&{<+=WF%@ZiOR?x`R{Y*M#1No$f8)`J(H##idq zlds^(R9Eza`DO-&-!~Vd(I#@L=G%8KuD=hvbIT8vv}% z0frMrB?rj%47Y7#>spv(1xUDqLit10zGJ*0z3$q#eJ)6&%Z^%3I;u%g3&yn}Qj_}% zU}92r+Od-yn(pYp7L$ici^C$FPRX1!Wiwu3$2w0Z$M%VmzkKpPH))oAIFmJN1wX?s M+zcNCUWm8w7aiPRoB#j- literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/easy_install.py b/myenv/lib/python3.7/site-packages/easy_install.py new file mode 100644 index 000000000..d87e98403 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/easy_install.py @@ -0,0 +1,5 @@ +"""Run the EasyInstall command""" + +if __name__ == '__main__': + from setuptools.command.easy_install import main + main() diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/LICENSE.txt b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/LICENSE.txt new file mode 100644 index 000000000..049480f85 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2016 The pip developers (see AUTHORS.txt file) + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/METADATA b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/METADATA new file mode 100644 index 000000000..06f53af90 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/METADATA @@ -0,0 +1,78 @@ +Metadata-Version: 2.1 +Name: pip +Version: 10.0.1 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: python-virtualenv@groups.google.com +License: MIT +Keywords: easy_install distutils setuptools egg virtualenv +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Topic :: Software Development :: Build Tools +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.* +Provides-Extra: testing +Provides-Extra: testing +Requires-Dist: pytest; extra == 'testing' +Requires-Dist: mock; extra == 'testing' +Requires-Dist: pretend; extra == 'testing' +Requires-Dist: scripttest (>=1.3); extra == 'testing' +Requires-Dist: virtualenv (>=1.10); extra == 'testing' +Requires-Dist: freezegun; extra == 'testing' + +pip +=== + +The `PyPA recommended`_ tool for installing Python packages. + +.. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + +.. image:: https://img.shields.io/travis/pypa/pip/master.svg + :target: http://travis-ci.org/pypa/pip + +.. image:: https://img.shields.io/appveyor/ci/pypa/pip.svg + :target: https://ci.appveyor.com/project/pypa/pip/history + +.. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + +* `Installation`_ +* `Documentation`_ +* `Changelog`_ +* `GitHub Page`_ +* `Issue Tracking`_ +* `User mailing list`_ +* `Dev mailing list`_ +* User IRC: #pypa on Freenode. +* Dev IRC: #pypa-dev on Freenode. + +Code of Conduct +--------------- + +Everyone interacting in the pip project's codebases, issue trackers, chat +rooms and mailing lists is expected to follow the `PyPA Code of Conduct`_. + +.. _PyPA recommended: https://packaging.python.org/en/latest/current/ +.. _Installation: https://pip.pypa.io/en/stable/installing.html +.. _Documentation: https://pip.pypa.io/en/stable/ +.. _Changelog: https://pip.pypa.io/en/stable/news.html +.. _GitHub Page: https://github.com/pypa/pip +.. _Issue Tracking: https://github.com/pypa/pip/issues +.. _User mailing list: http://groups.google.com/group/python-virtualenv +.. _Dev mailing list: http://groups.google.com/group/pypa-dev +.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + + diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/RECORD b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/RECORD new file mode 100644 index 000000000..b3ae161fa --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/RECORD @@ -0,0 +1,580 @@ +pip/__init__.py,sha256=IgfvBPgESEvKl_J7zm-RppLOZaMhirh4JiDSZV-HCco,24 +pip/__main__.py,sha256=Rh5KFcZw82ZKcILJdoSeIv_dGdMww0FM1Ocj9zzU2pU,629 +pip/_internal/__init__.py,sha256=h0icMQeJDPEUwN9d0nQDY_lQCygIvI6zvUhOg7h90Zs,8675 +pip/_internal/basecommand.py,sha256=FlXB2xTq725sFwutRcNY3MWARRMmTJ5kM21Wss-Ba8g,14014 +pip/_internal/baseparser.py,sha256=aX6GSSbH7ttoToso0HZg2Dhk1rMUqF5cBA5leEUEqIs,8764 +pip/_internal/build_env.py,sha256=G0PPCOcslQ4b2NriSnBBFQkZUepD4TzJvNPbSNMnv_I,2773 +pip/_internal/cache.py,sha256=gyZxE0dtVBQaWs3vt5eyLPjJF_KPg8mhPqxc8vowjsE,7023 +pip/_internal/cmdoptions.py,sha256=sAalMay3GiDFkIXN_jQb1OChKlFxoySePz_80utMAno,16679 +pip/_internal/compat.py,sha256=T9XXobaTlSnF57r913o1sDTWyMpNJnR7s7GvxgHKJI0,7912 +pip/_internal/configuration.py,sha256=YIcGqy3YEc17PhjaRHoGbQumZsIXW9B1cMYfa3jOOIo,13330 +pip/_internal/download.py,sha256=nFjVi42nF3LmGHBD158uk2724dBDvOh7mLd6ownaxUg,34257 +pip/_internal/exceptions.py,sha256=U8EF9G6z62FA2XINXBe7Yg8yGBcf3CJD92s9VrWx84U,8470 +pip/_internal/index.py,sha256=LZ00_ZTkvMXNbacLY-qMK-eBAP7GI2HB-RLx0fFWGoE,41718 +pip/_internal/locations.py,sha256=bUbACpIX6FL_MTcFn7Vi1Wesxqc5TAnNBLcPXmDr6wc,6504 +pip/_internal/pep425tags.py,sha256=d-MxINADjnVAOLFYbCCDac9g_AruL85uOabDnV840fM,11115 +pip/_internal/resolve.py,sha256=7-UwudentwAU4WPOxXLXNzIIdnMVolvbCOB8IaIEYq8,13939 +pip/_internal/status_codes.py,sha256=Yyjh7KoKMFzRF-kYDVkdWYP0gZaPaSskwwRIuqMHdc4,164 +pip/_internal/wheel.py,sha256=pmdKiG6cKG3pjoQZTc-kA5kwKR56Ioj3Fdnf-R9KM20,31967 +pip/_internal/commands/__init__.py,sha256=m3VffLjVOXGIR6utX9NXPxAHFzbYgH05IV01-zBlw8o,2297 +pip/_internal/commands/check.py,sha256=J3lbjbwgMUS4dDsLnvDA4bJwtnAO-BDy2UA3qLXQPb4,1500 +pip/_internal/commands/completion.py,sha256=wR1ZRBgHA1S7KnJWR6kGFL-Y1FnO1K0Xf_XBF3wUm_E,3018 +pip/_internal/commands/configuration.py,sha256=BfeZEMSHgD4l754I2V00hS8ReEdutEGMcQaWKdtz2c0,7343 +pip/_internal/commands/download.py,sha256=RLkyWbc9uw1iLGlR5KGPXgKXb1Wz6NM3kT9wUeQ89bM,9092 +pip/_internal/commands/freeze.py,sha256=08R8n0lh-ZwD5lASiKJkKTkORFZSIHLvOSRznufWzRg,3320 +pip/_internal/commands/hash.py,sha256=qKoCGvq6KuWrUFB63_1FGy4x2g044irk_ocC7lHafZM,1729 +pip/_internal/commands/help.py,sha256=8frkEwpOOi7owyUIMyxN-r5EQkGxxOvOQ9aMCJmi9KA,1079 +pip/_internal/commands/install.py,sha256=zqmxI_6bfLnwbteGFffqSSzNJxRhSCgVhh__PWFm6yY,20270 +pip/_internal/commands/list.py,sha256=jIlRIPNIcr6gIuBXkyw6RevBlEThmlVW2Tp8kH9UpcM,11957 +pip/_internal/commands/search.py,sha256=DthDK8pP6jZBqCVB9cT6SRzAYMeO3orjLiy_VBQ34g8,4842 +pip/_internal/commands/show.py,sha256=bQvIXwdGv3teH9mDS8xOhsMOi0G5shC5g0ec1Jen4GU,6378 +pip/_internal/commands/uninstall.py,sha256=0kFt2ShaTEFGmtbbOId9HKzXOI2645rS8y8YK_3Pmq0,2786 +pip/_internal/commands/wheel.py,sha256=hWfSsII65HD3ZkjZ8SOPYg2adD5rX241gt2BzcbBDxg,6986 +pip/_internal/models/__init__.py,sha256=h9ecr0egfOgSwbvfj9VBln71JazHbu-uR_sUEYq5K-o,85 +pip/_internal/models/index.py,sha256=lyGdfJJRWktK_yYw7JsDnG7sURh5UJHOmc3Y29qopms,433 +pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/operations/check.py,sha256=X_-sP0QUNSknCEUqmKI2ZMfO1L9Igi6m24_V2H64zqU,3776 +pip/_internal/operations/freeze.py,sha256=myl8xl9SwJowX-fUYjeP2vQ7y1Y7bWoNM9U0g46AATI,10277 +pip/_internal/operations/prepare.py,sha256=7-7iMRirq4PU9e5JFLPfRZ-S2Ns0lAPjRo63VDil7dM,15496 +pip/_internal/req/__init__.py,sha256=r8dLbzoGMf-kLQVmZD8w7Ekh7Qh8tbZMNsSQnk_agrg,2152 +pip/_internal/req/req_file.py,sha256=TkrIqOaMok_8tNs3HPSDVmBW-Awdpj7mBhGlsRHIByA,12248 +pip/_internal/req/req_install.py,sha256=jmPY2CB2dpkVWdl3ucTajTfIJBOMe80SeGZJju3qzLs,43930 +pip/_internal/req/req_set.py,sha256=c-STvuL06rzHqOMJOovMinuWeT-7XZnl1XtdbSAi_6E,7268 +pip/_internal/req/req_uninstall.py,sha256=5dOiMppROHiQ5bVO9ydLgOppqLpSpipL22IZvq8mZOk,17002 +pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_internal/utils/appdirs.py,sha256=BRHuV2oKQwXqXxKn_mDADgadzDGOXRlL9IWQ8YePds8,9372 +pip/_internal/utils/deprecation.py,sha256=nXr5A3qXJw9qw40zHd3sPqAEeuk1pNM7ujmjU_GA0ZM,2374 +pip/_internal/utils/encoding.py,sha256=w-LGqMBuaXKmbiyfjrvkZPRlRMrcOwHwawcX4cUmZWA,1058 +pip/_internal/utils/filesystem.py,sha256=_8Es0meQBRDb_56ViTGlHucXOhsXJh8J38QJglgm9Gg,937 +pip/_internal/utils/glibc.py,sha256=TkIgCmg4VaYiN1764-9YBAPKOaHZyRTclwI-rYnx3VE,3088 +pip/_internal/utils/hashes.py,sha256=fvTpLRakvChw5UbYerszdg3KK0KImwQWddZAHDmhnFI,2994 +pip/_internal/utils/logging.py,sha256=5exO6tVvea_EsPk-SN6lawgbpmXopJDecYnt5AonGWs,3586 +pip/_internal/utils/misc.py,sha256=VwQjWHOAA9MuD_dFQZ35TorMs7iNep1W68IURqyAsJQ,28053 +pip/_internal/utils/outdated.py,sha256=4Gk5M1ciDGSW-teJe2sSO5bk_eGMLTR7YipX47-wllU,5951 +pip/_internal/utils/packaging.py,sha256=EqCvwBiNqWvqNIbMYsOXKVCQWShjREN1ugQJFuJtMsk,2347 +pip/_internal/utils/setuptools_build.py,sha256=HeJI9JPWldoZ8aznrqUDM8yajM6Cb4lWcP5a1-ITlZY,286 +pip/_internal/utils/temp_dir.py,sha256=QQIQxk2JtywkkzIWZl6AgerRzBS8avWCrgqoNw3ZvzE,2697 +pip/_internal/utils/typing.py,sha256=Qbt5MzIla2cXbfiqkgevVtj9iICLkG2Km_wVFUcdeGo,1144 +pip/_internal/utils/ui.py,sha256=YejN0-Wnw-Wxrcncfuroo8gxzQxZ8D8UR-Yw3kM9ebY,14058 +pip/_internal/vcs/__init__.py,sha256=DuVrznP2Byzvn-MQfJFMJq6J8wbO13djSGtl17CCUIw,15755 +pip/_internal/vcs/bazaar.py,sha256=ns_yLoGvxfjZGLPB9EnduES29HgkdIUpD0PumZFFrys,3848 +pip/_internal/vcs/git.py,sha256=wltK2rdQgmAH2fOLIYlZJKG020vkV_51E9-XoTxi_GU,11743 +pip/_internal/vcs/mercurial.py,sha256=QLDVwNNqZBmFUehgqdnkmHXYuS1uM4Y-BhwIN-NZKxA,3708 +pip/_internal/vcs/subversion.py,sha256=yDl4-9akhvT5vOikcyLIrG-id7dNu175slw8nlKNjaA,9826 +pip/_vendor/__init__.py,sha256=WzUY8TjsL8huF2bvDmJ0jJaZZqHYFWBR59W-jIMhmZY,4841 +pip/_vendor/appdirs.py,sha256=FP--W5qMHqF69_aVHkK86rahEMqjx9bGMthBtop4o7Q,25151 +pip/_vendor/distro.py,sha256=3629Gq_vpInTGR9r3JOFYZe0NNXIYLR36EB1r7KKZWo,40565 +pip/_vendor/ipaddress.py,sha256=pQLwJp-Y6fejIsVhu4AtzGb0sWT9VQ3IJ6CVHc0xiLQ,82271 +pip/_vendor/pyparsing.py,sha256=lVzkkak4qOnUwe9UdXqAh38yMKQ_JJir3cyvWC3-4Co,231068 +pip/_vendor/retrying.py,sha256=LfbAQSee7r9F4SHbBcI1OBu7OLSDDr04Qsw9zkuC0Jw,10239 +pip/_vendor/six.py,sha256=AlC1P9p2M-P18p0YMxuf2K9ZUOJDlDTV7XOT4j-UdE0,31779 +pip/_vendor/cachecontrol/__init__.py,sha256=uceTzGAT6-yqquMtT1VM0v442Oepfjh3UayG2elwiTA,313 +pip/_vendor/cachecontrol/_cmd.py,sha256=wmV963nAqd798iZV4mAOFVflVMb24PQyor7yaUY18-8,1380 +pip/_vendor/cachecontrol/adapter.py,sha256=mjwrhPJ93xdX71vrNfbvuQ1qHMsuU6moqw6z6l7USrw,5156 +pip/_vendor/cachecontrol/cache.py,sha256=zoR7ySiJAw1fErdOCFAiMXTT8Ym4_w-qYd5sxmWbgIM,829 +pip/_vendor/cachecontrol/compat.py,sha256=3BisP29GBHAo0QxUrbpBsMeXSp8YzKQcGHwEW7VYU2U,724 +pip/_vendor/cachecontrol/controller.py,sha256=kPPbgL2TSCSX8D9PNKpKaRpYiBobf3e4GtICbPHKnM4,14232 +pip/_vendor/cachecontrol/filewrapper.py,sha256=VHFoFNSCKbMSYMEoFqzq2Fb1QJ--n8S-zf2vPHIm4z0,2609 +pip/_vendor/cachecontrol/heuristics.py,sha256=ZVGTWaBSoERb4v7b7_72RCdWgcJ2NhH-8UJxKWuWQL8,4282 +pip/_vendor/cachecontrol/serialize.py,sha256=tENdPZInXRYmFwtmMg80WKTTTfhqYQSBogHzwPfbCnM,7249 +pip/_vendor/cachecontrol/wrapper.py,sha256=T0xfnMREVtxouHnjZ3Tutgni3dh7KZUwkCgF5lnxVqM,781 +pip/_vendor/cachecontrol/caches/__init__.py,sha256=rN8Ox5dd2ucPtgkybgz77XfTTUL4HFTO2-n2ACK2q3E,88 +pip/_vendor/cachecontrol/caches/file_cache.py,sha256=XQ9Jx6toKoWVyvX8gVQy2TO_RaxBZ84lItIcaxgUeBA,4202 +pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=KhAFz-jv40vlQz8wOJFjH_4ZkOCGZ57ltrS6a55V30Y,1145 +pip/_vendor/certifi/__init__.py,sha256=y0h3xfIlqLlYBlOUNZX0VVt8Kim1ZOLnNjjnW5TsLVI,66 +pip/_vendor/certifi/__main__.py,sha256=1KEP4dm8_1Xrt08ozOzq9-Ibu3vRX4Ix5qJhUphBz_8,43 +pip/_vendor/certifi/cacert.pem,sha256=7CEXfLHxDwvDpwVu0y_2lfJYk63cU-KUKI_DL1Lq8Uo,271088 +pip/_vendor/certifi/core.py,sha256=ZwgmmJFMPi1askRkL5S7Rt4SvZnK34AQDItgsuVDHaY,873 +pip/_vendor/chardet/__init__.py,sha256=4IALi1GamO36WXX5HGuw8nq5kZAUvbbz_mfZ3o4Vi6Q,1598 +pip/_vendor/chardet/big5freq.py,sha256=dwRzRlsGp3Zgr1JQSSSwnxvyaZ7_q-5kuPfCVMuy4to,31640 +pip/_vendor/chardet/big5prober.py,sha256=TpmdoNfRtnQ7x9Q_p-a1CHaG-ok2mbisN5e9UHAtOiY,1804 +pip/_vendor/chardet/chardistribution.py,sha256=NzboAhfS6GODy_Tp6BkmUOL4NuxwTVfdVFcKA9bdUAo,9644 +pip/_vendor/chardet/charsetgroupprober.py,sha256=ft0AbLXJbzf4H8ZFQGs9JruhyIYNbcCayiOKt7keX4U,3893 +pip/_vendor/chardet/charsetprober.py,sha256=kk5-m0VdjqzbEhPRkBZ386R3fBQo3DxsBrdL-WFyk1o,5255 +pip/_vendor/chardet/codingstatemachine.py,sha256=qz9ZwK1q4mZ4s4zDRbyXu5KaGunYbk7g1Z7fqfb4mA4,3678 +pip/_vendor/chardet/compat.py,sha256=fzrojuU_eJuG1DGfZUqZC0H-13rCKdB0Dp4Msry45Kk,1168 +pip/_vendor/chardet/cp949prober.py,sha256=5NnMVUcel3jDY3w8ljD0cXyj2lcrvdagxOVE1jxl7xc,1904 +pip/_vendor/chardet/enums.py,sha256=3H_EIVP-VUYOdKqe2xmYdyooEDSLqS8sACMbn_3oejU,1737 +pip/_vendor/chardet/escprober.py,sha256=5MrTnVtZGEt3ssnY-lOXmOo3JY-CIqz9ruG3KjDpkbY,4051 +pip/_vendor/chardet/escsm.py,sha256=xQbwmM3Ieuskg-Aohyc6-bSfg3vsY0tx2TEKLDoVZGg,10756 +pip/_vendor/chardet/eucjpprober.py,sha256=PHumemJS19xMhDR4xPrsvxMfyBfsb297kVWmYz6zgy8,3841 +pip/_vendor/chardet/euckrfreq.py,sha256=MrLrIWMtlaDI0LYt-MM3MougBbLtSWHs6kvZx0VasIM,13741 +pip/_vendor/chardet/euckrprober.py,sha256=VbiOn7_id7mL9Q5GdeV0Ze3w5fG0nRCpUkEzeR-bnnY,1795 +pip/_vendor/chardet/euctwfreq.py,sha256=ZPBIHZDwNknGf7m6r4xGH8bX0W38qBpnTwVVv1QHw_M,32008 +pip/_vendor/chardet/euctwprober.py,sha256=hlUyGKUxzOPfBxCcyUcvRZSxgkLuvRoDU9wejp6YMiM,1793 +pip/_vendor/chardet/gb2312freq.py,sha256=aLHs-2GS8vmSM2ljyoWWgeVq_xRRcS_gN7ykpIiV43A,20998 +pip/_vendor/chardet/gb2312prober.py,sha256=msVbrDFcrJRE_XvsyETiqbTGfvdFhVIEZ2zBd-OENaE,1800 +pip/_vendor/chardet/hebrewprober.py,sha256=r81LqgKb24ZbvOmfi95MzItUxx7bkrjJR1ppkj5rvZw,14130 +pip/_vendor/chardet/jisfreq.py,sha256=vrqCR4CmwownBVXJ3Hh_gsfiDnIHOELbcNmTyC6Jx3w,26102 +pip/_vendor/chardet/jpcntx.py,sha256=Cn4cypo2y8CpqCan-zsdfYdEgXkRCnsqQoYaCu6FRjI,19876 +pip/_vendor/chardet/langbulgarianmodel.py,sha256=5lclhylDVAOLeJHlnOm69zrxCLkyDMjQIQU6VBQZDXM,13067 +pip/_vendor/chardet/langcyrillicmodel.py,sha256=UrFtQKuen6p_BkTB--vJ0gL70i0I68heaU7dyvocIBo,18281 +pip/_vendor/chardet/langgreekmodel.py,sha256=qC6d4lhMPrMvg0-4jJjcbq4mAITzg13nTcQcSHPgNLQ,12913 +pip/_vendor/chardet/langhebrewmodel.py,sha256=NOVTSRijKrUxo-n5Ums6HIbnG0rVP6cz6DfgqQ8x5JY,11545 +pip/_vendor/chardet/langhungarianmodel.py,sha256=ODhhGyhBUyB-Idb-PPKMdOx8j6D-i08Uih3tUMCGYEU,12817 +pip/_vendor/chardet/langthaimodel.py,sha256=konL5O3RkhYg8eP__wo2KS_8b5xW-NSkC2YKrHdEyoA,11489 +pip/_vendor/chardet/langturkishmodel.py,sha256=zuXKW-cDnX07Pfxe_uGDg4GRW2atWo0-Y3S9gLW5tJs,11295 +pip/_vendor/chardet/latin1prober.py,sha256=s1SFkEFY2NGe2_9bgX2MhOmyM_U_qSd_jVSdkdSgZxs,5515 +pip/_vendor/chardet/mbcharsetprober.py,sha256=hzFVD-brxTAVLnTAkDqa1ztd6RwGGwb5oAdvhj1-lE8,3504 +pip/_vendor/chardet/mbcsgroupprober.py,sha256=DlT-X7KRUl5y3SWJNqF1NXqvkjVc47jPKjJ2j4KVs3A,2066 +pip/_vendor/chardet/mbcssm.py,sha256=LGUDh1VB61rWsZB4QlJBzaCjI2PUEUgbBc91gPlX4DQ,26053 +pip/_vendor/chardet/sbcharsetprober.py,sha256=Mo5ei_pFbGUi2iU_mu_z7nhvoT57BAz4ArB2sU-5Brc,5789 +pip/_vendor/chardet/sbcsgroupprober.py,sha256=8QJNorUc5Kf7qY5kA0wFx6VjehbF9czir_YwqnPAFKM,3619 +pip/_vendor/chardet/sjisprober.py,sha256=1WGev_SSHpa7AVXmM0DIONl1OvyKc8mdydUNaKtGGNI,3866 +pip/_vendor/chardet/universaldetector.py,sha256=QWmEZZ5YGLjgW0IHL99GH8sAz0-Ss0_hlMZvaiyWVdY,12771 +pip/_vendor/chardet/utf8prober.py,sha256=rGwn69WfIvmibp0sWvYuH_TPoXs7zzwKHTX79Ojbr9o,2848 +pip/_vendor/chardet/version.py,sha256=tlfcQ3YlTcJAVNI1yBvSZRc0x89mVEBc3KzvRNlNLYU,251 +pip/_vendor/chardet/cli/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2 +pip/_vendor/chardet/cli/chardetect.py,sha256=jRgVc5dO4Q1XEu8U4hW1JgF7jSMpKpFSbcNUerja-tc,2859 +pip/_vendor/colorama/__init__.py,sha256=whcPsYXKzF0-MPCAz-vZ6Zd47N3WsHRyiAL1fKXqywk,247 +pip/_vendor/colorama/ansi.py,sha256=ch3DG2AkcsfuoL9pbb2wWbDSPa9XKdJOG2hcvWlcoRo,2626 +pip/_vendor/colorama/ansitowin32.py,sha256=JPr6ygKbsdEf6kiD451CKNmsCv5mynro0wvqx3MVEdE,9904 +pip/_vendor/colorama/initialise.py,sha256=RoreuRuUDL2tOM_9lgS2jCwTe_7MJgivNnKBqSqOWH8,1999 +pip/_vendor/colorama/win32.py,sha256=VKw0bstCPxo8cuzuzqd8rwcSAqsg-XGTQhjQ-i2yLYg,5582 +pip/_vendor/colorama/winterm.py,sha256=HLWnoOYgZoV0k3ierZVLjalxIAnnKRZOpMYdnw1mJyY,6452 +pip/_vendor/distlib/__init__.py,sha256=qqL7IwXhPX99TEn0ZZViD-qGbtWQt6tQMEvHAvEZnp4,604 +pip/_vendor/distlib/compat.py,sha256=bt1NmKYnjqXNL1H7wZvQvxa6un7bNkzGaWAL20zTNeg,42524 +pip/_vendor/distlib/database.py,sha256=YM136SthxK27i3BnN7lZnGz9ojYbE-fpbb0XPO60PBY,52204 +pip/_vendor/distlib/index.py,sha256=e7NL77TofD_nGakAUpuGEYBZ0mQrIFCwlk6O9NYNGgc,21589 +pip/_vendor/distlib/locators.py,sha256=SbcWC4i_dMZdsyd6bkJJxrK4LyEvGnLWGOoqIe_EX0Y,52949 +pip/_vendor/distlib/manifest.py,sha256=0TlGw5ZyFp8wxr_GJz7tAAXGYwUJvceMIOsh9ydAXpM,15204 +pip/_vendor/distlib/markers.py,sha256=k4Fx6LHfaIaX1eOIoaWK_-o-zE8zoT5rXwb6mbnLoXk,4518 +pip/_vendor/distlib/metadata.py,sha256=3UhLlEcPqM04S0V8ErkpB-BtB9y9KRzo9Y7wOJ0gN8g,41077 +pip/_vendor/distlib/resources.py,sha256=5Xn4ehSMQKsu6kf4gxIsMvy668RRvtL0XwUPytyviPE,11121 +pip/_vendor/distlib/scripts.py,sha256=HQWiNeLsOTvlPV_oXYWWEmcYkB2JWUfd_uvFwsdUs0E,17000 +pip/_vendor/distlib/t32.exe,sha256=ftub1bsSPUCOnBn-eCtcarKTk0N0CBEP53BumkIxWJE,92672 +pip/_vendor/distlib/t64.exe,sha256=iChOG627LWTHY8-jzSwlo9SYU5a-0JHwQu4AqDz8I68,102400 +pip/_vendor/distlib/util.py,sha256=001EgqgtSL4OyKcBUEuXw2MHWhvywa-dok37oco2meE,61249 +pip/_vendor/distlib/version.py,sha256=tFjbWEAxyeCDw0dWQDJsWsu9EzegUI5Yhm3IBu2x8hY,24127 +pip/_vendor/distlib/w32.exe,sha256=NPYPpt7PIjVqABEu1CzabbDyHHkJpuw-_qZq_48H0j0,89088 +pip/_vendor/distlib/w64.exe,sha256=Yb-qr1OQEzL8KRGTk-XHUZDwMSljfQeZnVoTk-K4e7E,99328 +pip/_vendor/distlib/wheel.py,sha256=UjFZFgLgwR93x2w94eT5sdE0RlFysONrqTxxEabvAaA,40490 +pip/_vendor/distlib/_backport/__init__.py,sha256=XkACqtjaFfFn1QQBFDNxSqhMva0LqXeeh6H3fVwwLQ4,280 +pip/_vendor/distlib/_backport/misc.py,sha256=focjmI7975W3LgEtiNC99lvxohfZdsNSLTakOcPNShs,1012 +pip/_vendor/distlib/_backport/shutil.py,sha256=5fh9dIYeC0kn_dJ0aPmf9LD-KBIrb5Ls8BLvpEQFanY,26408 +pip/_vendor/distlib/_backport/sysconfig.cfg,sha256=LoipPkR2PfCKC7JUQBGxp6OFVlWIiWBXT-rNuzv8acU,2701 +pip/_vendor/distlib/_backport/sysconfig.py,sha256=Aim_2sc3NKNpn2jhcs11eYutzCaHoP0mprxZRw7901Q,27752 +pip/_vendor/distlib/_backport/tarfile.py,sha256=fzwGLsCdTmO8uzoHjyjSgu4-srrDQEAcw4jNKUfvQH0,95235 +pip/_vendor/html5lib/__init__.py,sha256=I6pIlbwpm1kWyTxyN75xY1k39xbQbB9594RG482qMkw,1197 +pip/_vendor/html5lib/_ihatexml.py,sha256=57rnJVn6e6coDPaWi2mPaOx90vZBbeczq2WhvFswNjc,16993 +pip/_vendor/html5lib/_inputstream.py,sha256=FWkYxymJwSdbgvSD30q7A_PUF8Ux9ieL7XrYyNa7JV4,33475 +pip/_vendor/html5lib/_tokenizer.py,sha256=CC6FQW_g5TYQ3x0_Qv7LnX2EN5bDkyCtnbdHRFNpcfI,78301 +pip/_vendor/html5lib/_utils.py,sha256=iDaIb_kEGHMmStFSqI7-VNMWFeJ2M_s5RRDTi0x3xV0,4139 +pip/_vendor/html5lib/constants.py,sha256=mch2PjgQKA1FDLxUsE3hBSnehEiK7CFJqLX90RDoeUM,86465 +pip/_vendor/html5lib/html5parser.py,sha256=a-ma5DCah-z2FAMv5Kitpvv8VTEl2DmfWQMEBhCAN2M,121754 +pip/_vendor/html5lib/serializer.py,sha256=lo3hpkSIelyAIpYUvV9942iVtTBvOBFn44kOY5Aki40,16167 +pip/_vendor/html5lib/_trie/__init__.py,sha256=d3JrXCIMoiedbsVrNTzuc9F1bcuxW3u9Fk2k_vYsqgE,303 +pip/_vendor/html5lib/_trie/_base.py,sha256=zBZ77JleT-kocEBTgqPAsABXr2bWyTMmc-qFfDLh6zM,967 +pip/_vendor/html5lib/_trie/datrie.py,sha256=HqcJwB9Qd0n1GTg2diREOpricdMdGy_x7AEMZ7fZ494,1222 +pip/_vendor/html5lib/_trie/py.py,sha256=LmuYcbypKw-aMLcT0-IY6WewATGzg1QRkmyd8hTBQeY,1842 +pip/_vendor/html5lib/filters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/html5lib/filters/alphabeticalattributes.py,sha256=0TV6VWJzhNkcLFiR7BNZUJsTJgAEEyZ02in6-PuL2gU,948 +pip/_vendor/html5lib/filters/base.py,sha256=6D2t423hbOLtjnvAAOrs1mWX1vsabMLBrWQF67ITPho,298 +pip/_vendor/html5lib/filters/inject_meta_charset.py,sha256=J-W5X3LyosH1sUipiHU1x-2ocd7g9JSudpIek_QlCUU,3018 +pip/_vendor/html5lib/filters/lint.py,sha256=O6sK29HXXW02Nv-EIEOfGvdQMuXxWvBePu2sQ2ecbJc,3736 +pip/_vendor/html5lib/filters/optionaltags.py,sha256=IVHcJ35kr6_MYBqahFMIK-Gel-ALLUk6Wk9X-or_yXk,10795 +pip/_vendor/html5lib/filters/sanitizer.py,sha256=UKpPV0sataiAlCrJqhO_nsVJklP95_ZeV9F-NWFhJl8,27144 +pip/_vendor/html5lib/filters/whitespace.py,sha256=bCC0mMQZicbq8HCg67pip_oScN5Fz_KkkvldfE137Kw,1252 +pip/_vendor/html5lib/treeadapters/__init__.py,sha256=76InX2oJAx-C4rGAJziZsoE_CHI8_3thl6TeMgP-ypk,709 +pip/_vendor/html5lib/treeadapters/genshi.py,sha256=nQHNa4Hu0IMpu4bqHbJJS3_Cd1pKXgDO1pgMZ6gADDg,1769 +pip/_vendor/html5lib/treeadapters/sax.py,sha256=PAmV6NG9BSpfMHUY72bDbXwAe6Q2tPn1BC2yAD-K1G0,1826 +pip/_vendor/html5lib/treebuilders/__init__.py,sha256=zfrXDjeqDo2M7cJFax6hRJs70Az4pfHFiZbuLOZ9YE4,3680 +pip/_vendor/html5lib/treebuilders/base.py,sha256=0eFyXVYMz-T5N2CvlteLdu9oFi8Vr_fzHh_sVlf1bn0,14996 +pip/_vendor/html5lib/treebuilders/dom.py,sha256=t8MSFOSsFZwZuBpziGKBb-lmiqOUHXoAZx35qG4mG7Q,9071 +pip/_vendor/html5lib/treebuilders/etree.py,sha256=7h-CRMmkQ4V2jlcJvPYfBFeYyBZ1zViTxyqyZ7isu5Y,13104 +pip/_vendor/html5lib/treebuilders/etree_lxml.py,sha256=umqJTOUZWm7r0s-YtD5q6SkSqx0GobwVKQoVQf9OYaQ,14488 +pip/_vendor/html5lib/treewalkers/__init__.py,sha256=GmI7wgPftMdv1QD7zgnQ9B7Gl-uq6hwE4A79zkxj7gw,5868 +pip/_vendor/html5lib/treewalkers/base.py,sha256=g-cLq7VStBtpZZZ1v_Tbwp3GhJjQ2oG5njgeHVhAaXE,7728 +pip/_vendor/html5lib/treewalkers/dom.py,sha256=fBJht3gn5a6y1WN2KE9gsUru158yTQ0KikT3vOM7Xc4,1456 +pip/_vendor/html5lib/treewalkers/etree.py,sha256=VuzZ0UoL2bBvTqhsFIDzUUaZ4zVtm5TLpA2YZXjeoJE,4680 +pip/_vendor/html5lib/treewalkers/etree_lxml.py,sha256=tfNrv3kswPqAaggOB-2dlb-1qCwtUIR80gNDrysrQYI,6522 +pip/_vendor/html5lib/treewalkers/genshi.py,sha256=P_2Tnc2GkbWJfuodXN9oYIg6kN9E26aWXXe9iL0_eX4,2378 +pip/_vendor/idna/__init__.py,sha256=_0n4R0OXufy1HIcXEOxgJCUCHGDqtazhMdYBVIXc320,60 +pip/_vendor/idna/codec.py,sha256=NDQdy95NUcd00WV5Qh0QOpZvYJzIpaMVb9ME0hKuQ80,3417 +pip/_vendor/idna/compat.py,sha256=QPaSi9bWqUO7OAXmC0brJFYc1zweHI3JnA7HiM2BlQA,244 +pip/_vendor/idna/core.py,sha256=h71HqE4Uatoa0tuv4ZLcGQkGsiio2YFM5eMoFP49Ucw,11777 +pip/_vendor/idna/idnadata.py,sha256=QzJoJWVfKZz9lmbSL352eQ-aAz8wWV1Mmle_xpHWwQo,34584 +pip/_vendor/idna/intranges.py,sha256=K5VTgP3Cn6UOQwinqj0O2stySFQoTb8xrLFKyg-hulg,1802 +pip/_vendor/idna/package_data.py,sha256=8oZdkdEfFSvy0GFwp7FEW2c8LYizacCoMxJ1kOfiaK4,23 +pip/_vendor/idna/uts46data.py,sha256=NiMrqRILhA-TY24j9FSrKHTbAImnH6XNYjr3e3CuK28,192578 +pip/_vendor/lockfile/__init__.py,sha256=0L3coX3n75LdlVoaqx7miFcPQu8QkK96tNBj3l3G0To,9718 +pip/_vendor/lockfile/linklockfile.py,sha256=KSuiHUZTLHZA21uINfNp6u3hmf2oPbZICJqMtBE5psQ,2725 +pip/_vendor/lockfile/mkdirlockfile.py,sha256=fhUNnWvRrWFuUoFTAR_u6rKUPD3LcnC8gsNAVPOuP_A,3180 +pip/_vendor/lockfile/pidlockfile.py,sha256=T4s8zw9w50AcRIP24iNQDMW72lqwOemY3WjzxObi3RU,6280 +pip/_vendor/lockfile/sqlitelockfile.py,sha256=EsQuCc7jY2OkxH_VtTcVvMmh0WqM4t5THW8YTAKwMQE,5662 +pip/_vendor/lockfile/symlinklockfile.py,sha256=z1OZoyjGaSRhHdvY1P3fnFJnMMzlAkVUqtuMXS9r-58,2686 +pip/_vendor/msgpack/__init__.py,sha256=zR7vdPYrBXCdepgdVJ2QfmRZRSIY6mSgWR80n69hDas,1743 +pip/_vendor/msgpack/_version.py,sha256=POm-iSTNxNW5sad41qA2730FUnysX8YK355itzer7W4,21 +pip/_vendor/msgpack/exceptions.py,sha256=RyRn_K51HUOdHHqj009FJX1GNG53zXXgDJoKP2VHj4I,1097 +pip/_vendor/msgpack/fallback.py,sha256=OBhNyNg9w0WLlohyc-cIOOrkvxtm4yCqqynrRCNZdgY,37388 +pip/_vendor/packaging/__about__.py,sha256=odsXiEJE2jtkyh_shxz3_7OatrWwz-_gIGamccRsga4,741 +pip/_vendor/packaging/__init__.py,sha256=C3OqRc9ZY_RX9Xqn9bEUNGPWZfHYn2jma09g56Vm5zc,527 +pip/_vendor/packaging/_compat.py,sha256=SGlGKDzqD3XlaWy8KpxqFpno7iL89C2DXbbS74KTFtY,890 +pip/_vendor/packaging/_structures.py,sha256=fUkh4B9_x5gvKZ2upn4d6OWyaknJHS5MADtTB6NvxYY,1488 +pip/_vendor/packaging/markers.py,sha256=oWCQ3Gnu_1i2brmgB9IjRuLX7BR0FXW5T4LAVdE590w,8522 +pip/_vendor/packaging/requirements.py,sha256=NjxC5jc8R-REVY9b7wKUVkfEvI6WnHZXUGuA2BX0aNM,4571 +pip/_vendor/packaging/specifiers.py,sha256=IuuvPJWMU5P8BF39wP1YEHqmreWOVT6jpv7ktpAJC6E,28800 +pip/_vendor/packaging/utils.py,sha256=NWMGNYzo1QNuzvCq3aSJrTNvZRya6pWIjwJLbN6OHOI,1643 +pip/_vendor/packaging/version.py,sha256=n1XXikr4f8Qhn60lLZf7IBjdLRXFC3RMCWVSMKdMX1c,12660 +pip/_vendor/pkg_resources/__init__.py,sha256=pHrCKMoBv2wg1sJnvFoA5OLo-Oy8Vy2RWaPzrLUp9vA,106604 +pip/_vendor/pkg_resources/py31compat.py,sha256=Z-1_GSMguagCRvkGzDS-JCl_WVMkKsXss8ZTujmDu7Q,622 +pip/_vendor/progress/__init__.py,sha256=xAeSvVj-sqgxs5EQ9QQrc9Bi8dRSrrgkO9kKH1cU7zc,3315 +pip/_vendor/progress/bar.py,sha256=mTafSoOmjwpjoPbMp1iUGpNb-39esXByST7J2W8VyV4,2924 +pip/_vendor/progress/counter.py,sha256=JAtmG0NSbHwcfUoC6qP_MqfnEcPRgoO-qD1c1PJDIHM,1576 +pip/_vendor/progress/helpers.py,sha256=kzd7NtwigwIqvhYQvtTh8mSQUiFZ0bkIWh0WHJ7fQPY,2945 +pip/_vendor/progress/spinner.py,sha256=yrYKBBsswArohmg7esPBKFiPvGsisEa6DJqrEYYuHuA,1483 +pip/_vendor/pytoml/__init__.py,sha256=PLFK235q-7F9Mmelsr_7IcAIWebDo3W9Hq_T1Vz54KA,95 +pip/_vendor/pytoml/core.py,sha256=W8BqMPwcme5HkPBtxkQz9VJBvhkrELje94Dh1iUfFaI,522 +pip/_vendor/pytoml/parser.py,sha256=awre-bIQXv0-gUYWzHaGO2diB7b3JNoH9ryJR3gh498,10916 +pip/_vendor/pytoml/writer.py,sha256=nf-DAzJl_-rXx2-ElWbUyOqyz5vhe8U1nfVzw9J5N2s,3942 +pip/_vendor/requests/__init__.py,sha256=VaN258Yd3AsoxqDFQPEdD7fbQxWmHJ-QJDKnVpaWBlc,3765 +pip/_vendor/requests/__version__.py,sha256=55GrYwgz00HNchocTGNgu0C45FFSIGvt6bG03JxdI54,450 +pip/_vendor/requests/_internal_utils.py,sha256=zDALdxFfs4pAp4CME_TTw2rGyYR2EGBpSehYHgfn8o0,1138 +pip/_vendor/requests/adapters.py,sha256=v99RMxr14jFWuJDjJx1wFy48QLVyatYVn0h6z_7h9ss,21541 +pip/_vendor/requests/api.py,sha256=MLNvyq433Usebv0qJ3iqPyWw7EaRXvP0AA3EhP69u6Q,6389 +pip/_vendor/requests/auth.py,sha256=oiFJBIY2TLaRS9Q5tqhX864xwSg700d0NqjHe4PXL6M,10021 +pip/_vendor/requests/certs.py,sha256=fFBPJjnP90gWELetFYPbzrsfZgSZopej7XhlkrnVVec,483 +pip/_vendor/requests/compat.py,sha256=RXnp8IWkk9x0WI01rpmDgbRke38K4C2m07gKE3_o-Qo,1943 +pip/_vendor/requests/cookies.py,sha256=RZsnbFuCZbg9_x2kUqG-LxE6ag_o3P7qutTGDPJ2tXY,18750 +pip/_vendor/requests/exceptions.py,sha256=MgjuNuYzlEaQSr0gYcZsrHOQS94DioiN-tNjJetz90g,3237 +pip/_vendor/requests/help.py,sha256=UzahIUhIPZsrHUdN7s7i6npseJyBkFhk14Rniid4yS0,3787 +pip/_vendor/requests/hooks.py,sha256=O6Bq6nBlEOvESY9vNYI8XxPZcr8j7rpW63TaIGYS6ZE,801 +pip/_vendor/requests/models.py,sha256=KcMA_uvBv1ob02OUHZk-HEpbo-G0JUWn6hr9GIs9nbg,35016 +pip/_vendor/requests/packages.py,sha256=ry2VlKGoCDdr8ZJyNCXxDcAF1HfENfmoylCK-_VzXh0,711 +pip/_vendor/requests/sessions.py,sha256=YLbQOFObuQWJ8uJGgncMsYWcBqueRGWqaSxl8qiLK3I,28283 +pip/_vendor/requests/status_codes.py,sha256=qcAG-f5Aty7LBfAIetNch3iSFxy-lHNnpxjK089KwaI,3414 +pip/_vendor/requests/structures.py,sha256=fyd9UjYd61TU-xNlsIzswA6TA0hFbWQz4RLhPnhXwh0,3117 +pip/_vendor/requests/utils.py,sha256=tRCh5BKG0mV_EmRe-9apaMLvP6LLmyZt6KGfpRvmnQY,28556 +pip/_vendor/urllib3/__init__.py,sha256=eUbFXyueA6UDT6UhLW4bKRzwwUMAMij3ngS_-1YyIyk,2950 +pip/_vendor/urllib3/_collections.py,sha256=SOoOxhnf3qV7bjT8euFfaf0XmGG7D9TDMt_0K1WyfKo,10523 +pip/_vendor/urllib3/connection.py,sha256=s5mL_MPFMgVm0p12dmPSEB3k6wNDqJjURvXVBKtAatk,13376 +pip/_vendor/urllib3/connectionpool.py,sha256=FCbqrfrpOwxUGSb1Vb5MT9__t_faupuOzap6RGz2YNY,36263 +pip/_vendor/urllib3/exceptions.py,sha256=Thyo48MhmG_I3N7pYlFklWrScB3BL_JaWqOdE_TTw2w,6849 +pip/_vendor/urllib3/fields.py,sha256=Z4nrtz2cAM-CoOFzeiapbEUhWQb6UF27mLlMZ9ixvjo,6121 +pip/_vendor/urllib3/filepost.py,sha256=LADqnU5Cv7kE-IbXHshOL8w9ELTB9T3v7BTOHPs6Hzk,2415 +pip/_vendor/urllib3/poolmanager.py,sha256=jbIvksgTNHsFsppt7Gc3ONaodf1HbeYgw2hluocBiak,16785 +pip/_vendor/urllib3/request.py,sha256=igm_4K9Pl5m4s4UDTZhykIEiCH1XJjwwCM7utw-pldE,6094 +pip/_vendor/urllib3/response.py,sha256=Au8uQnlOaxnmCDE0xqjGs0c225ctF6A4q9-sh-Fercc,23529 +pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/appengine.py,sha256=kxXiAF8woZVVw4UoeDueqZTzQaFuxZAE9vcUhL2DX3o,11185 +pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=YPml98tDEed6IB4zJinHz9s8Pml_tQwET3MMQQJlMvY,4590 +pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=_eNGwUSOGQ0gH42vKKzbXH6lSNVR0WdlGjw6_CYqW-Q,15826 +pip/_vendor/urllib3/contrib/securetransport.py,sha256=2kMhRPWPSMHW1LMF3cNlP5Bma25ang52aLc5G4Dqsps,31311 +pip/_vendor/urllib3/contrib/socks.py,sha256=TFbwYnvVqcYEQpryNJUE21O58a64wo1eFni2U-AO42A,6383 +pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=lBmVv2L6jPrkcSSB7HZhTdpCKWeabkFbOdPkauPIk0g,18153 +pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=enHnjmNdGsbVIELgK-vYnqVZwnszZE8srZU0_SHf74Y,12405 +pip/_vendor/urllib3/packages/__init__.py,sha256=gKFqcXJ8LRVrzvIrDp1NtEG0C3G5x5k9BDaJy_ZHrWM,114 +pip/_vendor/urllib3/packages/ordered_dict.py,sha256=dbnZZ3wH-RWx9SSvCCmGhIAfUPN6L7C55wYkUC5XA2c,9194 +pip/_vendor/urllib3/packages/six.py,sha256=dCw7sqQpOJ_L3ssF_TrmqYiNnLnnMVOtA4-TAU7eyd0,30966 +pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pip/_vendor/urllib3/packages/backports/makefile.py,sha256=DJvigopntDsoZ8PHUZ7FqjQHEvZOeuX-nKn83oVTwGA,1514 +pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py,sha256=9qJkL_ZBallrIGgSkZ3WWFhBnskjgsHw11o-DXGdua8,707 +pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py,sha256=bmjfWqkCXSfykgrsf6EszPzuu_kI2HMEkijjfwX1yfc,5876 +pip/_vendor/urllib3/util/__init__.py,sha256=aHNNBJDY0LXT8fIJGvaimxo4M1yq87CMLt-pq2tJ5lc,1098 +pip/_vendor/urllib3/util/connection.py,sha256=IkRhyJKTNo0vg6LSjZaH1x9p-mt9_KDMM8Z3ves0p8s,4367 +pip/_vendor/urllib3/util/request.py,sha256=6Z9yV2XHdzb3YK1lVZgEw6PfYcUxtKuHrRmBIFWrfgA,3823 +pip/_vendor/urllib3/util/response.py,sha256=zS8uNkrLuM1vVRsV46i51mfbJG-Y3-wsqQw8EB8EU4c,2424 +pip/_vendor/urllib3/util/retry.py,sha256=ZKskgGn4XAor1ceSOcoGGFumHFXzun38-jUCeEJmI6I,15002 +pip/_vendor/urllib3/util/selectors.py,sha256=ygw9CJs0yChlyVwD40mJ1LIwbNaKpzYo8Vg74vYemgc,21728 +pip/_vendor/urllib3/util/ssl_.py,sha256=sp4YBfpJ7F1TEhnafRmvpc89DVquMGb61WLo3XevcG4,12561 +pip/_vendor/urllib3/util/timeout.py,sha256=aTFA7xp2UHmpAuyHbC5iCySPr4iEc8-YTZvCiad2X0g,9999 +pip/_vendor/urllib3/util/url.py,sha256=lsU39rCqfddTelBSvteq4uT-LI3WtkCEeGS2jqRp08s,6717 +pip/_vendor/urllib3/util/wait.py,sha256=J94ZLK8TURoIWyCinTcqwCU3n-SYzeOZCzI0svttXrY,1491 +pip/_vendor/webencodings/__init__.py,sha256=kG5cBDbIrAtrrdU-h1iSPVYq10ayTFldU1CTRcb1ym4,10921 +pip/_vendor/webencodings/labels.py,sha256=e9gPVTA1XNYalJMVVX7lXvb52Kurc4UdnXFJDPcBXFE,9210 +pip/_vendor/webencodings/mklabels.py,sha256=tyhoDDc-TC6kjJY25Qn5TlsyMs2_IyPf_rfh4L6nSrg,1364 +pip/_vendor/webencodings/tests.py,sha256=7J6TdufKEml8sQSWcYEsl-e73QXtPmsIHF6pPT0sq08,6716 +pip/_vendor/webencodings/x_user_defined.py,sha256=CMn5bx2ccJ4y3Bsqf3xC24bYO4ONC3ZY_lv5vrqhKAY,4632 +pip-10.0.1.dist-info/LICENSE.txt,sha256=vphq0X7zpPm3cGDzp-hfRTuAI4-5iSx9gxQW2xgY2Pc,1110 +pip-10.0.1.dist-info/METADATA,sha256=EzjmH1-bJksGOXBg4G0Im1UADPT2IGcApslzIUSZPkQ,2859 +pip-10.0.1.dist-info/RECORD,, +pip-10.0.1.dist-info/WHEEL,sha256=saUSQBLOUjf5ACZdNkhQ0lB6XrHU-l4vpzxq_W1n_AY,116 +pip-10.0.1.dist-info/entry_points.txt,sha256=VQWeNvELfCZUrbgKimd04NWN7Dh_XRL8uR4dANlO4qQ,98 +pip-10.0.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +../../../bin/pip,sha256=tRPL8LMLps2ROQk2H4yHPZGAw9hrrO-t6G0Lu-oRnPs,277 +../../../bin/pip3,sha256=tRPL8LMLps2ROQk2H4yHPZGAw9hrrO-t6G0Lu-oRnPs,277 +../../../bin/pip3.7,sha256=tRPL8LMLps2ROQk2H4yHPZGAw9hrrO-t6G0Lu-oRnPs,277 +pip-10.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc,, +pip/_internal/utils/__pycache__/logging.cpython-37.pyc,, +pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc,, +pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc,, +pip/_internal/utils/__pycache__/glibc.cpython-37.pyc,, +pip/_internal/utils/__pycache__/outdated.cpython-37.pyc,, +pip/_internal/utils/__pycache__/hashes.cpython-37.pyc,, +pip/_internal/utils/__pycache__/encoding.cpython-37.pyc,, +pip/_internal/utils/__pycache__/typing.cpython-37.pyc,, +pip/_internal/utils/__pycache__/packaging.cpython-37.pyc,, +pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc,, +pip/_internal/utils/__pycache__/ui.cpython-37.pyc,, +pip/_internal/utils/__pycache__/setuptools_build.cpython-37.pyc,, +pip/_internal/utils/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/utils/__pycache__/misc.cpython-37.pyc,, +pip/_internal/models/__pycache__/index.cpython-37.pyc,, +pip/_internal/models/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/__pycache__/build_env.cpython-37.pyc,, +pip/_internal/__pycache__/wheel.cpython-37.pyc,, +pip/_internal/__pycache__/exceptions.cpython-37.pyc,, +pip/_internal/__pycache__/status_codes.cpython-37.pyc,, +pip/_internal/__pycache__/index.cpython-37.pyc,, +pip/_internal/__pycache__/resolve.cpython-37.pyc,, +pip/_internal/__pycache__/download.cpython-37.pyc,, +pip/_internal/__pycache__/locations.cpython-37.pyc,, +pip/_internal/__pycache__/basecommand.cpython-37.pyc,, +pip/_internal/__pycache__/compat.cpython-37.pyc,, +pip/_internal/__pycache__/pep425tags.cpython-37.pyc,, +pip/_internal/__pycache__/cache.cpython-37.pyc,, +pip/_internal/__pycache__/configuration.cpython-37.pyc,, +pip/_internal/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/__pycache__/cmdoptions.cpython-37.pyc,, +pip/_internal/__pycache__/baseparser.cpython-37.pyc,, +pip/_internal/operations/__pycache__/prepare.cpython-37.pyc,, +pip/_internal/operations/__pycache__/check.cpython-37.pyc,, +pip/_internal/operations/__pycache__/freeze.cpython-37.pyc,, +pip/_internal/operations/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_set.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_uninstall.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_install.cpython-37.pyc,, +pip/_internal/req/__pycache__/req_file.cpython-37.pyc,, +pip/_internal/req/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/git.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc,, +pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc,, +pip/_internal/commands/__pycache__/show.cpython-37.pyc,, +pip/_internal/commands/__pycache__/help.cpython-37.pyc,, +pip/_internal/commands/__pycache__/wheel.cpython-37.pyc,, +pip/_internal/commands/__pycache__/completion.cpython-37.pyc,, +pip/_internal/commands/__pycache__/download.cpython-37.pyc,, +pip/_internal/commands/__pycache__/check.cpython-37.pyc,, +pip/_internal/commands/__pycache__/list.cpython-37.pyc,, +pip/_internal/commands/__pycache__/hash.cpython-37.pyc,, +pip/_internal/commands/__pycache__/search.cpython-37.pyc,, +pip/_internal/commands/__pycache__/install.cpython-37.pyc,, +pip/_internal/commands/__pycache__/configuration.cpython-37.pyc,, +pip/_internal/commands/__pycache__/freeze.cpython-37.pyc,, +pip/_internal/commands/__pycache__/uninstall.cpython-37.pyc,, +pip/_internal/commands/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc,, +pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc,, +pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/version.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc,, +pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc,, +pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc,, +pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/bar.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/counter.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc,, +pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc,, +pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/util.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/database.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/version.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/index.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc,, +pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc,, +pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc,, +pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc,, +pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc,, +pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/codec.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/core.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc,, +pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/__pycache__/appdirs.cpython-37.pyc,, +pip/_vendor/__pycache__/ipaddress.cpython-37.pyc,, +pip/_vendor/__pycache__/six.cpython-37.pyc,, +pip/_vendor/__pycache__/retrying.cpython-37.pyc,, +pip/_vendor/__pycache__/distro.cpython-37.pyc,, +pip/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +pip/_vendor/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/help.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/structures.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/certs.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/models.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/compat.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/packages.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/auth.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/utils.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/api.cpython-37.pyc,, +pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc,, +pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc,, +pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc,, +pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc,, +pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/core.cpython-37.pyc,, +pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/selectors.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc,, +pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc,, +pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc,, +pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc,, +pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc,, +pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc,, +pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc,, +pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc,, +pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc,, +pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc,, +pip/__pycache__/__main__.cpython-37.pyc,, +pip/__pycache__/__init__.cpython-37.pyc,, diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL new file mode 100644 index 000000000..0f91e7875 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.31.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/entry_points.txt b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/entry_points.txt new file mode 100644 index 000000000..6b7f48a42 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.6 = pip._internal:main + diff --git a/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip-10.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.7/site-packages/pip/__init__.py b/myenv/lib/python3.7/site-packages/pip/__init__.py new file mode 100644 index 000000000..0a3b85071 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "10.0.1" diff --git a/myenv/lib/python3.7/site-packages/pip/__main__.py b/myenv/lib/python3.7/site-packages/pip/__main__.py new file mode 100644 index 000000000..a128ee35e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/__main__.py @@ -0,0 +1,19 @@ +from __future__ import absolute_import + +import os +import sys + +# If we are running from a wheel, add the wheel to sys.path +# This allows the usage python pip-*.whl/pip install pip-*.whl +if __package__ == '': + # __file__ is pip-*.whl/pip/__main__.py + # first dirname call strips of '/__main__.py', second strips off '/pip' + # Resulting path is the name of the wheel itself + # Add that to sys.path so we can import pip + path = os.path.dirname(os.path.dirname(__file__)) + sys.path.insert(0, path) + +from pip._internal import main as _main # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/myenv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1116f8145d4626426d12c97defdf5855b0acebe5 GIT binary patch literal 206 zcmZ?b<>g`kf~*j+SP3Bg7{q}AMj*ohh>JOZL<&O`LkeRsgCgwC(6Gz`FpiJU d%*!l^kJl@xyv1RYo1apelWGTYXE6{n003{(Ha`FW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59524fa6a35fc27514f5cc4cacdfde8c3e356d29 GIT binary patch literal 458 zcmXv}yH3L}6t$hC4Sj(S;vYJ+;Z@N}2q6YW7CJ>jmRmc;sgoGnsp!m)v?IUdm5EK%oEyOd<3+5-3GY4AOvwG*~0` z#84jXTL0MI!#zwR7Pwwa0gLvixeUco(Mh`yupW)vRmOr{pLIXM-ZP^YFl_xeJurm! zm@IT9YQr!uWTnir_1&-_ytFaKK4Lr^*bc^7ZED3ZR_+O4QKfC5x7v0wmSnjmD>t&C zB<9VwDOV*am}khi@PigFHB-j+C6{B&OT*lTP@$)a8X3Rrk30+e;N}acQ#Wnkmn2g0 z4KXa)5S3(=piJqcP{|_4c&aDm?S|egvD{o;m~6VrmAK3%vsp4voZiT38zRI=Ehp1! l^X|yFZ2a)xSZ-~6S5&kX>>fH*ed3^pVi<>UbOr~==YNl$f*b$< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/__init__.py new file mode 100644 index 000000000..d713b0dc2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/__init__.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +import optparse +import warnings + +import sys + +# 2016-06-17 barry@debian.org: urllib3 1.14 added optional support for socks, +# but if invoked (i.e. imported), it will issue a warning to stderr if socks +# isn't available. requests unconditionally imports urllib3's socks contrib +# module, triggering this warning. The warning breaks DEP-8 tests (because of +# the stderr output) and is just plain annoying in normal usage. I don't want +# to add socks as yet another dependency for pip, nor do I want to allow-stder +# in the DEP-8 tests, so just suppress the warning. pdb tells me this has to +# be done before the import of pip.vcs. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.filterwarnings("ignore", category=DependencyWarning) # noqa + +# We want to inject the use of SecureTransport as early as possible so that any +# references or sessions or what have you are ensured to have it, however we +# only want to do this in the case that we're running on macOS and the linked +# OpenSSL is too old to handle TLSv1.2 +try: + import ssl +except ImportError: + pass +else: + # Checks for OpenSSL 1.0.1 on MacOS + if sys.platform == "darwin" and ssl.OPENSSL_VERSION_NUMBER < 0x1000100f: + try: + from pip._vendor.urllib3.contrib import securetransport + except (ImportError, OSError): + pass + else: + securetransport.inject_into_urllib3() + +from pip import __version__ +from pip._internal import cmdoptions +from pip._internal.exceptions import CommandError, PipError +from pip._internal.utils.misc import get_installed_distributions, get_prog +from pip._internal.utils import deprecation +from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa +from pip._internal.baseparser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import get_summaries, get_similar_commands +from pip._internal.commands import commands_dict +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +def autocomplete(): + """Command and option completion for the main option parser (and options) + and its subcommands (and options). + + Enable by sourcing one of the completion shell scripts (bash, zsh or fish). + """ + # Don't complete if user hasn't sourced bash_completion file. + if 'PIP_AUTO_COMPLETE' not in os.environ: + return + cwords = os.environ['COMP_WORDS'].split()[1:] + cword = int(os.environ['COMP_CWORD']) + try: + current = cwords[cword - 1] + except IndexError: + current = '' + + subcommands = [cmd for cmd, summary in get_summaries()] + options = [] + # subcommand + try: + subcommand_name = [w for w in cwords if w in subcommands][0] + except IndexError: + subcommand_name = None + + parser = create_main_parser() + # subcommand options + if subcommand_name: + # special case: 'help' subcommand has no options + if subcommand_name == 'help': + sys.exit(1) + # special case: list locally installed dists for show and uninstall + should_list_installed = ( + subcommand_name in ['show', 'uninstall'] and + not current.startswith('-') + ) + if should_list_installed: + installed = [] + lc = current.lower() + for dist in get_installed_distributions(local_only=True): + if dist.key.startswith(lc) and dist.key not in cwords[1:]: + installed.append(dist.key) + # if there are no dists installed, fall back to option completion + if installed: + for dist in installed: + print(dist) + sys.exit(1) + + subcommand = commands_dict[subcommand_name]() + + for opt in subcommand.parser.option_list_all: + if opt.help != optparse.SUPPRESS_HELP: + for opt_str in opt._long_opts + opt._short_opts: + options.append((opt_str, opt.nargs)) + + # filter out previously specified options from available options + prev_opts = [x.split('=')[0] for x in cwords[1:cword - 1]] + options = [(x, v) for (x, v) in options if x not in prev_opts] + # filter options by current input + options = [(k, v) for k, v in options if k.startswith(current)] + for option in options: + opt_label = option[0] + # append '=' to options which require args + if option[1] and option[0][:2] == "--": + opt_label += '=' + print(opt_label) + else: + # show main parser options only when necessary + if current.startswith('-') or current.startswith('--'): + opts = [i.option_list for i in parser.option_groups] + opts.append(parser.option_list) + opts = (o for it in opts for o in it) + + for opt in opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def create_main_parser(): + parser_kw = { + 'usage': '\n%prog [options]', + 'add_help_option': False, + 'formatter': UpdatingDefaultsHelpFormatter(), + 'name': 'global', + 'prog': get_prog(), + } + + parser = ConfigOptionParser(**parser_kw) + parser.disable_interspersed_args() + + pip_pkg_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + parser.version = 'pip %s from %s (python %s)' % ( + __version__, pip_pkg_dir, sys.version[:3], + ) + + # add the general options + gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) + parser.add_option_group(gen_opts) + + parser.main = True # so the help formatter knows + + # create command listing for description + command_summaries = get_summaries() + description = [''] + ['%-27s %s' % (i, j) for i, j in command_summaries] + parser.description = '\n'.join(description) + + return parser + + +def parseopts(args): + parser = create_main_parser() + + # Note: parser calls disable_interspersed_args(), so the result of this + # call is to split the initial args into the general options before the + # subcommand and everything else. + # For example: + # args: ['--timeout=5', 'install', '--user', 'INITools'] + # general_options: ['--timeout==5'] + # args_else: ['install', '--user', 'INITools'] + general_options, args_else = parser.parse_args(args) + + # --version + if general_options.version: + sys.stdout.write(parser.version) + sys.stdout.write(os.linesep) + sys.exit() + + # pip || pip help -> print_help() + if not args_else or (args_else[0] == 'help' and len(args_else) == 1): + parser.print_help() + sys.exit() + + # the subcommand name + cmd_name = args_else[0] + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + # all the args without the subcommand + cmd_args = args[:] + cmd_args.remove(cmd_name) + + return cmd_name, cmd_args + + +def check_isolated(args): + isolated = False + + if "--isolated" in args: + isolated = True + + return isolated + + +def main(args=None): + if args is None: + args = sys.argv[1:] + + # Configure our deprecation warnings to be sent through loggers + deprecation.install_warning_logger() + + autocomplete() + + try: + cmd_name, cmd_args = parseopts(args) + except PipError as exc: + sys.stderr.write("ERROR: %s" % exc) + sys.stderr.write(os.linesep) + sys.exit(1) + + # Needed for locale.getpreferredencoding(False) to work + # in pip._internal.utils.encoding.auto_decode + try: + locale.setlocale(locale.LC_ALL, '') + except locale.Error as e: + # setlocale can apparently crash if locale are uninitialized + logger.debug("Ignoring error %s when setting locale", e) + command = commands_dict[cmd_name](isolated=check_isolated(cmd_args)) + return command.main(cmd_args) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8626259155dc33be52554951c0437a76d7156a54 GIT binary patch literal 6200 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 Hfwua;Od$T% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/baseparser.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/baseparser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bd911c6ac98c137b902890de339100239b1fddb GIT binary patch literal 8305 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 bXB6K;K^H*s&mfCef6GSM#J`8GEieBM8F-am literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cmdoptions.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/cmdoptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e193cd0c33cc7852a6201b879cdd3c317f589ae GIT binary patch literal 12713 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 Oy*itA{c4R>EB^&iFMT)w literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/configuration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6143866378719ce6825259e3cf2a0daf481384 GIT binary patch literal 9779 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 Pl3|w2JlJIVZyNs%`%n!Z literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/download.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..758011120bfd583b8e4dce44133ca3c5b2d9c78a GIT binary patch literal 20957 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 am%&r=9>5*VW9if0(eVdKT+=7K=l>6;%1QzN literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f156c650ed5764946aebd1b7c180d7b3c43bd4d6 GIT binary patch literal 10748 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 JZwBq^{{s;kLb?C| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02dd7631b3798d0183901df00a6d50c4b625a03d GIT binary patch literal 30625 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/locations.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9e7427e36d5881a378d23351ad1e51771a18be9b GIT binary patch literal 4248 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6e5822cf926581b0bb17673f5ef31c3e95e7669 GIT binary patch literal 7265 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/resolve.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb7720ea2131934d91d35a03ce15ac58410708f8 GIT binary patch literal 8501 zcmaJ`O>i8?b)LW7o&CXL@k8)Olsu+Gi|Zl)$)*xXVHi@96)UBpX^Ii)EvZI>>0V$K zvop)?Spd7WP^AP`5jv=>^1)}|m}71^_>glBKIJrr9Fkme%vGm+ujgk0m=&O=w`Zn* zUU$Fuz3;vGU}2%5;cxI{?MwNWn)Y9GQ~X(|+{YzuYD2qc59_`9u+eJ_o4uxbR}EXkh2Day*TVL2vA3w|cGwv%^_GUq zy=8S@4_Ah(y;WV~`pG4}cB=O-|DDDftocG?O@8Ib>|JHXXIi)AO>|BBh>v*0c;ru< z$6UtYI0@pY(Ri}M9X5X@%2!ShIiq0Y1kxFC(T~NDGslxoKMuoqU%uaH;F*)eqxF#Q z@z4?c`8W`K$fE==9sGG4P8@|36x@*`?mHg!#3&fg8Hsqn{p2?KZF_=+TuLYIJANGX z!@y5)Bb+EsHq=NMEKYW~*bgLkJm&_B$6FykJLL_BANYJkYa)q-hn7tB-P&-_6;kYR zAp!Ry>z`L#^ptgMiCoF*o{wkO?+m9I@NZeh|qU&aHij#c2iz%&;y@z9qQF zk{w4i?>7DiTA@Ac>S>elzBdjNhV|jL;_rAt)UBkieZXb%ITsSbKM1Mw(6(%Ih${2gcH`McgWmrlf? zdP(eTaj15_y_@5xtkb(((@A^PnbIP0IOrJTm8aBeKfuP06LrkHL9|^qEVQ5W*o!8` z%$W+O6%HxHv`r?l9`x5q9L}bTNxUvGu6PEg_l|yPAL)_;MWQA8Ogl18j8je5 zX3d#4Fn6o+dSZQ}&+x{r%uJNknSru4vryVhLs_S`ZevzQ*_<^{wq{k73$q%^_RL1P zIIE!SBumNi5skINH0-PXu)CU8pi(fMHbh8m7updduA8p7xiz~`PcPxyFqE|YKtge7 zmonY7M}m($!9`l_lcI^VCSmA!pEhAQJal~zDwVc#Wpa0*))=QV9&HPc@nY;rx(KlG zIg~CxuG9{IVVIYtE5UXYlZqB7Mv`>$hvn&}Yx$E4dYdjl*Ok7zr0~L^Wm+LLJiS7S z?h|fsc5d`;E43sK`(hQ1#TpftsJKkUkEpm##p_hOLB%yHUZdhF3K&w|b^Xwj(slny z`(dy-62TtUvbpDpP2ejwN^TCt=GMS<-<9t~f3?T%`0i-$=Wiwbcee*3e7pb7d+%*N z*#thX=PO(n{yXpfB6;r7Lv`V#u%5^ZHx;Pw@r}_$EMfkexFpG?nQgsoRCWAYRRjN2 zEB=k?QejgY#i{$WJM?GcYU273m;4h7D5Eye#cBfOquP-U71al3Vxg>@R8O@d{jzpw z;I1~hm)PVYUuZMqBRp3M2UQ%@Pa3D%p*b@}FKM2%X67kI+13uNWZ_6VtQ>riw4vPA z5qf?3@US{rn^`A|Gwq}U^{<{9)cUFRd}L|K(r!ciQP&P@x;9;fve(?@S>Zsg;A_0`6FJ-?28 z?mU`2`ow`@I>5{%@aM8lXjvZf63_AWydd=8lW#jg;_S!ckO61sGQ==?^4NgbAq*

HR{rhVBu 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/status_codes.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/status_codes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf85307112529d656b78f0ba4d62b4dc6a7449ba GIT binary patch literal 406 zcmXw#TT8<*6oA{VyD&E9gQ!2jJKUM3VIbW1B8>BS^1_^VZWA{xsoyGvE%oK1=dD;mGVY@=N)yUUSY8a9X3=%v6Et2S+O>yE-L##_LW4^L4I4ce4xAS!FQ&HC4aY)L zM_U^pHF8>C@62xG=QLI!j_99{7buNrO>g)#SO>=7UYo-wpeu+PrY X&!Tl3B{(DgUG*odBhXP)d4K)@3>t1O literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..650c2605b73afc3035424c47b69151bb9f146658 GIT binary patch literal 20684 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/basecommand.py b/myenv/lib/python3.7/site-packages/pip/_internal/basecommand.py new file mode 100644 index 000000000..e900928f3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/basecommand.py @@ -0,0 +1,373 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import + +import logging +import logging.config +import optparse +import os +import sys +import warnings + +from pip._internal import cmdoptions +from pip._internal.baseparser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.compat import WINDOWS +from pip._internal.download import PipSession +from pip._internal.exceptions import ( + BadCommand, CommandError, InstallationError, PreviousBuildDirError, + UninstallationError, +) +from pip._internal.index import PackageFinder +from pip._internal.locations import running_under_virtualenv +from pip._internal.req.req_file import parse_requirements +from pip._internal.req.req_install import InstallRequirement +from pip._internal.status_codes import ( + ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +from pip._internal.utils import deprecation +from pip._internal.utils.logging import IndentingFormatter +from pip._internal.utils.misc import get_prog, normalize_path +from pip._internal.utils.outdated import pip_version_check +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional + +__all__ = ['Command'] + +logger = logging.getLogger(__name__) + + +class Command(object): + name = None # type: Optional[str] + usage = None # type: Optional[str] + hidden = False # type: bool + ignore_require_venv = False # type: bool + log_streams = ("ext://sys.stdout", "ext://sys.stderr") + + def __init__(self, isolated=False): + parser_kw = { + 'usage': self.usage, + 'prog': '%s %s' % (get_prog(), self.name), + 'formatter': UpdatingDefaultsHelpFormatter(), + 'add_help_option': False, + 'name': self.name, + 'description': self.__doc__, + 'isolated': isolated, + } + + self.parser = ConfigOptionParser(**parser_kw) + + # Commands should add options to this option group + optgroup_name = '%s Options' % self.name.capitalize() + self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) + + # Add the general options + gen_opts = cmdoptions.make_option_group( + cmdoptions.general_group, + self.parser, + ) + self.parser.add_option_group(gen_opts) + + def _build_session(self, options, retries=None, timeout=None): + session = PipSession( + cache=( + normalize_path(os.path.join(options.cache_dir, "http")) + if options.cache_dir else None + ), + retries=retries if retries is not None else options.retries, + insecure_hosts=options.trusted_hosts, + ) + + # Handle custom ca-bundles from the user + if options.cert: + session.verify = options.cert + + # Handle SSL client certificate + if options.client_cert: + session.cert = options.client_cert + + # Handle timeouts + if options.timeout or timeout: + session.timeout = ( + timeout if timeout is not None else options.timeout + ) + + # Handle configured proxies + if options.proxy: + session.proxies = { + "http": options.proxy, + "https": options.proxy, + } + + # Determine if we can prompt the user for authentication or not + session.auth.prompting = not options.no_input + + return session + + def parse_args(self, args): + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + if self.verbosity >= 1: + level = "DEBUG" + elif self.verbosity == -1: + level = "WARNING" + elif self.verbosity == -2: + level = "ERROR" + elif self.verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + # The root logger should match the "console" level *unless* we + # specified "--log" to send debug logs to a file. + root_level = level + if options.log: + root_level = "DEBUG" + + logger_class = "pip._internal.utils.logging.ColorizedStreamHandler" + handler_class = "pip._internal.utils.logging.BetterRotatingFileHandler" + + logging.config.dictConfig({ + "version": 1, + "disable_existing_loggers": False, + "filters": { + "exclude_warnings": { + "()": "pip._internal.utils.logging.MaxLevelFilter", + "level": logging.WARNING, + }, + }, + "formatters": { + "indent": { + "()": IndentingFormatter, + "format": "%(message)s", + }, + }, + "handlers": { + "console": { + "level": level, + "class": logger_class, + "no_color": options.no_color, + "stream": self.log_streams[0], + "filters": ["exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": logger_class, + "no_color": options.no_color, + "stream": self.log_streams[1], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_class, + "filename": options.log or "/dev/null", + "delay": True, + "formatter": "indent", + }, + }, + "root": { + "level": root_level, + "handlers": list(filter(None, [ + "console", + "console_errors", + "user_log" if options.log else None, + ])), + }, + # Disable any logging besides WARNING unless we have DEBUG level + # logging enabled. These use both pip._vendor and the bare names + # for the case where someone unbundles our libraries. + "loggers": { + name: { + "level": ( + "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + ) + } for name in [ + "pip._vendor", "distlib", "requests", "urllib3" + ] + }, + }) + + if sys.version_info[:2] == (3, 3): + warnings.warn( + "Python 3.3 supported has been deprecated and support for it " + "will be dropped in the future. Please upgrade your Python.", + deprecation.RemovedInPip11Warning, + ) + + # TODO: try to get these passing down from the command? + # without resorting to os.environ to hold these. + + if options.no_input: + os.environ['PIP_NO_INPUT'] = '1' + + if options.exists_action: + os.environ['PIP_EXISTS_ACTION'] = ' '.join(options.exists_action) + + if options.require_venv and not self.ignore_require_venv: + # If a venv is required check if it can really be found + if not running_under_virtualenv(): + logger.critical( + 'Could not find an activated virtualenv (required).' + ) + sys.exit(VIRTUALENV_NOT_FOUND) + + original_root_handlers = set(logging.root.handlers) + + try: + status = self.run(options, args) + # FIXME: all commands should return an exit status + # and when it is done, isinstance is not needed anymore + if isinstance(status, int): + return status + except PreviousBuildDirError as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return PREVIOUS_BUILD_DIR_ERROR + except (InstallationError, UninstallationError, BadCommand) as exc: + logger.critical(str(exc)) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except CommandError as exc: + logger.critical('ERROR: %s', exc) + logger.debug('Exception information:', exc_info=True) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + # Check if we're using the latest version of pip available + if (not options.disable_pip_version_check and not + getattr(options, "no_index", False)): + with self._build_session( + options, + retries=0, + timeout=min(5, options.timeout)) as session: + pip_version_check(session, options) + # Avoid leaking loggers + for handler in set(logging.root.handlers) - original_root_handlers: + # this method benefit from the Logger class internal lock + logging.root.removeHandler(handler) + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, args, options, finder, + session, name, wheel_cache): + """ + Marshal cmd line args into a requirement set. + """ + # NOTE: As a side-effect, options.require_hashes and + # requirement_set.require_hashes may be updated + + for filename in options.constraints: + for req_to_add in parse_requirements( + filename, + constraint=True, finder=finder, options=options, + session=session, wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in args: + req_to_add = InstallRequirement.from_line( + req, None, isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for req in options.editables: + req_to_add = InstallRequirement.from_editable( + req, + isolated=options.isolated_mode, + wheel_cache=wheel_cache + ) + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + + for filename in options.requirements: + for req_to_add in parse_requirements( + filename, + finder=finder, options=options, session=session, + wheel_cache=wheel_cache): + req_to_add.is_direct = True + requirement_set.add_requirement(req_to_add) + # If --require-hashes was a line in a requirements file, tell + # RequirementSet about it: + requirement_set.require_hashes = options.require_hashes + + if not (args or options.editables or options.requirements): + opts = {'name': name} + if options.find_links: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(maybe you meant "pip %(name)s %(links)s"?)' % + dict(opts, links=' '.join(options.find_links))) + else: + raise CommandError( + 'You must give at least one requirement to %(name)s ' + '(see "pip help %(name)s")' % opts) + + # On Windows, any operation modifying pip should be run as: + # python -m pip ... + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + WINDOWS and + requirement_set.has_requirement("pip") and + os.path.basename(sys.argv[0]).startswith("pip") + ) + if should_show_use_python_msg: + new_command = [ + sys.executable, "-m", "pip" + ] + sys.argv[1:] + raise CommandError( + 'To modify pip, please run the following command:\n{}' + .format(" ".join(new_command)) + ) + + def _build_package_finder(self, options, session, + platform=None, python_versions=None, + abi=None, implementation=None): + """ + Create a package finder appropriate to this requirement command. + """ + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + return PackageFinder( + find_links=options.find_links, + format_control=options.format_control, + index_urls=index_urls, + trusted_hosts=options.trusted_hosts, + allow_all_prereleases=options.pre, + process_dependency_links=options.process_dependency_links, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + ) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/baseparser.py b/myenv/lib/python3.7/site-packages/pip/_internal/baseparser.py new file mode 100644 index 000000000..ed28a1b95 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/baseparser.py @@ -0,0 +1,240 @@ +"""Base option parser setup""" +from __future__ import absolute_import + +import logging +import optparse +import sys +import textwrap +from distutils.util import strtobool + +from pip._vendor.six import string_types + +from pip._internal.compat import get_terminal_size +from pip._internal.configuration import Configuration, ConfigurationError + +logger = logging.getLogger(__name__) + + +class PrettyHelpFormatter(optparse.IndentedHelpFormatter): + """A prettier/less verbose help formatter for optparse.""" + + def __init__(self, *args, **kwargs): + # help position must be aligned with __init__.parseopts.description + kwargs['max_help_position'] = 30 + kwargs['indent_increment'] = 1 + kwargs['width'] = get_terminal_size()[0] - 2 + optparse.IndentedHelpFormatter.__init__(self, *args, **kwargs) + + def format_option_strings(self, option): + return self._format_option_strings(option, ' <%s>', ', ') + + def _format_option_strings(self, option, mvarfmt=' <%s>', optsep=', '): + """ + Return a comma-separated list of option strings and metavars. + + :param option: tuple of (short opt, long opt), e.g: ('-f', '--format') + :param mvarfmt: metavar format string - evaluated as mvarfmt % metavar + :param optsep: separator + """ + opts = [] + + if option._short_opts: + opts.append(option._short_opts[0]) + if option._long_opts: + opts.append(option._long_opts[0]) + if len(opts) > 1: + opts.insert(1, optsep) + + if option.takes_value(): + metavar = option.metavar or option.dest.lower() + opts.append(mvarfmt % metavar.lower()) + + return ''.join(opts) + + def format_heading(self, heading): + if heading == 'Options': + return '' + return heading + ':\n' + + def format_usage(self, usage): + """ + Ensure there is only one newline between usage and the first heading + if there is no description. + """ + msg = '\nUsage: %s\n' % self.indent_lines(textwrap.dedent(usage), " ") + return msg + + def format_description(self, description): + # leave full control over description to us + if description: + if hasattr(self.parser, 'main'): + label = 'Commands' + else: + label = 'Description' + # some doc strings have initial newlines, some don't + description = description.lstrip('\n') + # some doc strings have final newlines and spaces, some don't + description = description.rstrip() + # dedent, then reindent + description = self.indent_lines(textwrap.dedent(description), " ") + description = '%s:\n%s\n' % (label, description) + return description + else: + return '' + + def format_epilog(self, epilog): + # leave full control over epilog to us + if epilog: + return epilog + else: + return '' + + def indent_lines(self, text, indent): + new_lines = [indent + line for line in text.split('\n')] + return "\n".join(new_lines) + + +class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): + """Custom help formatter for use in ConfigOptionParser. + + This is updates the defaults before expanding them, allowing + them to show up correctly in the help listing. + """ + + def expand_default(self, option): + if self.parser is not None: + self.parser._update_defaults(self.parser.defaults) + return optparse.IndentedHelpFormatter.expand_default(self, option) + + +class CustomOptionParser(optparse.OptionParser): + + def insert_option_group(self, idx, *args, **kwargs): + """Insert an OptionGroup at a given position.""" + group = self.add_option_group(*args, **kwargs) + + self.option_groups.pop() + self.option_groups.insert(idx, group) + + return group + + @property + def option_list_all(self): + """Get a list of all options, including those in option groups.""" + res = self.option_list[:] + for i in self.option_groups: + res.extend(i.option_list) + + return res + + +class ConfigOptionParser(CustomOptionParser): + """Custom option parser which updates its defaults by checking the + configuration files and environmental variables""" + + def __init__(self, *args, **kwargs): + self.name = kwargs.pop('name') + + isolated = kwargs.pop("isolated", False) + self.config = Configuration(isolated) + + assert self.name + optparse.OptionParser.__init__(self, *args, **kwargs) + + def check_default(self, option, key, val): + try: + return option.check_value(key, val) + except optparse.OptionValueError as exc: + print("An error occurred during configuration: %s" % exc) + sys.exit(3) + + def _get_ordered_configuration_items(self): + # Configuration gives keys in an unordered manner. Order them. + override_order = ["global", self.name, ":env:"] + + # Pool the options into different groups + section_items = {name: [] for name in override_order} + for section_key, val in self.config.items(): + # ignore empty values + if not val: + logger.debug( + "Ignoring configuration key '%s' as it's value is empty.", + section_key + ) + continue + + section, key = section_key.split(".", 1) + if section in override_order: + section_items[section].append((key, val)) + + # Yield each group in their override order + for section in override_order: + for key, val in section_items[section]: + yield key, val + + def _update_defaults(self, defaults): + """Updates the given defaults with values from the config files and + the environ. Does a little special handling for certain types of + options (lists).""" + + # Accumulate complex default state. + self.values = optparse.Values(self.defaults) + late_eval = set() + # Then set the options with those values + for key, val in self._get_ordered_configuration_items(): + # '--' because configuration supports only long names + option = self.get_option('--' + key) + + # Ignore options not present in this parser. E.g. non-globals put + # in [global] by users that want them to apply to all applicable + # commands. + if option is None: + continue + + if option.action in ('store_true', 'store_false', 'count'): + val = strtobool(val) + elif option.action == 'append': + val = val.split() + val = [self.check_default(option, key, v) for v in val] + elif option.action == 'callback': + late_eval.add(option.dest) + opt_str = option.get_opt_string() + val = option.convert_value(opt_str, val) + # From take_action + args = option.callback_args or () + kwargs = option.callback_kwargs or {} + option.callback(option, opt_str, val, self, *args, **kwargs) + else: + val = self.check_default(option, key, val) + + defaults[option.dest] = val + + for key in late_eval: + defaults[key] = getattr(self.values, key) + self.values = None + return defaults + + def get_default_values(self): + """Overriding to make updating the defaults after instantiation of + the option parser possible, _update_defaults() does the dirty work.""" + if not self.process_default_values: + # Old, pre-Optik 1.5 behaviour. + return optparse.Values(self.defaults) + + # Load the configuration, or error out in case of an error + try: + self.config.load() + except ConfigurationError as err: + self.exit(2, err.args[0]) + + defaults = self._update_defaults(self.defaults.copy()) # ours + for option in self._get_all_options(): + default = defaults.get(option.dest) + if isinstance(default, string_types): + opt_str = option.get_opt_string() + defaults[option.dest] = option.check_value(opt_str, default) + return optparse.Values(defaults) + + def error(self, msg): + self.print_usage(sys.stderr) + self.exit(2, "%s\n" % msg) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/build_env.py b/myenv/lib/python3.7/site-packages/pip/_internal/build_env.py new file mode 100644 index 000000000..8ad7735d0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/build_env.py @@ -0,0 +1,92 @@ +"""Build Environment used for isolation during sdist building +""" + +import os +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._internal.utils.temp_dir import TempDirectory + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self, no_clean): + self._temp_dir = TempDirectory(kind="build-env") + self._no_clean = no_clean + + @property + def path(self): + return self._temp_dir.path + + def __enter__(self): + self._temp_dir.create() + + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', None) + self.save_nousersite = os.environ.get('PYTHONNOUSERSITE', None) + + install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' + install_dirs = get_paths(install_scheme, vars={ + 'base': self.path, + 'platbase': self.path, + }) + + scripts = install_dirs['scripts'] + if self.save_path: + os.environ['PATH'] = scripts + os.pathsep + self.save_path + else: + os.environ['PATH'] = scripts + os.pathsep + os.defpath + + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=0, prefix=self.path) + platlib = get_python_lib(plat_specific=1, prefix=self.path) + if purelib == platlib: + lib_dirs = purelib + else: + lib_dirs = purelib + os.pathsep + platlib + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + os.environ['PYTHONNOUSERSITE'] = '1' + + return self.path + + def __exit__(self, exc_type, exc_val, exc_tb): + if not self._no_clean: + self._temp_dir.cleanup() + + def restore_var(varname, old_value): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + restore_var('PATH', self.save_path) + restore_var('PYTHONPATH', self.save_pythonpath) + restore_var('PYTHONNOUSERSITE', self.save_nousersite) + + def cleanup(self): + self._temp_dir.cleanup() + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self, no_clean): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/cache.py b/myenv/lib/python3.7/site-packages/pip/_internal/cache.py new file mode 100644 index 000000000..5547d73da --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/cache.py @@ -0,0 +1,202 @@ +"""Cache Management +""" + +import errno +import hashlib +import logging +import os + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal import index +from pip._internal.compat import expanduser +from pip._internal.download import path_to_url +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import InvalidWheelFilename, Wheel + +logger = logging.getLogger(__name__) + + +class Cache(object): + """An abstract class - provides cache directories for data from links + + + :param cache_dir: The root of the cache. + :param format_control: A pip.index.FormatControl object to limit + binaries being read from the cache. + :param allowed_formats: which formats of files the cache should store. + ('binary' and 'source' are the only allowed values) + """ + + def __init__(self, cache_dir, format_control, allowed_formats): + super(Cache, self).__init__() + self.cache_dir = expanduser(cache_dir) if cache_dir else None + self.format_control = format_control + self.allowed_formats = allowed_formats + + _valid_formats = {"source", "binary"} + assert self.allowed_formats.union(_valid_formats) == _valid_formats + + def _get_cache_path_parts(self, link): + """Get parts of part that must be os.path.joined with cache_dir + """ + + # We want to generate an url to use as our cache key, we don't want to + # just re-use the URL because it might have other items in the fragment + # and we don't care about those. + key_parts = [link.url_without_fragment] + if link.hash_name is not None and link.hash is not None: + key_parts.append("=".join([link.hash_name, link.hash])) + key_url = "#".join(key_parts) + + # Encode our key url with sha224, we'll use this because it has similar + # security properties to sha256, but with a shorter total output (and + # thus less secure). However the differences don't make a lot of + # difference for our use case here. + hashed = hashlib.sha224(key_url.encode()).hexdigest() + + # We want to nest the directories some to prevent having a ton of top + # level directories where we might run out of sub directories on some + # FS. + parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] + + return parts + + def _get_candidates(self, link, package_name): + can_not_cache = ( + not self.cache_dir or + not package_name or + not link + ) + if can_not_cache: + return [] + + canonical_name = canonicalize_name(package_name) + formats = index.fmt_ctl_formats( + self.format_control, canonical_name + ) + if not self.allowed_formats.intersection(formats): + return [] + + root = self.get_path_for_link(link) + try: + return os.listdir(root) + except OSError as err: + if err.errno in {errno.ENOENT, errno.ENOTDIR}: + return [] + raise + + def get_path_for_link(self, link): + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get(self, link, package_name): + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return index.Link(path_to_url(path)) + + def cleanup(self): + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link(self, link): + """Return a directory to store cached wheels for link + + Because there are M wheels for any one sdist, we provide a directory + to cache them in, and then consult that directory when looking up + cache hits. + + We only insert things into the cache if they have plausible version + numbers, so that we don't contaminate the cache with things that were + not unique. E.g. ./package might have dozens of installs done for it + and build a version of 0.0...and if we built and cached a wheel, we'd + end up using the same wheel even if the source has been edited. + + :param link: The link of the sdist for which this will cache wheels. + """ + parts = self._get_cache_path_parts(link) + + # Store wheels within the root cache_dir + return os.path.join(self.cache_dir, "wheels", *parts) + + def get(self, link, package_name): + candidates = [] + + for wheel_name in self._get_candidates(link, package_name): + try: + wheel = Wheel(wheel_name) + except InvalidWheelFilename: + continue + if not wheel.supported(): + # Built for a different python/arch/etc + continue + candidates.append((wheel.support_index_min(), wheel_name)) + + if not candidates: + return link + + return self._link_for_candidate(link, min(candidates)[1]) + + +class EphemWheelCache(SimpleWheelCache): + """A SimpleWheelCache that creates it's own temporary cache directory + """ + + def __init__(self, format_control): + self._temp_dir = TempDirectory(kind="ephem-wheel-cache") + self._temp_dir.create() + + super(EphemWheelCache, self).__init__( + self._temp_dir.path, format_control + ) + + def cleanup(self): + self._temp_dir.cleanup() + + +class WheelCache(Cache): + """Wraps EphemWheelCache and SimpleWheelCache into a single Cache + + This Cache allows for gracefully degradation, using the ephem wheel cache + when a certain link is not found in the simple wheel cache first. + """ + + def __init__(self, cache_dir, format_control): + super(WheelCache, self).__init__( + cache_dir, format_control, {'binary'} + ) + self._wheel_cache = SimpleWheelCache(cache_dir, format_control) + self._ephem_cache = EphemWheelCache(format_control) + + def get_path_for_link(self, link): + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + return self._ephem_cache.get_path_for_link(link) + + def get(self, link, package_name): + retval = self._wheel_cache.get(link, package_name) + if retval is link: + retval = self._ephem_cache.get(link, package_name) + return retval + + def cleanup(self): + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/cmdoptions.py b/myenv/lib/python3.7/site-packages/pip/_internal/cmdoptions.py new file mode 100644 index 000000000..58854e34f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/cmdoptions.py @@ -0,0 +1,609 @@ +""" +shared options and groups + +The principle here is to define options once, but *not* instantiate them +globally. One reason being that options with action='append' can carry state +between parses. pip parses general options twice internally, and shouldn't +pass on state. To be consistent, all options will follow this design. + +""" +from __future__ import absolute_import + +import warnings +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup + +from pip._internal.index import ( + FormatControl, fmt_ctl_handle_mutual_exclude, fmt_ctl_no_binary, +) +from pip._internal.locations import USER_CACHE_DIR, src_prefix +from pip._internal.models import PyPI +from pip._internal.utils.hashes import STRONG_HASHES +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import BAR_TYPES + +if MYPY_CHECK_RUNNING: + from typing import Any + + +def make_option_group(group, parser): + """ + Return an OptionGroup object + group -- assumed to be dict with 'name' and 'options' keys + parser -- an optparse Parser + """ + option_group = OptionGroup(parser, group['name']) + for option in group['options']: + option_group.add_option(option()) + return option_group + + +def check_install_build_global(options, check_options=None): + """Disable wheels if per-setup.py call options are set. + + :param options: The OptionParser options to update. + :param check_options: The options to check, if not supplied defaults to + options. + """ + if check_options is None: + check_options = options + + def getname(n): + return getattr(check_options, n, None) + names = ["build_options", "global_options", "install_options"] + if any(map(getname, names)): + control = options.format_control + fmt_ctl_no_binary(control) + warnings.warn( + 'Disabling all use of wheels due to the use of --build-options ' + '/ --global-options / --install-options.', stacklevel=2, + ) + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Any + +isolated_mode = partial( + Option, + "--isolated", + dest="isolated_mode", + action="store_true", + default=False, + help=( + "Run pip in an isolated mode, ignoring environment variables and user " + "configuration." + ), +) + +require_virtualenv = partial( + Option, + # Run only if inside a virtualenv, bail if not. + '--require-virtualenv', '--require-venv', + dest='require_venv', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Any + +verbose = partial( + Option, + '-v', '--verbose', + dest='verbose', + action='count', + default=0, + help='Give more output. Option is additive, and can be used up to 3 times.' +) + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Any + +quiet = partial( + Option, + '-q', '--quiet', + dest='quiet', + action='count', + default=0, + help=( + 'Give less output. Option is additive, and can be used up to 3' + ' times (corresponding to WARNING, ERROR, and CRITICAL logging' + ' levels).' + ), +) # type: Any + +progress_bar = partial( + Option, + '--progress-bar', + dest='progress_bar', + type='choice', + choices=list(BAR_TYPES.keys()), + default='on', + help=( + 'Specify type of progress to be displayed [' + + '|'.join(BAR_TYPES.keys()) + '] (default: %default)' + ), +) # type: Any + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) # type: Any + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Any + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Any + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Any + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Any + +skip_requirements_regex = partial( + Option, + # A regex to be used to skip requirements + '--skip-requirements-regex', + dest='skip_requirements_regex', + type='str', + default='', + help=SUPPRESS_HELP, +) # type: Any + + +def exists_action(): + return Option( + # Option when path already exist + '--exists-action', + dest='exists_action', + type='choice', + choices=['s', 'i', 'w', 'b', 'a'], + default=[], + action='append', + metavar='action', + help="Default action when a path already exists: " + "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort).", + ) + + +cert = partial( + Option, + '--cert', + dest='cert', + type='str', + metavar='path', + help="Path to alternate CA bundle.", +) # type: Any + +client_cert = partial( + Option, + '--client-cert', + dest='client_cert', + type='str', + default=None, + metavar='path', + help="Path to SSL client certificate, a single file containing the " + "private key and the certificate in PEM format.", +) # type: Any + +index_url = partial( + Option, + '-i', '--index-url', '--pypi-url', + dest='index_url', + metavar='URL', + default=PyPI.simple_url, + help="Base URL of Python Package Index (default %default). " + "This should point to a repository compliant with PEP 503 " + "(the simple repository API) or a local directory laid out " + "in the same format.", +) # type: Any + + +def extra_index_url(): + return Option( + '--extra-index-url', + dest='extra_index_urls', + metavar='URL', + action='append', + default=[], + help="Extra URLs of package indexes to use in addition to " + "--index-url. Should follow the same rules as " + "--index-url.", + ) + + +no_index = partial( + Option, + '--no-index', + dest='no_index', + action='store_true', + default=False, + help='Ignore package index (only looking at --find-links URLs instead).', +) # type: Any + + +def find_links(): + return Option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='url', + help="If a url or path to an html file, then parse for links to " + "archives. If a local path or file:// url that's a directory, " + "then look for archives in the directory listing.", + ) + + +def trusted_host(): + return Option( + "--trusted-host", + dest="trusted_hosts", + action="append", + metavar="HOSTNAME", + default=[], + help="Mark this host as trusted, even though it does not have valid " + "or any HTTPS.", + ) + + +# Remove after 1.5 +process_dependency_links = partial( + Option, + "--process-dependency-links", + dest="process_dependency_links", + action="store_true", + default=False, + help="Enable the processing of dependency links.", +) # type: Any + + +def constraints(): + return Option( + '-c', '--constraint', + dest='constraints', + action='append', + default=[], + metavar='file', + help='Constrain versions using the given constraints file. ' + 'This option can be used multiple times.' + ) + + +def requirements(): + return Option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Install from the given requirements file. ' + 'This option can be used multiple times.' + ) + + +def editable(): + return Option( + '-e', '--editable', + dest='editables', + action='append', + default=[], + metavar='path/url', + help=('Install a project in editable mode (i.e. setuptools ' + '"develop mode") from a local project path or a VCS url.'), + ) + + +src = partial( + Option, + '--src', '--source', '--source-dir', '--source-directory', + dest='src_dir', + metavar='dir', + default=src_prefix, + help='Directory to check out editable projects into. ' + 'The default in a virtualenv is "/src". ' + 'The default for global installs is "/src".' +) # type: Any + + +def _get_format_control(values, option): + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + existing = getattr(parser.values, option.dest) + fmt_ctl_handle_mutual_exclude( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + existing = getattr(parser.values, option.dest) + fmt_ctl_handle_mutual_exclude( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=FormatControl(set(), set()), + help="Do not use binary packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all binary packages, :none: to empty the set, or one or " + "more package names with commas between them. Note that some " + "packages are tricky to compile and may fail to install when " + "this option is used on them.", + ) + + +def only_binary(): + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=FormatControl(set(), set()), + help="Do not use source packages. Can be supplied multiple times, and " + "each time adds to the existing value. Accepts either :all: to " + "disable all source packages, :none: to empty the set, or one or " + "more package names with commas between them. Packages without " + "binary distributions will fail to install when this option is " + "used on them.", + ) + + +cache_dir = partial( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in

." +) + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="store_false", + help="Disable the cache.", +) + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Any + +build_dir = partial( + Option, + '-b', '--build', '--build-dir', '--build-directory', + dest='build_dir', + metavar='dir', + help='Directory to unpack packages into and build in. Note that ' + 'an initial build still takes place in a temporary directory. ' + 'The location of temporary directories can be controlled by setting ' + 'the TMPDIR environment variable (TEMP on Windows) appropriately. ' + 'When passed, build directories are not cleaned in case of failures.' +) # type: Any + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Any + +no_build_isolation = partial( + Option, + '--no-build-isolation', + dest='build_isolation', + action='store_false', + default=True, + help='Disable isolation when building a modern source distribution. ' + 'Build dependencies specified by PEP 518 must be already installed ' + 'if this option is used.' +) # type: Any + +install_options = partial( + Option, + '--install-option', + dest='install_options', + action='append', + metavar='options', + help="Extra arguments to be supplied to the setup.py install " + "command (use like --install-option=\"--install-scripts=/usr/local/" + "bin\"). Use multiple --install-option options to pass multiple " + "options to setup.py install. If you are using an option with a " + "directory path, be sure to use absolute path.", +) # type: Any + +global_options = partial( + Option, + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the install command.", +) # type: Any + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories)." +) # type: Any + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Any + +disable_pip_version_check = partial( + Option, + "--disable-pip-version-check", + dest="disable_pip_version_check", + action="store_true", + default=False, + help="Don't periodically check PyPI to determine whether a new version " + "of pip is available for download. Implied with --no-index.", +) # type: Any + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Any + + +def _merge_hash(option, opt_str, value, parser): + """Given a value spelled "algo:digest", append the digest to a list + pointed to in a dict by the algo name.""" + if not parser.values.hashes: + parser.values.hashes = {} + try: + algo, digest = value.split(':', 1) + except ValueError: + parser.error('Arguments to %s must be a hash name ' + 'followed by a value, like --hash=sha256:abcde...' % + opt_str) + if algo not in STRONG_HASHES: + parser.error('Allowed hash algorithms for %s are %s.' % + (opt_str, ', '.join(STRONG_HASHES))) + parser.values.hashes.setdefault(algo, []).append(digest) + + +hash = partial( + Option, + '--hash', + # Hash values eventually end up in InstallRequirement.hashes due to + # __dict__ copying in process_line(). + dest='hashes', + action='callback', + callback=_merge_hash, + type='string', + help="Verify that the package's archive matches this " + 'hash before installing. Example: --hash=sha256:abcdef...', +) # type: Any + + +require_hashes = partial( + Option, + '--require-hashes', + dest='require_hashes', + action='store_true', + default=False, + help='Require a hash to check each requirement against, for ' + 'repeatable installs. This option is implied when any package in a ' + 'requirements file has a --hash option.', +) # type: Any + + +########## +# groups # +########## + +general_group = { + 'name': 'General Options', + 'options': [ + help_, + isolated_mode, + require_virtualenv, + verbose, + version, + quiet, + log, + no_input, + proxy, + retries, + timeout, + skip_requirements_regex, + exists_action, + trusted_host, + cert, + client_cert, + cache_dir, + no_cache, + disable_pip_version_check, + no_color, + ] +} + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + process_dependency_links, + ] +} diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py new file mode 100644 index 000000000..d44e6f11e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py @@ -0,0 +1,79 @@ +""" +Package containing all pip commands +""" +from __future__ import absolute_import + +from pip._internal.commands.completion import CompletionCommand +from pip._internal.commands.configuration import ConfigurationCommand +from pip._internal.commands.download import DownloadCommand +from pip._internal.commands.freeze import FreezeCommand +from pip._internal.commands.hash import HashCommand +from pip._internal.commands.help import HelpCommand +from pip._internal.commands.list import ListCommand +from pip._internal.commands.check import CheckCommand +from pip._internal.commands.search import SearchCommand +from pip._internal.commands.show import ShowCommand +from pip._internal.commands.install import InstallCommand +from pip._internal.commands.uninstall import UninstallCommand +from pip._internal.commands.wheel import WheelCommand + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Type + from pip._internal.basecommand import Command + +commands_order = [ + InstallCommand, + DownloadCommand, + UninstallCommand, + FreezeCommand, + ListCommand, + ShowCommand, + CheckCommand, + ConfigurationCommand, + SearchCommand, + WheelCommand, + HashCommand, + CompletionCommand, + HelpCommand, +] # type: List[Type[Command]] + +commands_dict = {c.name: c for c in commands_order} + + +def get_summaries(ordered=True): + """Yields sorted (command name, command summary) tuples.""" + + if ordered: + cmditems = _sort_commands(commands_dict, commands_order) + else: + cmditems = commands_dict.items() + + for name, command_class in cmditems: + yield (name, command_class.summary) + + +def get_similar_commands(name): + """Command name auto-correct.""" + from difflib import get_close_matches + + name = name.lower() + + close_commands = get_close_matches(name, commands_dict.keys()) + + if close_commands: + return close_commands[0] + else: + return False + + +def _sort_commands(cmddict, order): + def keyfn(key): + try: + return order.index(key[1]) + except ValueError: + # unordered items should come last + return 0xff + + return sorted(cmddict.items(), key=keyfn) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..636d2bbeb2fea82b3f125c90f38b66b83410a6e9 GIT binary patch literal 2504 zcmaJ@OK;mo5Z)!JM`VeX9mTQbN0e6^6}6N;+$Kd36m_0xYXr5EG(-b}=B{koyQH$D z?AVY_HPBvq>L0L={YM3_J>@4fmv&|?$#xKh#4cxNXCL$JH?#b%R4Nd7w$`Rz{+lP{ zA8ZVs5(wWyiLX#X7;y-r%n(!>jzLj2g()q^(y}EoGV5fuoDn&hck)`!igU8y6ttWZ zW3uQJwVW3vX*;%-&xvtacFI~VhzU9AOlo;doR<}+qUEBvAg7!uEtkYaIqghq*%mXh z>QuEnE@tJNGpFUUn3oIA0wsJw{SAAa5SL`lsmaUEW!*n1uE?v-Rp_7Qd0yoOUglGL zl4p5^&+#I+xV=$wuCep1azOaCd*oN@Txauaid{UQ&PQyT%^VQtV^(Fe@V&w2R!Mzf z|9atx=Wlx(yyiz?;ss$4Zqz&>YVDv6Dk;5?#f3KraGj>(-g+E~PQu+lwj-5*YGOH( zZNZZu3PD11P*#?suoY}{ly_D?elOY$MdYy))6xUQ`942Uj6L$=&C^XT+NYX71aWfG zEG}6j69bNJHCg-PYCVzbKGEe z?oUrwRvxcBtQ)C?TS=|8y*3AzbNwlOV4i*qs4XbVP~r+y0qK&L#UAa#yG8yqURkT; zFGSS}J;`B0qj58(zCv4Fy-k{J73_EkZ|-=i*@^_?DsD>ET;FotTk%r(^$z>eciTIk z-%MJ!Hnx=bthIFec5|%>r?=R5Yf<@2x4uYTd8pLI4Z?)0&=XC+f51%_bV1^}jrQK# z!W|a)33RpZeu8^PN3ulCz-Mjf9eQR$@u9@uK-DFxoREYj#;-v zJ@T^hi_tTBX4mMNTUN_>Mksl;@El?iSZM4oy$HBqaV-W;aaOz0-&YNR`E)?TTHFDC zsl9qF=>X&6#!5Yt+AfZ92acqrf#jkSsXc5)3cyPnCsk#EXAzFykkPBZyL+2$TX^&Ds z?$7|F2=Ia==Am^&070W`s7BXdbcU=FWMpM(A2z65-s|XQru4(3Ymuy ziF@-!6mwU4iNDF?2Z&UT1+A6{*40%oOEV(cY;E(sxNd5{k9+Oo;REpA^}eFL z4`d)bHH7{)OcfWQB8G;*uxQ>;H=yk!gYX%^fZuoys^3V9A`}Pto{=CB^oW4d<{t() zYpo3NL(d@Blk+$br`)rDCxDi0A3hn)gkxXzA!k6}3LoK`xHzE(wW)3F&!6R7)kPp^%%JC&{#uAN>QVaoa$TxHN| zeuPy^Cv}xYo7oXIn~>*K?t>PP`V~Syat;A0Se-+Qxe==X|NU)+!8vlXvA#3Z*oPL1 z;TloM?sQ?qLj82B@E;__>+^jF(ivPf%0{zMo8HCyM~$ON_3TWYBoJ{U*=xf+t;%SS z?KdW%p(ar?b9TtO7xO+N6b6vO$kUOplavloO|w&BuJ0fn1o=BMVjaQn>Y#l9Lovk_ Z>4+C%-=bw&G!2NB_q|!uHVehP{XeoBr|SR! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/check.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..647f6b2fd1a26c87a9b94439b6c5ef68b770bc84 GIT binary patch literal 1382 zcmY*ZPjA~c6elH0vSoMZupv!0tk8z`;9`-xwL#ON7>Z`VE`u*E8bE6x$Rcga(La-t z8ynIo{TMwY$6fY;h~0MTSJ-KfjFUQqNk2aEz4v?X{m55$?zjlX{LRkEKNdp&s?GHv zAiRVrMzBysaf$-`2RAgC{(}5wsjAtx94a+D#jixLVtdifyoJAGe)`b&ZWMPtv zDoRsE!Ns>zR()24G!Yd~#&wkxxrkMq>tTTK5~g?n3qt{>C@?4vOlky#nt=tfO$oI= zpunNF!YTVl3e*PV`q^8?lgY}v3GZ#t3U3xInHLvX8CA(RWgcZE%PGs_gb80-I=A(X z>*?{Z5EyHVkdd2!0} z>p;pzc$1>esXwr|A}?1}mCllJ0aTE7T1=;mOOoW1V$hdFuyi7wO%EiA_*BT=Hv60` z5hBT_vKJTmBu(Nk21!)Du#R0?3L_*tUt+~lCGnhP>{b6zX!+vTMSE{ zEP>a#89)&FIUp!b^aB^7C*p(u#NkMi(UK$CfL9`rjozj z$Q?|K_1$gS`(Qj8bYv&giG`tb!!RpooidR7VYsNHR8<3ZP8iZ627xGrv}yr&SvsNy zM0~~fAi6HX*0QT~HY|$$LeU=}00=d;9-8H-=BeuMLAL%)rv5k*Y?Ccl*IVAd{k*Mu^g{{xT}gb)A# literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/completion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cd910eb62ba82d9c4dba05e113070c292357b96 GIT binary patch literal 3078 zcmai0UvC>l5a0W2$8lO(AV2|W2|@B9UD5!Bf|`mp1XTVsQ4$0gqSNJe?VNkQyY8+N zYMiH3;t3?)c}O4mDtv@}<%zG*CuY`moHR)}>-J`6c4udQ`#-3ly=KPsQaL+tQ6gDoHG!s zZLXqH6z%?(wYO=Rmh_#5+~rvoNSYMgGUF;Oaw=6U6j&0GmMW0X8Od{2i(jw^snO9B zf!Ao_s}USqemRzK=*rqR>l>@ydF zywvDx2Cv}U<@t&H{5k9Q)}uS$ZmmT);p^3{)#W8RzeEE%3HRW5&CzZ+4GYS6EAC~A zhM&`Cb_!4;vVk=7;=3n7Y4!5NAp7i`lbB>h5@&S35DX3jKgR)3DtOFjcqbW}&lr;Y zoEc^I=p1Z~e?av@P$v*B&o>%Fzac;qT!iSkSPqw2+I|kCiOOjB)&Ib_e?E*+E0w!r znsG$+1SXV94kwiTe1cW90jG#rkfk{uWI*TUE}ml8L>uSqxErfo^p&eP%_R*}8ivpK zRskLI(9k&m>`v2nLNO%pIMg#J(xub!DUs%FD$6WY^e1YT<$FMw6Knmrv^{Z-sX5M+ z34>cPoohsA;S1(yn4G3?;AnRzmb=>NL*pXi36`1hZ6Sy0OCrpuhB z$K0m>D`{EGWB%i6vw}tJF=KZR9E4>46n?fQAAk-a%gw#fi3%ROLm z<$m7}L&UpphdX*&szPvJcrKOjAQ34gK+T7VR%baaQMYb<2Zph1{H|22ZtvRNnMSiG*49& z>1xttQBf+XYcVqtoSXK`SV%7Pi;zoPC>#Lls4a?K30rX`&sy4zMO$k7!M?bPD_D9e zijpjrGK&5pPxlr}k?zHcFYd)+u~lS@3%S@8i#wetx+!nuAMLRZlBnE!@49N;Yj^n`K#Ete=No*bo-yB1jz~el z_6%U!0UXvrFELYyUA3-SH6UW$y5!8-zSV#ET;zfpCTbpcIV5T=in;~sWhmF9=wUC; zMwUtxu_6Jriwa$lJ)p061j*aZu~rHGu$RIYD6wbKLtKX-^voz*6Cg5+u&vs4tM0nfHvFpYe~a!j AX8-^I literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc7950feec91353f02b43fdf5bb52f266cc6472e GIT binary patch literal 6426 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 S0X{|B4xpyYChDbQL+x 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/list.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c1d7e1b9c3f06ac9d16bf67ccc53351917aeb586 GIT binary patch literal 9789 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/commands/__pycache__/search.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2861d7a39bf1d0e225e66b1e29368cf3537ac88 GIT binary patch literal 4294 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%0A#>GVApFghH&JhlFZt$}Iv! zRhONLmk^T8-g@srDm*~nIHN>>{SkuPky(<20cS++>L?y0M`uHO7pjPLIF{HzqbiqHgzVt}b_ulP zz`1d>yr#y^_%TZ;}#Z5fhXYd1tmaLk79Q}h&*wmnzZ?n*r0K`b2mV8_2?c{(}&Ku zSh$;1HO>O9p=zChN2y9u_-ZE@M`V*?M!LySdH@MkNJX}js-DY+8mdKTE4Y;IK0L1m z4j)#FRHs<%9(eMAOSL}r?(*Wc-LZ(XL^WY3{-7W#s1PI<*-JICsN?Kl22;&#kdFjMF z0fLS5xtjPetxp<@CirS6SmoAE>6WHjb7Rpa$&bxH{E|>{(Lw$ICLWiurknhhR_B4bPHqKto+D4uFw8{^cTq5nb+r(kIHk6xAW== z%IEa_yf$fox5W&!7w}xf^AzQ!<3{@QyrKDZp~tG2c?Qq3td90M)_BxBZqAzvXI>|3 zq(1;}V@_PpKQ@z>$0YHG=v~phE^9(&Yu=i?Ft1N8EnYk^<~H(~b=;n}ADi+w=`L$O zG`}+M7}2w~k-l`d@z@l= z;Sm<9W-i&Mmju;D;pgHJt_+~yT9%B3$GA)Alk)MA>H@KS!j~e@5cN6YoUNtBOQhLa zF;j4IrfNB)aRx};28*~r&1Ez&!VUb)p1+CuH&0ahT)<^i)|jh5EiF6g4>b#v?LGYP8LR9zcZ-(e?zhj4-Bsfa_-#Js3eLk^(M zCvlQd0l!3VN?9&4rm`b%$^{jFf-pi~y!aXQ=$%)*PmMNtdud>I8Z)k{KzIFu)*_Bm zi>tD>t#}cms&eRs8JD6$EL9q5>okxhI7~Ds=LW#pHXCN6M8Hl!t!YrJ-+ZoN5nqM) zA=!q+3iuk<8pc{y&8(TTwL51)9m@0?R0+^^p%Q4gbPZWZ{g&(A!~0J$Q*~Xuw7IVM zj80L`Bwip9kr}EUk*6auqM3G)7=0dw;66P)!sW-97i0uoe^6N>>6UA4+p;TotkzHT zOz$buW0a*C$^utd;89ibd%#of=53_N!D)KTgX_Y|*kB*URFO6X{h6XRSLd~l=l*_v zb%sCidHyHG84sh1>&cFT7*&)mbmU+OQ{?Nz^;I@_j*b?!{oV20$tf1p)2nk?ir48u zivK1k0(HcFS9k4ff^4ViW1fDbAwi5mi(AxCdH2NfXPmEgEx+CCWK($&jrIzw1+Qzt L] list + %prog [] [--editor ] edit + + %prog [] get name + %prog [] set name value + %prog [] unset name + """ + + summary = "Manage local and global configuration." + + def __init__(self, *args, **kwargs): + super(ConfigurationCommand, self).__init__(*args, **kwargs) + + self.configuration = None + + self.cmd_opts.add_option( + '--editor', + dest='editor', + action='store', + default=None, + help=( + 'Editor to use to edit the file. Uses VISUAL or EDITOR ' + 'environment variables if not provided.' + ) + ) + + self.cmd_opts.add_option( + '--global', + dest='global_file', + action='store_true', + default=False, + help='Use the system-wide configuration file only' + ) + + self.cmd_opts.add_option( + '--user', + dest='user_file', + action='store_true', + default=False, + help='Use the user configuration file only' + ) + + self.cmd_opts.add_option( + '--venv', + dest='venv_file', + action='store_true', + default=False, + help='Use the virtualenv configuration file only' + ) + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + handlers = { + "list": self.list_values, + "edit": self.open_in_editor, + "get": self.get_name, + "set": self.set_name_value, + "unset": self.unset_name + } + + # Determine action + if not args or args[0] not in handlers: + logger.error("Need an action ({}) to perform.".format( + ", ".join(sorted(handlers))) + ) + return ERROR + + action = args[0] + + # Determine which configuration files are to be loaded + # Depends on whether the command is modifying. + try: + load_only = self._determine_file( + options, need_value=(action in ["get", "set", "unset", "edit"]) + ) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + # Load a new configuration + self.configuration = Configuration( + isolated=options.isolated_mode, load_only=load_only + ) + self.configuration.load() + + # Error handling happens here, not in the action-handlers. + try: + handlers[action](options, args[1:]) + except PipError as e: + logger.error(e.args[0]) + return ERROR + + return SUCCESS + + def _determine_file(self, options, need_value): + file_options = { + kinds.USER: options.user_file, + kinds.GLOBAL: options.global_file, + kinds.VENV: options.venv_file + } + + if sum(file_options.values()) == 0: + if not need_value: + return None + # Default to user, unless there's a virtualenv file. + elif os.path.exists(venv_config_file): + return kinds.VENV + else: + return kinds.USER + elif sum(file_options.values()) == 1: + # There's probably a better expression for this. + return [key for key in file_options if file_options[key]][0] + + raise PipError( + "Need exactly one file to operate upon " + "(--user, --venv, --global) to perform." + ) + + def list_values(self, options, args): + self._get_n_args(args, "list", n=0) + + for key, value in sorted(self.configuration.items()): + logger.info("%s=%r", key, value) + + def get_name(self, options, args): + key = self._get_n_args(args, "get [name]", n=1) + value = self.configuration.get_value(key) + + logger.info("%s", value) + + def set_name_value(self, options, args): + key, value = self._get_n_args(args, "set [name] [value]", n=2) + self.configuration.set_value(key, value) + + self._save_configuration() + + def unset_name(self, options, args): + key = self._get_n_args(args, "unset [name]", n=1) + self.configuration.unset_value(key) + + self._save_configuration() + + def open_in_editor(self, options, args): + editor = self._determine_editor(options) + + fname = self.configuration.get_file_to_edit() + if fname is None: + raise PipError("Could not determine appropriate file.") + + try: + subprocess.check_call([editor, fname]) + except subprocess.CalledProcessError as e: + raise PipError( + "Editor Subprocess exited with exit code {}" + .format(e.returncode) + ) + + def _get_n_args(self, args, example, n): + """Helper to make sure the command got the right number of arguments + """ + if len(args) != n: + msg = ( + 'Got unexpected number of arguments, expected {}. ' + '(example: "{} config {}")' + ).format(n, get_prog(), example) + raise PipError(msg) + + if n == 1: + return args[0] + else: + return args + + def _save_configuration(self): + # We successfully ran a modifying command. Need to save the + # configuration. + try: + self.configuration.save() + except Exception: + logger.error( + "Unable to save configuration. Please report this as a bug.", + exc_info=1 + ) + raise PipError("Internal Error.") + + def _determine_editor(self, options): + if options.editor is not None: + return options.editor + elif "VISUAL" in os.environ: + return os.environ["VISUAL"] + elif "EDITOR" in os.environ: + return os.environ["EDITOR"] + else: + raise PipError("Could not determine editor to use.") diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/download.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/download.py new file mode 100644 index 000000000..916a4703d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/download.py @@ -0,0 +1,233 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal import cmdoptions +from pip._internal.basecommand import RequirementCommand +from pip._internal.exceptions import CommandError +from pip._internal.index import FormatControl +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, normalize_path +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +class DownloadCommand(RequirementCommand): + """ + Download packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports downloading from "requirements files", which provide + an easy way to specify a whole environment to be downloaded. + """ + name = 'download' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] ... + %prog [options] ... + %prog [options] ...""" + + summary = 'Download packages.' + + def __init__(self, *args, **kw): + super(DownloadCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.global_options()) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.pre()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + + cmd_opts.add_option( + '-d', '--dest', '--destination-dir', '--destination-directory', + dest='download_dir', + metavar='dir', + default=os.curdir, + help=("Download packages into ."), + ) + + cmd_opts.add_option( + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only download wheels compatible with . " + "Defaults to the platform of the running system."), + ) + + cmd_opts.add_option( + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only download wheels compatible with Python " + "interpreter version . If not specified, then the " + "current system interpreter minor version is used. A major " + "version (e.g. '2') can be specified to match all " + "minor revs of that major version. A minor version " + "(e.g. '34') can also be specified."), + ) + + cmd_opts.add_option( + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only download wheels compatible with Python " + "implementation , e.g. 'pp', 'jy', 'cp', " + " or 'ip'. If not specified, then the current " + "interpreter implementation is used. Use 'py' to force " + "implementation-agnostic wheels."), + ) + + cmd_opts.add_option( + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only download wheels compatible with Python " + "abi , e.g. 'pypy_41'. If not specified, then the " + "current interpreter abi tag is used. Generally " + "you will need to specify --implementation, " + "--platform, and --python-version when using " + "this option."), + ) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + options.ignore_installed = True + # editable doesn't really make sense for `pip download`, but the bowels + # of the RequirementSet code require that property. + options.editables = [] + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + binary_only = FormatControl(set(), {':all:'}) + no_sdist_dependencies = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + if dist_restriction_set and no_sdist_dependencies: + raise CommandError( + "When restricting platform and interpreter constraints using " + "--python-version, --platform, --abi, or --implementation, " + "either --no-deps must be set, or --only-binary=:all: must be " + "set and --no-binary must not be set (or must be set to " + ":none:)." + ) + + options.src_dir = os.path.abspath(options.src_dir) + options.download_dir = normalize_path(options.download_dir) + + ensure_dir(options.download_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder( + options=options, + session=session, + platform=options.platform, + python_versions=python_versions, + abi=options.abi, + implementation=options.implementation, + ) + build_delete = (not (options.no_clean or options.build_dir)) + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with TempDirectory( + options.build_dir, delete=build_delete, kind="download" + ) as directory: + + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + self.populate_requirement_set( + requirement_set, + args, + options, + finder, + session, + self.name, + None + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=options.download_dir, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=None, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=False, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + downloaded = ' '.join([ + req.name for req in requirement_set.successfully_downloaded + ]) + if downloaded: + logger.info('Successfully downloaded %s', downloaded) + + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + + return requirement_set diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py new file mode 100644 index 000000000..ac562d7d8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import sys + +from pip._internal import index +from pip._internal.basecommand import Command +from pip._internal.cache import WheelCache +from pip._internal.compat import stdlib_pkgs +from pip._internal.operations.freeze import freeze + +DEV_PKGS = {'pip', 'setuptools', 'distribute', 'wheel'} + + +class FreezeCommand(Command): + """ + Output installed packages in requirements format. + + packages are listed in a case-insensitive sorted order. + """ + name = 'freeze' + usage = """ + %prog [options]""" + summary = 'Output installed packages in requirements format.' + log_streams = ("ext://sys.stderr", "ext://sys.stderr") + + def __init__(self, *args, **kw): + super(FreezeCommand, self).__init__(*args, **kw) + + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help="Use the order in the given requirements file and its " + "comments when generating output. This option can be " + "used multiple times.") + self.cmd_opts.add_option( + '-f', '--find-links', + dest='find_links', + action='append', + default=[], + metavar='URL', + help='URL for finding packages, which will be added to the ' + 'output.') + self.cmd_opts.add_option( + '-l', '--local', + dest='local', + action='store_true', + default=False, + help='If in a virtualenv that has global access, do not output ' + 'globally-installed packages.') + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + self.cmd_opts.add_option( + '--all', + dest='freeze_all', + action='store_true', + help='Do not skip these packages in the output:' + ' %s' % ', '.join(DEV_PKGS)) + self.cmd_opts.add_option( + '--exclude-editable', + dest='exclude_editable', + action='store_true', + help='Exclude editable package from output.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + format_control = index.FormatControl(set(), set()) + wheel_cache = WheelCache(options.cache_dir, format_control) + skip = set(stdlib_pkgs) + if not options.freeze_all: + skip.update(DEV_PKGS) + + freeze_kwargs = dict( + requirement=options.requirements, + find_links=options.find_links, + local_only=options.local, + user_only=options.user, + skip_regex=options.skip_requirements_regex, + isolated=options.isolated_mode, + wheel_cache=wheel_cache, + skip=skip, + exclude_editable=options.exclude_editable, + ) + + try: + for line in freeze(**freeze_kwargs): + sys.stdout.write(line + '\n') + finally: + wheel_cache.cleanup() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/hash.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/hash.py new file mode 100644 index 000000000..0ce1419da --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.basecommand import Command +from pip._internal.status_codes import ERROR +from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES +from pip._internal.utils.misc import read_chunks + +logger = logging.getLogger(__name__) + + +class HashCommand(Command): + """ + Compute a hash of a local package archive. + + These can be used with --hash in a requirements file to do repeatable + installs. + + """ + name = 'hash' + usage = '%prog [options] ...' + summary = 'Compute hashes of package archives.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(HashCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-a', '--algorithm', + dest='algorithm', + choices=STRONG_HASHES, + action='store', + default=FAVORITE_HASH, + help='The hash algorithm to use: one of %s' % + ', '.join(STRONG_HASHES)) + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + self.parser.print_usage(sys.stderr) + return ERROR + + algorithm = options.algorithm + for path in args: + logger.info('%s:\n--hash=%s:%s', + path, algorithm, _hash_of_file(path, algorithm)) + + +def _hash_of_file(path, algorithm): + """Return the hash digest of a file.""" + with open(path, 'rb') as archive: + hash = hashlib.new(algorithm) + for chunk in read_chunks(archive): + hash.update(chunk) + return hash.hexdigest() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/help.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/help.py new file mode 100644 index 000000000..f4a0e40c2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/help.py @@ -0,0 +1,36 @@ +from __future__ import absolute_import + +from pip._internal.basecommand import SUCCESS, Command +from pip._internal.exceptions import CommandError + + +class HelpCommand(Command): + """Show help for commands""" + name = 'help' + usage = """ + %prog """ + summary = 'Show help for commands.' + ignore_require_venv = True + + def run(self, options, args): + from pip._internal.commands import commands_dict, get_similar_commands + + try: + # 'pip help' with no args is handled by pip.__init__.parseopt() + cmd_name = args[0] # the command we need help for + except IndexError: + return SUCCESS + + if cmd_name not in commands_dict: + guess = get_similar_commands(cmd_name) + + msg = ['unknown command "%s"' % cmd_name] + if guess: + msg.append('maybe you meant "%s"' % guess) + + raise CommandError(' - '.join(msg)) + + command = commands_dict[cmd_name]() + command.parser.print_help() + + return SUCCESS diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/install.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/install.py new file mode 100644 index 000000000..057a64ecf --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/install.py @@ -0,0 +1,502 @@ +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +from optparse import SUPPRESS_HELP + +from pip._internal import cmdoptions +from pip._internal.basecommand import RequirementCommand +from pip._internal.cache import WheelCache +from pip._internal.exceptions import ( + CommandError, InstallationError, PreviousBuildDirError, +) +from pip._internal.locations import distutils_scheme, virtualenv_no_global +from pip._internal.operations.check import check_install_conflicts +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet, install_given_reqs +from pip._internal.resolve import Resolver +from pip._internal.status_codes import ERROR +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +try: + import wheel +except ImportError: + wheel = None + + +logger = logging.getLogger(__name__) + + +class InstallCommand(RequirementCommand): + """ + Install packages from: + + - PyPI (and other indexes) using requirement specifiers. + - VCS project urls. + - Local project directories. + - Local or remote source archives. + + pip also supports installing from "requirements files", which provide + an easy way to specify a whole environment to be installed. + """ + name = 'install' + + usage = """ + %prog [options] [package-index-options] ... + %prog [options] -r [package-index-options] ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Install packages.' + + def __init__(self, *args, **kw): + super(InstallCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.pre()) + + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option( + '-t', '--target', + dest='target_dir', + metavar='dir', + default=None, + help='Install packages into . ' + 'By default this will not replace existing files/folders in ' + '. Use --upgrade to replace existing packages in ' + 'with new versions.' + ) + cmd_opts.add_option( + '--user', + dest='use_user_site', + action='store_true', + help="Install to the Python user install directory for your " + "platform. Typically ~/.local/, or %APPDATA%\\Python on " + "Windows. (See the Python documentation for site.USER_BASE " + "for full details.)") + cmd_opts.add_option( + '--no-user', + dest='use_user_site', + action='store_false', + help=SUPPRESS_HELP) + cmd_opts.add_option( + '--root', + dest='root_path', + metavar='dir', + default=None, + help="Install everything relative to this alternate root " + "directory.") + cmd_opts.add_option( + '--prefix', + dest='prefix_path', + metavar='dir', + default=None, + help="Installation prefix where lib, bin and other top-level " + "folders are placed") + + cmd_opts.add_option(cmdoptions.build_dir()) + + cmd_opts.add_option(cmdoptions.src()) + + cmd_opts.add_option( + '-U', '--upgrade', + dest='upgrade', + action='store_true', + help='Upgrade all specified packages to the newest available ' + 'version. The handling of dependencies depends on the ' + 'upgrade-strategy used.' + ) + + cmd_opts.add_option( + '--upgrade-strategy', + dest='upgrade_strategy', + default='only-if-needed', + choices=['only-if-needed', 'eager'], + help='Determines how dependency upgrading should be handled ' + '[default: %default]. ' + '"eager" - dependencies are upgraded regardless of ' + 'whether the currently installed version satisfies the ' + 'requirements of the upgraded package(s). ' + '"only-if-needed" - are upgraded only when they do not ' + 'satisfy the requirements of the upgraded package(s).' + ) + + cmd_opts.add_option( + '--force-reinstall', + dest='force_reinstall', + action='store_true', + help='Reinstall all packages even if they are already ' + 'up-to-date.') + + cmd_opts.add_option( + '-I', '--ignore-installed', + dest='ignore_installed', + action='store_true', + help='Ignore the installed packages (reinstalling instead).') + + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + + cmd_opts.add_option(cmdoptions.install_options()) + cmd_opts.add_option(cmdoptions.global_options()) + + cmd_opts.add_option( + "--compile", + action="store_true", + dest="compile", + default=True, + help="Compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-compile", + action="store_false", + dest="compile", + help="Do not compile Python source files to bytecode", + ) + + cmd_opts.add_option( + "--no-warn-script-location", + action="store_false", + dest="warn_script_location", + default=True, + help="Do not warn when installing scripts outside PATH", + ) + cmd_opts.add_option( + "--no-warn-conflicts", + action="store_false", + dest="warn_about_conflicts", + default=True, + help="Do not warn about broken dependencies", + ) + + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + + upgrade_strategy = "to-satisfy-only" + if options.upgrade: + upgrade_strategy = options.upgrade_strategy + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + install_options = options.install_options or [] + if options.use_user_site: + if options.prefix_path: + raise CommandError( + "Can not combine '--user' and '--prefix' as they imply " + "different installation locations" + ) + if virtualenv_no_global(): + raise InstallationError( + "Can not perform a '--user' install. User site-packages " + "are not visible in this virtualenv." + ) + install_options.append('--user') + install_options.append('--prefix=') + + target_temp_dir = TempDirectory(kind="target") + if options.target_dir: + options.ignore_installed = True + options.target_dir = os.path.abspath(options.target_dir) + if (os.path.exists(options.target_dir) and not + os.path.isdir(options.target_dir)): + raise CommandError( + "Target path exists but is not a directory, will not " + "continue." + ) + + # Create a target directory for using with the target option + target_temp_dir.create() + install_options.append('--home=' + target_temp_dir.path) + + global_options = options.global_options or [] + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + if options.cache_dir and not check_path_owner(options.cache_dir): + logger.warning( + "The directory '%s' or its parent directory is not owned " + "by the current user and caching wheels has been " + "disabled. check the permissions and owner of that " + "directory. If executing pip with sudo, you may want " + "sudo's -H flag.", + options.cache_dir, + ) + options.cache_dir = None + + with TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=None, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=options.use_user_site, + upgrade_strategy=upgrade_strategy, + force_reinstall=options.force_reinstall, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=options.ignore_installed, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + # If caching is disabled or wheel is not installed don't + # try to build wheels. + if wheel and options.cache_dir: + # build wheels before install. + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + # Ignore the result: a failed wheel will be + # installed from the sdist/vcs whatever. + wb.build( + requirement_set.requirements.values(), + session=session, autobuilding=True + ) + + to_install = resolver.get_installation_order( + requirement_set + ) + + # Consistency Checking of the package set we're installing. + should_warn_about_conflicts = ( + not options.ignore_dependencies and + options.warn_about_conflicts + ) + if should_warn_about_conflicts: + self._warn_about_conflicts(to_install) + + # Don't warn about script install locations if + # --target has been specified + warn_script_location = options.warn_script_location + if options.target_dir: + warn_script_location = False + + installed = install_given_reqs( + to_install, + install_options, + global_options, + root=options.root_path, + home=target_temp_dir.path, + prefix=options.prefix_path, + pycompile=options.compile, + warn_script_location=warn_script_location, + use_user_site=options.use_user_site, + ) + + possible_lib_locations = get_lib_location_guesses( + user=options.use_user_site, + home=target_temp_dir.path, + root=options.root_path, + prefix=options.prefix_path, + isolated=options.isolated_mode, + ) + reqs = sorted(installed, key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, possible_lib_locations + ) + if installed_version: + item += '-' + installed_version + except Exception: + pass + items.append(item) + installed = ' '.join(items) + if installed: + logger.info('Successfully installed %s', installed) + except EnvironmentError as error: + show_traceback = (self.verbosity >= 1) + + message = create_env_error_message( + error, show_traceback, options.use_user_site, + ) + logger.error(message, exc_info=show_traceback) + + return ERROR + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + # Clean up + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() + + if options.target_dir: + self._handle_target_dir( + options.target_dir, target_temp_dir, options.upgrade + ) + return requirement_set + + def _handle_target_dir(self, target_dir, target_temp_dir, upgrade): + ensure_dir(target_dir) + + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + lib_dir_list = [] + + with target_temp_dir: + # Checking both purelib and platlib directories for installed + # packages to be moved to target directory + scheme = distutils_scheme('', home=target_temp_dir.path) + purelib_dir = scheme['purelib'] + platlib_dir = scheme['platlib'] + data_dir = scheme['data'] + + if os.path.exists(purelib_dir): + lib_dir_list.append(purelib_dir) + if os.path.exists(platlib_dir) and platlib_dir != purelib_dir: + lib_dir_list.append(platlib_dir) + if os.path.exists(data_dir): + lib_dir_list.append(data_dir) + + for lib_dir in lib_dir_list: + for item in os.listdir(lib_dir): + if lib_dir == data_dir: + ddir = os.path.join(data_dir, item) + if any(s.startswith(ddir) for s in lib_dir_list[:-1]): + continue + target_item_dir = os.path.join(target_dir, item) + if os.path.exists(target_item_dir): + if not upgrade: + logger.warning( + 'Target directory %s already exists. Specify ' + '--upgrade to force replacement.', + target_item_dir + ) + continue + if os.path.islink(target_item_dir): + logger.warning( + 'Target directory %s already exists and is ' + 'a link. Pip will not automatically replace ' + 'links, please remove if replacement is ' + 'desired.', + target_item_dir + ) + continue + if os.path.isdir(target_item_dir): + shutil.rmtree(target_item_dir) + else: + os.remove(target_item_dir) + + shutil.move( + os.path.join(lib_dir, item), + target_item_dir + ) + + def _warn_about_conflicts(self, to_install): + package_set, _dep_info = check_install_conflicts(to_install) + missing, conflicting = _dep_info + + # NOTE: There is some duplication here from pip check + for project_name in missing: + version = package_set[project_name][0] + for dependency in missing[project_name]: + logger.critical( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[1], + ) + + for project_name in conflicting: + version = package_set[project_name][0] + for dep_name, dep_version, req in conflicting[project_name]: + logger.critical( + "%s %s has requirement %s, but you'll have %s %s which is " + "incompatible.", + project_name, version, req, dep_name, dep_version, + ) + + +def get_lib_location_guesses(*args, **kwargs): + scheme = distutils_scheme('', *args, **kwargs) + return [scheme['purelib'], scheme['platlib']] + + +def create_env_error_message(error, show_traceback, using_user_site): + """Format an error message for an EnvironmentError + + It may occur anytime during the execution of the install command. + """ + parts = [] + + # Mention the error if we are not going to show a traceback + parts.append("Could not install packages due to an EnvironmentError") + if not show_traceback: + parts.append(": ") + parts.append(str(error)) + else: + parts.append(".") + + # Spilt the error indication from a helper message (if any) + parts[-1] += "\n" + + # Suggest useful actions to the user: + # (1) using user site-packages or (2) verifying the permissions + if error.errno == errno.EACCES: + user_option_part = "Consider using the `--user` option" + permissions_part = "Check the permissions" + + if not using_user_site: + parts.extend([ + user_option_part, " or ", + permissions_part.lower(), + ]) + else: + parts.append(permissions_part) + parts.append(".\n") + + return "".join(parts).strip() + "\n" diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/list.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/list.py new file mode 100644 index 000000000..1b46c6f78 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/list.py @@ -0,0 +1,343 @@ +from __future__ import absolute_import + +import json +import logging +import warnings + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.basecommand import Command +from pip._internal.cmdoptions import index_group, make_option_group +from pip._internal.exceptions import CommandError +from pip._internal.index import PackageFinder +from pip._internal.utils.deprecation import RemovedInPip11Warning +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.packaging import get_installer + +logger = logging.getLogger(__name__) + + +class ListCommand(Command): + """ + List installed packages, including editables. + + Packages are listed in a case-insensitive sorted order. + """ + name = 'list' + usage = """ + %prog [options]""" + summary = 'List installed packages.' + + def __init__(self, *args, **kw): + super(ListCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-o', '--outdated', + action='store_true', + default=False, + help='List outdated packages') + cmd_opts.add_option( + '-u', '--uptodate', + action='store_true', + default=False, + help='List uptodate packages') + cmd_opts.add_option( + '-e', '--editable', + action='store_true', + default=False, + help='List editable projects.') + cmd_opts.add_option( + '-l', '--local', + action='store_true', + default=False, + help=('If in a virtualenv that has global access, do not list ' + 'globally-installed packages.'), + ) + self.cmd_opts.add_option( + '--user', + dest='user', + action='store_true', + default=False, + help='Only output packages installed in user-site.') + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option( + '--format', + action='store', + dest='list_format', + default="columns", + choices=('legacy', 'columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "json, or legacy.", + ) + + cmd_opts.add_option( + '--not-required', + action='store_true', + dest='not_required', + help="List packages that are not dependencies of " + "installed packages.", + ) + + cmd_opts.add_option( + '--exclude-editable', + action='store_false', + dest='include_editable', + help='Exclude editable package from output.', + ) + cmd_opts.add_option( + '--include-editable', + action='store_true', + dest='include_editable', + help='Include editable package from output.', + default=True, + ) + index_opts = make_option_group(index_group, self.parser) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def _build_package_finder(self, options, index_urls, session): + """ + Create a package finder appropriate to this list command. + """ + return PackageFinder( + find_links=options.find_links, + index_urls=index_urls, + allow_all_prereleases=options.pre, + trusted_hosts=options.trusted_hosts, + process_dependency_links=options.process_dependency_links, + session=session, + ) + + def run(self, options, args): + if options.list_format == "legacy": + warnings.warn( + "The legacy format has been deprecated and will be removed " + "in the future.", + RemovedInPip11Warning, + ) + + if options.outdated and options.uptodate: + raise CommandError( + "Options --outdated and --uptodate cannot be combined.") + + packages = get_installed_distributions( + local_only=options.local, + user_only=options.user, + editables_only=options.editable, + include_editables=options.include_editable, + ) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(packages, options) + + if options.not_required: + packages = self.get_not_required(packages, options) + + self.output_package_listing(packages, options) + + def get_outdated(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version > dist.parsed_version + ] + + def get_uptodate(self, packages, options): + return [ + dist for dist in self.iter_packages_latest_infos(packages, options) + if dist.latest_version == dist.parsed_version + ] + + def get_not_required(self, packages, options): + dep_keys = set() + for dist in packages: + dep_keys.update(requirement.key for requirement in dist.requires()) + return {pkg for pkg in packages if pkg.key not in dep_keys} + + def iter_packages_latest_infos(self, packages, options): + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + dependency_links = [] + for dist in packages: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt'), + ) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + finder.add_dependency_links(dependency_links) + + for dist in packages: + typ = 'unknown' + all_candidates = finder.find_all_candidates(dist.key) + if not options.pre: + # Remove prereleases + all_candidates = [candidate for candidate in all_candidates + if not candidate.version.is_prerelease] + + if not all_candidates: + continue + best_candidate = max(all_candidates, + key=finder._candidate_sort_key) + remote_version = best_candidate.version + if best_candidate.location.is_wheel: + typ = 'wheel' + else: + typ = 'sdist' + # This is dirty but makes the rest of the code much cleaner + dist.latest_version = remote_version + dist.latest_filetype = typ + yield dist + + def output_legacy(self, dist, options): + if options.verbose >= 1: + return '%s (%s, %s, %s)' % ( + dist.project_name, + dist.version, + dist.location, + get_installer(dist), + ) + elif dist_is_editable(dist): + return '%s (%s, %s)' % ( + dist.project_name, + dist.version, + dist.location, + ) + else: + return '%s (%s)' % (dist.project_name, dist.version) + + def output_legacy_latest(self, dist, options): + return '%s - Latest: %s [%s]' % ( + self.output_legacy(dist, options), + dist.latest_version, + dist.latest_filetype, + ) + + def output_package_listing(self, packages, options): + packages = sorted( + packages, + key=lambda dist: dist.project_name.lower(), + ) + if options.list_format == 'columns' and packages: + data, header = format_for_columns(packages, options) + self.output_package_listing_columns(data, header) + elif options.list_format == 'freeze': + for dist in packages: + if options.verbose >= 1: + logger.info("%s==%s (%s)", dist.project_name, + dist.version, dist.location) + else: + logger.info("%s==%s", dist.project_name, dist.version) + elif options.list_format == 'json': + logger.info(format_for_json(packages, options)) + elif options.list_format == "legacy": + for dist in packages: + if options.outdated: + logger.info(self.output_legacy_latest(dist, options)) + else: + logger.info(self.output_legacy(dist, options)) + + def output_package_listing_columns(self, data, header): + # insert the header first: we need to know the size of column names + if len(data) > 0: + data.insert(0, header) + + pkg_strings, sizes = tabulate(data) + + # Create and add a separator. + if len(data) > 0: + pkg_strings.insert(1, " ".join(map(lambda x: '-' * x, sizes))) + + for val in pkg_strings: + logger.info(val) + + +def tabulate(vals): + # From pfmoore on GitHub: + # https://github.com/pypa/pip/issues/3651#issuecomment-216932564 + assert len(vals) > 0 + + sizes = [0] * max(len(x) for x in vals) + for row in vals: + sizes = [max(s, len(str(c))) for s, c in zip_longest(sizes, row)] + + result = [] + for row in vals: + display = " ".join([str(c).ljust(s) if c is not None else '' + for s, c in zip_longest(sizes, row)]) + result.append(display) + + return result, sizes + + +def format_for_columns(pkgs, options): + """ + Convert the package data into something usable + by output_package_listing_columns. + """ + running_outdated = options.outdated + # Adjust the header for the `pip list --outdated` case. + if running_outdated: + header = ["Package", "Version", "Latest", "Type"] + else: + header = ["Package", "Version"] + + data = [] + if options.verbose >= 1 or any(dist_is_editable(x) for x in pkgs): + header.append("Location") + if options.verbose >= 1: + header.append("Installer") + + for proj in pkgs: + # if we're working on the 'outdated' list, separate out the + # latest_version and type + row = [proj.project_name, proj.version] + + if running_outdated: + row.append(proj.latest_version) + row.append(proj.latest_filetype) + + if options.verbose >= 1 or dist_is_editable(proj): + row.append(proj.location) + if options.verbose >= 1: + row.append(get_installer(proj)) + + data.append(row) + + return data, header + + +def format_for_json(packages, options): + data = [] + for dist in packages: + info = { + 'name': dist.project_name, + 'version': six.text_type(dist.version), + } + if options.verbose >= 1: + info['location'] = dist.location + info['installer'] = get_installer(dist) + if options.outdated: + info['latest_version'] = six.text_type(dist.latest_version) + info['latest_filetype'] = dist.latest_filetype + data.append(info) + return json.dumps(data) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/search.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/search.py new file mode 100644 index 000000000..83895cefc --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/search.py @@ -0,0 +1,135 @@ +from __future__ import absolute_import + +import logging +import sys +import textwrap +from collections import OrderedDict + +from pip._vendor import pkg_resources +from pip._vendor.packaging.version import parse as parse_version +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore + +from pip._internal.basecommand import SUCCESS, Command +from pip._internal.compat import get_terminal_size +from pip._internal.download import PipXmlrpcTransport +from pip._internal.exceptions import CommandError +from pip._internal.models import PyPI +from pip._internal.status_codes import NO_MATCHES_FOUND +from pip._internal.utils.logging import indent_log + +logger = logging.getLogger(__name__) + + +class SearchCommand(Command): + """Search for PyPI packages whose name or summary contains .""" + name = 'search' + usage = """ + %prog [options] """ + summary = 'Search PyPI for packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(SearchCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-i', '--index', + dest='index', + metavar='URL', + default=PyPI.pypi_url, + help='Base URL of Python Package Index (default %default)') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + raise CommandError('Missing required argument (search query).') + query = args + pypi_hits = self.search(query, options) + hits = transform_hits(pypi_hits) + + terminal_width = None + if sys.stdout.isatty(): + terminal_width = get_terminal_size()[0] + + print_results(hits, terminal_width=terminal_width) + if pypi_hits: + return SUCCESS + return NO_MATCHES_FOUND + + def search(self, query, options): + index_url = options.index + with self._build_session(options) as session: + transport = PipXmlrpcTransport(index_url, session) + pypi = xmlrpc_client.ServerProxy(index_url, transport) + hits = pypi.search({'name': query, 'summary': query}, 'or') + return hits + + +def transform_hits(hits): + """ + The list from pypi is really a list of versions. We want a list of + packages with the list of versions stored inline. This converts the + list from pypi into one we can use. + """ + packages = OrderedDict() + for hit in hits: + name = hit['name'] + summary = hit['summary'] + version = hit['version'] + + if name not in packages.keys(): + packages[name] = { + 'name': name, + 'summary': summary, + 'versions': [version], + } + else: + packages[name]['versions'].append(version) + + # if this is the highest version, replace summary and score + if version == highest_version(packages[name]['versions']): + packages[name]['summary'] = summary + + return list(packages.values()) + + +def print_results(hits, name_column_width=None, terminal_width=None): + if not hits: + return + if name_column_width is None: + name_column_width = max([ + len(hit['name']) + len(highest_version(hit.get('versions', ['-']))) + for hit in hits + ]) + 4 + + installed_packages = [p.project_name for p in pkg_resources.working_set] + for hit in hits: + name = hit['name'] + summary = hit['summary'] or '' + latest = highest_version(hit.get('versions', ['-'])) + if terminal_width is not None: + target_width = terminal_width - name_column_width - 5 + if target_width > 10: + # wrap and indent summary to fit terminal + summary = textwrap.wrap(summary, target_width) + summary = ('\n' + ' ' * (name_column_width + 3)).join(summary) + + line = '%-*s - %s' % (name_column_width, + '%s (%s)' % (name, latest), summary) + try: + logger.info(line) + if name in installed_packages: + dist = pkg_resources.get_distribution(name) + with indent_log(): + if dist.version == latest: + logger.info('INSTALLED: %s (latest)', dist.version) + else: + logger.info('INSTALLED: %s', dist.version) + logger.info('LATEST: %s', latest) + except UnicodeEncodeError: + pass + + +def highest_version(versions): + return max(versions, key=parse_version) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/show.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/show.py new file mode 100644 index 000000000..bad96287a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/show.py @@ -0,0 +1,164 @@ +from __future__ import absolute_import + +import logging +import os +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.basecommand import Command +from pip._internal.status_codes import ERROR, SUCCESS + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """Show information about one or more installed packages.""" + name = 'show' + usage = """ + %prog [options] ...""" + summary = 'Show information about installed packages.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(ShowCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-f', '--files', + dest='files', + action='store_true', + default=False, + help='Show the full list of installed files for each package.') + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + if not args: + logger.warning('ERROR: Please provide a package name or names.') + return ERROR + query = args + + results = search_packages_info(query) + if not print_results( + results, list_files=options.files, verbose=options.verbose): + return ERROR + return SUCCESS + + +def search_packages_info(query): + """ + Gather details from installed distributions. Print distribution name, + version, location, and installed files. Installed files requires a + pip generated 'installed-files.txt' in the distributions '.egg-info' + directory. + """ + installed = {} + for p in pkg_resources.working_set: + installed[canonicalize_name(p.project_name)] = p + + query_names = [canonicalize_name(name) for name in query] + + for dist in [installed[pkg] for pkg in query_names if pkg in installed]: + package = { + 'name': dist.project_name, + 'version': dist.version, + 'location': dist.location, + 'requires': [dep.project_name for dep in dist.requires()], + } + file_list = None + metadata = None + if isinstance(dist, pkg_resources.DistInfoDistribution): + # RECORDs should be part of .dist-info metadatas + if dist.has_metadata('RECORD'): + lines = dist.get_metadata_lines('RECORD') + paths = [l.split(',')[0] for l in lines] + paths = [os.path.join(dist.location, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('METADATA'): + metadata = dist.get_metadata('METADATA') + else: + # Otherwise use pip's log for .egg-info's + if dist.has_metadata('installed-files.txt'): + paths = dist.get_metadata_lines('installed-files.txt') + paths = [os.path.join(dist.egg_info, p) for p in paths] + file_list = [os.path.relpath(p, dist.location) for p in paths] + + if dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + + if dist.has_metadata('entry_points.txt'): + entry_points = dist.get_metadata_lines('entry_points.txt') + package['entry_points'] = entry_points + + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + package['installer'] = line.strip() + break + + # @todo: Should pkg_resources.Distribution have a + # `get_pkg_info` method? + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + for key in ('metadata-version', 'summary', + 'home-page', 'author', 'author-email', 'license'): + package[key] = pkg_info_dict.get(key) + + # It looks like FeedParser cannot deal with repeated headers + classifiers = [] + for line in metadata.splitlines(): + if line.startswith('Classifier: '): + classifiers.append(line[len('Classifier: '):]) + package['classifiers'] = classifiers + + if file_list: + package['files'] = sorted(file_list) + yield package + + +def print_results(distributions, list_files=False, verbose=False): + """ + Print the informations from installed distributions found. + """ + results_printed = False + for i, dist in enumerate(distributions): + results_printed = True + if i > 0: + logger.info("---") + + name = dist.get('name', '') + required_by = [ + pkg.project_name for pkg in pkg_resources.working_set + if name in [required.name for required in pkg.requires()] + ] + + logger.info("Name: %s", name) + logger.info("Version: %s", dist.get('version', '')) + logger.info("Summary: %s", dist.get('summary', '')) + logger.info("Home-page: %s", dist.get('home-page', '')) + logger.info("Author: %s", dist.get('author', '')) + logger.info("Author-email: %s", dist.get('author-email', '')) + logger.info("License: %s", dist.get('license', '')) + logger.info("Location: %s", dist.get('location', '')) + logger.info("Requires: %s", ', '.join(dist.get('requires', []))) + logger.info("Required-by: %s", ', '.join(required_by)) + + if verbose: + logger.info("Metadata-Version: %s", + dist.get('metadata-version', '')) + logger.info("Installer: %s", dist.get('installer', '')) + logger.info("Classifiers:") + for classifier in dist.get('classifiers', []): + logger.info(" %s", classifier) + logger.info("Entry-points:") + for entry in dist.get('entry_points', []): + logger.info(" %s", entry.strip()) + if list_files: + logger.info("Files:") + for line in dist.get('files', []): + logger.info(" %s", line.strip()) + if "files" not in dist: + logger.info("Cannot locate installed-files.txt") + return results_printed diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py new file mode 100644 index 000000000..3bfa07f05 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/uninstall.py @@ -0,0 +1,71 @@ +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.basecommand import Command +from pip._internal.exceptions import InstallationError +from pip._internal.req import InstallRequirement, parse_requirements + + +class UninstallCommand(Command): + """ + Uninstall packages. + + pip is able to uninstall most installed packages. Known exceptions are: + + - Pure distutils packages installed with ``python setup.py install``, which + leave behind no metadata to determine what files were installed. + - Script wrappers installed by ``python setup.py develop``. + """ + name = 'uninstall' + usage = """ + %prog [options] ... + %prog [options] -r ...""" + summary = 'Uninstall packages.' + + def __init__(self, *args, **kw): + super(UninstallCommand, self).__init__(*args, **kw) + self.cmd_opts.add_option( + '-r', '--requirement', + dest='requirements', + action='append', + default=[], + metavar='file', + help='Uninstall all the packages listed in the given requirements ' + 'file. This option can be used multiple times.', + ) + self.cmd_opts.add_option( + '-y', '--yes', + dest='yes', + action='store_true', + help="Don't ask for confirmation of uninstall deletions.") + + self.parser.insert_option_group(0, self.cmd_opts) + + def run(self, options, args): + with self._build_session(options) as session: + reqs_to_uninstall = {} + for name in args: + req = InstallRequirement.from_line( + name, isolated=options.isolated_mode, + ) + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + for filename in options.requirements: + for req in parse_requirements( + filename, + options=options, + session=session): + if req.name: + reqs_to_uninstall[canonicalize_name(req.name)] = req + if not reqs_to_uninstall: + raise InstallationError( + 'You must give at least one requirement to %(name)s (see ' + '"pip help %(name)s")' % dict(name=self.name) + ) + for req in reqs_to_uninstall.values(): + uninstall_pathset = req.uninstall( + auto_confirm=options.yes, verbose=self.verbosity > 0, + ) + if uninstall_pathset: + uninstall_pathset.commit() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py b/myenv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py new file mode 100644 index 000000000..ed8cdfc22 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/commands/wheel.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os + +from pip._internal import cmdoptions +from pip._internal.basecommand import RequirementCommand +from pip._internal.cache import WheelCache +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.resolve import Resolver +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +logger = logging.getLogger(__name__) + + +class WheelCommand(RequirementCommand): + """ + Build Wheel archives for your requirements and dependencies. + + Wheel is a built-package format, and offers the advantage of not + recompiling your software during every install. For more details, see the + wheel docs: https://wheel.readthedocs.io/en/latest/ + + Requirements: setuptools>=0.8, and wheel. + + 'pip wheel' uses the bdist_wheel setuptools extension from the wheel + package to build individual wheels. + + """ + + name = 'wheel' + usage = """ + %prog [options] ... + %prog [options] -r ... + %prog [options] [-e] ... + %prog [options] [-e] ... + %prog [options] ...""" + + summary = 'Build wheels from your requirements.' + + def __init__(self, *args, **kw): + super(WheelCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '-w', '--wheel-dir', + dest='wheel_dir', + metavar='dir', + default=os.curdir, + help=("Build wheels into , where the default is the " + "current working directory."), + ) + cmd_opts.add_option(cmdoptions.no_binary()) + cmd_opts.add_option(cmdoptions.only_binary()) + cmd_opts.add_option( + '--build-option', + dest='build_options', + metavar='options', + action='append', + help="Extra arguments to be supplied to 'setup.py bdist_wheel'.", + ) + cmd_opts.add_option(cmdoptions.no_build_isolation()) + cmd_opts.add_option(cmdoptions.constraints()) + cmd_opts.add_option(cmdoptions.editable()) + cmd_opts.add_option(cmdoptions.requirements()) + cmd_opts.add_option(cmdoptions.src()) + cmd_opts.add_option(cmdoptions.ignore_requires_python()) + cmd_opts.add_option(cmdoptions.no_deps()) + cmd_opts.add_option(cmdoptions.build_dir()) + cmd_opts.add_option(cmdoptions.progress_bar()) + + cmd_opts.add_option( + '--global-option', + dest='global_options', + action='append', + metavar='options', + help="Extra global options to be supplied to the setup.py " + "call before the 'bdist_wheel' command.") + + cmd_opts.add_option( + '--pre', + action='store_true', + default=False, + help=("Include pre-release and development versions. By default, " + "pip only finds stable versions."), + ) + + cmd_opts.add_option(cmdoptions.no_clean()) + cmd_opts.add_option(cmdoptions.require_hashes()) + + index_opts = cmdoptions.make_option_group( + cmdoptions.index_group, + self.parser, + ) + + self.parser.insert_option_group(0, index_opts) + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + cmdoptions.check_install_build_global(options) + + index_urls = [options.index_url] + options.extra_index_urls + if options.no_index: + logger.debug('Ignoring indexes: %s', ','.join(index_urls)) + index_urls = [] + + if options.build_dir: + options.build_dir = os.path.abspath(options.build_dir) + + options.src_dir = os.path.abspath(options.src_dir) + + with self._build_session(options) as session: + finder = self._build_package_finder(options, session) + build_delete = (not (options.no_clean or options.build_dir)) + wheel_cache = WheelCache(options.cache_dir, options.format_control) + + with TempDirectory( + options.build_dir, delete=build_delete, kind="wheel" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + ) + + try: + self.populate_requirement_set( + requirement_set, args, options, finder, session, + self.name, wheel_cache + ) + + preparer = RequirementPreparer( + build_dir=directory.path, + src_dir=options.src_dir, + download_dir=None, + wheel_download_dir=options.wheel_dir, + progress_bar=options.progress_bar, + build_isolation=options.build_isolation, + ) + + resolver = Resolver( + preparer=preparer, + finder=finder, + session=session, + wheel_cache=wheel_cache, + use_user_site=False, + upgrade_strategy="to-satisfy-only", + force_reinstall=False, + ignore_dependencies=options.ignore_dependencies, + ignore_requires_python=options.ignore_requires_python, + ignore_installed=True, + isolated=options.isolated_mode, + ) + resolver.resolve(requirement_set) + + # build wheels + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=options.build_options or [], + global_options=options.global_options or [], + no_clean=options.no_clean, + ) + wheels_built_successfully = wb.build( + requirement_set.requirements.values(), session=session, + ) + if not wheels_built_successfully: + raise CommandError( + "Failed to build one or more wheels" + ) + except PreviousBuildDirError: + options.no_clean = True + raise + finally: + if not options.no_clean: + requirement_set.cleanup_files() + wheel_cache.cleanup() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/compat.py b/myenv/lib/python3.7/site-packages/pip/_internal/compat.py new file mode 100644 index 000000000..064717d12 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/compat.py @@ -0,0 +1,235 @@ +"""Stuff that differs in different Python versions and platform +distributions.""" +from __future__ import absolute_import, division + +import codecs +import locale +import logging +import os +import shutil +import sys + +from pip._vendor.six import text_type + +try: + import ipaddress +except ImportError: + try: + from pip._vendor import ipaddress # type: ignore + except ImportError: + import ipaddr as ipaddress # type: ignore + ipaddress.ip_address = ipaddress.IPAddress + ipaddress.ip_network = ipaddress.IPNetwork + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", +] + + +logger = logging.getLogger(__name__) + +if sys.version_info >= (3, 4): + uses_pycache = True + from importlib.util import cache_from_source +else: + import imp + + try: + cache_from_source = imp.cache_from_source # type: ignore + except AttributeError: + # does not use __pycache__ + cache_from_source = None + + uses_pycache = cache_from_source is not None + + +if sys.version_info >= (3, 5): + backslashreplace_decode = "backslashreplace" +else: + # In version 3.4 and older, backslashreplace exists + # but does not support use for decoding. + # We implement our own replace handler for this + # situation, so that we can consistently use + # backslash replacement for all versions. + def backslashreplace_decode_fn(err): + raw_bytes = (err.object[i] for i in range(err.start, err.end)) + if sys.version_info[0] == 2: + # Python 2 gave us characters - convert to numeric bytes + raw_bytes = (ord(b) for b in raw_bytes) + return u"".join(u"\\x%x" % c for c in raw_bytes), err.end + codecs.register_error( + "backslashreplace_decode", + backslashreplace_decode_fn, + ) + backslashreplace_decode = "backslashreplace_decode" + + +def console_to_str(data): + """Return a string, safe for output, of subprocess output. + + We assume the data is in the locale preferred encoding. + If it won't decode properly, we warn the user but decode as + best we can. + + We also ensure that the output can be safely written to + standard output without encoding errors. + """ + + # First, get the encoding we assume. This is the preferred + # encoding for the locale, unless that is not found, or + # it is ASCII, in which case assume UTF-8 + encoding = locale.getpreferredencoding() + if (not encoding) or codecs.lookup(encoding).name == "ascii": + encoding = "utf-8" + + # Now try to decode the data - if we fail, warn the user and + # decode with replacement. + try: + s = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + s = data.decode(encoding, errors=backslashreplace_decode) + + # Make sure we can print the output, by encoding it to the output + # encoding with replacement of unencodable characters, and then + # decoding again. + # We use stderr's encoding because it's less likely to be + # redirected and if we don't find an encoding we skip this + # step (on the assumption that output is wrapped by something + # that won't fail). + # The double getattr is to deal with the possibility that we're + # being called in a situation where sys.__stderr__ doesn't exist, + # or doesn't have an encoding attribute. Neither of these cases + # should occur in normal pip use, but there's no harm in checking + # in case people use pip in (unsupported) unusual situations. + output_encoding = getattr(getattr(sys, "__stderr__", None), + "encoding", None) + + if output_encoding: + s = s.encode(output_encoding, errors="backslashreplace") + s = s.decode(output_encoding) + + return s + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # Replace is ignored -- unicode to UTF-8 can't fail + if isinstance(s, text_type): + return s.encode('utf-8') + return s + + +def get_path_uid(path): + """ + Return path's uid. + + Does not follow symlinks: + https://github.com/pypa/pip/pull/935#discussion_r5307003 + + Placed this function in compat due to differences on AIX and + Jython, that should eventually go away. + + :raises OSError: When path is a symlink or can't be read. + """ + if hasattr(os, 'O_NOFOLLOW'): + fd = os.open(path, os.O_RDONLY | os.O_NOFOLLOW) + file_uid = os.fstat(fd).st_uid + os.close(fd) + else: # AIX and Jython + # WARNING: time of check vulnerability, but best we can do w/o NOFOLLOW + if not os.path.islink(path): + # older versions of Jython don't have `os.fstat` + file_uid = os.stat(path).st_uid + else: + # raise OSError for parity with os.O_NOFOLLOW above + raise OSError( + "%s is a symlink; Will not return uid for symlinks" % path + ) + return file_uid + + +def expanduser(path): + """ + Expand ~ and ~user constructions. + + Includes a workaround for http://bugs.python.org/issue14768 + """ + expanded = os.path.expanduser(path) + if path.startswith('~/') and expanded.startswith('//'): + expanded = expanded[1:] + return expanded + + +# packages in the stdlib that may have installation metadata, but should not be +# considered 'installed'. this theoretically could be determined based on +# dist.location (py27:`sysconfig.get_paths()['stdlib']`, +# py26:sysconfig.get_config_vars('LIBDEST')), but fear platform variation may +# make this ineffective, so hard-coding +stdlib_pkgs = {"python", "wsgiref", "argparse"} + + +# windows detection, covers cpython and ironpython +WINDOWS = (sys.platform.startswith("win") or + (sys.platform == 'cli' and os.name == 'nt')) + + +def samefile(file1, file2): + """Provide an alternative for os.path.samefile on Windows/Python2""" + if hasattr(os.path, 'samefile'): + return os.path.samefile(file1, file2) + else: + path1 = os.path.normcase(os.path.abspath(file1)) + path2 = os.path.normcase(os.path.abspath(file2)) + return path1 == path2 + + +if hasattr(shutil, 'get_terminal_size'): + def get_terminal_size(): + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + return tuple(shutil.get_terminal_size()) +else: + def get_terminal_size(): + """ + Returns a tuple (x, y) representing the width(x) and the height(y) + in characters of the terminal window. + """ + def ioctl_GWINSZ(fd): + try: + import fcntl + import termios + import struct + cr = struct.unpack_from( + 'hh', + fcntl.ioctl(fd, termios.TIOCGWINSZ, '12345678') + ) + except: + return None + if cr == (0, 0): + return None + return cr + cr = ioctl_GWINSZ(0) or ioctl_GWINSZ(1) or ioctl_GWINSZ(2) + if not cr: + try: + fd = os.open(os.ctermid(), os.O_RDONLY) + cr = ioctl_GWINSZ(fd) + os.close(fd) + except: + pass + if not cr: + cr = (os.environ.get('LINES', 25), os.environ.get('COLUMNS', 80)) + return int(cr[1]), int(cr[0]) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/configuration.py b/myenv/lib/python3.7/site-packages/pip/_internal/configuration.py new file mode 100644 index 000000000..07af3733f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/configuration.py @@ -0,0 +1,378 @@ +"""Configuration management setup + +Some terminology: +- name + As written in config files. +- value + Value associated with a name +- key + Name combined with it's section (section.name) +- variant + A single word describing where the configuration key-value pair came from +""" + +import locale +import logging +import os + +from pip._vendor import six +from pip._vendor.six.moves import configparser + +from pip._internal.exceptions import ConfigurationError +from pip._internal.locations import ( + legacy_config_file, new_config_file, running_under_virtualenv, + site_config_files, venv_config_file, +) +from pip._internal.utils.misc import ensure_dir, enum +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple + + RawConfigParser = configparser.RawConfigParser # Shorthand + Kind = NewType("Kind", str) + +logger = logging.getLogger(__name__) + + +# NOTE: Maybe use the optionx attribute to normalize keynames. +def _normalize_name(name): + # type: (str) -> str + """Make a name consistent regardless of source (environment or file) + """ + name = name.lower().replace('_', '-') + if name.startswith('--'): + name = name[2:] # only prefer long opts + return name + + +def _disassemble_key(name): + # type: (str) -> List[str] + return name.split(".", 1) + + +# The kinds of configurations there are. +kinds = enum( + USER="user", # User Specific + GLOBAL="global", # System Wide + VENV="venv", # Virtual Environment Specific + ENV="env", # from PIP_CONFIG_FILE + ENV_VAR="env-var", # from Environment Variables +) + + +class Configuration(object): + """Handles management of configuration. + + Provides an interface to accessing and managing configuration files. + + This class converts provides an API that takes "section.key-name" style + keys and stores the value associated with it as "key-name" under the + section "section". + + This allows for a clean interface wherein the both the section and the + key-name are preserved in an easy to manage form in the configuration files + and the data stored is also nice. + """ + + def __init__(self, isolated, load_only=None): + # type: (bool, Kind) -> None + super(Configuration, self).__init__() + + _valid_load_only = [kinds.USER, kinds.GLOBAL, kinds.VENV, None] + if load_only not in _valid_load_only: + raise ConfigurationError( + "Got invalid value for load_only - should be one of {}".format( + ", ".join(map(repr, _valid_load_only[:-1])) + ) + ) + self.isolated = isolated # type: bool + self.load_only = load_only # type: Optional[Kind] + + # The order here determines the override order. + self._override_order = [ + kinds.GLOBAL, kinds.USER, kinds.VENV, kinds.ENV, kinds.ENV_VAR + ] + + self._ignore_env_names = ["version", "help"] + + # Because we keep track of where we got the data from + self._parsers = { + variant: [] for variant in self._override_order + } # type: Dict[Kind, List[Tuple[str, RawConfigParser]]] + self._config = { + variant: {} for variant in self._override_order + } # type: Dict[Kind, Dict[str, Any]] + self._modified_parsers = [] # type: List[Tuple[str, RawConfigParser]] + + def load(self): + # type: () -> None + """Loads configuration from configuration files and environment + """ + self._load_config_files() + if not self.isolated: + self._load_environment_vars() + + def get_file_to_edit(self): + # type: () -> Optional[str] + """Returns the file with highest priority in configuration + """ + assert self.load_only is not None, \ + "Need to be specified a file to be editing" + + try: + return self._get_parser_to_modify()[0] + except IndexError: + return None + + def items(self): + # type: () -> Iterable[Tuple[str, Any]] + """Returns key-value pairs like dict.items() representing the loaded + configuration + """ + return self._dictionary.items() + + def get_value(self, key): + # type: (str) -> Any + """Get a value from the configuration. + """ + try: + return self._dictionary[key] + except KeyError: + raise ConfigurationError("No such key - {}".format(key)) + + def set_value(self, key, value): + # type: (str, Any) -> None + """Modify a value in the configuration. + """ + self._ensure_have_load_only() + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Modify the parser and the configuration + if not parser.has_section(section): + parser.add_section(section) + parser.set(section, name, value) + + self._config[self.load_only][key] = value + self._mark_as_modified(fname, parser) + + def unset_value(self, key): + # type: (str) -> None + """Unset a value in the configuration. + """ + self._ensure_have_load_only() + + if key not in self._config[self.load_only]: + raise ConfigurationError("No such key - {}".format(key)) + + fname, parser = self._get_parser_to_modify() + + if parser is not None: + section, name = _disassemble_key(key) + + # Remove the key in the parser + modified_something = False + if parser.has_section(section): + # Returns whether the option was removed or not + modified_something = parser.remove_option(section, name) + + if modified_something: + # name removed from parser, section may now be empty + section_iter = iter(parser.items(section)) + try: + val = six.next(section_iter) + except StopIteration: + val = None + + if val is None: + parser.remove_section(section) + + self._mark_as_modified(fname, parser) + else: + raise ConfigurationError( + "Fatal Internal error [id=1]. Please report as a bug." + ) + + del self._config[self.load_only][key] + + def save(self): + # type: () -> None + """Save the currentin-memory state. + """ + self._ensure_have_load_only() + + for fname, parser in self._modified_parsers: + logger.info("Writing to %s", fname) + + # Ensure directory exists. + ensure_dir(os.path.dirname(fname)) + + with open(fname, "w") as f: + parser.write(f) # type: ignore + + # + # Private routines + # + + def _ensure_have_load_only(self): + # type: () -> None + if self.load_only is None: + raise ConfigurationError("Needed a specific file to be modifying.") + logger.debug("Will be working with %s variant only", self.load_only) + + @property + def _dictionary(self): + # type: () -> Dict[str, Any] + """A dictionary representing the loaded configuration. + """ + # NOTE: Dictionaries are not populated if not loaded. So, conditionals + # are not needed here. + retval = {} + + for variant in self._override_order: + retval.update(self._config[variant]) + + return retval + + def _load_config_files(self): + # type: () -> None + """Loads configuration from configuration files + """ + config_files = dict(self._iter_config_files()) + if config_files[kinds.ENV][0:1] == [os.devnull]: + logger.debug( + "Skipping loading configuration files due to " + "environment's PIP_CONFIG_FILE being os.devnull" + ) + return + + for variant, files in config_files.items(): + for fname in files: + # If there's specific variant set in `load_only`, load only + # that variant, not the others. + if self.load_only is not None and variant != self.load_only: + logger.debug( + "Skipping file '%s' (variant: %s)", fname, variant + ) + continue + + parser = self._load_file(variant, fname) + + # Keeping track of the parsers used + self._parsers[variant].append((fname, parser)) + + def _load_file(self, variant, fname): + # type: (Kind, str) -> RawConfigParser + logger.debug("For variant '%s', will try loading '%s'", variant, fname) + parser = self._construct_parser(fname) + + for section in parser.sections(): + items = parser.items(section) + self._config[variant].update(self._normalized_keys(section, items)) + + return parser + + def _construct_parser(self, fname): + # type: (str) -> RawConfigParser + parser = configparser.RawConfigParser() + # If there is no such file, don't bother reading it but create the + # parser anyway, to hold the data. + # Doing this is useful when modifying and saving files, where we don't + # need to construct a parser. + if os.path.exists(fname): + try: + parser.read(fname) + except UnicodeDecodeError: + raise ConfigurationError(( + "ERROR: " + "Configuration file contains invalid %s characters.\n" + "Please fix your configuration, located at %s\n" + ) % (locale.getpreferredencoding(False), fname)) + return parser + + def _load_environment_vars(self): + # type: () -> None + """Loads configuration from environment variables + """ + self._config[kinds.ENV_VAR].update( + self._normalized_keys(":env:", self._get_environ_vars()) + ) + + def _normalized_keys(self, section, items): + # type: (str, Iterable[Tuple[str, Any]]) -> Dict[str, Any] + """Normalizes items to construct a dictionary with normalized keys. + + This routine is where the names become keys and are made the same + regardless of source - configuration files or environment. + """ + normalized = {} + for name, val in items: + key = section + "." + _normalize_name(name) + normalized[key] = val + return normalized + + def _get_environ_vars(self): + # type: () -> Iterable[Tuple[str, str]] + """Returns a generator with all environmental vars with prefix PIP_""" + for key, val in os.environ.items(): + should_be_yielded = ( + key.startswith("PIP_") and + key[4:].lower() not in self._ignore_env_names + ) + if should_be_yielded: + yield key[4:].lower(), val + + # XXX: This is patched in the tests. + def _iter_config_files(self): + # type: () -> Iterable[Tuple[Kind, List[str]]] + """Yields variant and configuration files associated with it. + + This should be treated like items of a dictionary. + """ + # SMELL: Move the conditions out of this function + + # environment variables have the lowest priority + config_file = os.environ.get('PIP_CONFIG_FILE', None) + if config_file is not None: + yield kinds.ENV, [config_file] + else: + yield kinds.ENV, [] + + # at the base we have any global configuration + yield kinds.GLOBAL, list(site_config_files) + + # per-user configuration next + should_load_user_config = not self.isolated and not ( + config_file and os.path.exists(config_file) + ) + if should_load_user_config: + # The legacy config file is overridden by the new config file + yield kinds.USER, [legacy_config_file, new_config_file] + + # finally virtualenv configuration first trumping others + if running_under_virtualenv(): + yield kinds.VENV, [venv_config_file] + + def _get_parser_to_modify(self): + # type: () -> Tuple[str, RawConfigParser] + # Determine which parser to modify + parsers = self._parsers[self.load_only] + if not parsers: + # This should not happen if everything works correctly. + raise ConfigurationError( + "Fatal Internal error [id=2]. Please report as a bug." + ) + + # Use the highest priority parser. + return parsers[-1] + + # XXX: This is patched in the tests. + def _mark_as_modified(self, fname, parser): + # type: (str, RawConfigParser) -> None + file_parser_tuple = (fname, parser) + if file_parser_tuple not in self._modified_parsers: + self._modified_parsers.append(file_parser_tuple) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/download.py b/myenv/lib/python3.7/site-packages/pip/_internal/download.py new file mode 100644 index 000000000..e0e2d24c9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/download.py @@ -0,0 +1,922 @@ +from __future__ import absolute_import + +import cgi +import email.utils +import getpass +import json +import logging +import mimetypes +import os +import platform +import re +import shutil +import sys + +from pip._vendor import requests, six, urllib3 +from pip._vendor.cachecontrol import CacheControlAdapter +from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.lockfile import LockError +from pip._vendor.requests.adapters import BaseAdapter, HTTPAdapter +from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth +from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response +from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.requests.utils import get_netrc_auth +# NOTE: XMLRPC Client is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import +from pip._vendor.six.moves import xmlrpc_client # type: ignore +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote +from pip._vendor.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.compat import WINDOWS +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models import PyPI +from pip._internal.utils.encoding import auto_decode +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.glibc import libc_ver +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, ask_path_exists, backup_dir, call_subprocess, consume, + display_path, format_size, get_installed_version, rmtree, splitext, + unpack_file, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import DownloadProgressProvider +from pip._internal.vcs import vcs + +try: + import ssl # noqa +except ImportError: + ssl = None + +HAS_TLS = (ssl is not None) or IS_PYOPENSSL + +__all__ = ['get_file_content', + 'is_url', 'url_to_path', 'path_to_url', + 'is_archive_file', 'unpack_vcs_link', + 'unpack_file_url', 'is_vcs_url', 'is_file_url', + 'unpack_http_url', 'unpack_url'] + + +logger = logging.getLogger(__name__) + + +def user_agent(): + """ + Return a string representing the user agent. + """ + data = { + "installer": {"name": "pip", "version": pip.__version__}, + "python": platform.python_version(), + "implementation": { + "name": platform.python_implementation(), + }, + } + + if data["implementation"]["name"] == 'CPython': + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'PyPy': + if sys.pypy_version_info.releaselevel == 'final': + pypy_version_info = sys.pypy_version_info[:3] + else: + pypy_version_info = sys.pypy_version_info + data["implementation"]["version"] = ".".join( + [str(x) for x in pypy_version_info] + ) + elif data["implementation"]["name"] == 'Jython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + elif data["implementation"]["name"] == 'IronPython': + # Complete Guess + data["implementation"]["version"] = platform.python_version() + + if sys.platform.startswith("linux"): + from pip._vendor import distro + distro_infos = dict(filter( + lambda x: x[1], + zip(["name", "version", "id"], distro.linux_distribution()), + )) + libc = dict(filter( + lambda x: x[1], + zip(["lib", "version"], libc_ver()), + )) + if libc: + distro_infos["libc"] = libc + if distro_infos: + data["distro"] = distro_infos + + if sys.platform.startswith("darwin") and platform.mac_ver()[0]: + data["distro"] = {"name": "macOS", "version": platform.mac_ver()[0]} + + if platform.system(): + data.setdefault("system", {})["name"] = platform.system() + + if platform.release(): + data.setdefault("system", {})["release"] = platform.release() + + if platform.machine(): + data["cpu"] = platform.machine() + + if HAS_TLS: + data["openssl_version"] = ssl.OPENSSL_VERSION + + setuptools_version = get_installed_version("setuptools") + if setuptools_version is not None: + data["setuptools_version"] = setuptools_version + + return "{data[installer][name]}/{data[installer][version]} {json}".format( + data=data, + json=json.dumps(data, separators=(",", ":"), sort_keys=True), + ) + + +class MultiDomainBasicAuth(AuthBase): + + def __init__(self, prompting=True): + self.prompting = prompting + self.passwords = {} + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Get the netloc without any embedded credentials + netloc = parsed.netloc.rsplit("@", 1)[-1] + + # Set the url of the request to the url without any credentials + req.url = urllib_parse.urlunparse(parsed[:1] + (netloc,) + parsed[2:]) + + # Use any stored credentials that we have for this netloc + username, password = self.passwords.get(netloc, (None, None)) + + # Extract credentials embedded in the url if we have none stored + if username is None: + username, password = self.parse_credentials(parsed.netloc) + + # Get creds from netrc if we still don't have them + if username is None and password is None: + netrc_auth = get_netrc_auth(req.url) + username, password = netrc_auth if netrc_auth else (None, None) + + if username or password: + # Store the username and password + self.passwords[netloc] = (username, password) + + # Send the basic auth with this request + req = HTTPBasicAuth(username or "", password or "")(req) + + # Attach a hook to handle 401 responses + req.register_hook("response", self.handle_401) + + return req + + def handle_401(self, resp, **kwargs): + # We only care about 401 responses, anything else we want to just + # pass through the actual response + if resp.status_code != 401: + return resp + + # We are not able to prompt the user so simply return the response + if not self.prompting: + return resp + + parsed = urllib_parse.urlparse(resp.url) + + # Prompt the user for a new username and password + username = six.moves.input("User for %s: " % parsed.netloc) + password = getpass.getpass("Password: ") + + # Store the new username and password to use for future requests + if username or password: + self.passwords[parsed.netloc] = (username, password) + + # Consume content and release the original connection to allow our new + # request to reuse the same one. + resp.content + resp.raw.release_conn() + + # Add our new username and password to the request + req = HTTPBasicAuth(username or "", password or "")(resp.request) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def parse_credentials(self, netloc): + if "@" in netloc: + userinfo = netloc.rsplit("@", 1)[0] + if ":" in userinfo: + user, pwd = userinfo.split(":", 1) + return (urllib_unquote(user), urllib_unquote(pwd)) + return urllib_unquote(userinfo), None + return None, None + + +class LocalFSAdapter(BaseAdapter): + + def send(self, request, stream=None, timeout=None, verify=None, cert=None, + proxies=None): + pathname = url_to_path(request.url) + + resp = Response() + resp.status_code = 200 + resp.url = request.url + + try: + stats = os.stat(pathname) + except OSError as exc: + resp.status_code = 404 + resp.raw = exc + else: + modified = email.utils.formatdate(stats.st_mtime, usegmt=True) + content_type = mimetypes.guess_type(pathname)[0] or "text/plain" + resp.headers = CaseInsensitiveDict({ + "Content-Type": content_type, + "Content-Length": stats.st_size, + "Last-Modified": modified, + }) + + resp.raw = open(pathname, "rb") + resp.close = resp.raw.close + + return resp + + def close(self): + pass + + +class SafeFileCache(FileCache): + """ + A file based cache which is safe to use even when the target directory may + not be accessible or writable. + """ + + def __init__(self, *args, **kwargs): + super(SafeFileCache, self).__init__(*args, **kwargs) + + # Check to ensure that the directory containing our cache directory + # is owned by the user current executing pip. If it does not exist + # we will check the parent directory until we find one that does exist. + # If it is not owned by the user executing pip then we will disable + # the cache and log a warning. + if not check_path_owner(self.directory): + logger.warning( + "The directory '%s' or its parent directory is not owned by " + "the current user and the cache has been disabled. Please " + "check the permissions and owner of that directory. If " + "executing pip with sudo, you may want sudo's -H flag.", + self.directory, + ) + + # Set our directory to None to disable the Cache + self.directory = None + + def get(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).get(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def set(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).set(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + def delete(self, *args, **kwargs): + # If we don't have a directory, then the cache should be a no-op. + if self.directory is None: + return + + try: + return super(SafeFileCache, self).delete(*args, **kwargs) + except (LockError, OSError, IOError): + # We intentionally silence this error, if we can't access the cache + # then we can just skip caching and process the request as if + # caching wasn't enabled. + pass + + +class InsecureHTTPAdapter(HTTPAdapter): + + def cert_verify(self, conn, url, verify, cert): + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + + +class PipSession(requests.Session): + + timeout = None + + def __init__(self, *args, **kwargs): + retries = kwargs.pop("retries", 0) + cache = kwargs.pop("cache", None) + insecure_hosts = kwargs.pop("insecure_hosts", []) + + super(PipSession, self).__init__(*args, **kwargs) + + # Attach our User Agent to the request + self.headers["User-Agent"] = user_agent() + + # Attach our Authentication handler to the session + self.auth = MultiDomainBasicAuth() + + # Create our urllib3.Retry instance which will allow us to customize + # how we handle retries. + retries = urllib3.Retry( + # Set the total number of retries that a particular request can + # have. + total=retries, + + # A 503 error from PyPI typically means that the Fastly -> Origin + # connection got interrupted in some way. A 503 error in general + # is typically considered a transient error so we'll go ahead and + # retry it. + # A 500 may indicate transient error in Amazon S3 + # A 520 or 527 - may indicate transient error in CloudFlare + status_forcelist=[500, 503, 520, 527], + + # Add a small amount of back off between failed requests in + # order to prevent hammering the service. + backoff_factor=0.25, + ) + + # We want to _only_ cache responses on securely fetched origins. We do + # this because we can't validate the response of an insecurely fetched + # origin, and we don't want someone to be able to poison the cache and + # require manual eviction from the cache to fix it. + if cache: + secure_adapter = CacheControlAdapter( + cache=SafeFileCache(cache, use_dir_lock=True), + max_retries=retries, + ) + else: + secure_adapter = HTTPAdapter(max_retries=retries) + + # Our Insecure HTTPAdapter disables HTTPS validation. It does not + # support caching (see above) so we'll use it for all http:// URLs as + # well as any https:// host that we've marked as ignoring TLS errors + # for. + insecure_adapter = InsecureHTTPAdapter(max_retries=retries) + + self.mount("https://", secure_adapter) + self.mount("http://", insecure_adapter) + + # Enable file:// urls + self.mount("file://", LocalFSAdapter()) + + # We want to use a non-validating adapter for any requests which are + # deemed insecure. + for host in insecure_hosts: + self.mount("https://{}/".format(host), insecure_adapter) + + def request(self, method, url, *args, **kwargs): + # Allow setting a default timeout on a session + kwargs.setdefault("timeout", self.timeout) + + # Dispatch the actual request + return super(PipSession, self).request(method, url, *args, **kwargs) + + +def get_file_content(url, comes_from=None, session=None): + """Gets the content of a file; it may be a filename, file: URL, or + http: URL. Returns (location, content). Content is unicode. + + :param url: File path or url. + :param comes_from: Origin description of requirements. + :param session: Instance of pip.download.PipSession. + """ + if session is None: + raise TypeError( + "get_file_content() missing 1 required keyword argument: 'session'" + ) + + match = _scheme_re.search(url) + if match: + scheme = match.group(1).lower() + if (scheme == 'file' and comes_from and + comes_from.startswith('http')): + raise InstallationError( + 'Requirements file %s references URL %s, which is local' + % (comes_from, url)) + if scheme == 'file': + path = url.split(':', 1)[1] + path = path.replace('\\', '/') + match = _url_slash_drive_re.match(path) + if match: + path = match.group(1) + ':' + path.split('|', 1)[1] + path = urllib_parse.unquote(path) + if path.startswith('/'): + path = '/' + path.lstrip('/') + url = path + else: + # FIXME: catch some errors + resp = session.get(url) + resp.raise_for_status() + return resp.url, resp.text + try: + with open(url, 'rb') as f: + content = auto_decode(f.read()) + except IOError as exc: + raise InstallationError( + 'Could not open requirements file: %s' % str(exc) + ) + return url, content + + +_scheme_re = re.compile(r'^(http|https|file):', re.I) +_url_slash_drive_re = re.compile(r'/*([a-z])\|', re.I) + + +def is_url(name): + """Returns true if the name looks like a URL""" + if ':' not in name: + return False + scheme = name.split(':', 1)[0].lower() + return scheme in ['http', 'https', 'file', 'ftp'] + vcs.all_schemes + + +def url_to_path(url): + """ + Convert a file: URL to a path. + """ + assert url.startswith('file:'), ( + "You can only turn file: urls into filenames (not %r)" % url) + + _, netloc, path, _, _ = urllib_parse.urlsplit(url) + + # if we have a UNC path, prepend UNC share notation + if netloc: + netloc = '\\\\' + netloc + + path = urllib_request.url2pathname(netloc + path) + return path + + +def path_to_url(path): + """ + Convert a path to a file: URL. The path will be made absolute and have + quoted path parts. + """ + path = os.path.normpath(os.path.abspath(path)) + url = urllib_parse.urljoin('file:', urllib_request.pathname2url(path)) + return url + + +def is_archive_file(name): + """Return True if `name` is a considered as an archive file.""" + ext = splitext(name)[1].lower() + if ext in ARCHIVE_EXTENSIONS: + return True + return False + + +def unpack_vcs_link(link, location): + vcs_backend = _get_used_vcs_backend(link) + vcs_backend.unpack(location) + + +def _get_used_vcs_backend(link): + for backend in vcs.backends: + if link.scheme in backend.schemes: + vcs_backend = backend(link.url) + return vcs_backend + + +def is_vcs_url(link): + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + """Return whether a file:// Link points to a directory. + + ``link`` must not have any other scheme but file://. Call is_file_url() + first. + + """ + link_path = url_to_path(link.url_without_fragment) + return os.path.isdir(link_path) + + +def _progress_indicator(iterable, *args, **kwargs): + return iterable + + +def _download_url(resp, link, content_file, hashes, progress_bar): + try: + total_length = int(resp.headers['content-length']) + except (ValueError, KeyError, TypeError): + total_length = 0 + + cached_resp = getattr(resp, "from_cache", False) + if logger.getEffectiveLevel() > logging.INFO: + show_progress = False + elif cached_resp: + show_progress = False + elif total_length > (40 * 1000): + show_progress = True + elif not total_length: + show_progress = True + else: + show_progress = False + + show_url = link.show_url + + def resp_read(chunk_size): + try: + # Special case for urllib3. + for chunk in resp.raw.stream( + chunk_size, + # We use decode_content=False here because we don't + # want urllib3 to mess with the raw bytes we get + # from the server. If we decompress inside of + # urllib3 then we cannot verify the checksum + # because the checksum will be of the compressed + # file. This breakage will only occur if the + # server adds a Content-Encoding header, which + # depends on how the server was configured: + # - Some servers will notice that the file isn't a + # compressible file and will leave the file alone + # and with an empty Content-Encoding + # - Some servers will notice that the file is + # already compressed and will leave the file + # alone and will add a Content-Encoding: gzip + # header + # - Some servers won't notice anything at all and + # will take a file that's already been compressed + # and compress it again and set the + # Content-Encoding: gzip header + # + # By setting this not to decode automatically we + # hope to eliminate problems with the second case. + decode_content=False): + yield chunk + except AttributeError: + # Standard file-like object. + while True: + chunk = resp.raw.read(chunk_size) + if not chunk: + break + yield chunk + + def written_chunks(chunks): + for chunk in chunks: + content_file.write(chunk) + yield chunk + + progress_indicator = _progress_indicator + + if link.netloc == PyPI.netloc: + url = show_url + else: + url = link.url_without_fragment + + if show_progress: # We don't show progress on cached responses + progress_indicator = DownloadProgressProvider(progress_bar, + max=total_length) + if total_length: + logger.info("Downloading %s (%s)", url, format_size(total_length)) + else: + logger.info("Downloading %s", url) + elif cached_resp: + logger.info("Using cached %s", url) + else: + logger.info("Downloading %s", url) + + logger.debug('Downloading from URL %s', link) + + downloaded_chunks = written_chunks( + progress_indicator( + resp_read(CONTENT_CHUNK_SIZE), + CONTENT_CHUNK_SIZE + ) + ) + if hashes: + hashes.check_against_chunks(downloaded_chunks) + else: + consume(downloaded_chunks) + + +def _copy_file(filename, location, link): + copy = True + download_location = os.path.join(location, link.filename) + if os.path.exists(download_location): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)abort' % + display_path(download_location), ('i', 'w', 'b', 'a')) + if response == 'i': + copy = False + elif response == 'w': + logger.warning('Deleting %s', display_path(download_location)) + os.remove(download_location) + elif response == 'b': + dest_file = backup_dir(download_location) + logger.warning( + 'Backing up %s to %s', + display_path(download_location), + display_path(dest_file), + ) + shutil.move(download_location, dest_file) + elif response == 'a': + sys.exit(-1) + if copy: + shutil.copy(filename, download_location) + logger.info('Saved %s', display_path(download_location)) + + +def unpack_http_url(link, location, download_dir=None, + session=None, hashes=None, progress_bar="on"): + if session is None: + raise TypeError( + "unpack_http_url() missing 1 required keyword argument: 'session'" + ) + + with TempDirectory(kind="unpack") as temp_dir: + # If a download dir is specified, is the file already downloaded there? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + content_type = mimetypes.guess_type(from_path)[0] + else: + # let's download to a tmp dir + from_path, content_type = _download_http_url(link, + session, + temp_dir.path, + hashes, + progress_bar) + + # unpack the archive to the build dir location. even when only + # downloading archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified; let's copy the archive there + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + if not already_downloaded_path: + os.unlink(from_path) + + +def unpack_file_url(link, location, download_dir=None, hashes=None): + """Unpack link into location. + + If download_dir is provided and link points to a file, make a copy + of the link file inside download_dir. + """ + link_path = url_to_path(link.url_without_fragment) + + # If it's a url to a local directory + if is_dir_url(link): + if os.path.isdir(location): + rmtree(location) + shutil.copytree(link_path, location, symlinks=True) + if download_dir: + logger.info('Link is a directory, ignoring download_dir') + return + + # If --require-hashes is off, `hashes` is either empty, the + # link's embedded hash, or MissingHashes; it is required to + # match. If --require-hashes is on, we are satisfied by any + # hash in `hashes` matching: a URL-based or an option-based + # one; no internet-sourced hash will be in `hashes`. + if hashes: + hashes.check_against_path(link_path) + + # If a download dir is specified, is the file already there and valid? + already_downloaded_path = None + if download_dir: + already_downloaded_path = _check_download_dir(link, + download_dir, + hashes) + + if already_downloaded_path: + from_path = already_downloaded_path + else: + from_path = link_path + + content_type = mimetypes.guess_type(from_path)[0] + + # unpack the archive to the build dir location. even when only downloading + # archives, they have to be unpacked to parse dependencies + unpack_file(from_path, location, content_type, link) + + # a download dir is specified and not already downloaded + if download_dir and not already_downloaded_path: + _copy_file(from_path, download_dir, link) + + +def _copy_dist_from_dir(link_path, location): + """Copy distribution files in `link_path` to `location`. + + Invoked when user requests to install a local directory. E.g.: + + pip install . + pip install ~/dev/git-repos/python-prompt-toolkit + + """ + + # Note: This is currently VERY SLOW if you have a lot of data in the + # directory, because it copies everything with `shutil.copytree`. + # What it should really do is build an sdist and install that. + # See https://github.com/pypa/pip/issues/2195 + + if os.path.isdir(location): + rmtree(location) + + # build an sdist + setup_py = 'setup.py' + sdist_args = [sys.executable] + sdist_args.append('-c') + sdist_args.append(SETUPTOOLS_SHIM % setup_py) + sdist_args.append('sdist') + sdist_args += ['--dist-dir', location] + logger.info('Running setup.py sdist for %s', link_path) + + with indent_log(): + call_subprocess(sdist_args, cwd=link_path, show_stdout=False) + + # unpack sdist into `location` + sdist = os.path.join(location, os.listdir(location)[0]) + logger.info('Unpacking sdist %s into %s', sdist, location) + unpack_file(sdist, location, content_type=None, link=None) + + +class PipXmlrpcTransport(xmlrpc_client.Transport): + """Provide a `xmlrpclib.Transport` implementation via a `PipSession` + object. + """ + + def __init__(self, index_url, session, use_datetime=False): + xmlrpc_client.Transport.__init__(self, use_datetime) + index_parts = urllib_parse.urlparse(index_url) + self._scheme = index_parts.scheme + self._session = session + + def request(self, host, handler, request_body, verbose=False): + parts = (self._scheme, host, handler, None, None, None) + url = urllib_parse.urlunparse(parts) + try: + headers = {'Content-Type': 'text/xml'} + response = self._session.post(url, data=request_body, + headers=headers, stream=True) + response.raise_for_status() + self.verbose = verbose + return self.parse_response(response.raw) + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", + exc.response.status_code, url, + ) + raise + + +def unpack_url(link, location, download_dir=None, + only_download=False, session=None, hashes=None, + progress_bar="on"): + """Unpack link. + If link is a VCS link: + if only_download, export into download_dir and ignore location + else unpack into location + for other types of link: + - unpack into location + - if download_dir, copy the file into download_dir + - if only_download, mark location for deletion + + :param hashes: A Hashes object, one of whose embedded hashes must match, + or HashMismatch will be raised. If the Hashes is empty, no matches are + required, and unhashable types of requirements (like VCS ones, which + would ordinarily raise HashUnsupported) are allowed. + """ + # non-editable vcs urls + if is_vcs_url(link): + unpack_vcs_link(link, location) + + # file urls + elif is_file_url(link): + unpack_file_url(link, location, download_dir, hashes=hashes) + + # http urls + else: + if session is None: + session = PipSession() + + unpack_http_url( + link, + location, + download_dir, + session, + hashes=hashes, + progress_bar=progress_bar + ) + if only_download: + write_delete_marker_file(location) + + +def _download_http_url(link, session, temp_dir, hashes, progress_bar): + """Download link url into temp_dir using provided session""" + target_url = link.url.split('#', 1)[0] + try: + resp = session.get( + target_url, + # We use Accept-Encoding: identity here because requests + # defaults to accepting compressed responses. This breaks in + # a variety of ways depending on how the server is configured. + # - Some servers will notice that the file isn't a compressible + # file and will leave the file alone and with an empty + # Content-Encoding + # - Some servers will notice that the file is already + # compressed and will leave the file alone and will add a + # Content-Encoding: gzip header + # - Some servers won't notice anything at all and will take + # a file that's already been compressed and compress it again + # and set the Content-Encoding: gzip header + # By setting this to request only the identity encoding We're + # hoping to eliminate the third case. Hopefully there does not + # exist a server which when given a file will notice it is + # already compressed and that you're not asking for a + # compressed file and will then decompress it before sending + # because if that's the case I don't think it'll ever be + # possible to make this work. + headers={"Accept-Encoding": "identity"}, + stream=True, + ) + resp.raise_for_status() + except requests.HTTPError as exc: + logger.critical( + "HTTP error %s while getting %s", exc.response.status_code, link, + ) + raise + + content_type = resp.headers.get('content-type', '') + filename = link.filename # fallback + # Have a look at the Content-Disposition header for a better guess + content_disposition = resp.headers.get('content-disposition') + if content_disposition: + type, params = cgi.parse_header(content_disposition) + # We use ``or`` here because we don't want to use an "empty" value + # from the filename param. + filename = params.get('filename') or filename + ext = splitext(filename)[1] + if not ext: + ext = mimetypes.guess_extension(content_type) + if ext: + filename += ext + if not ext and link.url != resp.url: + ext = os.path.splitext(resp.url)[1] + if ext: + filename += ext + file_path = os.path.join(temp_dir, filename) + with open(file_path, 'wb') as content_file: + _download_url(resp, link, content_file, hashes, progress_bar) + return file_path, content_type + + +def _check_download_dir(link, download_dir, hashes): + """ Check download_dir for previously downloaded file with correct hash + If a correct file is found return its path else None + """ + download_path = os.path.join(download_dir, link.filename) + if os.path.exists(download_path): + # If already downloaded, does its hash match? + logger.info('File was already downloaded %s', download_path) + if hashes: + try: + hashes.check_against_path(download_path) + except HashMismatch: + logger.warning( + 'Previously-downloaded file %s has bad hash. ' + 'Re-downloading.', + download_path + ) + os.unlink(download_path) + return None + return download_path + return None diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/exceptions.py b/myenv/lib/python3.7/site-packages/pip/_internal/exceptions.py new file mode 100644 index 000000000..28705c872 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/exceptions.py @@ -0,0 +1,249 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + + +class PipError(Exception): + """Base pip exception""" + + +class ConfigurationError(PipError): + """General exception in configuration""" + + +class InstallationError(PipError): + """General exception during installation""" + + +class UninstallationError(PipError): + """General exception during uninstallation""" + + +class DistributionNotFound(InstallationError): + """Raised when a distribution cannot be found to satisfy a requirement""" + + +class RequirementsFileParseError(InstallationError): + """Raised when a general error occurs parsing a requirements file line.""" + + +class BestVersionAlreadyInstalled(PipError): + """Raised when the most up-to-date version of a package is already + installed.""" + + +class BadCommand(PipError): + """Raised when virtualenv or a command is not found""" + + +class CommandError(PipError): + """Raised when there is an error in command-line arguments""" + + +class PreviousBuildDirError(PipError): + """Raised when there's a previous conflicting build directory""" + + +class InvalidWheelFilename(InstallationError): + """Invalid wheel filename.""" + + +class UnsupportedWheel(InstallationError): + """Unsupported wheel.""" + + +class HashErrors(InstallationError): + """Multiple HashError instances rolled into one for reporting""" + + def __init__(self): + self.errors = [] + + def append(self, error): + self.errors.append(error) + + def __str__(self): + lines = [] + self.errors.sort(key=lambda e: e.order) + for cls, errors_of_cls in groupby(self.errors, lambda e: e.__class__): + lines.append(cls.head) + lines.extend(e.body() for e in errors_of_cls) + if lines: + return '\n'.join(lines) + + def __nonzero__(self): + return bool(self.errors) + + def __bool__(self): + return self.__nonzero__() + + +class HashError(InstallationError): + """ + A failure to verify a package against known-good hashes + + :cvar order: An int sorting hash exception classes by difficulty of + recovery (lower being harder), so the user doesn't bother fretting + about unpinned packages when he has deeper issues, like VCS + dependencies, to deal with. Also keeps error reports in a + deterministic order. + :cvar head: A section heading for display above potentially many + exceptions of this kind + :ivar req: The InstallRequirement that triggered this error. This is + pasted on after the exception is instantiated, because it's not + typically available earlier. + + """ + req = None + head = '' + + def body(self): + """Return a summary of me for display under the heading. + + This default implementation simply prints a description of the + triggering requirement. + + :param req: The InstallRequirement that provoked this error, with + populate_link() having already been called + + """ + return ' %s' % self._requirement_name() + + def __str__(self): + return '%s\n%s' % (self.head, self.body()) + + def _requirement_name(self): + """Return a description of the requirement that triggered me. + + This default implementation returns long description of the req, with + line numbers + + """ + return str(self.req) if self.req else 'unknown package' + + +class VcsHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 0 + head = ("Can't verify hashes for these requirements because we don't " + "have a way to hash version control repositories:") + + +class DirectoryUrlHashUnsupported(HashError): + """A hash was provided for a version-control-system-based requirement, but + we don't have a method for hashing those.""" + + order = 1 + head = ("Can't verify hashes for these file:// requirements because they " + "point to directories:") + + +class HashMissing(HashError): + """A hash was needed for a requirement but is absent.""" + + order = 2 + head = ('Hashes are required in --require-hashes mode, but they are ' + 'missing from some requirements. Here is a list of those ' + 'requirements along with the hashes their downloaded archives ' + 'actually had. Add lines like these to your requirements files to ' + 'prevent tampering. (If you did not enable --require-hashes ' + 'manually, note that it turns on automatically when any package ' + 'has a hash.)') + + def __init__(self, gotten_hash): + """ + :param gotten_hash: The hash of the (possibly malicious) archive we + just downloaded + """ + self.gotten_hash = gotten_hash + + def body(self): + # Dodge circular import. + from pip._internal.utils.hashes import FAVORITE_HASH + + package = None + if self.req: + # In the case of URL-based requirements, display the original URL + # seen in the requirements file rather than the package name, + # so the output can be directly copied into the requirements file. + package = (self.req.original_link if self.req.original_link + # In case someone feeds something downright stupid + # to InstallRequirement's constructor. + else getattr(self.req, 'req', None)) + return ' %s --hash=%s:%s' % (package or 'unknown package', + FAVORITE_HASH, + self.gotten_hash) + + +class HashUnpinned(HashError): + """A requirement had a hash specified but was not pinned to a specific + version.""" + + order = 3 + head = ('In --require-hashes mode, all requirements must have their ' + 'versions pinned with ==. These do not:') + + +class HashMismatch(HashError): + """ + Distribution file hash values don't match. + + :ivar package_name: The name of the package that triggered the hash + mismatch. Feel free to write to this after the exception is raise to + improve its error message. + + """ + order = 4 + head = ('THESE PACKAGES DO NOT MATCH THE HASHES FROM THE REQUIREMENTS ' + 'FILE. If you have updated the package versions, please update ' + 'the hashes. Otherwise, examine the package contents carefully; ' + 'someone may have tampered with them.') + + def __init__(self, allowed, gots): + """ + :param allowed: A dict of algorithm names pointing to lists of allowed + hex digests + :param gots: A dict of algorithm names pointing to hashes we + actually got from the files under suspicion + """ + self.allowed = allowed + self.gots = gots + + def body(self): + return ' %s:\n%s' % (self._requirement_name(), + self._hash_comparison()) + + def _hash_comparison(self): + """ + Return a comparison of actual and expected hash values. + + Example:: + + Expected sha256 abcdeabcdeabcdeabcdeabcdeabcdeabcdeabcdeabcde + or 123451234512345123451234512345123451234512345 + Got bcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdefbcdef + + """ + def hash_then_or(hash_name): + # For now, all the decent hashes have 6-char names, so we can get + # away with hard-coding space literals. + return chain([hash_name], repeat(' or')) + + lines = [] + for hash_name, expecteds in iteritems(self.allowed): + prefix = hash_then_or(hash_name) + lines.extend((' Expected %s %s' % (next(prefix), e)) + for e in expecteds) + lines.append(' Got %s\n' % + self.gots[hash_name].hexdigest()) + prefix = ' or' + return '\n'.join(lines) + + +class UnsupportedPythonVersion(InstallationError): + """Unsupported python version according to Requires-Python package + metadata.""" diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/index.py b/myenv/lib/python3.7/site-packages/pip/_internal/index.py new file mode 100644 index 000000000..15e0bf371 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/index.py @@ -0,0 +1,1117 @@ +"""Routines related to PyPI, indexes""" +from __future__ import absolute_import + +import cgi +import itertools +import logging +import mimetypes +import os +import posixpath +import re +import sys +import warnings +from collections import namedtuple + +from pip._vendor import html5lib, requests, six +from pip._vendor.distlib.compat import unescape +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.requests.exceptions import SSLError +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.compat import ipaddress +from pip._internal.download import HAS_TLS, is_url, path_to_url, url_to_path +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, InvalidWheelFilename, + UnsupportedWheel, +) +from pip._internal.models import PyPI +from pip._internal.pep425tags import get_supported +from pip._internal.utils.deprecation import RemovedInPip11Warning +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, cached_property, normalize_path, + splitext, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.wheel import Wheel, wheel_ext + +__all__ = ['FormatControl', 'fmt_ctl_handle_mutual_exclude', 'PackageFinder'] + + +SECURE_ORIGINS = [ + # protocol, hostname, port + # Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC) + ("https", "*", "*"), + ("*", "localhost", "*"), + ("*", "127.0.0.0/8", "*"), + ("*", "::1/128", "*"), + ("file", "*", None), + # ssh is always secure. + ("ssh", "*", "*"), +] + + +logger = logging.getLogger(__name__) + + +class InstallationCandidate(object): + + def __init__(self, project, version, location): + self.project = project + self.version = parse_version(version) + self.location = location + self._key = (self.project, self.version, self.location) + + def __repr__(self): + return "".format( + self.project, self.version, self.location, + ) + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, InstallationCandidate): + return NotImplemented + + return method(self._key, other._key) + + +class PackageFinder(object): + """This finds packages. + + This is meant to match easy_install's technique for looking for + packages, by reading pages and looking for appropriate links. + """ + + def __init__(self, find_links, index_urls, allow_all_prereleases=False, + trusted_hosts=None, process_dependency_links=False, + session=None, format_control=None, platform=None, + versions=None, abi=None, implementation=None): + """Create a PackageFinder. + + :param format_control: A FormatControl object or None. Used to control + the selection of source packages / binary packages when consulting + the index and links. + :param platform: A string or None. If None, searches for packages + that are supported by the current system. Otherwise, will find + packages that can be built on the platform passed in. These + packages will only be downloaded for distribution: they will + not be built locally. + :param versions: A list of strings or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param abi: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + :param implementation: A string or None. This is passed directly + to pep425tags.py in the get_supported() method. + """ + if session is None: + raise TypeError( + "PackageFinder() missing 1 required keyword argument: " + "'session'" + ) + + # Build find_links. If an argument starts with ~, it may be + # a local file relative to a home directory. So try normalizing + # it and if it exists, use the normalized version. + # This is deliberately conservative - it might be fine just to + # blindly normalize anything starting with a ~... + self.find_links = [] + for link in find_links: + if link.startswith('~'): + new_link = normalize_path(link) + if os.path.exists(new_link): + link = new_link + self.find_links.append(link) + + self.index_urls = index_urls + self.dependency_links = [] + + # These are boring links that have already been logged somehow: + self.logged_links = set() + + self.format_control = format_control or FormatControl(set(), set()) + + # Domains that we won't emit warnings for when not using HTTPS + self.secure_origins = [ + ("*", host, "*") + for host in (trusted_hosts if trusted_hosts else []) + ] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # Do we process dependency links? + self.process_dependency_links = process_dependency_links + + # The Session we'll use to make requests + self.session = session + + # The valid tags to check potential found wheel candidates against + self.valid_tags = get_supported( + versions=versions, + platform=platform, + abi=abi, + impl=implementation, + ) + + # If we don't have TLS enabled, then WARN if anyplace we're looking + # relies on TLS. + if not HAS_TLS: + for link in itertools.chain(self.index_urls, self.find_links): + parsed = urllib_parse.urlparse(link) + if parsed.scheme == "https": + logger.warning( + "pip is configured with locations that require " + "TLS/SSL, however the ssl module in Python is not " + "available." + ) + break + + def get_formatted_locations(self): + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join(self.index_urls)) + ) + if self.find_links: + lines.append( + "Looking in links: {}".format(", ".join(self.find_links)) + ) + return "\n".join(lines) + + def add_dependency_links(self, links): + # # FIXME: this shouldn't be global list this, it should only + # # apply to requirements of the package that specifies the + # # dependency_links value + # # FIXME: also, we should track comes_from (i.e., use Link) + if self.process_dependency_links: + warnings.warn( + "Dependency Links processing has been deprecated and will be " + "removed in a future release.", + RemovedInPip11Warning, + ) + self.dependency_links.extend(links) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + """ + Sort locations into "files" (archives) and "urls", and return + a pair of lists (files,urls) + """ + files = [] + urls = [] + + # puts the url for the given file path into the appropriate list + def sort_path(path): + url = path_to_url(path) + if mimetypes.guess_type(url, strict=False)[0] == 'text/html': + urls.append(url) + else: + files.append(url) + + for url in locations: + + is_local_path = os.path.exists(url) + is_file_url = url.startswith('file:') + + if is_local_path or is_file_url: + if is_local_path: + path = url + else: + path = url_to_path(url) + if os.path.isdir(path): + if expand_dir: + path = os.path.realpath(path) + for item in os.listdir(path): + sort_path(os.path.join(path, item)) + elif is_file_url: + urls.append(url) + elif os.path.isfile(path): + sort_path(path) + else: + logger.warning( + "Url '%s' is ignored: it is neither a file " + "nor a directory.", url, + ) + elif is_url(url): + # Only add url with clear scheme + urls.append(url) + else: + logger.warning( + "Url '%s' is ignored. It is either a non-existing " + "path or lacks a specific scheme.", url, + ) + + return files, urls + + def _candidate_sort_key(self, candidate): + """ + Function used to generate link sort key for link tuples. + The greater the return value, the more preferred it is. + If not finding wheels, then sorted by version only. + If finding wheels, then the sort order is by version, then: + 1. existing installs + 2. wheels ordered via Wheel.support_index_min(self.valid_tags) + 3. source archives + Note: it was considered to embed this logic into the Link + comparison operators, but then different sdist links + with the same version, would have to be considered equal + """ + support_num = len(self.valid_tags) + build_tag = tuple() + if candidate.location.is_wheel: + # can raise InvalidWheelFilename + wheel = Wheel(candidate.location.filename) + if not wheel.supported(self.valid_tags): + raise UnsupportedWheel( + "%s is not a supported wheel for this platform. It " + "can't be sorted." % wheel.filename + ) + pri = -(wheel.support_index_min(self.valid_tags)) + if wheel.build_tag is not None: + match = re.match(r'^(\d+)(.*)$', wheel.build_tag) + build_tag_groups = match.groups() + build_tag = (int(build_tag_groups[0]), build_tag_groups[1]) + else: # sdist + pri = -(support_num) + return (candidate.version, build_tag, pri) + + def _validate_secure_origin(self, logger, location): + # Determine if this url used a secure transport mechanism + parsed = urllib_parse.urlparse(str(location)) + origin = (parsed.scheme, parsed.hostname, parsed.port) + + # The protocol to use to see if the protocol matches. + # Don't count the repository type as part of the protocol: in + # cases such as "git+ssh", only use "ssh". (I.e., Only verify against + # the last scheme.) + protocol = origin[0].rsplit('+', 1)[-1] + + # Determine if our origin is a secure origin by looking through our + # hardcoded list of secure origins, as well as any additional ones + # configured on this PackageFinder instance. + for secure_origin in (SECURE_ORIGINS + self.secure_origins): + if protocol != secure_origin[0] and secure_origin[0] != "*": + continue + + try: + # We need to do this decode dance to ensure that we have a + # unicode object, even on Python 2.x. + addr = ipaddress.ip_address( + origin[1] + if ( + isinstance(origin[1], six.text_type) or + origin[1] is None + ) + else origin[1].decode("utf8") + ) + network = ipaddress.ip_network( + secure_origin[1] + if isinstance(secure_origin[1], six.text_type) + else secure_origin[1].decode("utf8") + ) + except ValueError: + # We don't have both a valid address or a valid network, so + # we'll check this origin against hostnames. + if (origin[1] and + origin[1].lower() != secure_origin[1].lower() and + secure_origin[1] != "*"): + continue + else: + # We have a valid address and network, so see if the address + # is contained within the network. + if addr not in network: + continue + + # Check to see if the port patches + if (origin[2] != secure_origin[2] and + secure_origin[2] != "*" and + secure_origin[2] is not None): + continue + + # If we've gotten here, then this origin matches the current + # secure origin and we should return True + return True + + # If we've gotten to this point, then the origin isn't secure and we + # will not accept it as a valid location to search. We will however + # log a warning that we are ignoring it. + logger.warning( + "The repository located at %s is not a trusted or secure host and " + "is being ignored. If this repository is available via HTTPS we " + "recommend you use HTTPS instead, otherwise you may silence " + "this warning and allow it anyway with '--trusted-host %s'.", + parsed.hostname, + parsed.hostname, + ) + + return False + + def _get_index_urls_locations(self, project_name): + """Returns the locations found via self.index_urls + + Checks the url_name on the main (first in the list) index and + use this url_name to produce all locations + """ + + def mkurl_pypi_url(url): + loc = posixpath.join( + url, + urllib_parse.quote(canonicalize_name(project_name))) + # For maximum compatibility with easy_install, ensure the path + # ends in a trailing slash. Although this isn't in the spec + # (and PyPI can handle it without the slash) some other index + # implementations might break if they relied on easy_install's + # behavior. + if not loc.endswith('/'): + loc = loc + '/' + return loc + + return [mkurl_pypi_url(url) for url in self.index_urls] + + def find_all_candidates(self, project_name): + """Find all available InstallationCandidate for project_name + + This checks index_urls, find_links and dependency_links. + All versions found are returned as an InstallationCandidate list. + + See _link_package_versions for details on which files are accepted + """ + index_locations = self._get_index_urls_locations(project_name) + index_file_loc, index_url_loc = self._sort_locations(index_locations) + fl_file_loc, fl_url_loc = self._sort_locations( + self.find_links, expand_dir=True, + ) + dep_file_loc, dep_url_loc = self._sort_locations(self.dependency_links) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, dep_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-links + # We explicitly do not trust links that came from dependency_links + # We want to filter out any thing which does not have a secure origin. + url_locations = [ + link for link in itertools.chain( + (Link(url) for url in index_url_loc), + (Link(url) for url in fl_url_loc), + (Link(url) for url in dep_url_loc), + ) + if self._validate_secure_origin(logger, link) + ] + + logger.debug('%d location(s) to search for versions of %s:', + len(url_locations), project_name) + + for location in url_locations: + logger.debug('* %s', location) + + canonical_name = canonicalize_name(project_name) + formats = fmt_ctl_formats(self.format_control, canonical_name) + search = Search(project_name, canonical_name, formats) + find_links_versions = self._package_versions( + # We trust every directly linked archive in find_links + (Link(url, '-f') for url in self.find_links), + search + ) + + page_versions = [] + for page in self._get_pages(url_locations, project_name): + logger.debug('Analyzing links from page %s', page.url) + with indent_log(): + page_versions.extend( + self._package_versions(page.links, search) + ) + + dependency_versions = self._package_versions( + (Link(url) for url in self.dependency_links), search + ) + if dependency_versions: + logger.debug( + 'dependency_links found: %s', + ', '.join([ + version.location.url for version in dependency_versions + ]) + ) + + file_versions = self._package_versions(file_locations, search) + if file_versions: + file_versions.sort(reverse=True) + logger.debug( + 'Local files found: %s', + ', '.join([ + url_to_path(candidate.location.url) + for candidate in file_versions + ]) + ) + + # This is an intentional priority ordering + return ( + file_versions + find_links_versions + page_versions + + dependency_versions + ) + + def find_requirement(self, req, upgrade): + """Try to find a Link matching req + + Expects req, an InstallRequirement and upgrade, a boolean + Returns a Link if found, + Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise + """ + all_candidates = self.find_all_candidates(req.name) + + # Filter out anything which doesn't match our specifier + compatible_versions = set( + req.specifier.filter( + # We turn the version object into a str here because otherwise + # when we're debundled but setuptools isn't, Python will see + # packaging.version.Version and + # pkg_resources._vendor.packaging.version.Version as different + # types. This way we'll use a str as a common data interchange + # format. If we stop using the pkg_resources provided specifier + # and start using our own, we can drop the cast to str(). + [str(c.version) for c in all_candidates], + prereleases=( + self.allow_all_prereleases + if self.allow_all_prereleases else None + ), + ) + ) + applicable_candidates = [ + # Again, converting to str to deal with debundling. + c for c in all_candidates if str(c.version) in compatible_versions + ] + + if applicable_candidates: + best_candidate = max(applicable_candidates, + key=self._candidate_sort_key) + else: + best_candidate = None + + if req.satisfied_by is not None: + installed_version = parse_version(req.satisfied_by.version) + else: + installed_version = None + + if installed_version is None and best_candidate is None: + logger.critical( + 'Could not find a version that satisfies the requirement %s ' + '(from versions: %s)', + req, + ', '.join( + sorted( + {str(c.version) for c in all_candidates}, + key=parse_version, + ) + ) + ) + + raise DistributionNotFound( + 'No matching distribution found for %s' % req + ) + + best_installed = False + if installed_version and ( + best_candidate is None or + best_candidate.version <= installed_version): + best_installed = True + + if not upgrade and installed_version is not None: + if best_installed: + logger.debug( + 'Existing installed version (%s) is most up-to-date and ' + 'satisfies requirement', + installed_version, + ) + else: + logger.debug( + 'Existing installed version (%s) satisfies requirement ' + '(most up-to-date version is %s)', + installed_version, + best_candidate.version, + ) + return None + + if best_installed: + # We have an existing version, and its the best version + logger.debug( + 'Installed version (%s) is most up-to-date (past versions: ' + '%s)', + installed_version, + ', '.join(sorted(compatible_versions, key=parse_version)) or + "none", + ) + raise BestVersionAlreadyInstalled + + logger.debug( + 'Using version %s (newest of versions: %s)', + best_candidate.version, + ', '.join(sorted(compatible_versions, key=parse_version)) + ) + return best_candidate.location + + def _get_pages(self, locations, project_name): + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() + for location in locations: + if location in seen: + continue + seen.add(location) + + page = self._get_page(location) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() + for link in links: + if link not in seen: + seen.add(link) + if link.egg_fragment: + eggs.append(link) + else: + no_eggs.append(link) + return no_eggs + eggs + + def _package_versions(self, links, search): + result = [] + for link in self._sort_links(links): + v = self._link_package_versions(link, search) + if v is not None: + result.append(v) + return result + + def _log_skipped_link(self, link, reason): + if link not in self.logged_links: + logger.debug('Skipping link %s; %s', link, reason) + self.logged_links.add(link) + + def _link_package_versions(self, link, search): + """Return an InstallationCandidate or None""" + version = None + if link.egg_fragment: + egg_info = link.egg_fragment + ext = link.ext + else: + egg_info, ext = link.splitext() + if not ext: + self._log_skipped_link(link, 'not a file') + return + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return + if "binary" not in search.formats and ext == wheel_ext: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return + if ext == wheel_ext: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return + + version = wheel.version + + # This should be up by the search.ok_binary check, but see issue 2700. + if "source" not in search.formats and ext != wheel_ext: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return + + if not version: + version = egg_info_matches(egg_info, search.supplied, link) + if version is None: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return + + match = self._py_version_re.search(version) + if match: + version = version[:match.start()] + py_version = match.group(1) + if py_version != sys.version[:3]: + self._log_skipped_link( + link, 'Python version is incorrect') + return + try: + support_this_python = check_requires_python(link.requires_python) + except specifiers.InvalidSpecifier: + logger.debug("Package %s has an invalid Requires-Python entry: %s", + link.filename, link.requires_python) + support_this_python = True + + if not support_this_python: + logger.debug("The package %s is incompatible with the python" + "version in use. Acceptable python versions are:%s", + link, link.requires_python) + return + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + def _get_page(self, link): + return HTMLPage.get_page(link, session=self.session) + + +def egg_info_matches( + egg_info, search_name, link, + _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param search_name: The name of the package this belongs to. None to + infer the name. Note that this cannot unambiguously parse strings + like foo-2-2 which might be foo, 2-2 or foo-2, 2. + :param link: The link the string came from, for logging on failure. + """ + match = _egg_info_re.search(egg_info) + if not match: + logger.debug('Could not parse version from link: %s', link) + return None + if search_name is None: + full_match = match.group(0) + return full_match[full_match.index('-'):] + name = match.group(0).lower() + # To match the "safe" name that pkg_resources creates: + name = name.replace('_', '-') + # project name and version must be separated by a dash + look_for = search_name.lower() + "-" + if name.startswith(look_for): + return match.group(0)[len(look_for):] + else: + return None + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + # Determine if we have any encoding information in our headers + encoding = None + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + + if "charset" in params: + encoding = params['charset'] + + self.content = content + self.parsed = html5lib.parse( + self.content, + transport_encoding=encoding, + namespaceHTMLElements=False, + ) + self.url = url + self.headers = headers + + def __str__(self): + return self.url + + @classmethod + def get_page(cls, link, skip_archives=True, session=None): + if session is None: + raise TypeError( + "get_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url + url = url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + logger.debug('Cannot look at %s URL %s', scheme, link) + return None + + try: + if skip_archives: + filename = link.filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + content_type = cls._get_content_type( + url, session=session, + ) + if content_type.lower().startswith('text/html'): + break + else: + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + logger.debug('Getting page %s', url) + + # Tack index.html onto file:// URLs that point to directories + (scheme, netloc, path, params, query, fragment) = \ + urllib_parse.urlparse(url) + if (scheme == 'file' and + os.path.isdir(urllib_request.url2pathname(path))): + # add trailing slash if not present so urljoin doesn't trim + # final segment + if not url.endswith('/'): + url += '/' + url = urllib_parse.urljoin(url, 'index.html') + logger.debug(' file: URL is directory, getting %s', url) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + "Cache-Control": "max-age=600", + }, + ) + resp.raise_for_status() + + # The check for archives above only works if the url ends with + # something that looks like an archive. However that is not a + # requirement of an url. Unless we issue a HEAD request on every + # url we cannot know ahead of time for sure if something is HTML + # or not. However we can check after we've downloaded it. + content_type = resp.headers.get('Content-Type', 'unknown') + if not content_type.lower().startswith("text/html"): + logger.debug( + 'Skipping page %s because of Content-Type: %s', + link, + content_type, + ) + return + + inst = cls(resp.content, resp.url, resp.headers) + except requests.HTTPError as exc: + cls._handle_fail(link, exc, url) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + cls._handle_fail(link, reason, url, meth=logger.info) + except requests.ConnectionError as exc: + cls._handle_fail(link, "connection error: %s" % exc, url) + except requests.Timeout: + cls._handle_fail(link, "timed out", url) + else: + return inst + + @staticmethod + def _handle_fail(link, reason, url, meth=None): + if meth is None: + meth = logger.debug + + meth("Could not fetch URL %s: %s - skipping", link, reason) + + @staticmethod + def _get_content_type(url, session): + """Get the Content-Type of the given url, using a HEAD request""" + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + # FIXME: some warning or something? + # assertion error? + return '' + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + return resp.headers.get("Content-Type", "") + + @cached_property + def base_url(self): + bases = [ + x for x in self.parsed.findall(".//base") + if x.get("href") is not None + ] + if bases and bases[0].get("href"): + return bases[0].get("href") + else: + return self.url + + @property + def links(self): + """Yields all links in the page""" + for anchor in self.parsed.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = self.clean_link( + urllib_parse.urljoin(self.base_url, href) + ) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self, requires_python=pyrequire) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + def clean_link(self, url): + """Makes sure a link is fully encoded. That is, if a ' ' shows up in + the link, it will be rewritten to %20 (while not over-quoting + % or other characters).""" + return self._clean_re.sub( + lambda match: '%%%2x' % ord(match.group(0)), url) + + +class Link(object): + + def __init__(self, url, comes_from=None, requires_python=None): + """ + Object representing a parsed link from https://pypi.org/simple/* + + url: + url of the resource pointed to (href of the link) + comes_from: + instance of HTMLPage where the link was found, or string. + requires_python: + String containing the `Requires-Python` metadata field, specified + in PEP 345. This may be specified by a data-requires-python + attribute in the HTML link tag, as described in PEP 503. + """ + + # url can be a UNC windows share + if url.startswith('\\\\'): + url = path_to_url(url) + + self.url = url + self.comes_from = comes_from + self.requires_python = requires_python if requires_python else None + + def __str__(self): + if self.requires_python: + rp = ' (requires-python:%s)' % self.requires_python + else: + rp = '' + if self.comes_from: + return '%s (from %s)%s' % (self.url, self.comes_from, rp) + else: + return str(self.url) + + def __repr__(self): + return '' % self + + def __eq__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url == other.url + + def __ne__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url != other.url + + def __lt__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url < other.url + + def __le__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url <= other.url + + def __gt__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url > other.url + + def __ge__(self, other): + if not isinstance(other, Link): + return NotImplemented + return self.url >= other.url + + def __hash__(self): + return hash(self.url) + + @property + def filename(self): + _, netloc, path, _, _ = urllib_parse.urlsplit(self.url) + name = posixpath.basename(path.rstrip('/')) or netloc + name = urllib_parse.unquote(name) + assert name, ('URL %r produced no filename' % self.url) + return name + + @property + def scheme(self): + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + return self.splitext()[1] + + @property + def url_without_fragment(self): + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(self.url) + return urllib_parse.urlunsplit((scheme, netloc, path, query, None)) + + _egg_fragment_re = re.compile(r'[#&]egg=([^&]*)') + + @property + def egg_fragment(self): + match = self._egg_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _subdirectory_fragment_re = re.compile(r'[#&]subdirectory=([^&]*)') + + @property + def subdirectory_fragment(self): + match = self._subdirectory_fragment_re.search(self.url) + if not match: + return None + return match.group(1) + + _hash_re = re.compile( + r'(sha1|sha224|sha384|sha256|sha512|md5)=([a-f0-9]+)' + ) + + @property + def hash(self): + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + return self.ext == wheel_ext + + @property + def is_artifact(self): + """ + Determines if this points to an actual artifact (e.g. a tarball) or if + it points to an "abstract" thing like a path or a VCS location. + """ + from pip._internal.vcs import vcs + + if self.scheme in vcs.all_schemes: + return False + + return True + + +FormatControl = namedtuple('FormatControl', 'no_binary only_binary') +"""This object has two fields, no_binary and only_binary. + +If a field is falsy, it isn't set. If it is {':all:'}, it should match all +packages except those listed in the other field. Only one field can be set +to {':all:'} at a time. The rest of the time exact package name matches +are listed, with any given package only showing up in one field at a time. +""" + + +def fmt_ctl_handle_mutual_exclude(value, target, other): + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + if ':none:' not in new: + # Without a none, we want to discard everything as :all: covers it + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + +def fmt_ctl_formats(fmt_ctl, canonical_name): + result = {"binary", "source"} + if canonical_name in fmt_ctl.only_binary: + result.discard('source') + elif canonical_name in fmt_ctl.no_binary: + result.discard('binary') + elif ':all:' in fmt_ctl.only_binary: + result.discard('source') + elif ':all:' in fmt_ctl.no_binary: + result.discard('binary') + return frozenset(result) + + +def fmt_ctl_no_binary(fmt_ctl): + fmt_ctl_handle_mutual_exclude( + ':all:', fmt_ctl.no_binary, fmt_ctl.only_binary, + ) + + +Search = namedtuple('Search', 'supplied canonical formats') +"""Capture key aspects of a search. + +:attribute supplied: The user supplied package. +:attribute canonical: The canonical package name. +:attribute formats: The formats allowed for this package. Should be a set + with 'binary' or 'source' or both in it. +""" diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/locations.py b/myenv/lib/python3.7/site-packages/pip/_internal/locations.py new file mode 100644 index 000000000..ce8f7e973 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/locations.py @@ -0,0 +1,194 @@ +"""Locations where we look for configs, install stuff, etc""" +from __future__ import absolute_import + +import os +import os.path +import platform +import site +import sys +import sysconfig +from distutils import sysconfig as distutils_sysconfig +from distutils.command.install import SCHEME_KEYS, install # type: ignore + +from pip._internal.compat import WINDOWS, expanduser +from pip._internal.utils import appdirs + +# Application Directories +USER_CACHE_DIR = appdirs.user_cache_dir("pip") + + +DELETE_MARKER_MESSAGE = '''\ +This file is placed here by pip to indicate the source was put +here by pip. + +Once this package is successfully installed this source code will be +deleted (unless you remove this file). +''' +PIP_DELETE_MARKER_FILENAME = 'pip-delete-this-directory.txt' + + +def write_delete_marker_file(directory): + """ + Write the pip delete marker file into this directory. + """ + filepath = os.path.join(directory, PIP_DELETE_MARKER_FILENAME) + with open(filepath, 'w') as marker_fp: + marker_fp.write(DELETE_MARKER_MESSAGE) + + +def running_under_virtualenv(): + """ + Return True if we're running inside a virtualenv, False otherwise. + + """ + if hasattr(sys, 'real_prefix'): + return True + elif sys.prefix != getattr(sys, "base_prefix", sys.prefix): + return True + + return False + + +def virtualenv_no_global(): + """ + Return True if in a venv and no system site packages. + """ + # this mirrors the logic in virtualenv.py for locating the + # no-global-site-packages.txt file + site_mod_dir = os.path.dirname(os.path.abspath(site.__file__)) + no_global_file = os.path.join(site_mod_dir, 'no-global-site-packages.txt') + if running_under_virtualenv() and os.path.isfile(no_global_file): + return True + + +if running_under_virtualenv(): + src_prefix = os.path.join(sys.prefix, 'src') +else: + # FIXME: keep src in cwd for now (it is not a temporary folder) + try: + src_prefix = os.path.join(os.getcwd(), 'src') + except OSError: + # In case the current working directory has been renamed or deleted + sys.exit( + "The folder you are executing pip from can no longer be found." + ) + +# under macOS + virtualenv sys.prefix is not properly resolved +# it is something like /path/to/python/bin/.. +# Note: using realpath due to tmp dirs on OSX being symlinks +src_prefix = os.path.abspath(src_prefix) + +# FIXME doesn't account for venv linked to global site-packages + +site_packages = sysconfig.get_path("purelib") +# This is because of a bug in PyPy's sysconfig module, see +# https://bitbucket.org/pypy/pypy/issues/2506/sysconfig-returns-incorrect-paths +# for more information. +if platform.python_implementation().lower() == "pypy": + site_packages = distutils_sysconfig.get_python_lib() +try: + # Use getusersitepackages if this is present, as it ensures that the + # value is initialised properly. + user_site = site.getusersitepackages() +except AttributeError: + user_site = site.USER_SITE +user_dir = expanduser('~') +if WINDOWS: + bin_py = os.path.join(sys.prefix, 'Scripts') + bin_user = os.path.join(user_site, 'Scripts') + # buildout uses 'bin' on Windows too? + if not os.path.exists(bin_py): + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.ini' + + legacy_storage_dir = os.path.join(user_dir, 'pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) +else: + bin_py = os.path.join(sys.prefix, 'bin') + bin_user = os.path.join(user_site, 'bin') + + config_basename = 'pip.conf' + + legacy_storage_dir = os.path.join(user_dir, '.pip') + legacy_config_file = os.path.join( + legacy_storage_dir, + config_basename, + ) + # Forcing to use /usr/local/bin for standard macOS framework installs + # Also log to ~/Library/Logs/ for use with the Console.app log viewer + if sys.platform[:6] == 'darwin' and sys.prefix[:16] == '/System/Library/': + bin_py = '/usr/local/bin' + +site_config_files = [ + os.path.join(path, config_basename) + for path in appdirs.site_config_dirs('pip') +] + +venv_config_file = os.path.join(sys.prefix, config_basename) +new_config_file = os.path.join(appdirs.user_config_dir("pip"), config_basename) + + +def distutils_scheme(dist_name, user=False, home=None, root=None, + isolated=False, prefix=None): + """ + Return a distutils install scheme + """ + from distutils.dist import Distribution + + scheme = {} + + if isolated: + extra_dist_args = {"script_args": ["--no-user-cfg"]} + else: + extra_dist_args = {} + dist_args = {'name': dist_name} + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + d.parse_config_files() + i = d.get_command_obj('install', create=True) + # NOTE: setting user or home has the side-effect of creating the home dir + # or user base for installations during finalize_options() + # ideally, we'd prefer a scheme class that has no side-effects. + assert not (user and prefix), "user={} prefix={}".format(user, prefix) + i.user = user or i.user + if user: + i.prefix = "" + i.prefix = prefix or i.prefix + i.home = home or i.home + i.root = root or i.root + i.finalize_options() + for key in SCHEME_KEYS: + scheme[key] = getattr(i, 'install_' + key) + + # install_lib specified in setup.cfg should install *everything* + # into there (i.e. it takes precedence over both purelib and + # platlib). Note, i.install_lib is *always* set after + # finalize_options(); we only want to override here if the user + # has explicitly requested it hence going back to the config + if 'install_lib' in d.get_option_dict('install'): + scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + + if running_under_virtualenv(): + scheme['headers'] = os.path.join( + sys.prefix, + 'include', + 'site', + 'python' + sys.version[:3], + dist_name, + ) + + if root is not None: + path_no_drive = os.path.splitdrive( + os.path.abspath(scheme["headers"]))[1] + scheme["headers"] = os.path.join( + root, + path_no_drive[1:], + ) + + return scheme diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/models/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/models/__init__.py new file mode 100644 index 000000000..2d080a427 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/models/__init__.py @@ -0,0 +1,4 @@ +from pip._internal.models.index import Index, PyPI + + +__all__ = ["Index", "PyPI"] diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/models/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b16738a272c5e2dc243d3ee85bb142fee27e6e71 GIT binary patch literal 301 zcmYLEO-sZu5KYsrim>3xgZKw}*v7A77evI{USwg{OF@RZNtcwgTPLx&Kgqw8t0(`0 zCnw74z`RKw?@eCr$Kyjr)hv&n9%+7r%dR*b?x^i4fn+i=tc}X38nu5GM6!!GBGbPI-W8h?M>qb%LS@+M&o|1ZXA!1tFVsB7v3^k``jaTk;_8 z*s-s}wNqcAQ|}}gNP!-3$GanS{O&vI(`eKuAjQqgZ$Bv^zc4t62hJs^eg%dTP9<5< z)S=`H;SP772zQ11=%$|Vxc5j?pZi})6#RzMB%;=@Go{4>qk}l$T!QKoFoL9%lhomq zJ5MBaxywCRy{?M&uSzZ+7WfGYt}f_jP<;kwM|Xq~L-)>(ey4>C5$N9I5P|QvzSH^v zCjiWy*+A#3S_vqr)?F)UhhStrXDwVCLZoY%8yl3u$ZBB+kYT2ReRF5~T?K|8 zhFAr?$g!Rla;XBq^@FG}EPtw`R(X>dku;e~mX+i}>13sndBNCJPs;ZVf45+D^XAMf zr?-WYua}ea^W-L}^ZGO|waKJBRg1~=t+~%I*(%FRBUG8mWL0q?b&?}ZalNr2gT34^ z<|9QR7(xR&rbD_Nw_L`D1OJeUQ*KE`)Q0SVyaFk8fHFFZT-AfT?LnJGm6vUck)uYK z^pKLa+s?dzq{8?0%ieZbuy*%00UR zL8|s1d<=+PqX}skD9mh+?~JMSMUvof;!52nvnWVUfWDYDqU4o|b^Z{qsz&G-K*8h{ kBJJ7?s(B$6rY&W?>&^Am|L(TohYs>b_+>f(L-%O#7q;}zkN^Mx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/models/index.py b/myenv/lib/python3.7/site-packages/pip/_internal/models/index.py new file mode 100644 index 000000000..161de50b5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/models/index.py @@ -0,0 +1,15 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class Index(object): + def __init__(self, url): + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self.url_to_path('simple') + self.pypi_url = self.url_to_path('pypi') + + def url_to_path(self, path): + return urllib_parse.urljoin(self.url, path) + + +PyPI = Index('https://pypi.org/') diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/operations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a691c70f60bfd3391fc557126a790e189ee2f054 GIT binary patch literal 205 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 BYjpqs literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ede215db8bc0f0252adf3782acc4c9352641ff86 GIT binary patch literal 10336 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 PackageSet + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + retval = {} + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + retval[name] = PackageDetails(dist.version, dist.requires()) + return retval + + +def check_package_set(package_set): + # type: (PackageSet) -> CheckResult + """Check if a package set is consistent + """ + missing = dict() + conflicting = dict() + + for package_name in package_set: + # Info about dependencies of package_name + missing_deps = set() # type: Set[Missing] + conflicting_deps = set() # type: Set[Conflicting] + + for req in package_set[package_name].requires: + name = canonicalize_name(req.project_name) # type: str + + # Check if it's missing + if name not in package_set: + missed = True + if req.marker is not None: + missed = req.marker.evaluate() + if missed: + missing_deps.add((name, req)) + continue + + # Check if there's a conflict + version = package_set[name].version # type: str + if not req.specifier.contains(version, prereleases=True): + conflicting_deps.add((name, version, req)) + + def str_key(x): + return str(x) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str_key) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str_key) + + return missing, conflicting + + +def check_install_conflicts(to_install): + # type: (List[InstallRequirement]) -> Tuple[PackageSet, CheckResult] + """For checking if the dependency graph would be consistent after \ + installing given requirements + """ + # Start from the current state + state = create_package_set_from_installed() + _simulate_installation_of(to_install, state) + return state, check_package_set(state) + + +# NOTE from @pradyunsg +# This required a minor update in dependency link handling logic over at +# operations.prepare.IsSDist.dist() to get it working +def _simulate_installation_of(to_install, state): + # type: (List[InstallRequirement], PackageSet) -> None + """Computes the version of packages after installing to_install. + """ + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + dist = make_abstract_dist(inst_req).dist(finder=None) + name = canonicalize_name(dist.key) + state[name] = PackageDetails(dist.version, dist.requires()) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py b/myenv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py new file mode 100644 index 000000000..000102d31 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/operations/freeze.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re +import warnings + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import InstallationError +from pip._internal.req import InstallRequirement +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.deprecation import RemovedInPip11Warning +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, + find_links=None, local_only=None, user_only=None, skip_regex=None, + isolated=False, + wheel_cache=None, + exclude_editable=False, + skip=()): + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + dependency_links = [] + + for dist in pkg_resources.working_set: + if dist.has_metadata('dependency_links.txt'): + dependency_links.extend( + dist.get_metadata_lines('dependency_links.txt') + ) + for link in find_links: + if '#egg=' in link: + dependency_links.append(link) + for link in find_links: + yield '-f %s' % link + installations = {} + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist( + dist, + dependency_links + ) + except RequirementParseError: + logger.warning( + "Could not parse requirement: %s", + dist.project_name + ) + continue + if exclude_editable and req.editable: + continue + installations[req.name] = req + + if requirement: + # the options that don't get turned into an InstallRequirement + # should only be emitted once, even if the same option is in multiple + # requirements files, so we need to keep track of what has been emitted + # so that we don't emit it again if it's seen again + emitted_options = set() + # keep track of which files a requirement is in so that we can + # give an accurate warning if a requirement appears multiple times. + req_files = collections.defaultdict(list) + for req_file_path in requirement: + with open(req_file_path) as req_file: + for line in req_file: + if (not line.strip() or + line.strip().startswith('#') or + (skip_match and skip_match(line)) or + line.startswith(( + '-r', '--requirement', + '-Z', '--always-unzip', + '-f', '--find-links', + '-i', '--index-url', + '--pre', + '--trusted-host', + '--process-dependency-links', + '--extra-index-url'))): + line = line.rstrip() + if line not in emitted_options: + emitted_options.add(line) + yield line + continue + + if line.startswith('-e') or line.startswith('--editable'): + if line.startswith('-e'): + line = line[2:].strip() + else: + line = line[len('--editable'):].strip().lstrip('=') + line_req = InstallRequirement.from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = InstallRequirement.from_line( + COMMENT_RE.sub('', line).strip(), + isolated=isolated, + wheel_cache=wheel_cache, + ) + + if not line_req.name: + logger.info( + "Skipping line in requirement file [%s] because " + "it's not clear what it would install: %s", + req_file_path, line.strip(), + ) + logger.info( + " (add #egg=PackageName to the URL to avoid" + " this warning)" + ) + elif line_req.name not in installations: + # either it's not installed, or it is installed + # but has been processed already + if not req_files[line_req.name]: + logger.warning( + "Requirement file [%s] contains %s, but that " + "package is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), + ) + else: + req_files[line_req.name].append(req_file_path) + else: + yield str(installations[line_req.name]).rstrip() + del installations[line_req.name] + req_files[line_req.name].append(req_file_path) + + # Warn about requirements that were included multiple times (in a + # single requirements file or in different requirements files). + for name, files in six.iteritems(req_files): + if len(files) > 1: + logger.warning("Requirement %s included multiple times [%s]", + name, ', '.join(sorted(set(files)))) + + yield( + '## The following requirements were added by ' + 'pip freeze:' + ) + for installation in sorted( + installations.values(), key=lambda x: x.name.lower()): + if canonicalize_name(installation.name) not in skip: + yield str(installation).rstrip() + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + _rev_re = re.compile(r'-r(\d+)$') + _date_re = re.compile(r'-(20\d\d\d\d\d\d)$') + + @classmethod + def from_dist(cls, dist, dependency_links): + location = os.path.normcase(os.path.abspath(dist.location)) + comments = [] + from pip._internal.vcs import vcs, get_src_requirement + if dist_is_editable(dist) and vcs.get_backend_name(location): + editable = True + try: + req = get_src_requirement(dist, location) + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + req = None + if req is None: + logger.warning( + 'Could not determine repository location of %s', location + ) + comments.append( + '## !! Could not determine repository location' + ) + req = dist.as_requirement() + editable = False + else: + editable = False + req = dist.as_requirement() + specs = req.specs + assert len(specs) == 1 and specs[0][0] in ["==", "==="], \ + 'Expected 1 spec with == or ===; specs = %r; dist = %r' % \ + (specs, dist) + version = specs[0][1] + ver_match = cls._rev_re.search(version) + date_match = cls._date_re.search(version) + if ver_match or date_match: + svn_backend = vcs.get_backend('svn') + if svn_backend: + svn_location = svn_backend().get_location( + dist, + dependency_links, + ) + if not svn_location: + logger.warning( + 'Warning: cannot find svn location for %s', req, + ) + comments.append( + '## FIXME: could not find svn URL in dependency_links ' + 'for this package:' + ) + else: + warnings.warn( + "SVN editable detection based on dependency links " + "will be dropped in the future.", + RemovedInPip11Warning, + ) + comments.append( + '# Installing as editable to satisfy requirement %s:' % + req + ) + if ver_match: + rev = ver_match.group(1) + else: + rev = '{%s}' % date_match.group(1) + editable = True + req = '%s@%s#egg=%s' % ( + svn_location, + rev, + cls.egg_name(dist) + ) + return cls(dist.project_name, req, editable, comments) + + @staticmethod + def egg_name(dist): + name = dist.egg_name() + match = re.search(r'-py\d\.\d$', name) + if match: + name = name[:match.start()] + return name + + def __str__(self): + req = self.req + if self.editable: + req = '-e %s' % req + return '\n'.join(list(self.comments) + [str(req)]) + '\n' diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py b/myenv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py new file mode 100644 index 000000000..c1e8158ec --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/operations/prepare.py @@ -0,0 +1,380 @@ +"""Prepares a distribution for installation +""" + +import itertools +import logging +import os +import sys +from copy import copy + +from pip._vendor import pkg_resources, requests + +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.compat import expanduser +from pip._internal.download import ( + is_dir_url, is_file_url, is_vcs_url, unpack_url, url_to_path, +) +from pip._internal.exceptions import ( + DirectoryUrlHashUnsupported, HashUnpinned, InstallationError, + PreviousBuildDirError, VcsHashUnsupported, +) +from pip._internal.index import FormatControl +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + call_subprocess, display_path, normalize_path, +) +from pip._internal.utils.ui import open_spinner +from pip._internal.vcs import vcs + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + """Factory to make an abstract dist object. + + Preconditions: Either an editable req with a source_dir, or satisfied_by or + a wheel link, or a non-editable req with a source_dir. + + :return: A concrete DistAbstraction. + """ + if req.editable: + return IsSDist(req) + elif req.link and req.link.is_wheel: + return IsWheel(req) + else: + return IsSDist(req) + + +def _install_build_reqs(finder, prefix, build_requirements): + # NOTE: What follows is not a very good thing. + # Eventually, this should move into the BuildEnvironment class and + # that should handle all the isolation and sub-process invocation. + finder = copy(finder) + finder.format_control = FormatControl(set(), set([":all:"])) + urls = [ + finder.find_requirement( + InstallRequirement.from_line(r), upgrade=False).url + for r in build_requirements + ] + args = [ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--no-user', '--prefix', prefix, + ] + list(urls) + + with open_spinner("Installing build dependencies") as spinner: + call_subprocess(args, show_stdout=False, spinner=spinner) + + +class DistAbstraction(object): + """Abstracts out the wheel vs non-wheel Resolver.resolve() logic. + + The requirements for anything installable are as follows: + - we must be able to determine the requirement name + (or we can't correctly handle the non-upgrade case). + - we must be able to generate a list of run-time dependencies + without installing any additional packages (or we would + have to either burn time by doing temporary isolated installs + or alternatively violate pips 'don't start installing unless + all requirements are available' rule - neither of which are + desirable). + - for packages with setup requirements, we must also be able + to determine their requirements without installing additional + packages (for the same reason as run-time dependencies) + - we must be able to create a Distribution object exposing the + above metadata. + """ + + def __init__(self, req): + self.req = req + + def dist(self, finder): + """Return a setuptools Dist object.""" + raise NotImplementedError(self.dist) + + def prep_for_dist(self, finder): + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError(self.dist) + + +class IsWheel(DistAbstraction): + + def dist(self, finder): + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self, finder): + dist = self.req.get_dist() + # FIXME: shouldn't be globally added. + if finder and dist.has_metadata('dependency_links.txt'): + finder.add_dependency_links( + dist.get_metadata_lines('dependency_links.txt') + ) + return dist + + def prep_for_dist(self, finder, build_isolation): + # Before calling "setup.py egg_info", we need to set-up the build + # environment. + build_requirements, isolate = self.req.get_pep_518_info() + should_isolate = build_isolation and isolate + + minimum_requirements = ('setuptools', 'wheel') + missing_requirements = set(minimum_requirements) - set( + pkg_resources.Requirement(r).key + for r in build_requirements + ) + if missing_requirements: + def format_reqs(rs): + return ' and '.join(map(repr, sorted(rs))) + logger.warning( + "Missing build time requirements in pyproject.toml for %s: " + "%s.", self.req, format_reqs(missing_requirements) + ) + logger.warning( + "This version of pip does not implement PEP 517 so it cannot " + "build a wheel without %s.", format_reqs(minimum_requirements) + ) + + if should_isolate: + with self.req.build_env: + pass + _install_build_reqs(finder, self.req.build_env.path, + build_requirements) + else: + self.req.build_env = NoOpBuildEnvironment(no_clean=False) + + self.req.run_egg_info() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self, finder): + return self.req.satisfied_by + + def prep_for_dist(self, finder): + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__(self, build_dir, download_dir, src_dir, wheel_download_dir, + progress_bar, build_isolation): + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + + # Where still packed archives should be written to. If None, they are + # not saved, and are deleted immediately after unpacking. + self.download_dir = download_dir + + # Where still-packed .whl files should be written to. If None, they are + # written to the download_dir parameter. Separate to download_dir to + # permit only keeping wheel archives for pip wheel. + if wheel_download_dir: + wheel_download_dir = normalize_path(wheel_download_dir) + self.wheel_download_dir = wheel_download_dir + + # NOTE + # download_dir and wheel_download_dir overlap semantically and may + # be combined if we're willing to have non-wheel archives present in + # the wheelhouse output by 'pip wheel'. + + self.progress_bar = progress_bar + + # Is build isolation allowed? + self.build_isolation = build_isolation + + @property + def _download_should_save(self): + # TODO: Modify to reduce indentation needed + if self.download_dir: + self.download_dir = expanduser(self.download_dir) + if os.path.exists(self.download_dir): + return True + else: + logger.critical('Could not find download directory') + raise InstallationError( + "Could not find or access download directory '%s'" + % display_path(self.download_dir)) + return False + + def prepare_linked_requirement(self, req, session, finder, + upgrade_allowed, require_hashes): + """Prepare a requirement that would be obtained from req.link + """ + # TODO: Breakup into smaller functions + if req.link and req.link.scheme == 'file': + path = url_to_path(req.link.url) + logger.info('Processing %s', display_path(path)) + else: + logger.info('Collecting %s', req) + + with indent_log(): + # @@ if filesystem packages are not marked + # editable in a req, a non deterministic error + # occurs when the script attempts to unpack the + # build directory + req.ensure_has_source_dir(self.build_dir) + # If a checkout exists, it's unwise to keep going. version + # inconsistencies are logged later, but do not fail the + # installation. + # FIXME: this won't upgrade when there's an existing + # package unpacked in `req.source_dir` + # package unpacked in `req.source_dir` + if os.path.exists(os.path.join(req.source_dir, 'setup.py')): + raise PreviousBuildDirError( + "pip can't proceed with requirements '%s' due to a" + " pre-existing build directory (%s). This is " + "likely due to a previous installation that failed" + ". pip is being responsible and not assuming it " + "can delete this. Please delete it and try again." + % (req, req.source_dir) + ) + req.populate_link(finder, upgrade_allowed, require_hashes) + + # We can't hit this spot and have populate_link return None. + # req.satisfied_by is None here (because we're + # guarded) and upgrade has no impact except when satisfied_by + # is not None. + # Then inside find_requirement existing_applicable -> False + # If no new versions are found, DistributionNotFound is raised, + # otherwise a result is guaranteed. + assert req.link + link = req.link + + # Now that we have the real link, we can tell what kind of + # requirements we have and raise some more informative errors + # than otherwise. (For example, we can raise VcsHashUnsupported + # for a VCS URL rather than HashMissing.) + if require_hashes: + # We could check these first 2 conditions inside + # unpack_url and save repetition of conditions, but then + # we would report less-useful error messages for + # unhashable requirements, complaining that there's no + # hash provided. + if is_vcs_url(link): + raise VcsHashUnsupported() + elif is_file_url(link) and is_dir_url(link): + raise DirectoryUrlHashUnsupported() + if not req.original_link and not req.is_pinned: + # Unpinned packages are asking for trouble when a new + # version is uploaded. This isn't a security check, but + # it saves users a surprising hash mismatch in the + # future. + # + # file:/// URLs aren't pinnable, so don't complain + # about them not being pinned. + raise HashUnpinned() + + hashes = req.hashes(trust_internet=not require_hashes) + if require_hashes and not hashes: + # Known-good hashes are missing for this requirement, so + # shim it with a facade object that will provoke hash + # computation and then raise a HashMissing exception + # showing the user what the hash should be. + hashes = MissingHashes() + + try: + download_dir = self.download_dir + # We always delete unpacked sdists after pip ran. + autodelete_unpacked = True + if req.link.is_wheel and self.wheel_download_dir: + # when doing 'pip wheel` we download wheels to a + # dedicated dir. + download_dir = self.wheel_download_dir + if req.link.is_wheel: + if download_dir: + # When downloading, we only unpack wheels to get + # metadata. + autodelete_unpacked = True + else: + # When installing a wheel, we use the unpacked + # wheel. + autodelete_unpacked = False + unpack_url( + req.link, req.source_dir, + download_dir, autodelete_unpacked, + session=session, hashes=hashes, + progress_bar=self.progress_bar + ) + except requests.HTTPError as exc: + logger.critical( + 'Could not install requirement %s because of error %s', + req, + exc, + ) + raise InstallationError( + 'Could not install requirement %s because of HTTP ' + 'error %s for URL %s' % + (req, exc, req.link) + ) + abstract_dist = make_abstract_dist(req) + abstract_dist.prep_for_dist(finder, self.build_isolation) + if self._download_should_save: + # Make a .zip of the source_dir we already created. + if req.link.scheme in vcs.all_schemes: + req.archive(self.download_dir) + return abstract_dist + + def prepare_editable_requirement(self, req, require_hashes, use_user_site, + finder): + """Prepare an editable requirement + """ + assert req.editable, "cannot prepare a non-editable req as editable" + + logger.info('Obtaining %s', req) + + with indent_log(): + if require_hashes: + raise InstallationError( + 'The editable requirement %s cannot be installed when ' + 'requiring hashes, because there is no single file to ' + 'hash.' % req + ) + req.ensure_has_source_dir(self.src_dir) + req.update_editable(not self._download_should_save) + + abstract_dist = make_abstract_dist(req) + abstract_dist.prep_for_dist(finder, self.build_isolation) + + if self._download_should_save: + req.archive(self.download_dir) + req.check_if_exists(use_user_site) + + return abstract_dist + + def prepare_installed_requirement(self, req, require_hashes, skip_reason): + """Prepare an already-installed requirement + """ + assert req.satisfied_by, "req should have been satisfied but isn't" + assert skip_reason is not None, ( + "did not get skip reason skipped but req.satisfied_by " + "is set to %r" % (req.satisfied_by,) + ) + logger.info( + 'Requirement %s: %s (%s)', + skip_reason, req, req.satisfied_by.version + ) + with indent_log(): + if require_hashes: + logger.debug( + 'Since it is already installed, we are trusting this ' + 'package without checking its hash. To ensure a ' + 'completely repeatable environment, install into an ' + 'empty virtualenv.' + ) + abstract_dist = Installed(req) + + return abstract_dist diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/pep425tags.py b/myenv/lib/python3.7/site-packages/pip/_internal/pep425tags.py new file mode 100644 index 000000000..5d3131086 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/pep425tags.py @@ -0,0 +1,317 @@ +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import logging +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +import pip._internal.utils.glibc + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + logger.debug("Config variable '%s' is unset, Python ABI tag may " + "be incorrect", var) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return pip._internal.utils.glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/req/__init__.py new file mode 100644 index 000000000..07ae607cb --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/req/__init__.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import + +import logging + +from .req_install import InstallRequirement +from .req_set import RequirementSet +from .req_file import parse_requirements +from pip._internal.utils.logging import indent_log + + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs(to_install, install_options, global_options=(), + *args, **kwargs): + """ + Install everything in the given list. + + (to be called after having downloaded and unpacked the packages) + """ + + if to_install: + logger.info( + 'Installing collected packages: %s', + ', '.join([req.name for req in to_install]), + ) + + with indent_log(): + for requirement in to_install: + if requirement.conflicts_with: + logger.info( + 'Found existing installation: %s', + requirement.conflicts_with, + ) + with indent_log(): + uninstalled_pathset = requirement.uninstall( + auto_confirm=True + ) + try: + requirement.install( + install_options, + global_options, + *args, + **kwargs + ) + except: + should_rollback = ( + requirement.conflicts_with and + not requirement.install_succeeded + ) + # if install did not succeed, rollback previous uninstall + if should_rollback: + uninstalled_pathset.rollback() + raise + else: + should_commit = ( + requirement.conflicts_with and + requirement.install_succeeded + ) + if should_commit: + uninstalled_pathset.commit() + requirement.remove_temporary_source() + + return to_install diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e11051a05c8178647747c4cb554af3755a6740d5 GIT binary patch literal 1554 zcmZWp&2Aev5GJYB?rLS(sRFn~3$)uqiwJ0>^v9@E7)DVP1qu`?8XIsTz#!I3N?L`x zlu51}8|zDxYyWON1@f)E^$GeM1+P8j6>{ouB{>Gl1!srD;c#ZY8GhC2L zC0=fHzb&*$gm}nL%S`c{7Y5WfZ!8bElXPc^(wwT-Y8s?bRxmh0g&eCU7*sAy%5Qg;{~a_ zp8p;ycz<=HJC;f?l^Rf7D}51vpfAWr zaq8;84Fc1la{yC!fs7&l$I&IO@D%+$vrdL9Z!|`c(il>{@`#h%Vu|1C39D$ zJG-Bn)5HnuNwWfyP$Xgi*9|BvGec>AcK#~bbBRl3KHGoSdG5mS(Zz@VufG1CkdRWn z56t?=#e3h#67tBOf@BFv-3^J!WZ_bD2;pudrI9q1#VAwxgI?SEQ0`-{td|udX}zh; z3KhV;cGD?|EH#>*WoBYqWwG+Z25aVxwP(6aQ_cZN8!CY31kkfS1d?aQz6qTu=bReu zx;0VfRLfGOyw|c3__DUOwYDW^&S7mg$3mVYg09zIqQ=_#PtNLp`$qTL+tbhkkN=KzB6{l1=G;QG04d7Vk|2p>irLlpNfaCS!19^ni zC=-170=)y()4#5qerYnH`zu>ZyaGz0$0)U}F*n~WK@BN&W0}MA=$w7=Rr`7sPP}~Y__rh literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_file.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..05d266bf557b3a4aa1f7700ec1462aa8fe429e3c GIT binary patch literal 8653 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 RB;?1xBR2f^1cc4!{|_f2ZB76H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/req/__pycache__/req_set.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a40d74e9fdd38dba793d08ce7c099154116ab817 GIT binary patch literal 5784 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/req_file.py b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_file.py new file mode 100644 index 000000000..9e6ef4129 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_file.py @@ -0,0 +1,338 @@ +""" +Requirements file parsing +""" + +from __future__ import absolute_import + +import optparse +import os +import re +import shlex +import sys + +from pip._vendor.six.moves import filterfalse +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal import cmdoptions +from pip._internal.download import get_file_content +from pip._internal.exceptions import RequirementsFileParseError +from pip._internal.req.req_install import InstallRequirement + +__all__ = ['parse_requirements'] + +SCHEME_RE = re.compile(r'^(http|https|file):', re.I) +COMMENT_RE = re.compile(r'(^|\s)+#.*$') + +# Matches environment variable-style values in '${MY_VARIABLE_1}' with the +# variable name consisting of only uppercase letters, digits or the '_' +# (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, +# 2013 Edition. +ENV_VAR_RE = re.compile(r'(?P\$\{(?P[A-Z0-9_]+)\})') + +SUPPORTED_OPTIONS = [ + cmdoptions.constraints, + cmdoptions.editable, + cmdoptions.requirements, + cmdoptions.no_index, + cmdoptions.index_url, + cmdoptions.find_links, + cmdoptions.extra_index_url, + cmdoptions.always_unzip, + cmdoptions.no_binary, + cmdoptions.only_binary, + cmdoptions.pre, + cmdoptions.process_dependency_links, + cmdoptions.trusted_host, + cmdoptions.require_hashes, +] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [o().dest for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements(filename, finder=None, comes_from=None, options=None, + session=None, constraint=False, wheel_cache=None): + """Parse a requirements file and yield InstallRequirement instances. + + :param filename: Path or url of requirements file. + :param finder: Instance of pip.index.PackageFinder. + :param comes_from: Origin description of requirements. + :param options: cli options. + :param session: Instance of pip.download.PipSession. + :param constraint: If true, parsing a constraint file rather than + requirements file. + :param wheel_cache: Instance of pip.wheel.WheelCache + """ + if session is None: + raise TypeError( + "parse_requirements() missing 1 required keyword argument: " + "'session'" + ) + + _, content = get_file_content( + filename, comes_from=comes_from, session=session + ) + + lines_enum = preprocess(content, options) + + for line_number, line in lines_enum: + req_iter = process_line(line, filename, line_number, finder, + comes_from, options, session, wheel_cache, + constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + """Split, filter, and join lines, and return a line iterator + + :param content: the content of the requirements file + :param options: cli options + """ + lines_enum = enumerate(content.splitlines(), start=1) + lines_enum = join_lines(lines_enum) + lines_enum = ignore_comments(lines_enum) + lines_enum = skip_regex(lines_enum, options) + lines_enum = expand_env_variables(lines_enum) + return lines_enum + + +def process_line(line, filename, line_number, finder=None, comes_from=None, + options=None, session=None, wheel_cache=None, + constraint=False): + """Process a single requirements line; This can result in creating/yielding + requirements, or updating the finder. + + For lines that contain requirements, the only options that have an effect + are from SUPPORTED_OPTIONS_REQ, and they are scoped to the + requirement. Other options from SUPPORTED_OPTIONS may be present, but are + ignored. + + For lines that do not contain requirements, the only options that have an + effect are from SUPPORTED_OPTIONS. Options from SUPPORTED_OPTIONS_REQ may + be present, but are ignored. These lines may contain multiple options + (although our docs imply only one is supported), and all our parsed and + affect the finder. + + :param constraint: If True, parsing a constraints file. + :param options: OptionParser options that we may update + """ + parser = build_parser(line) + defaults = parser.get_default_values() + defaults.index_url = None + if finder: + # `finder.format_control` will be updated during parsing + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + if sys.version_info < (2, 7, 3): + # Prior to 2.7.3, shlex cannot deal with unicode entries + options_str = options_str.encode('utf8') + opts, _ = parser.parse_args(shlex.split(options_str), defaults) + + # preserve for the nested code path + line_comes_from = '%s %s (line %s)' % ( + '-c' if constraint else '-r', filename, line_number, + ) + + # yield a line requirement + if args_str: + isolated = options.isolated_mode if options else False + if options: + cmdoptions.check_install_build_global(options, opts) + # get the options that apply to requirements + req_options = {} + for dest in SUPPORTED_OPTIONS_REQ_DEST: + if dest in opts.__dict__ and opts.__dict__[dest]: + req_options[dest] = opts.__dict__[dest] + yield InstallRequirement.from_line( + args_str, line_comes_from, constraint=constraint, + isolated=isolated, options=req_options, wheel_cache=wheel_cache + ) + + # yield an editable requirement + elif opts.editables: + isolated = options.isolated_mode if options else False + yield InstallRequirement.from_editable( + opts.editables[0], comes_from=line_comes_from, + constraint=constraint, isolated=isolated, wheel_cache=wheel_cache + ) + + # parse a nested requirements file + elif opts.requirements or opts.constraints: + if opts.requirements: + req_path = opts.requirements[0] + nested_constraint = False + else: + req_path = opts.constraints[0] + nested_constraint = True + # original file is over http + if SCHEME_RE.search(filename): + # do a url join so relative paths work + req_path = urllib_parse.urljoin(filename, req_path) + # original file and nested file are paths + elif not SCHEME_RE.search(req_path): + # do a join so relative paths work + req_path = os.path.join(os.path.dirname(filename), req_path) + # TODO: Why not use `comes_from='-r {} (line {})'` here as well? + parser = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parser: + yield req + + # percolate hash-checking option upward + elif opts.require_hashes: + options.require_hashes = opts.require_hashes + + # set finder options + elif finder: + if opts.index_url: + finder.index_urls = [opts.index_url] + if opts.no_index is True: + finder.index_urls = [] + if opts.extra_index_urls: + finder.index_urls.extend(opts.extra_index_urls) + if opts.find_links: + # FIXME: it would be nice to keep track of the source + # of the find_links: support a find-links local path + # relative to a requirements file. + value = opts.find_links[0] + req_dir = os.path.dirname(os.path.abspath(filename)) + relative_to_reqs_file = os.path.join(req_dir, value) + if os.path.exists(relative_to_reqs_file): + value = relative_to_reqs_file + finder.find_links.append(value) + if opts.pre: + finder.allow_all_prereleases = True + if opts.process_dependency_links: + finder.process_dependency_links = True + if opts.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + """Break up the line into an args and options string. We only want to shlex + (and then optparse) the options, not the args. args can contain markers + which are corrupted by shlex. + """ + tokens = line.split(' ') + args = [] + options = tokens[:] + for token in tokens: + if token.startswith('-') or token.startswith('--'): + break + else: + args.append(token) + options.pop(0) + return ' '.join(args), ' '.join(options) + + +def build_parser(line): + """ + Return a parser for parsing requirement lines + """ + parser = optparse.OptionParser(add_help_option=False) + + option_factories = SUPPORTED_OPTIONS + SUPPORTED_OPTIONS_REQ + for option_factory in option_factories: + option = option_factory() + parser.add_option(option) + + # By default optparse sys.exits on parsing errors. We want to wrap + # that in our own exception. + def parser_exit(self, msg): + # add offending line + msg = 'Invalid requirement: %s\n%s' % (line, msg) + raise RequirementsFileParseError(msg) + parser.exit = parser_exit + + return parser + + +def join_lines(lines_enum): + """Joins a line ending in '\' with the previous line (except when following + comments). The joined line takes on the index of the first line. + """ + primary_line_number = None + new_line = [] + for line_number, line in lines_enum: + if not line.endswith('\\') or COMMENT_RE.match(line): + if COMMENT_RE.match(line): + # this ensures comments are always matched later + line = ' ' + line + if new_line: + new_line.append(line) + yield primary_line_number, ''.join(new_line) + new_line = [] + else: + yield line_number, line + else: + if not new_line: + primary_line_number = line_number + new_line.append(line.strip('\\')) + + # last line contains \ + if new_line: + yield primary_line_number, ''.join(new_line) + + # TODO: handle space after '\'. + + +def ignore_comments(lines_enum): + """ + Strips comments and filter empty lines. + """ + for line_number, line in lines_enum: + line = COMMENT_RE.sub('', line) + line = line.strip() + if line: + yield line_number, line + + +def skip_regex(lines_enum, options): + """ + Skip lines that match '--skip-requirements-regex' pattern + + Note: the regex pattern is only built once + """ + skip_regex = options.skip_requirements_regex if options else None + if skip_regex: + pattern = re.compile(skip_regex) + lines_enum = filterfalse(lambda e: pattern.search(e[1]), lines_enum) + return lines_enum + + +def expand_env_variables(lines_enum): + """Replace all environment variables that can be retrieved via `os.getenv`. + + The only allowed format for environment variables defined in the + requirement file is `${MY_VARIABLE_1}` to ensure two things: + + 1. Strings that contain a `$` aren't accidentally (partially) expanded. + 2. Ensure consistency across platforms for requirement files. + + These points are the result of a discusssion on the `github pull + request #3514 `_. + + Valid characters in variable names follow the `POSIX standard + `_ and are limited + to uppercase letter, digits and the `_` (underscore). + """ + for line_number, line in lines_enum: + for env_var, var_name in ENV_VAR_RE.findall(line): + value = os.getenv(var_name) + if not value: + continue + + line = line.replace(env_var, value) + + yield line_number, line diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/req_install.py b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_install.py new file mode 100644 index 000000000..9dd1523e6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_install.py @@ -0,0 +1,1115 @@ +from __future__ import absolute_import + +import logging +import os +import re +import shutil +import sys +import sysconfig +import traceback +import warnings +import zipfile +from distutils.util import change_root +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources, pytoml, six +from pip._vendor.packaging import specifiers +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.packaging.version import Version +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal import wheel +from pip._internal.build_env import BuildEnvironment +from pip._internal.compat import native_str +from pip._internal.download import ( + is_archive_file, is_url, path_to_url, url_to_path, +) +from pip._internal.exceptions import InstallationError, UninstallationError +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, +) +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.deprecation import RemovedInPip11Warning +from pip._internal.utils.hashes import Hashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + _make_build_dir, ask_path_exists, backup_dir, call_subprocess, + display_path, dist_in_site_packages, dist_in_usersite, ensure_dir, + get_installed_version, is_installable_dir, read_text_file, rmtree, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.ui import open_spinner +from pip._internal.vcs import vcs +from pip._internal.wheel import Wheel, move_wheel_files + +logger = logging.getLogger(__name__) + +operators = specifiers.Specifier._operators.keys() + + +def _strip_extras(path): + m = re.match(r'^(.+)(\[[^\]]+\])$', path) + extras = None + if m: + path_no_extras = m.group(1) + extras = m.group(2) + else: + path_no_extras = path + + return path_no_extras, extras + + +class InstallRequirement(object): + """ + Represents something that may be installed later on, may have information + about where to fetch the relavant requirement and also contains logic for + installing the said requirement. + """ + + def __init__(self, req, comes_from, source_dir=None, editable=False, + link=None, update=True, markers=None, + isolated=False, options=None, wheel_cache=None, + constraint=False, extras=()): + assert req is None or isinstance(req, Requirement), req + self.req = req + self.comes_from = comes_from + self.constraint = constraint + if source_dir is not None: + self.source_dir = os.path.normpath(os.path.abspath(source_dir)) + else: + self.source_dir = None + self.editable = editable + + self._wheel_cache = wheel_cache + if link is not None: + self.link = self.original_link = link + else: + from pip._internal.index import Link + self.link = self.original_link = req and req.url and Link(req.url) + + if extras: + self.extras = extras + elif req: + self.extras = { + pkg_resources.safe_extra(extra) for extra in req.extras + } + else: + self.extras = set() + if markers is not None: + self.markers = markers + else: + self.markers = req and req.marker + self._egg_info_path = None + # This holds the pkg_resources.Distribution object if this requirement + # is already available: + self.satisfied_by = None + # This hold the pkg_resources.Distribution object if this requirement + # conflicts with another installed distribution: + self.conflicts_with = None + # Temporary build location + self._temp_build_dir = TempDirectory(kind="req-build") + # Used to store the global directory where the _temp_build_dir should + # have been created. Cf _correct_build_location method. + self._ideal_build_dir = None + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None + # UninstallPathSet of uninstalled distribution (for possible rollback) + self.uninstalled_pathset = None + self.options = options if options else {} + # Set to True after successful preparation of this requirement + self.prepared = False + self.is_direct = False + + self.isolated = isolated + self.build_env = BuildEnvironment(no_clean=True) + + @classmethod + def from_editable(cls, editable_req, comes_from=None, isolated=False, + options=None, wheel_cache=None, constraint=False): + from pip._internal.index import Link + + name, url, extras_override = parse_editable(editable_req) + if url.startswith('file:'): + source_dir = url_to_path(url) + else: + source_dir = None + + if name is not None: + try: + req = Requirement(name) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % name) + else: + req = None + return cls( + req, comes_from, source_dir=source_dir, + editable=True, + link=Link(url), + constraint=constraint, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=extras_override or (), + ) + + @classmethod + def from_req(cls, req, comes_from=None, isolated=False, wheel_cache=None): + try: + req = Requirement(req) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req) + if req.url: + raise InstallationError( + "Direct url requirement (like %s) are not allowed for " + "dependencies" % req + ) + return cls(req, comes_from, isolated=isolated, wheel_cache=wheel_cache) + + @classmethod + def from_line( + cls, name, comes_from=None, isolated=False, options=None, + wheel_cache=None, constraint=False): + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + """ + from pip._internal.index import Link + + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers = name.split(marker_sep, 1) + markers = markers.strip() + if not markers: + markers = None + else: + markers = Marker(markers) + else: + markers = None + name = name.strip() + req = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras = None + + if is_url(name): + link = Link(name) + else: + p, extras = _strip_extras(path) + looks_like_dir = os.path.isdir(p) and ( + os.path.sep in name or + (os.path.altsep is not None and os.path.altsep in name) or + name.startswith('.') + ) + if looks_like_dir: + if not is_installable_dir(p): + raise InstallationError( + "Directory %r is not installable. File 'setup.py' " + "not found." % name + ) + link = Link(path_to_url(p)) + elif is_archive_file(p): + if not os.path.isfile(p): + logger.warning( + 'Requirement %r looks like a filename, but the ' + 'file does not exist', + name + ) + link = Link(path_to_url(p)) + + # it's a local file, dir, or url + if link: + # Handle relative file URLs + if link.scheme == 'file' and re.search(r'\.\./', link.url): + link = Link( + path_to_url(os.path.normpath(os.path.abspath(link.path)))) + # wheel file + if link.is_wheel: + wheel = Wheel(link.filename) # can raise InvalidWheelFilename + req = "%s==%s" % (wheel.name, wheel.version) + else: + # set the req to the egg fragment. when it's not there, this + # will become an 'unnamed' requirement + req = link.egg_fragment + + # a requirement specifier + else: + req = name + + if extras: + extras = Requirement("placeholder" + extras.lower()).extras + else: + extras = () + if req is not None: + try: + req = Requirement(req) + except InvalidRequirement: + if os.path.sep in req: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req) + elif '=' in req and not any(op in req for op in operators): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = traceback.format_exc() + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req, add_msg)) + return cls( + req, comes_from, link=link, markers=markers, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=extras, + ) + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % self.link.url + else: + s = self.link.url if self.link else None + if self.satisfied_by is not None: + s += ' in %s' % display_path(self.satisfied_by.location) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += ' (from %s)' % comes_from + return s + + def __repr__(self): + return '<%s object: %s editable=%r>' % ( + self.__class__.__name__, str(self), self.editable) + + def populate_link(self, finder, upgrade, require_hashes): + """Ensure that if a link can be found for this, that it is found. + + Note that self.link may still be None - if Upgrade is False and the + requirement is already installed. + + If require_hashes is True, don't use the wheel cache, because cached + wheels, always built locally, have different hashes than the files + downloaded from the index server and thus throw false hash mismatches. + Furthermore, cached wheels at present have undeterministic contents due + to file modification times. + """ + if self.link is None: + self.link = finder.find_requirement(self, upgrade) + if self._wheel_cache is not None and not require_hashes: + old_link = self.link + self.link = self._wheel_cache.get(self.link, self.name) + if old_link != self.link: + logger.debug('Using cached wheel link: %s', self.link) + + @property + def specifier(self): + return self.req.specifier + + @property + def is_pinned(self): + """Return whether I am pinned to an exact version. + + For example, some-package==1.2 is pinned; some-package>1.2 is not. + """ + specifiers = self.specifier + return (len(specifiers) == 1 and + next(iter(specifiers)).operator in {'==', '==='}) + + def from_path(self): + if self.req is None: + return None + s = str(self.req) + if self.comes_from: + if isinstance(self.comes_from, six.string_types): + comes_from = self.comes_from + else: + comes_from = self.comes_from.from_path() + if comes_from: + s += '->' + comes_from + return s + + def build_location(self, build_dir): + assert build_dir is not None + if self._temp_build_dir.path is not None: + return self._temp_build_dir.path + if self.req is None: + # for requirement via a path to a directory: the name of the + # package is not available yet so we create a temp directory + # Once run_egg_info will have run, we'll be able + # to fix it via _correct_build_location + # Some systems have /tmp as a symlink which confuses custom + # builds (such as numpy). Thus, we ensure that the real path + # is returned. + self._temp_build_dir.create() + self._ideal_build_dir = build_dir + + return self._temp_build_dir.path + if self.editable: + name = self.name.lower() + else: + name = self.name + # FIXME: Is there a better place to create the build_dir? (hg and bzr + # need this) + if not os.path.exists(build_dir): + logger.debug('Creating directory %s', build_dir) + _make_build_dir(build_dir) + return os.path.join(build_dir, name) + + def _correct_build_location(self): + """Move self._temp_build_dir to self._ideal_build_dir/self.req.name + + For some requirements (e.g. a path to a directory), the name of the + package is not available until we run egg_info, so the build_location + will return a temporary directory and store the _ideal_build_dir. + + This is only called by self.egg_info_path to fix the temporary build + directory. + """ + if self.source_dir is not None: + return + assert self.req is not None + assert self._temp_build_dir.path + assert self._ideal_build_dir.path + old_location = self._temp_build_dir.path + self._temp_build_dir.path = None + + new_location = self.build_location(self._ideal_build_dir) + if os.path.exists(new_location): + raise InstallationError( + 'A package already exists in %s; please remove it to continue' + % display_path(new_location)) + logger.debug( + 'Moving package %s from %s to new location %s', + self, display_path(old_location), display_path(new_location), + ) + shutil.move(old_location, new_location) + self._temp_build_dir.path = new_location + self._ideal_build_dir = None + self.source_dir = os.path.normpath(os.path.abspath(new_location)) + self._egg_info_path = None + + @property + def name(self): + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def setup_py_dir(self): + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + assert self.source_dir, "No source dir for %s" % self + + setup_py = os.path.join(self.setup_py_dir, 'setup.py') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(setup_py, six.text_type): + setup_py = setup_py.encode(sys.getfilesystemencoding()) + + return setup_py + + @property + def pyproject_toml(self): + assert self.source_dir, "No source dir for %s" % self + + pp_toml = os.path.join(self.setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(pp_toml, six.text_type): + pp_toml = pp_toml.encode(sys.getfilesystemencoding()) + + return pp_toml + + def get_pep_518_info(self): + """Get a list of the packages required to build the project, if any, + and a flag indicating whether pyproject.toml is present, indicating + that the build should be isolated. + + Build requirements can be specified in a pyproject.toml, as described + in PEP 518. If this file exists but doesn't specify build + requirements, pip will default to installing setuptools and wheel. + """ + if os.path.isfile(self.pyproject_toml): + with open(self.pyproject_toml) as f: + pp_toml = pytoml.load(f) + build_sys = pp_toml.get('build-system', {}) + return (build_sys.get('requires', ['setuptools', 'wheel']), True) + return (['setuptools', 'wheel'], False) + + def run_egg_info(self): + assert self.source_dir + if self.name: + logger.debug( + 'Running setup.py (path:%s) egg_info for package %s', + self.setup_py, self.name, + ) + else: + logger.debug( + 'Running setup.py (path:%s) egg_info for package from %s', + self.setup_py, self.link, + ) + + with indent_log(): + script = SETUPTOOLS_SHIM % self.setup_py + base_cmd = [sys.executable, '-c', script] + if self.isolated: + base_cmd += ["--no-user-cfg"] + egg_info_cmd = base_cmd + ['egg_info'] + # We can't put the .egg-info files at the root, because then the + # source code will be mistaken for an installed egg, causing + # problems + if self.editable: + egg_base_option = [] + else: + egg_info_dir = os.path.join(self.setup_py_dir, 'pip-egg-info') + ensure_dir(egg_info_dir) + egg_base_option = ['--egg-base', 'pip-egg-info'] + with self.build_env: + call_subprocess( + egg_info_cmd + egg_base_option, + cwd=self.setup_py_dir, + show_stdout=False, + command_desc='python setup.py egg_info') + + if not self.req: + if isinstance(parse_version(self.pkg_info()["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.pkg_info()["Name"], + op, + self.pkg_info()["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.pkg_info()["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + logger.warning( + 'Running setup.py (path:%s) egg_info for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.setup_py, self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def egg_info_data(self, filename): + if self.satisfied_by is not None: + if not self.satisfied_by.has_metadata(filename): + return None + return self.satisfied_by.get_metadata(filename) + assert self.source_dir + filename = self.egg_info_path(filename) + if not os.path.exists(filename): + return None + data = read_text_file(filename) + return data + + def egg_info_path(self, filename): + if self._egg_info_path is None: + if self.editable: + base = self.source_dir + else: + base = os.path.join(self.setup_py_dir, 'pip-egg-info') + filenames = os.listdir(base) + if self.editable: + filenames = [] + for root, dirs, files in os.walk(base): + for dir in vcs.dirnames: + if dir in dirs: + dirs.remove(dir) + # Iterate over a copy of ``dirs``, since mutating + # a list while iterating over it can cause trouble. + # (See https://github.com/pypa/pip/pull/462.) + for dir in list(dirs): + # Don't search in anything that looks like a virtualenv + # environment + if ( + os.path.lexists( + os.path.join(root, dir, 'bin', 'python') + ) or + os.path.exists( + os.path.join( + root, dir, 'Scripts', 'Python.exe' + ) + )): + dirs.remove(dir) + # Also don't search through tests + elif dir == 'test' or dir == 'tests': + dirs.remove(dir) + filenames.extend([os.path.join(root, dir) + for dir in dirs]) + filenames = [f for f in filenames if f.endswith('.egg-info')] + + if not filenames: + raise InstallationError( + 'No files/directories in %s (from %s)' % (base, filename) + ) + assert filenames, \ + "No files/directories in %s (from %s)" % (base, filename) + + # if we have more than one match, we pick the toplevel one. This + # can easily be the case if there is a dist folder which contains + # an extracted tarball for testing purposes. + if len(filenames) > 1: + filenames.sort( + key=lambda x: x.count(os.path.sep) + + (os.path.altsep and x.count(os.path.altsep) or 0) + ) + self._egg_info_path = os.path.join(base, filenames[0]) + return os.path.join(self._egg_info_path, filename) + + def pkg_info(self): + p = FeedParser() + data = self.egg_info_data('PKG-INFO') + if not data: + logger.warning( + 'No PKG-INFO file found in %s', + display_path(self.egg_info_path('PKG-INFO')), + ) + p.feed(data or '') + return p.close() + + _requirements_section_re = re.compile(r'\[(.*?)\]') + + @property + def installed_version(self): + return get_installed_version(self.name) + + def assert_source_matches_version(self): + assert self.source_dir + version = self.pkg_info()['version'] + if self.req.specifier and version not in self.req.specifier: + logger.warning( + 'Requested %s, but installing version %s', + self, + version, + ) + else: + logger.debug( + 'Source in %s has version %s, which satisfies requirement %s', + display_path(self.source_dir), + version, + self, + ) + + def update_editable(self, obtain=True): + if not self.link: + logger.debug( + "Cannot update repository at %s; repository location is " + "unknown", + self.source_dir, + ) + return + assert self.editable + assert self.source_dir + if self.link.scheme == 'file': + # Static paths don't get updated + return + assert '+' in self.link.url, "bad url: %r" % self.link.url + if not self.update: + return + vc_type, url = self.link.url.split('+', 1) + backend = vcs.get_backend(vc_type) + if backend: + vcs_backend = backend(self.link.url) + if obtain: + vcs_backend.obtain(self.source_dir) + else: + vcs_backend.export(self.source_dir) + else: + assert 0, ( + 'Unexpected version control type (in %s): %s' + % (self.link, vc_type)) + + def uninstall(self, auto_confirm=False, verbose=False, + use_user_site=False): + """ + Uninstall the distribution currently satisfying this requirement. + + Prompts before removing or modifying files unless + ``auto_confirm`` is True. + + Refuses to delete or modify files outside of ``sys.prefix`` - + thus uninstallation within a virtual environment can only + modify that virtual environment, even if the virtualenv is + linked to global site-packages. + + """ + if not self.check_if_exists(use_user_site): + logger.warning("Skipping %s as it is not installed.", self.name) + return + dist = self.satisfied_by or self.conflicts_with + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def archive(self, build_dir): + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.pkg_info()["version"]) + archive_path = os.path.join(build_dir, archive_name) + if os.path.exists(archive_path): + response = ask_path_exists( + 'The file %s exists. (i)gnore, (w)ipe, (b)ackup, (a)bort ' % + display_path(archive_path), ('i', 'w', 'b', 'a')) + if response == 'i': + create_archive = False + elif response == 'w': + logger.warning('Deleting %s', display_path(archive_path)) + os.remove(archive_path) + elif response == 'b': + dest_file = backup_dir(archive_path) + logger.warning( + 'Backing up %s to %s', + display_path(archive_path), + display_path(dest_file), + ) + shutil.move(archive_path, dest_file) + elif response == 'a': + sys.exit(-1) + if create_archive: + zip = zipfile.ZipFile( + archive_path, 'w', zipfile.ZIP_DEFLATED, + allowZip64=True + ) + dir = os.path.normcase(os.path.abspath(self.setup_py_dir)) + for dirpath, dirnames, filenames in os.walk(dir): + if 'pip-egg-info' in dirnames: + dirnames.remove('pip-egg-info') + for dirname in dirnames: + dirname = os.path.join(dirpath, dirname) + name = self._clean_zip_name(dirname, dir) + zipdir = zipfile.ZipInfo(self.name + '/' + name + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + filename = os.path.join(dirpath, filename) + name = self._clean_zip_name(filename, dir) + zip.write(filename, self.name + '/' + name) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def _clean_zip_name(self, name, prefix): + assert name.startswith(prefix + os.path.sep), ( + "name %r doesn't start with prefix %r" % (name, prefix) + ) + name = name[len(prefix) + 1:] + name = name.replace(os.path.sep, '/') + return name + + def match_markers(self, extras_requested=None): + if not extras_requested: + # Provide an extra to safely evaluate the markers + # without matching any extra + extras_requested = ('',) + if self.markers is not None: + return any( + self.markers.evaluate({'extra': extra}) + for extra in extras_requested) + else: + return True + + def install(self, install_options, global_options=None, root=None, + home=None, prefix=None, warn_script_location=True, + use_user_site=False, pycompile=True): + global_options = global_options if global_options is not None else [] + if self.editable: + self.install_editable( + install_options, global_options, prefix=prefix, + ) + return + if self.is_wheel: + version = wheel.wheel_version(self.source_dir) + wheel.check_compatibility(version, self.name) + + self.move_wheel_files( + self.source_dir, root=root, prefix=prefix, home=home, + warn_script_location=warn_script_location, + use_user_site=use_user_site, pycompile=pycompile, + ) + self.install_succeeded = True + return + + # Extend the list of global and install options passed on to + # the setup.py call with the ones from the requirements file. + # Options specified in requirements file override those + # specified on the command line, since the last option given + # to setup.py is the one that is used. + global_options = list(global_options) + \ + self.options.get('global_options', []) + install_options = list(install_options) + \ + self.options.get('install_options', []) + + if self.isolated: + global_options = global_options + ["--no-user-cfg"] + + with TempDirectory(kind="record") as temp_dir: + record_filename = os.path.join(temp_dir.path, 'install-record.txt') + install_args = self.get_install_args( + global_options, record_filename, root, prefix, pycompile, + ) + msg = 'Running setup.py install for %s' % (self.name,) + with open_spinner(msg) as spinner: + with indent_log(): + with self.build_env: + call_subprocess( + install_args + install_options, + cwd=self.setup_py_dir, + show_stdout=False, + spinner=spinner, + ) + + if not os.path.exists(record_filename): + logger.debug('Record file %s not found', record_filename) + return + self.install_succeeded = True + + def prepend_root(path): + if root is None or not os.path.isabs(path): + return path + else: + return change_root(root, path) + + with open(record_filename) as f: + for line in f: + directory = os.path.dirname(line) + if directory.endswith('.egg-info'): + egg_info_dir = prepend_root(directory) + break + else: + logger.warning( + 'Could not find .egg-info directory in install record' + ' for %s', + self, + ) + # FIXME: put the record somewhere + # FIXME: should this be an error? + return + new_lines = [] + with open(record_filename) as f: + for line in f: + filename = line.strip() + if os.path.isdir(filename): + filename += os.path.sep + new_lines.append( + os.path.relpath(prepend_root(filename), egg_info_dir) + ) + new_lines.sort() + ensure_dir(egg_info_dir) + inst_files_path = os.path.join(egg_info_dir, 'installed-files.txt') + with open(inst_files_path, 'w') as f: + f.write('\n'.join(new_lines) + '\n') + + def ensure_has_source_dir(self, parent_dir): + """Ensure that a source_dir is set. + + This will create a temporary build dir if the name of the requirement + isn't known yet. + + :param parent_dir: The ideal pip parent_dir for the source_dir. + Generally src_dir for editables and build_dir for sdists. + :return: self.source_dir + """ + if self.source_dir is None: + self.source_dir = self.build_location(parent_dir) + return self.source_dir + + def get_install_args(self, global_options, record_filename, root, prefix, + pycompile): + install_args = [sys.executable, "-u"] + install_args.append('-c') + install_args.append(SETUPTOOLS_SHIM % self.setup_py) + install_args += list(global_options) + \ + ['install', '--record', record_filename] + install_args += ['--single-version-externally-managed'] + + if root is not None: + install_args += ['--root', root] + if prefix is not None: + install_args += ['--prefix', prefix] + + if pycompile: + install_args += ["--compile"] + else: + install_args += ["--no-compile"] + + if running_under_virtualenv(): + py_ver_str = 'python' + sysconfig.get_python_version() + install_args += ['--install-headers', + os.path.join(sys.prefix, 'include', 'site', + py_ver_str, self.name)] + + return install_args + + def remove_temporary_source(self): + """Remove the source files from this requirement, if they are marked + for deletion""" + if self.source_dir and os.path.exists( + os.path.join(self.source_dir, PIP_DELETE_MARKER_FILENAME)): + logger.debug('Removing source in %s', self.source_dir) + rmtree(self.source_dir) + self.source_dir = None + self._temp_build_dir.cleanup() + self.build_env.cleanup() + + def install_editable(self, install_options, + global_options=(), prefix=None): + logger.info('Running setup.py develop for %s', self.name) + + if self.isolated: + global_options = list(global_options) + ["--no-user-cfg"] + + if prefix: + prefix_param = ['--prefix={}'.format(prefix)] + install_options = list(install_options) + prefix_param + + with indent_log(): + # FIXME: should we do --install-headers here too? + with self.build_env: + call_subprocess( + [ + sys.executable, + '-c', + SETUPTOOLS_SHIM % self.setup_py + ] + + list(global_options) + + ['develop', '--no-deps'] + + list(install_options), + + cwd=self.setup_py_dir, + show_stdout=False, + ) + + self.install_succeeded = True + + def check_if_exists(self, use_user_site): + """Find an installed distribution that satisfies or conflicts + with this requirement, and set self.satisfied_by or + self.conflicts_with appropriately. + """ + if self.req is None: + return False + try: + # get_distribution() will resolve the entire list of requirements + # anyway, and we've already determined that we need the requirement + # in question, so strip the marker so that we don't try to + # evaluate it. + no_marker = Requirement(str(self.req)) + no_marker.marker = None + self.satisfied_by = pkg_resources.get_distribution(str(no_marker)) + if self.editable and self.satisfied_by: + self.conflicts_with = self.satisfied_by + # when installing editables, nothing pre-existing should ever + # satisfy + self.satisfied_by = None + return True + except pkg_resources.DistributionNotFound: + return False + except pkg_resources.VersionConflict: + existing_dist = pkg_resources.get_distribution( + self.req.name + ) + if use_user_site: + if dist_in_usersite(existing_dist): + self.conflicts_with = existing_dist + elif (running_under_virtualenv() and + dist_in_site_packages(existing_dist)): + raise InstallationError( + "Will not install to the user site because it will " + "lack sys.path precedence to %s in %s" % + (existing_dist.project_name, existing_dist.location) + ) + else: + self.conflicts_with = existing_dist + return True + + @property + def is_wheel(self): + return self.link and self.link.is_wheel + + def move_wheel_files(self, wheeldir, root=None, home=None, prefix=None, + warn_script_location=True, use_user_site=False, + pycompile=True): + move_wheel_files( + self.name, self.req, wheeldir, + user=use_user_site, + home=home, + root=root, + prefix=prefix, + pycompile=pycompile, + isolated=self.isolated, + warn_script_location=warn_script_location, + ) + + def get_dist(self): + """Return a pkg_resources.Distribution built from self.egg_info_path""" + egg_info = self.egg_info_path('').rstrip(os.path.sep) + base_dir = os.path.dirname(egg_info) + metadata = pkg_resources.PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + return pkg_resources.Distribution( + os.path.dirname(egg_info), + project_name=dist_name, + metadata=metadata, + ) + + @property + def has_hash_options(self): + """Return whether any known-good hashes are specified as options. + + These activate --require-hashes mode; hashes specified as part of a + URL do not. + + """ + return bool(self.options.get('hashes', {})) + + def hashes(self, trust_internet=True): + """Return a hash-comparer that considers my option- and URL-based + hashes to be known-good. + + Hashes in URLs--ones embedded in the requirements file, not ones + downloaded from an index server--are almost peers with ones from + flags. They satisfy --require-hashes (whether it was implicitly or + explicitly activated) but do not activate it. md5 and sha224 are not + allowed in flags, which should nudge people toward good algos. We + always OR all hashes together, even ones from URLs. + + :param trust_internet: Whether to trust URL-based (#md5=...) hashes + downloaded from the internet, as by populate_link() + + """ + good_hashes = self.options.get('hashes', {}).copy() + link = self.link if trust_internet else self.original_link + if link and link.hash: + good_hashes.setdefault(link.hash_name, []).append(link.hash) + return Hashes(good_hashes) + + +def _strip_postfix(req): + """ + Strip req postfix ( -dev, 0.2, etc ) + """ + # FIXME: use package_to_requirement? + match = re.search(r'^(.*?)(?:-dev|-\d.*)$', req) + if match: + # Strip off -dev, -0.2, etc. + warnings.warn( + "#egg cleanup for editable urls will be dropped in the future", + RemovedInPip11Warning, + ) + req = match.group(1) + return req + + +def parse_editable(editable_req): + """Parses an editable requirement into: + - a requirement name + - an URL + - extras + - editable options + Accepted requirements: + svn+http://blahblah@rev#egg=Foobar[baz]&subdirectory=version_subdir + .[some_extra] + """ + + from pip._internal.index import Link + + url = editable_req + + # If a file path is specified with extras, strip off the extras. + url_no_extras, extras = _strip_extras(url) + + if os.path.isdir(url_no_extras): + if not os.path.exists(os.path.join(url_no_extras, 'setup.py')): + raise InstallationError( + "Directory %r is not installable. File 'setup.py' not found." % + url_no_extras + ) + # Treating it as code that has already been checked out + url_no_extras = path_to_url(url_no_extras) + + if url_no_extras.lower().startswith('file:'): + package_name = Link(url_no_extras).egg_fragment + if extras: + return ( + package_name, + url_no_extras, + Requirement("placeholder" + extras.lower()).extras, + ) + else: + return package_name, url_no_extras, None + + for version_control in vcs: + if url.lower().startswith('%s:' % version_control): + url = '%s+%s' % (version_control, url) + break + + if '+' not in url: + raise InstallationError( + '%s should either be a path to a local project or a VCS url ' + 'beginning with svn+, git+, hg+, or bzr+' % + editable_req + ) + + vc_type = url.split('+', 1)[0].lower() + + if not vcs.get_backend(vc_type): + error_message = 'For --editable=%s only ' % editable_req + \ + ', '.join([backend.name + '+URL' for backend in vcs.backends]) + \ + ' is currently supported' + raise InstallationError(error_message) + + package_name = Link(url).egg_fragment + if not package_name: + raise InstallationError( + "Could not detect requirement name for '%s', please specify one " + "with #egg=your_package_name" % editable_req + ) + return _strip_postfix(package_name), url, None + + +def deduce_helpful_msg(req): + """Returns helpful msg in case requirements file does not exist, + or cannot be parsed. + + :params req: Requirements file path + """ + msg = "" + if os.path.exists(req): + msg = " It does exist." + # Try to parse and check if it is a requirements file. + try: + with open(req, 'r') as fp: + # parse first line only + next(parse_requirements(fp.read())) + msg += " The argument you provided " + \ + "(%s) appears to be a" % (req) + \ + " requirements file. If that is the" + \ + " case, use the '-r' flag to install" + \ + " the packages specified within it." + except RequirementParseError: + logger.debug("Cannot parse '%s' as requirements \ + file" % (req), exc_info=1) + else: + msg += " File '%s' does not exist." % (req) + return msg diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/req_set.py b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_set.py new file mode 100644 index 000000000..78b7d329c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_set.py @@ -0,0 +1,164 @@ +from __future__ import absolute_import + +import logging +from collections import OrderedDict + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.logging import indent_log +from pip._internal.wheel import Wheel + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False): + """Create a RequirementSet. + + :param wheel_cache: The pip wheel cache, for passing to + InstallRequirement. + """ + + self.requirements = OrderedDict() + self.require_hashes = require_hashes + + # Mapping of alias: real_name + self.requirement_aliases = {} + self.unnamed_requirements = [] + self.successfully_downloaded = [] + self.reqs_to_cleanup = [] + + def __str__(self): + reqs = [req for req in self.requirements.values() + if not req.comes_from] + reqs.sort(key=lambda req: req.name.lower()) + return ' '.join([str(req.req) for req in reqs]) + + def __repr__(self): + reqs = [req for req in self.requirements.values()] + reqs.sort(key=lambda req: req.name.lower()) + reqs_str = ', '.join([str(req.req) for req in reqs]) + return ('<%s object; %d requirement(s): %s>' + % (self.__class__.__name__, len(reqs), reqs_str)) + + def add_requirement(self, install_req, parent_req_name=None, + extras_requested=None): + """Add install_req as a requirement to install. + + :param parent_req_name: The name of the requirement that needed this + added. The name is used because when multiple unnamed requirements + resolve to the same name, we could otherwise end up with dependency + links that point outside the Requirements set. parent_req must + already be added. Note that None implies that this is a user + supplied requirement, vs an inferred one. + :param extras_requested: an iterable of extras used to evaluate the + environment markers. + :return: Additional requirements to scan. That is either [] if + the requirement is not applicable, or [install_req] if the + requirement is applicable and has just been added. + """ + name = install_req.name + if not install_req.match_markers(extras_requested): + logger.info("Ignoring %s: markers '%s' don't match your " + "environment", install_req.name, + install_req.markers) + return [], None + + # This check has to come after we filter requirements with the + # environment markers. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if not wheel.supported(): + raise InstallationError( + "%s is not a supported wheel on this platform." % + wheel.filename + ) + + # This next bit is really a sanity check. + assert install_req.is_direct == (parent_req_name is None), ( + "a direct req shouldn't have a parent and also, " + "a non direct req should have a parent" + ) + + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req], None + else: + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + if (parent_req_name is None and existing_req and not + existing_req.constraint and + existing_req.extras == install_req.extras and not + existing_req.req.specifier == install_req.req.specifier): + raise InstallationError( + 'Double requirement given: %s (already in %s, name=%r)' + % (install_req, existing_req, name)) + if not existing_req: + # Add requirement + self.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + result = [install_req] + else: + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + result = [] + if not install_req.constraint and existing_req.constraint: + if (install_req.link and not (existing_req.link and + install_req.link.path == existing_req.link.path)): + self.reqs_to_cleanup.append(install_req) + raise InstallationError( + "Could not satisfy constraints for '%s': " + "installation from path or url cannot be " + "constrained to a version" % name, + ) + # If we're now installing a constraint, mark the existing + # object for real installation. + existing_req.constraint = False + existing_req.extras = tuple( + sorted(set(existing_req.extras).union( + set(install_req.extras)))) + logger.debug("Setting %s extras to: %s", + existing_req, existing_req.extras) + # And now we need to scan this. + result = [existing_req] + # Canonicalise to the already-added object for the backref + # check below. + install_req = existing_req + + # We return install_req here to allow for the caller to add it to + # the dependency information for the parent package. + return result, install_req + + def has_requirement(self, project_name): + name = project_name.lower() + if (name in self.requirements and + not self.requirements[name].constraint or + name in self.requirement_aliases and + not self.requirements[self.requirement_aliases[name]].constraint): + return True + return False + + @property + def has_requirements(self): + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + def get_requirement(self, project_name): + for name in project_name, project_name.lower(): + if name in self.requirements: + return self.requirements[name] + if name in self.requirement_aliases: + return self.requirements[self.requirement_aliases[name]] + raise KeyError("No project with the name %r" % project_name) + + def cleanup_files(self): + """Clean up files, remove builds.""" + logger.debug('Cleaning up...') + with indent_log(): + for req in self.reqs_to_cleanup: + req.remove_temporary_source() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py new file mode 100644 index 000000000..a47520fe1 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/req/req_uninstall.py @@ -0,0 +1,455 @@ +from __future__ import absolute_import + +import csv +import functools +import logging +import os +import sys +import sysconfig + +from pip._vendor import pkg_resources + +from pip._internal.compat import WINDOWS, cache_from_source, uses_pycache +from pip._internal.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + FakeFile, ask, dist_in_usersite, dist_is_local, egg_link_path, is_local, + normalize_path, renames, +) +from pip._internal.utils.temp_dir import TempDirectory + +logger = logging.getLogger(__name__) + + +def _script_names(dist, script_name, is_gui): + """Create the fully qualified name of the files created by + {console,gui}_scripts for the given ``dist``. + Returns the list of file names + """ + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + exe_name = os.path.join(bin_dir, script_name) + paths_to_remove = [exe_name] + if WINDOWS: + paths_to_remove.append(exe_name + '.exe') + paths_to_remove.append(exe_name + '.exe.manifest') + if is_gui: + paths_to_remove.append(exe_name + '-script.pyw') + else: + paths_to_remove.append(exe_name + '-script.py') + return paths_to_remove + + +def _unique(fn): + @functools.wraps(fn) + def unique(*args, **kw): + seen = set() + for item in fn(*args, **kw): + if item not in seen: + seen.add(item) + yield item + return unique + + +@_unique +def uninstallation_paths(dist): + """ + Yield all the uninstallation paths for dist based on RECORD-without-.pyc + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .pyc. + """ + r = csv.reader(FakeFile(dist.get_metadata_lines('RECORD'))) + for row in r: + path = os.path.join(dist.location, row[0]) + yield path + if path.endswith('.py'): + dn, fn = os.path.split(path) + base = fn[:-3] + path = os.path.join(dn, base + '.pyc') + yield path + + +def compact(paths): + """Compact a path set to contain the minimal number of paths + necessary to contain all paths in the set. If /a/path/ and + /a/path/to/a/file.txt are both in the set, leave only the + shorter path.""" + + sep = os.path.sep + short_paths = set() + for path in sorted(paths, key=len): + should_add = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_add: + short_paths.add(path) + return short_paths + + +def compress_for_output_listing(paths): + """Returns a tuple of 2 sets of which paths to display to user + + The first set contains paths that would be deleted. Files of a package + are not added and the top-level directory of the package has a '*' added + at the end - to signify that all it's contents are removed. + + The second set contains files that would have been skipped in the above + folders. + """ + + will_remove = list(paths) + will_skip = set() + + # Determine folders and files + folders = set() + files = set() + for path in will_remove: + if path.endswith(".pyc"): + continue + if path.endswith("__init__.py") or ".dist-info" in path: + folders.add(os.path.dirname(path)) + files.add(path) + + folders = compact(folders) + + # This walks the tree using os.walk to not miss extra folders + # that might get added. + for folder in folders: + for dirpath, _, dirfiles in os.walk(folder): + for fname in dirfiles: + if fname.endswith(".pyc"): + continue + + file_ = os.path.normcase(os.path.join(dirpath, fname)) + if os.path.isfile(file_) and file_ not in files: + # We are skipping this file. Add it to the set. + will_skip.add(file_) + + will_remove = files | { + os.path.join(folder, "*") for folder in folders + } + + return will_remove, will_skip + + +class UninstallPathSet(object): + """A set of file paths to be removed in the uninstallation of a + requirement.""" + def __init__(self, dist): + self.paths = set() + self._refuse = set() + self.pth = {} + self.dist = dist + self.save_dir = TempDirectory(kind="uninstall") + self._moved_paths = [] + + def _permitted(self, path): + """ + Return True if the given path is one we are permitted to + remove/modify, False otherwise. + + """ + return is_local(path) + + def add(self, path): + head, tail = os.path.split(path) + + # we normalize the head to resolve parent directory symlinks, but not + # the tail, since we only want to uninstall symlinks, not their targets + path = os.path.join(normalize_path(head), os.path.normcase(tail)) + + if not os.path.exists(path): + return + if self._permitted(path): + self.paths.add(path) + else: + self._refuse.add(path) + + # __pycache__ files can show up after 'installed-files.txt' is created, + # due to imports + if os.path.splitext(path)[1] == '.py' and uses_pycache: + self.add(cache_from_source(path)) + + def add_pth(self, pth_file, entry): + pth_file = normalize_path(pth_file) + if self._permitted(pth_file): + if pth_file not in self.pth: + self.pth[pth_file] = UninstallPthEntries(pth_file) + self.pth[pth_file].add(entry) + else: + self._refuse.add(pth_file) + + def _stash(self, path): + return os.path.join( + self.save_dir.path, os.path.splitdrive(path)[1].lstrip(os.path.sep) + ) + + def remove(self, auto_confirm=False, verbose=False): + """Remove paths in ``self.paths`` with confirmation (unless + ``auto_confirm`` is True).""" + + if not self.paths: + logger.info( + "Can't uninstall '%s'. No files were found to uninstall.", + self.dist.project_name, + ) + return + + dist_name_version = ( + self.dist.project_name + "-" + self.dist.version + ) + logger.info('Uninstalling %s:', dist_name_version) + + with indent_log(): + if auto_confirm or self._allowed_to_proceed(verbose): + self.save_dir.create() + + for path in sorted(compact(self.paths)): + new_path = self._stash(path) + logger.debug('Removing file or directory %s', path) + self._moved_paths.append(path) + renames(path, new_path) + for pth in self.pth.values(): + pth.remove() + + logger.info('Successfully uninstalled %s', dist_name_version) + + def _allowed_to_proceed(self, verbose): + """Display which files would be deleted and prompt for confirmation + """ + + def _display(msg, paths): + if not paths: + return + + logger.info(msg) + with indent_log(): + for path in sorted(compact(paths)): + logger.info(path) + + if not verbose: + will_remove, will_skip = compress_for_output_listing(self.paths) + else: + # In verbose mode, display all the files that are going to be + # deleted. + will_remove = list(self.paths) + will_skip = set() + + _display('Would remove:', will_remove) + _display('Would not remove (might be manually added):', will_skip) + _display('Would not remove (outside of prefix):', self._refuse) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + """Rollback the changes previously made by remove().""" + if self.save_dir.path is None: + logger.error( + "Can't roll back %s; was not uninstalled", + self.dist.project_name, + ) + return False + logger.info('Rolling back uninstall of %s', self.dist.project_name) + for path in self._moved_paths: + tmp_path = self._stash(path) + logger.debug('Replacing %s', path) + renames(tmp_path, path) + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + self.save_dir.cleanup() + self._moved_paths = [] + + @classmethod + def from_dist(cls, dist): + dist_path = normalize_path(dist.location) + if not dist_is_local(dist): + logger.info( + "Not uninstalling %s at %s, outside environment %s", + dist.key, + dist_path, + sys.prefix, + ) + return cls(dist) + + if dist_path in {p for p in {sysconfig.get_path("stdlib"), + sysconfig.get_path("platstdlib")} + if p}: + logger.info( + "Not uninstalling %s at %s, as it is in the standard library.", + dist.key, + dist_path, + ) + return cls(dist) + + paths_to_remove = cls(dist) + develop_egg_link = egg_link_path(dist) + develop_egg_link_egg_info = '{}.egg-info'.format( + pkg_resources.to_filename(dist.project_name)) + egg_info_exists = dist.egg_info and os.path.exists(dist.egg_info) + # Special case for distutils installed package + distutils_egg_info = getattr(dist._provider, 'path', None) + + # Uninstall cases order do matter as in the case of 2 installs of the + # same package, pip needs to uninstall the currently detected version + if (egg_info_exists and dist.egg_info.endswith('.egg-info') and + not dist.egg_info.endswith(develop_egg_link_egg_info)): + # if dist.egg_info.endswith(develop_egg_link_egg_info), we + # are in fact in the develop_egg_link case + paths_to_remove.add(dist.egg_info) + if dist.has_metadata('installed-files.txt'): + for installed_file in dist.get_metadata( + 'installed-files.txt').splitlines(): + path = os.path.normpath( + os.path.join(dist.egg_info, installed_file) + ) + paths_to_remove.add(path) + # FIXME: need a test for this elif block + # occurs with --single-version-externally-managed/--record outside + # of pip + elif dist.has_metadata('top_level.txt'): + if dist.has_metadata('namespace_packages.txt'): + namespaces = dist.get_metadata('namespace_packages.txt') + else: + namespaces = [] + for top_level_pkg in [ + p for p + in dist.get_metadata('top_level.txt').splitlines() + if p and p not in namespaces]: + path = os.path.join(dist.location, top_level_pkg) + paths_to_remove.add(path) + paths_to_remove.add(path + '.py') + paths_to_remove.add(path + '.pyc') + paths_to_remove.add(path + '.pyo') + + elif distutils_egg_info: + raise UninstallationError( + "Cannot uninstall {!r}. It is a distutils installed project " + "and thus we cannot accurately determine which files belong " + "to it which would lead to only a partial uninstall.".format( + dist.project_name, + ) + ) + + elif dist.location.endswith('.egg'): + # package installed by easy_install + # We cannot match on dist.egg_name because it can slightly vary + # i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg + paths_to_remove.add(dist.location) + easy_install_egg = os.path.split(dist.location)[1] + easy_install_pth = os.path.join(os.path.dirname(dist.location), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, './' + easy_install_egg) + + elif egg_info_exists and dist.egg_info.endswith('.dist-info'): + for path in uninstallation_paths(dist): + paths_to_remove.add(path) + + elif develop_egg_link: + # develop egg + with open(develop_egg_link, 'r') as fh: + link_pointer = os.path.normcase(fh.readline().strip()) + assert (link_pointer == dist.location), ( + 'Egg-link %s does not match installed location of %s ' + '(at %s)' % (link_pointer, dist.project_name, dist.location) + ) + paths_to_remove.add(develop_egg_link) + easy_install_pth = os.path.join(os.path.dirname(develop_egg_link), + 'easy-install.pth') + paths_to_remove.add_pth(easy_install_pth, dist.location) + + else: + logger.debug( + 'Not sure how to uninstall: %s - Check: %s', + dist, dist.location, + ) + + # find distutils scripts= scripts + if dist.has_metadata('scripts') and dist.metadata_isdir('scripts'): + for script in dist.metadata_listdir('scripts'): + if dist_in_usersite(dist): + bin_dir = bin_user + else: + bin_dir = bin_py + paths_to_remove.add(os.path.join(bin_dir, script)) + if WINDOWS: + paths_to_remove.add(os.path.join(bin_dir, script) + '.bat') + + # find console_scripts + _scripts_to_remove = [] + console_scripts = dist.get_entry_map(group='console_scripts') + for name in console_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, False)) + # find gui_scripts + gui_scripts = dist.get_entry_map(group='gui_scripts') + for name in gui_scripts.keys(): + _scripts_to_remove.extend(_script_names(dist, name, True)) + + for s in _scripts_to_remove: + paths_to_remove.add(s) + + return paths_to_remove + + +class UninstallPthEntries(object): + def __init__(self, pth_file): + if not os.path.isfile(pth_file): + raise UninstallationError( + "Cannot remove entries from nonexistent file %s" % pth_file + ) + self.file = pth_file + self.entries = set() + self._saved_lines = None + + def add(self, entry): + entry = os.path.normcase(entry) + # On Windows, os.path.normcase converts the entry to use + # backslashes. This is correct for entries that describe absolute + # paths outside of site-packages, but all the others use forward + # slashes. + if WINDOWS and not os.path.splitdrive(entry)[0]: + entry = entry.replace('\\', '/') + self.entries.add(entry) + + def remove(self): + logger.debug('Removing pth entries from %s:', self.file) + with open(self.file, 'rb') as fh: + # windows uses '\r\n' with py3k, but uses '\n' with py2.x + lines = fh.readlines() + self._saved_lines = lines + if any(b'\r\n' in line for line in lines): + endline = '\r\n' + else: + endline = '\n' + # handle missing trailing newline + if lines and not lines[-1].endswith(endline.encode("utf-8")): + lines[-1] = lines[-1] + endline.encode("utf-8") + for entry in self.entries: + try: + logger.debug('Removing entry: %s', entry) + lines.remove((entry + endline).encode("utf-8")) + except ValueError: + pass + with open(self.file, 'wb') as fh: + fh.writelines(lines) + + def rollback(self): + if self._saved_lines is None: + logger.error( + 'Cannot roll back changes to %s, none were made', self.file + ) + return False + logger.debug('Rolling %s back to previous state', self.file) + with open(self.file, 'wb') as fh: + fh.writelines(self._saved_lines) + return True diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/resolve.py b/myenv/lib/python3.7/site-packages/pip/_internal/resolve.py new file mode 100644 index 000000000..189827e7d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/resolve.py @@ -0,0 +1,354 @@ +"""Dependency Resolution + +The dependency resolution in pip is performed as follows: + +for top-level requirements: + a. only one spec allowed per project, regardless of conflicts or not. + otherwise a "double requirement" exception is raised + b. they override sub-dependency requirements. +for sub-dependencies + a. "first found, wins" (where the order is breadth first) +""" + +import logging +from collections import defaultdict +from itertools import chain + +from pip._internal.exceptions import ( + BestVersionAlreadyInstalled, DistributionNotFound, HashError, HashErrors, + UnsupportedPythonVersion, +) + +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import dist_in_usersite, ensure_dir +from pip._internal.utils.packaging import check_dist_requires_python + +logger = logging.getLogger(__name__) + + +class Resolver(object): + """Resolves which packages need to be installed/uninstalled to perform \ + the requested operation without breaking the requirements of any package. + """ + + _allowed_strategies = {"eager", "only-if-needed", "to-satisfy-only"} + + def __init__(self, preparer, session, finder, wheel_cache, use_user_site, + ignore_dependencies, ignore_installed, ignore_requires_python, + force_reinstall, isolated, upgrade_strategy): + super(Resolver, self).__init__() + assert upgrade_strategy in self._allowed_strategies + + self.preparer = preparer + self.finder = finder + self.session = session + + # NOTE: This would eventually be replaced with a cache that can give + # information about both sdist and wheels transparently. + self.wheel_cache = wheel_cache + + self.require_hashes = None # This is set in resolve + + self.upgrade_strategy = upgrade_strategy + self.force_reinstall = force_reinstall + self.isolated = isolated + self.ignore_dependencies = ignore_dependencies + self.ignore_installed = ignore_installed + self.ignore_requires_python = ignore_requires_python + self.use_user_site = use_user_site + + self._discovered_dependencies = defaultdict(list) + + def resolve(self, requirement_set): + """Resolve what operations need to be done + + As a side-effect of this method, the packages (and their dependencies) + are downloaded, unpacked and prepared for installation. This + preparation is done by ``pip.operations.prepare``. + + Once PyPI has static dependency metadata available, it would be + possible to move the preparation to become a step separated from + dependency resolution. + """ + # make the wheelhouse + if self.preparer.wheel_download_dir: + ensure_dir(self.preparer.wheel_download_dir) + + # If any top-level requirement has a hash specified, enter + # hash-checking mode, which requires hashes from all. + root_reqs = ( + requirement_set.unnamed_requirements + + list(requirement_set.requirements.values()) + ) + self.require_hashes = ( + requirement_set.require_hashes or + any(req.has_hash_options for req in root_reqs) + ) + + # Display where finder is looking for packages + locations = self.finder.get_formatted_locations() + if locations: + logger.info(locations) + + # Actually prepare the files, and collect any exceptions. Most hash + # exceptions cannot be checked ahead of time, because + # req.populate_link() needs to be called before we can make decisions + # based on link type. + discovered_reqs = [] + hash_errors = HashErrors() + for req in chain(root_reqs, discovered_reqs): + try: + discovered_reqs.extend( + self._resolve_one(requirement_set, req) + ) + except HashError as exc: + exc.req = req + hash_errors.append(exc) + + if hash_errors: + raise hash_errors + + def _is_upgrade_allowed(self, req): + if self.upgrade_strategy == "to-satisfy-only": + return False + elif self.upgrade_strategy == "eager": + return True + else: + assert self.upgrade_strategy == "only-if-needed" + return req.is_direct + + def _set_req_to_reinstall(self, req): + """ + Set a requirement to be installed. + """ + # Don't uninstall the conflict if doing a user install and the + # conflict is not a user install. + if not self.use_user_site or dist_in_usersite(req.satisfied_by): + req.conflicts_with = req.satisfied_by + req.satisfied_by = None + + # XXX: Stop passing requirement_set for options + def _check_skip_installed(self, req_to_install): + """Check if req_to_install should be skipped. + + This will check if the req is installed, and whether we should upgrade + or reinstall it, taking into account all the relevant user options. + + After calling this req_to_install will only have satisfied_by set to + None if the req_to_install is to be upgraded/reinstalled etc. Any + other value will be a dist recording the current thing installed that + satisfies the requirement. + + Note that for vcs urls and the like we can't assess skipping in this + routine - we simply identify that we need to pull the thing down, + then later on it is pulled down and introspected to assess upgrade/ + reinstalls etc. + + :return: A text reason for why it was skipped, or None. + """ + if self.ignore_installed: + return None + + req_to_install.check_if_exists(self.use_user_site) + if not req_to_install.satisfied_by: + return None + + if self.force_reinstall: + self._set_req_to_reinstall(req_to_install) + return None + + if not self._is_upgrade_allowed(req_to_install): + if self.upgrade_strategy == "only-if-needed": + return 'not upgraded as not directly required' + return 'already satisfied' + + # Check for the possibility of an upgrade. For link-based + # requirements we have to pull the tree down and inspect to assess + # the version #, so it's handled way down. + if not req_to_install.link: + try: + self.finder.find_requirement(req_to_install, upgrade=True) + except BestVersionAlreadyInstalled: + # Then the best version is installed. + return 'already up-to-date' + except DistributionNotFound: + # No distribution found, so we squash the error. It will + # be raised later when we re-try later to do the install. + # Why don't we just raise here? + pass + + self._set_req_to_reinstall(req_to_install) + return None + + def _get_abstract_dist_for(self, req): + """Takes a InstallRequirement and returns a single AbstractDist \ + representing a prepared variant of the same. + """ + assert self.require_hashes is not None, ( + "require_hashes should have been set in Resolver.resolve()" + ) + + if req.editable: + return self.preparer.prepare_editable_requirement( + req, self.require_hashes, self.use_user_site, self.finder, + ) + + # satisfied_by is only evaluated by calling _check_skip_installed, + # so it must be None here. + assert req.satisfied_by is None + skip_reason = self._check_skip_installed(req) + + if req.satisfied_by: + return self.preparer.prepare_installed_requirement( + req, self.require_hashes, skip_reason + ) + + upgrade_allowed = self._is_upgrade_allowed(req) + abstract_dist = self.preparer.prepare_linked_requirement( + req, self.session, self.finder, upgrade_allowed, + self.require_hashes + ) + + # NOTE + # The following portion is for determining if a certain package is + # going to be re-installed/upgraded or not and reporting to the user. + # This should probably get cleaned up in a future refactor. + + # req.req is only avail after unpack for URL + # pkgs repeat check_if_exists to uninstall-on-upgrade + # (#14) + if not self.ignore_installed: + req.check_if_exists(self.use_user_site) + + if req.satisfied_by: + should_modify = ( + self.upgrade_strategy != "to-satisfy-only" or + self.force_reinstall or + self.ignore_installed or + req.link.scheme == 'file' + ) + if should_modify: + self._set_req_to_reinstall(req) + else: + logger.info( + 'Requirement already satisfied (use --upgrade to upgrade):' + ' %s', req, + ) + + return abstract_dist + + def _resolve_one(self, requirement_set, req_to_install): + """Prepare a single requirements file. + + :return: A list of additional InstallRequirements to also install. + """ + # Tell user what we are doing for this requirement: + # obtain (editable), skipping, processing (local url), collecting + # (remote url or package name) + if req_to_install.constraint or req_to_install.prepared: + return [] + + req_to_install.prepared = True + + # register tmp src for cleanup in case something goes wrong + requirement_set.reqs_to_cleanup.append(req_to_install) + + abstract_dist = self._get_abstract_dist_for(req_to_install) + + # Parse and return dependencies + dist = abstract_dist.dist(self.finder) + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] + + def add_req(subreq, extras_requested): + sub_install_req = InstallRequirement.from_req( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + ) + parent_req_name = req_to_install.name + to_scan_again, add_to_parent = requirement_set.add_requirement( + sub_install_req, + parent_req_name=parent_req_name, + extras_requested=extras_requested, + ) + if parent_req_name and add_to_parent: + self._discovered_dependencies[parent_req_name].append( + add_to_parent + ) + more_reqs.extend(to_scan_again) + + with indent_log(): + # We add req_to_install before its dependencies, so that we + # can refer to it when adding dependencies. + if not requirement_set.has_requirement(req_to_install.name): + # 'unnamed' requirements will get added here + req_to_install.is_direct = True + requirement_set.add_requirement( + req_to_install, parent_req_name=None, + ) + + if not self.ignore_dependencies: + if req_to_install.extras: + logger.debug( + "Installing extra requirements: %r", + ','.join(req_to_install.extras), + ) + missing_requested = sorted( + set(req_to_install.extras) - set(dist.extras) + ) + for missing in missing_requested: + logger.warning( + '%s does not provide the extra \'%s\'', + dist, missing + ) + + available_requested = sorted( + set(dist.extras) & set(req_to_install.extras) + ) + for subreq in dist.requires(available_requested): + add_req(subreq, extras_requested=available_requested) + + if not req_to_install.editable and not req_to_install.satisfied_by: + # XXX: --no-install leads this to report 'Successfully + # downloaded' for only non-editable reqs, even though we took + # action on them. + requirement_set.successfully_downloaded.append(req_to_install) + + return more_reqs + + def get_installation_order(self, req_set): + """Create the installation order. + + The installation order is topological - requirements are installed + before the requiring thing. We break cycles at an arbitrary point, + and make no other guarantees. + """ + # The current implementation, which we may change at any point + # installs the user specified things in the order given, except when + # dependencies must come earlier to achieve topological order. + order = [] + ordered_reqs = set() + + def schedule(req): + if req.satisfied_by or req in ordered_reqs: + return + if req.constraint: + return + ordered_reqs.add(req) + for dep in self._discovered_dependencies[req.name]: + schedule(dep) + order.append(req) + + for install_req in req_set.requirements.values(): + schedule(install_req) + return order diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/status_codes.py b/myenv/lib/python3.7/site-packages/pip/_internal/status_codes.py new file mode 100644 index 000000000..2b56931a8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/status_codes.py @@ -0,0 +1,8 @@ +from __future__ import absolute_import + +SUCCESS = 0 +ERROR = 1 +UNKNOWN_ERROR = 2 +VIRTUALENV_NOT_FOUND = 3 +PREVIOUS_BUILD_DIR_ERROR = 4 +NO_MATCHES_FOUND = 23 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cee2fb6e2603ee3d50d8a73c68484aa1680b96ee GIT binary patch literal 200 zcmZ?b<>g`kf~*j+SP=afM8E(ekl_Ht#VkM~g&~+hlhJP_LlHTZl OX-=vg$SK7@%m4r}Sv3Fv literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3b372ea609ce9320a875369cbd43354c361c1b7 GIT binary patch literal 7915 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dc5bc0025679d814649741ebd145cb4bb79195c GIT binary patch literal 1765 zcmbVM&5s*36t`z4Gm}ZONmK2D3K9{b5;-(s3oEv$LS42?Sph?|EL0r{S(DgFC(PH{ zPD)nO)9#f!$M(p-2+z(F!aWt+L#pn^DHgzr$ zby)qv3_QRttpl#J2H+-Ok2U}|m7X4s}(x<%WUIOxz0y>W?x z8`S(3^>3d0-a#+P=ptr4`81ThD9K}%uvChk%(6I2XE63y8jj%)7K&BxS;$kE7QJws zEo6_foU=(NqbwBz?|1MP^|5M)W0A!R$p{>nap}Wc_v_388 z^B`SK^saTopge#snjjboFhtLw7;bB*?NO9Jd~NV?brrvFDwmKnOc)``BcyT&^d=!^ zi!iQMenlLzREa<2Fz3-Slx(;R`EZ)WlyNak_;5TYWMAy1A1~=g6Ou3Qejum&vpJ7< zr+fGA4Nr%8l;4R`A;UPn!zX+DAIh^(PnMlTsboA2d!z z5?|YSXT(wpkq39VtsQZ+aJ6{lSEcE)D@!j3mfxeDq zowzqPENlEfE#LibmRn%ytqsc>Pjsww(~;64JA^KN0#R5L{aEMkNgybUQlbJCxG)N{ zu!`CRkTD%eTwrNj7A+3|>{sV53gNdHdnf=;Y||;Pm(#|C8Qr(RbB0S<{Y)r`fYBpu9+k#ds2j zLX@?noH(1!phi@E#^hI^GhP;ga@JdFFq3gO(n**Q;fyI4*vn=aUnzGQ#X$9hDI1v2 z(o9);Mp+ucTzQ^qz(}q(Z&aQxIw0J}^=|7xzX<|i7d``bP0#dduH)gR(KHOq--fln zRE8!3zo;+proqs2QQ)ZeP0d@}}el|u%(seiDqfTe-+xO(rZ zRNL8j&L*--`B^ C?w?=) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b9d5b2988eb20ae81f5beac1c481ee3ee0eb427 GIT binary patch literal 1136 zcmZux&u`N(6tB@z<@tNhQ8uQgTm=|eH%ov~{9^et? z_5ev^fInk`zZ%!k&>R>epm}WXqL1$(3)&w+jF?#z-hX;#4oqT^TxJvd(BO5M8`=XC zYF%i<{0I>%t48vp@oAH~^<4y2P3a5^#2MlAyL5-e5z5Xi7e0O4?9%Yi3%pieQsD{7 zp+~QsaBywBe&xx;3lq+1C|TblRD$BkF7;?U9*66Cu<8M0tpMskI!nTU(WMTRDW`1; z?~+OK0^|u=_E>aCy(FdaLfK1V?@eEJleoI|I~%2YZh+*OdY%dGysdJ92&1T8E-4FW zZ7WyEfJ<>2$*wXPjg?I(FoH`IDT|~k*0wfZKYOwDy!p1KY(WDac9q@XNiP-39&=Q) z|0AhP(HH6pga~a1JtimY%a*c8AOmH#k|X6z+{$86On)Li4{ZM&`zeo30!jUofcx!) z5z2*s#QoMmv$-Z#;|C|?Uf4`eD$DRSb`CgOX|JxY`#XLbrHfGvZ85gU!_~E_JPtCa z-pweMl*a+{dop6epB%oF_Ej&N_u+A5i@`4=LlJ9q#9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1c1d4c6adaa015872fb3c2acf03529306edac909 GIT binary patch literal 661 zcmYjO&2G~`5Z+lkv5DM}L&Sk6Acw~MRisjd5C|?v?IDqZB7tSRo5sodr?Z>TNX~_F z;4zY8U&&WayaFd?T|kUAKRY{~@0;1zM@Jn-vYb5lcW30q-u6PfI7I8CMsjIh}Nk{z@|wEh54j!NcDFzh8YlW z!*y5iG43z4u;4cIhAJbk%QSzQ1RCa>CkCZc3<@`FZUTWl3x&Xz9KibZT!A>)05q zd7*39PE&hIUZ>hrUL{KZB*Poi@3^s$+bE|;jD%uh~F z!%0}C<#C#86DxI$$;s%Mxr%MF(J0N0Bn~QEn^fs=o+_!g+Q@8JZtGsMkjd)qjfyY1 zM31QGhh&)30hhbbfq(}NhXA_J2A}sh_ULxd!WOyOEA+70NuL0R|Gasv_#B-P9kfJu&xzV^$pst_2&A<^c&EEBg>Gc2=rGTY8J!BL zvZ|y?%d8x((@N5QRSKF7Xjy66DDcjgZuU(lRV>TmJ0@UyRtshPr$6oQo0VbNBtxMS zi?IgpGjFs6S9PjQkm4ID}}QAO_Tw=(rL+r@gM>daKS1rV$a;KWyOS2 zNtqTx)hQD)07A^&EBFMK|Api|@cmo%YMD(_Eqc>b_6AkX;ZnUq_KwF%vZJ=kuc!Pg zmekX&M|!X`9LxNR!S?QM@32>A^@fWe&o?C7-uY6$Nv+fMBrCO$Wt#UIo#m?M2-~b@ zaNoBtY9j%XtZr%r2Gor(!4Y2a0x!e?iEu>Zeeg3YuWkNScQV@?o6FpyOLFG5o_eUs zg~v&YR+08E2}tZ6Al+%bi-7x=_#C%*LaMzhPse%4qyzE>{nLkQ-@SNTq~l6H`SsDp z?(5Iv-!`2qEB|+$e*5hAS}-m6tu#2v^oVXzRzYT#qST5ysLjIeUZ=xKe?vc0d#2;u zV5~px8X|@DX*M$9Nh(Vq1hT_^nWdLask1`7n!Ak$w3^OPR!trIatW?)mZW&oWK!^C z4!a1jS1%-%$BrmRsu`E zqu$PFWb37clAeU}fvqKtTc9552uP1fe=nY^=Wt?AegK=~hjy@M-45*CQ92cgr7zXl zaW3W|Zox`r69hq6A%rDAhHqvawqfWtz?(s#7E0R%1%=DK77eV00Av63&qFz*x}sb_ zh5|`~>XEo9WfW0p*TtSv-PF0D)!?eq6HUhvw+T_||i=x)E>(ve{ zD=ACW{H(mHCQVHTDOAR$o9)NMAW7jKpsp>D7`wEG7jN-~P`5b?udC@f?48pTIGTw3 z6g=?UL`gDe;MEdIA}vwUN+@ly$yGbp>T>!xUfr&@4zX{9bZHYlE-K#S;)!M4<;nsH OL6Fc3-w&6=_x=O+pOwu3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b6c3d86d2e9a80ce70ee4a3da73ef5f7fa6de9e GIT binary patch literal 3335 zcmbVOTW=f36`t8$E|(N3$*QW>Nl{E16b{pftevQ}4Wo!_yRnT%X=T+;7d6(aogum6 zUZ|O&E(G;r3CL5?zaTyKwdfD%@7UKo^)K|P=gg9nb$lnS_?6W4U9;vS)ztI7 zwC2~+x?eZnD#=3H@Ebt8ev`Yr%DtZLFMdIIjn_{JuZyJ<+h2zN3%mjU8)6y$-{95@ z(rW%2?k6o;EQLENPexhIS@yxs3Wx>CL^JMrSUXW{V!vc zhC1pO3)6op&U(d-XPMGrl7u?WvnNvK60TX0BIH5TA7ukoxT+uC+4z-te|q;b^WM09 zCqj{Cj}64xe({06tVb4q=OSGaph{0b@#Z?{z2ua@fi9&hqR_+H~n zd>P(#qxeeUqOd}Z!-woZhQpzdO!q_0c1Cf+6-!5nj)#e0eZ$6JCC?(k!i=-1FQS10 zc9F8M7sjAyoxwB6@`G%>m*=*@=hVABHkar()b^4;hamkfqDQq?dzx`YFr8R46vg<4l9)na)`fE3HbVBtH;* zej1+G7l&|2PXNpO`zAQY3&35--LeWtiKJV&rSg9#@&*X|pS&}a@qVa9XFrskZk})< zRVS65o!ua~t2VM<@AJ>1V7Pzhm%4kmw=0v|-Hm(qI@_ILJX}XJ!3FCw+PM3v-V5=g z83D*GWELi!k&YA9DKBjgk3b?=i**pZj|MYVtc;gR$F*l`bL&=t2}90U_n$z-hd`y_|q<@6MK!E(6{u@ z!0|PVSLE=c37*1^ox}HZbz+$_7mq8G%9%HD&M75(9L{?QoFD7jbp5A)v5xIycjBJa z&y6G#`z9H<@)U8nclrvxoh?i(+-;C)kKaB*d@+Ng8Tv|;0R+L(h)~VCGEW%>W4Hq- z1w52d1=QTBJk(*k#31^8D~y$3XuVm)vbf7KIFp(9y~H~H;h!>tW`jEeu>0)iYO~dl zn7ZU5OhpxiOX8iv&cs1ce~C%K1bR{1J{p#!^pL%R?Cxj?0ttyBUDN=CB?b#OkSJKI zDwhn~G&?xGTr1#%I|2lFQ85dJgI@|8Rt+f2X$5z#nz#(65jo8=KZ6zZ9!#X_&}C}T z75J@Lb-GAbETla;ejjZjRQtO9b95p4P;`T?WgtpiP3VdB7P1mVE!}Kc(uEac9-vVl z`4gNld@dxFD9=3@C8X)NITfI^#FZ=2+~!I&IY5PI3Rlu|OcQh*em7J?){PUfp2Pz{ z$Ih;Z^#6qfP~!u*S=L~hs#G|5@;f>eD_5=H)KFw}jC-v1s!k?%3E zDYP`94f-9TB40$22OfMQAdIM(b7o1#c;%BVp+_=f2YmrGLb7M3GC=7#x?Ca<#{fE% zekae95;U{~%~iY<3qb&3IuX;f>xGQ-Wq^7SHO6e4)er#Pju1z%d%-v(J1 z1qy=S&#$7FvTnJCXkWktjjbUA5e&5o6Xpj^Z;~_X+*ImW z7Pcj}0`fLaH(~m|RQwuvN+IZY^&KH*wdogl*e5uxz>+kV5qVR86#li7w<5dHmeQDjZ9iMhANsbwzt08{K7cy$&11*Ylexh(!tln eX5l?3gZ?*|5KVwKEYDiCR_%u4RO_`j5yo? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/logging.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e586a588def98300ff182f8bf06ad6a8c555febd GIT binary patch literal 4032 zcmaJ^-EZ5-5#J>#ilSxNaU3VP%OylVu2p)m)8v9AXc{;lPR@l-E^OnR6B-b-mX@hd zq_U)(*pQ1B4$!{#rO)1@os zHfoIhM1#@e;A0Ujo8^oNCV0%cyvaFz8?n(e^xJHj`fUy0rDh3ZGq$_sW?8SbVy9ba zRyfXmNO-DJr%i-i+!Tp4plKTWAN-5*(EykdLP7?-coTBusX{B*0gKqG%f!!?_S3mTwptaDl zd2~6mScebTeP%G9@4JHk07GrU5hKb2O?ibG9LCt+bv-;!yjGgz;rra{21(EkrT1

j zu?S_h(3J~Y9p8VD-AnH8if>zfZ}-maeEUJWBjew1-+TCQVPl~e^=?6K9>no2*}C`O zZvHl)N!|Pi2bW0@FZA;$&K7W%c9gW|dwa?)4nxQLiVRDjW_FDm+%;qs-(>FbW8v!= zT1J$d%K9GbAM*^snVl9!-wxgA2+T*@*{l5VHE2@KT~R^VJ@Q*DWxn9RuGj7vn? zS-CX7h?dQw3t5v3hVX)HK-3f@-%>Nnni=$Zk;*QFhq9&lVT*}oqv^AMgO41@IWh)p zz>kdsa5^%DAsS(I_A&WAwT8^#(-d4+W)(DB%$XS44i3zz}ATfq{c%b?i+6l zXwf(-6!WmyOSi{(8X;xOZEFu0lU}PYCG0SSm^OzOhr3~10EpzOlRzM)$Pw#k*%#>A zY`|X69Ka|!J7lv^>N5M6@z%o8`A6>63xmQd#{6w%#ZeNTbH+#aQ5Dv{Ys61Z5Xnl+{V2M7dcnj&eFgRyUQE zh4HqsW!OrkP?cgOV(8of04k@@QJT@la11>j2Ll<1Kt=G*rqTU_ZR=q8;2iJ)r5m$x zCUcdr<{~X7hXHShoqqyj1C|>dvtzZ5%j{TZsfHwW^^&}T7kMkoC2dxv^?WZ5Rb_2y zeQCpgva&+CBT9OB**arpg&I1#%I{>*>xJSmb`GOz|C+Ct`9wPL-*BPcTQ}sdutENs zI&?He7(XtJ6qj(KXc_*|wrO?JDQSLa0eA~dd zG90@!ZX3;s#A>tVgm833@@7?7qJ%h~6t*biUDMgTqUN5_H4*KHVm+5((ESeK7>Baa zBEQf>Z#u{`wBdzu67(FQK489?Tk>XJqIP5tSf_jpm-uCY;HvXR-I15DSxugiK(LCE zC z8xG&U@o7cpN2eI$Yy?WJ@GJ1i;YBEg_$Qm?P`G0v^I3;R_6zz>NM*BAI^elIpiFMa z#Q{GmA2Yc~Sv7Y$l_Qt(p(wpE)VYN%8oK5*}V;AZ7i*QudFAH_2v46Hi5iJ zYPwOTZ=|FZYQ5#}Fsrep$~ysVmXZQY8EK}lgZr6ypy7`G-_@KlUy zG*+{nv>%JY`afWGHiM2CF1O5C?pQN;PowSs@-yZ;y?=aBP^679^Av-#7sY@bnJ~`d z_g}+s)^qmy+Fy(V^S~PLPHAAiDaq>tYhWDW;`lRrdwmlaD{y3M9Le8;VUchs%PRZX z>dNZcI+7;k`XoirYmj_NM6;WnyFnf4Uf{j7w6?aoro&oUNaUe1*Os26VtcaISZ=&j_K!;|E32FG z0qr2rO48@^sq{CXYEaTi9g`e0XIh3^b}mVxwa~^7p?DGP|K0UhpN4e5uccHw;KGmM za2WpMV4y-|>`4y;Dpxwjkx8CAM)k{CUh3GL@{uzrQZM4YB58}fi%wa+Am34C)TDG% zsOnabg(QeZg_)e4BIRW2;wMg`N`Bf4QQ;L%Js0ZVLBt-~Fp16}%s;Esyk>+8?Yzf` z$thHvBoadIJK|2p#N9>XPaF9fD5C^@QcwvCi56)W=(Sbt`{4ZwAr#u5E~m>hM}y#PaTy)SR?0e_!wPKm(L11NpK{Eo--1u1V!AT_UZ69Lz#wr zh}koODVWX)Mn$4EIRt4W`_eht#fk<(@?4Z?xc})a(-XrlgYZ{kOE_{2$CNY!3{dr1 z_oxop?&tJh$Cspya)*CL;%KV?)%2)1AAzet<1A|V`EeaTPo-Lr>q|#nIZM(d{(Lve zS{lr%lJ6jY3WSN8Sl0i(mZVH&b4v8P-97&lRrA>m6Oqc|CaWyHZ-qVjpMp$8^m8wsG{yLcolbK%{2J5S>vvW%x7A>T1E1oa_pIJXUqQu`j3}k literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/misc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f355ca0d0299a158c110a8272a360d4896602498 GIT binary patch literal 22090 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 Bd1e3r literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18b6d9097a662de1a558c5b241019c05bcdeadb7 GIT binary patch literal 2812 zcmai0U2oeq6eT5DmK{57x2_F_VdDx6t+CWzw-!r_qWfsE4MXb!tAPOq20<3-M2;+} zB$cL)^V9;x9`+xc$NeR}?rDEvPrH}0ojP?;86qW-y!Z0la}WJvvsou_je1x9_!FM~ z!I#D5z{B@&t1dL0a2k^_?Nf@+R&4bx)7yQ=^p$=EdOLQ<)qa%{Va+^IJE8sh&xAX? z@|y69*m!048{B$ETJFDKleB1YAsDDM&b9EPah6Kmg>SALYbivCQx+EngO~ah8bSJ$ z69|CzZGQ0$8B*h-2BEmT`kFu}9~@;cvuzRDZC3BAWR`32}}Z-_(sbqM5A(d>zF z_9&7f)Tw+KT(=4NMZ}qqEQ|xCnBEICOJ5|41qp|5B7ny{V*%5!FqMIP$@pSicAV65*_F$O;|c)fw6bK zrysPI(E#vM_smT6o&|bu`GOxFr(tPOr?4HtLMZ|b@vJe6;dIkPEZ1`p3w`>E=6>H3 zU_}~J%bhc|m*z3Yy_QQjd$A`HCJrMVCA&*|XyAq!c?Xg?BCQg`C*UOIZ*8lL`bKNT z)I+ls#C6?fFk=eRDin*fGQhAXF@e7WQm{a>y>wuboo8oUJ~D_PF~s>!#lqdvECcWj zvc^1Mn4C|F?Q`~nteWR8O^hAjijaVBnb$eBVB6a)8kPw%(X!Jpz(!BzVw(ZM=E=c{ z#@d3LZK-!cRRgK7G*c1MCl-oZ_4n_&NupbfFI2bfk6(EAnxQkid6?O@d34V z_EJ_Mj4$9;4QL46v@Y6??Vo5L-zHd-zQMmzMWpmkV&L^Sf`2H<;Qx-I2 zO=#tmmC$gi2@QQs$&8o`WA3Pt@RFwIc!jJO-unJ+SgmlIgnD#x^(-dySt|@%dPYzH z3L-bbKSlqBJK*0k94M;u`fWL8?}aT6!=iE!#JMOeJy?SU)&o%CG^llnDkrU=;lc`o zMsFSyr~5S!NIJ8)H3MFc$O%265Fvd=v@;^Jigrg;ZksXh1kSI&U>x`l6$5K3XVi@>pOt~EJw9+vt7aHixN*7*2V7C%Vvz633jj@FrK<2i!D3Uy9(o-{u_&tJeU2~l zx?RUriTS<{w?gI;yG|XbC#T}lEo*Xll{qE*R#Ifc8k3@Jc)*016kXF4l7STk36j^e zN!2TpC`<;Xt7T2T`%R3~15o>O6u)!_=Q|uXcz$a*bUA@Ljk-Af=VW zh}IW~ybME6;8sX1VsFtpoqTj=i}*(*&sui3D=RRmwIMG;SJZufobo(|!Y>-W|2z-k zQU;2u@AEVSJwQ>Cm$3N|n=Nb*T;sNA&LuMxaSW4}f&rmotxH7TXfnQ;TzFRP{>{{sPCf*b5M4U~8VJp$hhBP_TVPaGd$PJum5~^cQ*S+Cb!Q4UVg+seu=@% z-ptIwn*($B$L#2iIz#Y<59C;-ZX(+c9rx^#b!&=AC95e-gUqa>!48X}xay~2x}uU& z%OAurDW|$A+DOU!jySU z@?-jdBZLy14Ljq5T6LloLbF_v2NhI;zJ3fE85*96~-EKYp$iSWSXQu|(-3ew;TVChByjKDoa%w}&WOHpKJGZ5SROFXz|PU}&HYyh;`Y6gab&yaC% zh3JtO)K#H@?MI*~3maN^Ewc`+bW1J6vY9yAE^R>W=lP(_Ma=#2DEDFp?$A@D&7ww% z?X68S9jw52jn7RuFABnwrId3wCfmiu$6fjT^^4c_(_epi`dj_-)#c^$%V)bywxQ3L z&NJS7%#V>43lM+F%{jFx4e`9H);6`{YJpBwL-t)Ihp)0RjvT9#iB7neteH(%7X z@w%>WzWO}n-?MNBS56-O_08r;i_3%L?U}*5Nklx-#g~vy=3fl8^acqbnS6T~t}2YFF1{m~QSp*%{!6Z{+Sf I#BlfUKiLGm!vFvP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/utils/__pycache__/ui.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1441d27937d606ccb639930d8e8a26fe0d16515f GIT binary patch literal 11863 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 + Unix: ~/.cache/ (XDG default) + Windows: C:\Users\\AppData\Local\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go + in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the + non-roaming app data dir (the default returned by `user_data_dir`). Apps + typically put cache data somewhere *under* the given dir here. Some + examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + """ + if WINDOWS: + # Get the base path + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + + # When using Python 2, return paths as bytes on Windows like we do on + # other operating systems. See helper function docs for more details. + if PY2 and isinstance(path, text_type): + path = _win_path_to_bytes(path) + + # Add our app name and Cache directory to it + path = os.path.join(path, appname, "Cache") + elif sys.platform == "darwin": + # Get the base path + path = expanduser("~/Library/Caches") + + # Add our app name to it + path = os.path.join(path, appname) + else: + # Get the base path + path = os.getenv("XDG_CACHE_HOME", expanduser("~/.cache")) + + # Add our app name to it + path = os.path.join(path, appname) + + return path + + +def user_data_dir(appname, roaming=False): + r""" + Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: ~/Library/Application Support/ + if it exists, else ~/.config/ + Unix: ~/.local/share/ # or in + $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\ ... + ...Application Data\ + Win XP (roaming): C:\Documents and Settings\\Local ... + ...Settings\Application Data\ + Win 7 (not roaming): C:\\Users\\AppData\Local\ + Win 7 (roaming): C:\\Users\\AppData\Roaming\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if WINDOWS: + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.join(os.path.normpath(_get_win_folder(const)), appname) + elif sys.platform == "darwin": + path = os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) if os.path.isdir(os.path.join( + expanduser('~/Library/Application Support/'), + appname, + ) + ) else os.path.join( + expanduser('~/.config/'), + appname, + ) + else: + path = os.path.join( + os.getenv('XDG_DATA_HOME', expanduser("~/.local/share")), + appname, + ) + + return path + + +def user_config_dir(appname, roaming=True): + """Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "roaming" (boolean, default True) can be set False to not use the + Windows roaming appdata directory. That means that for users on a + Windows network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + macOS: same as user_data_dir + Unix: ~/.config/ + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/". + """ + if WINDOWS: + path = user_data_dir(appname, roaming=roaming) + elif sys.platform == "darwin": + path = user_data_dir(appname) + else: + path = os.getenv('XDG_CONFIG_HOME', expanduser("~/.config")) + path = os.path.join(path, appname) + + return path + + +# for the discussion regarding site_config_dirs locations +# see +def site_config_dirs(appname): + r"""Return a list of potential user-shared config dirs for this application. + + "appname" is the name of application. + + Typical user config directories are: + macOS: /Library/Application Support// + Unix: /etc or $XDG_CONFIG_DIRS[i]// for each value in + $XDG_CONFIG_DIRS + Win XP: C:\Documents and Settings\All Users\Application ... + ...Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory + on Vista.) + Win 7: Hidden, but writeable on Win 7: + C:\ProgramData\\ + """ + if WINDOWS: + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + pathlist = [os.path.join(path, appname)] + elif sys.platform == 'darwin': + pathlist = [os.path.join('/Library/Application Support', appname)] + else: + # try looking in $XDG_CONFIG_DIRS + xdg_config_dirs = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + if xdg_config_dirs: + pathlist = [ + os.path.join(expanduser(x), appname) + for x in xdg_config_dirs.split(os.pathsep) + ] + else: + pathlist = [] + + # always look in /etc directly as well + pathlist.append('/etc') + + return pathlist + + +# -- Windows support functions -- + +def _get_win_folder_from_registry(csidl_name): + """ + This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + directory, _type = _winreg.QueryValueEx(key, shell_folder_name) + return directory + + +def _get_win_folder_with_ctypes(csidl_name): + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + + +if WINDOWS: + try: + import ctypes + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +def _win_path_to_bytes(path): + """Encode Windows paths to bytes. Only used on Python 2. + + Motivation is to be consistent with other operating systems where paths + are also returned as bytes. This avoids problems mixing bytes and Unicode + elsewhere in the codebase. For more details and discussion see + . + + If encoding using ASCII and MBCS fails, return the original Unicode path. + """ + for encoding in ('ASCII', 'MBCS'): + try: + return path.encode(encoding) + except (UnicodeEncodeError, LookupError): + pass + return path diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py new file mode 100644 index 000000000..c0e3884c6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/deprecation.py @@ -0,0 +1,77 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any + + +class PipDeprecationWarning(Warning): + pass + + +class Pending(object): + pass + + +class RemovedInPip11Warning(PipDeprecationWarning): + pass + + +class RemovedInPip12Warning(PipDeprecationWarning, Pending): + pass + + +# Warnings <-> Logging Integration + + +_warnings_showwarning = None # type: Any + + +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _warnings_showwarning is not None: + _warnings_showwarning( + message, category, filename, lineno, file, line, + ) + else: + if issubclass(category, PipDeprecationWarning): + # We use a specially named logger which will handle all of the + # deprecation messages for pip. + logger = logging.getLogger("pip._internal.deprecations") + + # This is purposely using the % formatter here instead of letting + # the logging module handle the interpolation. This is because we + # want it to appear as if someone typed this entire message out. + log_message = "DEPRECATION: %s" % message + + # PipDeprecationWarnings that are Pending still have at least 2 + # versions to go until they are removed so they can just be + # warnings. Otherwise, they will be removed in the very next + # version of pip. We want these to be more obvious so we use the + # ERROR logging level. + if issubclass(category, Pending): + logger.warning(log_message) + else: + logger.error(log_message) + else: + _warnings_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _warnings_showwarning + + if _warnings_showwarning is None: + _warnings_showwarning = warnings.showwarning + warnings.showwarning = _showwarning diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py new file mode 100644 index 000000000..831f3f6fb --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/encoding.py @@ -0,0 +1,33 @@ +import codecs +import locale +import re +import sys + +BOMS = [ + (codecs.BOM_UTF8, 'utf8'), + (codecs.BOM_UTF16, 'utf16'), + (codecs.BOM_UTF16_BE, 'utf16-be'), + (codecs.BOM_UTF16_LE, 'utf16-le'), + (codecs.BOM_UTF32, 'utf32'), + (codecs.BOM_UTF32_BE, 'utf32-be'), + (codecs.BOM_UTF32_LE, 'utf32-le'), +] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + """Check a bytes string for a BOM to correctly detect the encoding + + Fallback to locale.getpreferredencoding(False) like open() on Python3""" + for bom, encoding in BOMS: + if data.startswith(bom): + return data[len(bom):].decode(encoding) + # Lets check the first two lines as in PEP263 + for line in data.split(b'\n')[:2]: + if line[0:1] == b'#' and ENCODING_RE.search(line): + encoding = ENCODING_RE.search(line).groups()[0].decode('ascii') + return data.decode(encoding) + return data.decode( + locale.getpreferredencoding(False) or sys.getdefaultencoding(), + ) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py new file mode 100644 index 000000000..94fa2c6de --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/filesystem.py @@ -0,0 +1,28 @@ +import os +import os.path + +from pip._internal.compat import get_path_uid + + +def check_path_owner(path): + # If we don't have a way to check the effective uid of this process, then + # we'll just assume that we own the directory. + if not hasattr(os, "geteuid"): + return True + + previous = None + while path != previous: + if os.path.lexists(path): + # Check if path is writable by current user. + if os.geteuid() == 0: + # Special handling for root user in order to handle properly + # cases where users use sudo without -H flag. + try: + path_uid = get_path_uid(path) + except OSError: + return False + return path_uid == 0 + else: + return os.access(path, os.W_OK) + else: + previous, path = path, os.path.dirname(path) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py new file mode 100644 index 000000000..5900a1046 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/glibc.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import + +import ctypes +import re +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py new file mode 100644 index 000000000..8cf636722 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/hashes.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import hashlib + +from pip._vendor.six import iteritems, iterkeys, itervalues + +from pip._internal.exceptions import ( + HashMismatch, HashMissing, InstallationError, +) +from pip._internal.utils.misc import read_chunks + +# The recommended hash algo of the moment. Change this whenever the state of +# the art changes; it won't hurt backward compatibility. +FAVORITE_HASH = 'sha256' + + +# Names of hashlib algorithms allowed by the --hash option and ``pip hash`` +# Currently, those are the ones at least as collision-resistant as sha256. +STRONG_HASHES = ['sha256', 'sha384', 'sha512'] + + +class Hashes(object): + """A wrapper that builds multiple hashes at once and checks them against + known-good values + + """ + def __init__(self, hashes=None): + """ + :param hashes: A dict of algorithm names pointing to lists of allowed + hex digests + """ + self._allowed = {} if hashes is None else hashes + + def check_against_chunks(self, chunks): + """Check good hashes against ones built from iterable of chunks of + data. + + Raise HashMismatch if none match. + + """ + gots = {} + for hash_name in iterkeys(self._allowed): + try: + gots[hash_name] = hashlib.new(hash_name) + except (ValueError, TypeError): + raise InstallationError('Unknown hash name: %s' % hash_name) + + for chunk in chunks: + for hash in itervalues(gots): + hash.update(chunk) + + for hash_name, got in iteritems(gots): + if got.hexdigest() in self._allowed[hash_name]: + return + self._raise(gots) + + def _raise(self, gots): + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + """Check good hashes against a file-like object + + Raise HashMismatch if none match. + + """ + return self.check_against_chunks(read_chunks(file)) + + def check_against_path(self, path): + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + return self.__nonzero__() + + +class MissingHashes(Hashes): + """A workalike for Hashes used when we're missing a hash for a requirement + + It computes the actual hash of the requirement and raises a HashMissing + exception showing it to the user. + + """ + def __init__(self): + """Don't offer the ``hashes`` kwarg.""" + # Pass our favorite hash in to generate a "gotten hash". With the + # empty list, it will never match, so an error will always raise. + super(MissingHashes, self).__init__(hashes={FAVORITE_HASH: []}) + + def _raise(self, gots): + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/logging.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/logging.py new file mode 100644 index 000000000..1fb3e8a2f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/logging.py @@ -0,0 +1,132 @@ +from __future__ import absolute_import + +import contextlib +import logging +import logging.handlers +import os + +from pip._internal.compat import WINDOWS +from pip._internal.utils.misc import ensure_dir + +try: + import threading +except ImportError: + import dummy_threading as threading # type: ignore + + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + + +_log_state = threading.local() +_log_state.indentation = 0 + + +@contextlib.contextmanager +def indent_log(num=2): + """ + A context manager which will cause the log output to be indented for any + log messages emitted inside it. + """ + _log_state.indentation += num + try: + yield + finally: + _log_state.indentation -= num + + +def get_indentation(): + return getattr(_log_state, 'indentation', 0) + + +class IndentingFormatter(logging.Formatter): + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = logging.Formatter.format(self, record) + formatted = "".join([ + (" " * get_indentation()) + line + for line in formatted.splitlines(True) + ]) + return formatted + + +def _color_wrap(*colors): + def wrapped(inp): + return "".join(list(colors) + [inp, colorama.Style.RESET_ALL]) + return wrapped + + +class ColorizedStreamHandler(logging.StreamHandler): + + # Don't build up a list of colors if we don't have colorama + if colorama: + COLORS = [ + # This needs to be in order from highest logging level to lowest. + (logging.ERROR, _color_wrap(colorama.Fore.RED)), + (logging.WARNING, _color_wrap(colorama.Fore.YELLOW)), + ] + else: + COLORS = [] + + def __init__(self, stream=None, no_color=None): + logging.StreamHandler.__init__(self, stream) + self._no_color = no_color + + if WINDOWS and colorama: + self.stream = colorama.AnsiToWin32(self.stream) + + def should_color(self): + # Don't colorize things if we do not have colorama or if told not to + if not colorama or self._no_color: + return False + + real_stream = ( + self.stream if not isinstance(self.stream, colorama.AnsiToWin32) + else self.stream.wrapped + ) + + # If the stream is a tty we should color it + if hasattr(real_stream, "isatty") and real_stream.isatty(): + return True + + # If we have an ASNI term we should color it + if os.environ.get("TERM") == "ANSI": + return True + + # If anything else we should not color it + return False + + def format(self, record): + msg = logging.StreamHandler.format(self, record) + + if self.should_color(): + for level, color in self.COLORS: + if record.levelno >= level: + msg = color(msg) + break + + return msg + + +class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler): + + def _open(self): + ensure_dir(os.path.dirname(self.baseFilename)) + return logging.handlers.RotatingFileHandler._open(self) + + +class MaxLevelFilter(logging.Filter): + + def __init__(self, level): + self.level = level + + def filter(self, record): + return record.levelno < self.level diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/misc.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/misc.py new file mode 100644 index 000000000..db84a7c07 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/misc.py @@ -0,0 +1,851 @@ +from __future__ import absolute_import + +import contextlib +import errno +import io +import locale +# we have a submodule named 'logging' which would shadow this if we used the +# regular name: +import logging as std_logging +import os +import posixpath +import re +import shutil +import stat +import subprocess +import sys +import tarfile +import zipfile +from collections import deque + +from pip._vendor import pkg_resources +# NOTE: retrying is not annotated in typeshed as on 2017-07-17, which is +# why we ignore the type on this import. +from pip._vendor.retrying import retry # type: ignore +from pip._vendor.six import PY2 +from pip._vendor.six.moves import input + +from pip._internal.compat import console_to_str, expanduser, stdlib_pkgs +from pip._internal.exceptions import InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +__all__ = ['rmtree', 'display_path', 'backup_dir', + 'ask', 'splitext', + 'format_size', 'is_installable_dir', + 'is_svn_page', 'file_contents', + 'split_leading_dir', 'has_leading_dir', + 'normalize_path', + 'renames', 'get_prog', + 'unzip_file', 'untar_file', 'unpack_file', 'call_subprocess', + 'captured_stdout', 'ensure_dir', + 'ARCHIVE_EXTENSIONS', 'SUPPORTED_EXTENSIONS', + 'get_installed_version'] + + +logger = std_logging.getLogger(__name__) + +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', '.whl') +TAR_EXTENSIONS = ('.tar.gz', '.tgz', '.tar') +ARCHIVE_EXTENSIONS = ( + ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS) +SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS +try: + import bz2 # noqa + SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS +except ImportError: + logger.debug('bz2 module is not available') + +try: + # Only for Python 3.3+ + import lzma # noqa + SUPPORTED_EXTENSIONS += XZ_EXTENSIONS +except ImportError: + logger.debug('lzma module is not available') + + +def import_or_raise(pkg_or_module_string, ExceptionType, *args, **kwargs): + try: + return __import__(pkg_or_module_string) + except ImportError: + raise ExceptionType(*args, **kwargs) + + +def ensure_dir(path): + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + try: + prog = os.path.basename(sys.argv[0]) + if prog in ('__main__.py', '-c'): + return "%s -m pip" % sys.executable + else: + return prog + except (AttributeError, TypeError, IndexError): + pass + return 'pip' + + +# Retry every half second for up to 3 seconds +@retry(stop_max_delay=3000, wait_fixed=500) +def rmtree(dir, ignore_errors=False): + shutil.rmtree(dir, ignore_errors=ignore_errors, + onerror=rmtree_errorhandler) + + +def rmtree_errorhandler(func, path, exc_info): + """On Windows, the files in .svn are read-only, so when rmtree() tries to + remove them, an exception is thrown. We catch that here, remove the + read-only attribute, and hopefully continue without problems.""" + # if file type currently read only + if os.stat(path).st_mode & stat.S_IREAD: + # convert to read/write + os.chmod(path, stat.S_IWRITE) + # use the original function to repeat the operation + func(path) + return + else: + raise + + +def display_path(path): + """Gives the display value for a given path, making it relative to cwd + if possible.""" + path = os.path.normcase(os.path.abspath(path)) + if sys.version_info[0] == 2: + path = path.decode(sys.getfilesystemencoding(), 'replace') + path = path.encode(sys.getdefaultencoding(), 'replace') + if path.startswith(os.getcwd() + os.path.sep): + path = '.' + path[len(os.getcwd()):] + return path + + +def backup_dir(dir, ext='.bak'): + """Figure out the name of a directory to back up the given dir to + (adding .bak, .bak2, etc)""" + n = 1 + extension = ext + while os.path.exists(dir + extension): + n += 1 + extension = ext + str(n) + return dir + extension + + +def ask_path_exists(message, options): + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + """Ask the message interactively, with the given possible responses""" + while 1: + if os.environ.get('PIP_NO_INPUT'): + raise Exception( + 'No input was expected ($PIP_NO_INPUT set); question: %s' % + message + ) + response = input(message) + response = response.strip().lower() + if response not in options: + print( + 'Your response (%r) was not one of the expected responses: ' + '%s' % (response, ', '.join(options)) + ) + else: + return response + + +def format_size(bytes): + if bytes > 1000 * 1000: + return '%.1fMB' % (bytes / 1000.0 / 1000) + elif bytes > 10 * 1000: + return '%ikB' % (bytes / 1000) + elif bytes > 1000: + return '%.1fkB' % (bytes / 1000.0) + else: + return '%ibytes' % bytes + + +def is_installable_dir(path): + """Return True if `path` is a directory containing a setup.py file.""" + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + return False + + +def is_svn_page(html): + """ + Returns true if the page appears to be the index page of an svn repository + """ + return (re.search(r'[^<]*Revision \d+:', html) and + re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) + + +def file_contents(filename): + with open(filename, 'rb') as fp: + return fp.read().decode('utf-8') + + +def read_chunks(file, size=io.DEFAULT_BUFFER_SIZE): + """Yield pieces of data from a file-like object until EOF.""" + while True: + chunk = file.read(size) + if not chunk: + break + yield chunk + + +def split_leading_dir(path): + path = path.lstrip('/').lstrip('\\') + if '/' in path and (('\\' in path and path.find('/') < path.find('\\')) or + '\\' not in path): + return path.split('/', 1) + elif '\\' in path: + return path.split('\\', 1) + else: + return path, '' + + +def has_leading_dir(paths): + """Returns true if all the paths have the same leading path name + (i.e., everything is in one subdirectory in an archive)""" + common_prefix = None + for path in paths: + prefix, rest = split_leading_dir(path) + if not prefix: + return False + elif common_prefix is None: + common_prefix = prefix + elif prefix != common_prefix: + return False + return True + + +def normalize_path(path, resolve_symlinks=True): + """ + Convert a path to its canonical, case-normalized, absolute version. + + """ + path = expanduser(path) + if resolve_symlinks: + path = os.path.realpath(path) + else: + path = os.path.abspath(path) + return os.path.normcase(path) + + +def splitext(path): + """Like os.path.splitext, but take off .tar too""" + base, ext = posixpath.splitext(path) + if base.lower().endswith('.tar'): + ext = base[-4:] + ext + base = base[:-4] + return base, ext + + +def renames(old, new): + """Like os.renames(), but handles renaming across devices.""" + # Implementation borrowed from os.renames(). + head, tail = os.path.split(new) + if head and tail and not os.path.exists(head): + os.makedirs(head) + + shutil.move(old, new) + + head, tail = os.path.split(old) + if head and tail: + try: + os.removedirs(head) + except OSError: + pass + + +def is_local(path): + """ + Return True if path is within sys.prefix, if we're running in a virtualenv. + + If we're not in a virtualenv, all paths are considered "local." + + """ + if not running_under_virtualenv(): + return True + return normalize_path(path).startswith(normalize_path(sys.prefix)) + + +def dist_is_local(dist): + """ + Return True if given Distribution object is installed locally + (i.e. within current virtualenv). + + Always True if we're not in a virtualenv. + + """ + return is_local(dist_location(dist)) + + +def dist_in_usersite(dist): + """ + Return True if given Distribution is installed in user site. + """ + norm_path = normalize_path(dist_location(dist)) + return norm_path.startswith(normalize_path(user_site)) + + +def dist_in_site_packages(dist): + """ + Return True if given Distribution is installed in + sysconfig.get_python_lib(). + """ + return normalize_path( + dist_location(dist) + ).startswith(normalize_path(site_packages)) + + +def dist_is_editable(dist): + """Is distribution an editable install?""" + for path_item in sys.path: + egg_link = os.path.join(path_item, dist.project_name + '.egg-link') + if os.path.isfile(egg_link): + return True + return False + + +def get_installed_distributions(local_only=True, + skip=stdlib_pkgs, + include_editables=True, + editables_only=False, + user_only=False): + """ + Return a list of installed Distribution objects. + + If ``local_only`` is True (default), only return installations + local to the current virtualenv, if in a virtualenv. + + ``skip`` argument is an iterable of lower-case project names to + ignore; defaults to stdlib_pkgs + + If ``include_editables`` is False, don't report editables. + + If ``editables_only`` is True , only report editables. + + If ``user_only`` is True , only report installations in the user + site directory. + + """ + if local_only: + local_test = dist_is_local + else: + def local_test(d): + return True + + if include_editables: + def editable_test(d): + return True + else: + def editable_test(d): + return not dist_is_editable(d) + + if editables_only: + def editables_only_test(d): + return dist_is_editable(d) + else: + def editables_only_test(d): + return True + + if user_only: + user_test = dist_in_usersite + else: + def user_test(d): + return True + + return [d for d in pkg_resources.working_set + if local_test(d) and + d.key not in skip and + editable_test(d) and + editables_only_test(d) and + user_test(d) + ] + + +def egg_link_path(dist): + """ + Return the path for the .egg-link file if it exists, otherwise, None. + + There's 3 scenarios: + 1) not in a virtualenv + try to find in site.USER_SITE, then site_packages + 2) in a no-global virtualenv + try to find in site_packages + 3) in a yes-global virtualenv + try to find in site_packages, then site.USER_SITE + (don't look in global location) + + For #1 and #3, there could be odd cases, where there's an egg-link in 2 + locations. + + This method will just return the first one found. + """ + sites = [] + if running_under_virtualenv(): + if virtualenv_no_global(): + sites.append(site_packages) + else: + sites.append(site_packages) + if user_site: + sites.append(user_site) + else: + if user_site: + sites.append(user_site) + sites.append(site_packages) + + for site in sites: + egglink = os.path.join(site, dist.project_name) + '.egg-link' + if os.path.isfile(egglink): + return egglink + + +def dist_location(dist): + """ + Get the site-packages location of this distribution. Generally + this is dist.location, except in the case of develop-installed + packages, where dist.location is the source code location, and we + want to know where the egg-link file is. + + """ + egg_link = egg_link_path(dist) + if egg_link: + return egg_link + return dist.location + + +def current_umask(): + """Get the current umask which involves having to set it temporarily.""" + mask = os.umask(0) + os.umask(mask) + return mask + + +def unzip_file(filename, location, flatten=True): + """ + Unzip the file (with path `filename`) to the destination `location`. All + files are written based on system defaults and umask (i.e. permissions are + not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + zipfp = open(filename, 'rb') + try: + zip = zipfile.ZipFile(zipfp, allowZip64=True) + leading = has_leading_dir(zip.namelist()) and flatten + for info in zip.infolist(): + name = info.filename + data = zip.read(name) + fn = name + if leading: + fn = split_leading_dir(name)[1] + fn = os.path.join(location, fn) + dir = os.path.dirname(fn) + if fn.endswith('/') or fn.endswith('\\'): + # A directory + ensure_dir(fn) + else: + ensure_dir(dir) + fp = open(fn, 'wb') + try: + fp.write(data) + finally: + fp.close() + mode = info.external_attr >> 16 + # if mode and regular file and any execute permissions for + # user/group/world? + if mode and stat.S_ISREG(mode) and mode & 0o111: + # make dest file have execute for user/group/world + # (chmod +x) no-op on windows per python docs + os.chmod(fn, (0o777 - current_umask() | 0o111)) + finally: + zipfp.close() + + +def untar_file(filename, location): + """ + Untar the file (with path `filename`) to the destination `location`. + All files are written based on system defaults and umask (i.e. permissions + are not preserved), except that regular file members with any execute + permissions (user, group, or world) have "chmod +x" applied after being + written. Note that for windows, any execute changes using os.chmod are + no-ops per the python docs. + """ + ensure_dir(location) + if filename.lower().endswith('.gz') or filename.lower().endswith('.tgz'): + mode = 'r:gz' + elif filename.lower().endswith(BZ2_EXTENSIONS): + mode = 'r:bz2' + elif filename.lower().endswith(XZ_EXTENSIONS): + mode = 'r:xz' + elif filename.lower().endswith('.tar'): + mode = 'r' + else: + logger.warning( + 'Cannot determine compression type for file %s', filename, + ) + mode = 'r:*' + tar = tarfile.open(filename, mode) + try: + # note: python<=2.5 doesn't seem to know about pax headers, filter them + leading = has_leading_dir([ + member.name for member in tar.getmembers() + if member.name != 'pax_global_header' + ]) + for member in tar.getmembers(): + fn = member.name + if fn == 'pax_global_header': + continue + if leading: + fn = split_leading_dir(fn)[1] + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + tar._extract_member(member, path) + except Exception as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + else: + try: + fp = tar.extractfile(member) + except (KeyError, AttributeError) as exc: + # Some corrupt tar files seem to produce this + # (specifically bad symlinks) + logger.warning( + 'In the tar file %s the member %s is invalid: %s', + filename, member.name, exc, + ) + continue + ensure_dir(os.path.dirname(path)) + with open(path, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + fp.close() + # Update the timestamp (useful for cython compiled files) + tar.utime(member, path) + # member have any execute permissions for user/group/world? + if member.mode & 0o111: + # make dest file have execute for user/group/world + # no-op on windows per python docs + os.chmod(path, (0o777 - current_umask() | 0o111)) + finally: + tar.close() + + +def unpack_file(filename, location, content_type, link): + filename = os.path.realpath(filename) + if (content_type == 'application/zip' or + filename.lower().endswith(ZIP_EXTENSIONS) or + zipfile.is_zipfile(filename)): + unzip_file( + filename, + location, + flatten=not filename.endswith('.whl') + ) + elif (content_type == 'application/x-gzip' or + tarfile.is_tarfile(filename) or + filename.lower().endswith( + TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)): + untar_file(filename, location) + elif (content_type and content_type.startswith('text/html') and + is_svn_page(file_contents(filename))): + # We don't really care about this + from pip._internal.vcs.subversion import Subversion + Subversion('svn+' + link.url).unpack(location) + else: + # FIXME: handle? + # FIXME: magic signatures? + logger.critical( + 'Cannot unpack file %s (downloaded from %s, content-type: %s); ' + 'cannot detect archive format', + filename, location, content_type, + ) + raise InstallationError( + 'Cannot determine archive format of %s' % location + ) + + +def call_subprocess(cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, unset_environ=None, spinner=None): + """ + Args: + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + """ + if unset_environ is None: + unset_environ = [] + # This function's handling of subprocess output is confusing and I + # previously broke it terribly, so as penance I will write a long comment + # explaining things. + # + # The obvious thing that affects output is the show_stdout= + # kwarg. show_stdout=True means, let the subprocess write directly to our + # stdout. Even though it is nominally the default, it is almost never used + # inside pip (and should not be used in new code without a very good + # reason); as of 2016-02-22 it is only used in a few places inside the VCS + # wrapper code. Ideally we should get rid of it entirely, because it + # creates a lot of complexity here for a rarely used feature. + # + # Most places in pip set show_stdout=False. What this means is: + # - We connect the child stdout to a pipe, which we read. + # - By default, we hide the output but show a spinner -- unless the + # subprocess exits with an error, in which case we show the output. + # - If the --verbose option was passed (= loglevel is DEBUG), then we show + # the output unconditionally. (But in this case we don't want to show + # the output a second time if it turns out that there was an error.) + # + # stderr is always merged with stdout (even if show_stdout=True). + if show_stdout: + stdout = None + else: + stdout = subprocess.PIPE + if command_desc is None: + cmd_parts = [] + for part in cmd: + if ' ' in part or '\n' in part or '"' in part or "'" in part: + part = '"%s"' % part.replace('"', '\\"') + cmd_parts.append(part) + command_desc = ' '.join(cmd_parts) + logger.debug("Running command %s", command_desc) + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + for name in unset_environ: + env.pop(name, None) + try: + proc = subprocess.Popen( + cmd, stderr=subprocess.STDOUT, stdin=subprocess.PIPE, + stdout=stdout, cwd=cwd, env=env, + ) + proc.stdin.close() + except Exception as exc: + logger.critical( + "Error %s while executing command %s", exc, command_desc, + ) + raise + all_output = [] + if stdout is not None: + while True: + line = console_to_str(proc.stdout.readline()) + if not line: + break + line = line.rstrip() + all_output.append(line + '\n') + if logger.getEffectiveLevel() <= std_logging.DEBUG: + # Show the line immediately + logger.debug(line) + else: + # Update the spinner + if spinner is not None: + spinner.spin() + try: + proc.wait() + finally: + if proc.stdout: + proc.stdout.close() + if spinner is not None: + if proc.returncode: + spinner.finish("error") + else: + spinner.finish("done") + if proc.returncode: + if on_returncode == 'raise': + if (logger.getEffectiveLevel() > std_logging.DEBUG and + not show_stdout): + logger.info( + 'Complete output from command %s:', command_desc, + ) + logger.info( + ''.join(all_output) + + '\n----------------------------------------' + ) + raise InstallationError( + 'Command "%s" failed with error code %s in %s' + % (command_desc, proc.returncode, cwd)) + elif on_returncode == 'warn': + logger.warning( + 'Command "%s" had error code %s in %s', + command_desc, proc.returncode, cwd, + ) + elif on_returncode == 'ignore': + pass + else: + raise ValueError('Invalid value: on_returncode=%s' % + repr(on_returncode)) + if not show_stdout: + return ''.join(all_output) + + +def read_text_file(filename): + """Return the contents of *filename*. + + Try to decode the file contents with utf-8, the preferred system encoding + (e.g., cp1252 on some Windows machines), and latin1, in that order. + Decoding a byte string with latin1 will never raise an error. In the worst + case, the returned string will contain some garbage characters. + + """ + with open(filename, 'rb') as fp: + data = fp.read() + + encodings = ['utf-8', locale.getpreferredencoding(False), 'latin1'] + for enc in encodings: + try: + data = data.decode(enc) + except UnicodeDecodeError: + continue + break + + assert type(data) != bytes # Latin1 should have worked. + return data + + +def _make_build_dir(build_dir): + os.makedirs(build_dir) + write_delete_marker_file(build_dir) + + +class FakeFile(object): + """Wrap a list of lines in an object with readline() to make + ConfigParser happy.""" + def __init__(self, lines): + self._gen = (l for l in lines) + + def readline(self): + try: + try: + return next(self._gen) + except NameError: + return self._gen.next() + except StopIteration: + return '' + + def __iter__(self): + return self._gen + + +class StreamWrapper(StringIO): + + @classmethod + def from_stream(cls, orig_stream): + cls.orig_stream = orig_stream + return cls() + + # compileall.compile_dir() needs stdout.encoding to print to stdout + @property + def encoding(self): + return self.orig_stream.encoding + + +@contextlib.contextmanager +def captured_output(stream_name): + """Return a context manager used by captured_stdout/stdin/stderr + that temporarily replaces the sys stream *stream_name* with a StringIO. + + Taken from Lib/support/__init__.py in the CPython repo. + """ + orig_stdout = getattr(sys, stream_name) + setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout)) + try: + yield getattr(sys, stream_name) + finally: + setattr(sys, stream_name, orig_stdout) + + +def captured_stdout(): + """Capture the output of sys.stdout: + + with captured_stdout() as stdout: + print('hello') + self.assertEqual(stdout.getvalue(), 'hello\n') + + Taken from Lib/support/__init__.py in the CPython repo. + """ + return captured_output('stdout') + + +class cached_property(object): + """A property that is only computed once per instance and then replaces + itself with an ordinary attribute. Deleting the attribute resets the + property. + + Source: https://github.com/bottlepy/bottle/blob/0.11.5/bottle.py#L175 + """ + + def __init__(self, func): + self.__doc__ = getattr(func, '__doc__') + self.func = func + + def __get__(self, obj, cls): + if obj is None: + # We're being accessed from the class itself, not from an object + return self + value = obj.__dict__[self.func.__name__] = self.func(obj) + return value + + +def get_installed_version(dist_name, lookup_dirs=None): + """Get the installed version of dist_name avoiding pkg_resources cache""" + # Create a requirement that we'll look for inside of setuptools. + req = pkg_resources.Requirement.parse(dist_name) + + # We want to avoid having this cached, so we need to construct a new + # working set each time. + if lookup_dirs is None: + working_set = pkg_resources.WorkingSet() + else: + working_set = pkg_resources.WorkingSet(lookup_dirs) + + # Get the installed distribution from our working set + dist = working_set.find(req) + + # Check to see if we got an installed distribution or not, if we did + # we want to return it's version. + return dist.version if dist else None + + +def consume(iterator): + """Consume an iterable at C speed.""" + deque(iterator, maxlen=0) + + +# Simulates an enum +def enum(*sequential, **named): + enums = dict(zip(sequential, range(len(sequential))), **named) + reverse = {value: key for key, value in enums.items()} + enums['reverse_mapping'] = reverse + return type('Enum', (), enums) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py new file mode 100644 index 000000000..f4572abd2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/outdated.py @@ -0,0 +1,163 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile +from pip._vendor.packaging import version as packaging_version + +from pip._internal.compat import WINDOWS +from pip._internal.index import PackageFinder +from pip._internal.locations import USER_CACHE_DIR, running_under_virtualenv +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class VirtualenvSelfCheckState(object): + def __init__(self): + self.statefile_path = os.path.join(sys.prefix, "pip-selfcheck.json") + + # Load the existing state + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile) + except (IOError, ValueError): + self.state = {} + + def save(self, pypi_version, current_time): + # Attempt to write out our version check file + with open(self.statefile_path, "w") as statefile: + json.dump( + { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + }, + statefile, + sort_keys=True, + separators=(",", ":") + ) + + +class GlobalSelfCheckState(object): + def __init__(self): + self.statefile_path = os.path.join(USER_CACHE_DIR, "selfcheck.json") + + # Load the existing state + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + self.state = {} + + def save(self, pypi_version, current_time): + # Check to make sure that we own the directory + if not check_path_owner(os.path.dirname(self.statefile_path)): + return + + # Now that we've ensured the directory is owned by this user, we'll go + # ahead and make sure that all our directories are created. + ensure_dir(os.path.dirname(self.statefile_path)) + + # Attempt to write out our version check file + with lockfile.LockFile(self.statefile_path): + if os.path.exists(self.statefile_path): + with open(self.statefile_path) as statefile: + state = json.load(statefile) + else: + state = {} + + state[sys.prefix] = { + "last_check": current_time.strftime(SELFCHECK_DATE_FMT), + "pypi_version": pypi_version, + } + + with open(self.statefile_path, "w") as statefile: + json.dump(state, statefile, sort_keys=True, + separators=(",", ":")) + + +def load_selfcheck_statefile(): + if running_under_virtualenv(): + return VirtualenvSelfCheckState() + else: + return GlobalSelfCheckState() + + +def pip_version_check(session, options): + """Check for an update for pip. + + Limit the frequency of checks to once per week. State is stored either in + the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix + of the pip script path. + """ + installed_version = get_installed_version("pip") + if not installed_version: + return + + pip_version = packaging_version.parse(installed_version) + pypi_version = None + + try: + state = load_selfcheck_statefile() + + current_time = datetime.datetime.utcnow() + # Determine if we need to refresh the state + if "last_check" in state.state and "pypi_version" in state.state: + last_check = datetime.datetime.strptime( + state.state["last_check"], + SELFCHECK_DATE_FMT + ) + if (current_time - last_check).total_seconds() < 7 * 24 * 60 * 60: + pypi_version = state.state["pypi_version"] + + # Refresh the version if we need to or just see if we need to warn + if pypi_version is None: + # Lets use PackageFinder to see what the latest pip version is + finder = PackageFinder( + find_links=options.find_links, + index_urls=[options.index_url] + options.extra_index_urls, + allow_all_prereleases=False, # Explicitly set to False + trusted_hosts=options.trusted_hosts, + process_dependency_links=options.process_dependency_links, + session=session, + ) + all_candidates = finder.find_all_candidates("pip") + if not all_candidates: + return + pypi_version = str( + max(all_candidates, key=lambda c: c.version).version + ) + + # save that we've performed a check + state.save(pypi_version, current_time) + + remote_version = packaging_version.parse(pypi_version) + + # Determine if our pypi_version is older + if (pip_version < remote_version and + pip_version.base_version != remote_version.base_version): + # Advise "python -m pip" on Windows to avoid issues + # with overwriting pip.exe. + if WINDOWS: + pip_cmd = "python -m pip" + else: + pip_cmd = "pip" + logger.warning( + "You are using pip version %s, however version %s is " + "available.\nYou should consider upgrading via the " + "'%s install --upgrade pip' command.", + pip_version, pypi_version, pip_cmd + ) + except Exception: + logger.debug( + "There was an error checking the latest version of pip", + exc_info=True, + ) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py new file mode 100644 index 000000000..d52395364 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/packaging.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser # type: ignore + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal import exceptions + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + """ + Check if the python version in use match the `requires_python` specifier. + + Returns `True` if the version of python in use matches the requirement. + Returns `False` if the version of python in use does not matches the + requirement. + + Raises an InvalidSpecifier if `requires_python` have an invalid format. + """ + if requires_python is None: + # The package provides no information + return True + requires_python_specifier = specifiers.SpecifierSet(requires_python) + + # We only use major.minor.micro + python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) + return python_version in requires_python_specifier + + +def get_metadata(dist): + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + return dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + return dist.get_metadata('PKG-INFO') + + +def check_dist_requires_python(dist): + metadata = get_metadata(dist) + feed_parser = FeedParser() + feed_parser.feed(metadata) + pkg_info_dict = feed_parser.close() + requires_python = pkg_info_dict.get('Requires-Python') + try: + if not check_requires_python(requires_python): + raise exceptions.UnsupportedPythonVersion( + "%s requires Python '%s' but the running Python is %s" % ( + dist.project_name, + requires_python, + '.'.join(map(str, sys.version_info[:3])),) + ) + except specifiers.InvalidSpecifier as e: + logger.warning( + "Package %s has an invalid Requires-Python entry %s - %s", + dist.project_name, requires_python, e, + ) + return + + +def get_installer(dist): + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py new file mode 100644 index 000000000..9d3217400 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/setuptools_build.py @@ -0,0 +1,8 @@ +# Shim to wrap setup.py invocation with setuptools +SETUPTOOLS_SHIM = ( + "import setuptools, tokenize;__file__=%r;" + "f=getattr(tokenize, 'open', open)(__file__);" + "code=f.read().replace('\\r\\n', '\\n');" + "f.close();" + "exec(compile(code, __file__, 'exec'))" +) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py new file mode 100644 index 000000000..25bc0d9c0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/temp_dir.py @@ -0,0 +1,82 @@ +from __future__ import absolute_import + +import logging +import os.path +import tempfile + +from pip._internal.utils.misc import rmtree + +logger = logging.getLogger(__name__) + + +class TempDirectory(object): + """Helper class that owns and cleans up a temporary directory. + + This class can be used as a context manager or as an OO representation of a + temporary directory. + + Attributes: + path + Location to the created temporary directory or None + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + Methods: + create() + Creates a temporary directory and stores its path in the path + attribute. + cleanup() + Deletes the temporary directory and sets path attribute to None + + When used as a context manager, a temporary directory is created on + entering the context and, if the delete attribute is True, on exiting the + context the created directory is deleted. + """ + + def __init__(self, path=None, delete=None, kind="temp"): + super(TempDirectory, self).__init__() + + if path is None and delete is None: + # If we were not given an explicit directory, and we were not given + # an explicit delete option, then we'll default to deleting. + delete = True + + self.path = path + self.delete = delete + self.kind = kind + + def __repr__(self): + return "<{} {!r}>".format(self.__class__.__name__, self.path) + + def __enter__(self): + self.create() + return self + + def __exit__(self, exc, value, tb): + if self.delete: + self.cleanup() + + def create(self): + """Create a temporary directory and store it's path in self.path + """ + if self.path is not None: + logger.debug( + "Skipped creation of temporary directory: {}".format(self.path) + ) + return + # We realpath here because some systems have their default tmpdir + # symlinked to another directory. This tends to confuse build + # scripts, so we canonicalize the path by traversing potential + # symlinks here. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) + + def cleanup(self): + """Remove the temporary directory created and reset state + """ + if self.path is not None and os.path.exists(self.path): + rmtree(self.path) + self.path = None diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/typing.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/typing.py new file mode 100644 index 000000000..4e25ae6ca --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/typing.py @@ -0,0 +1,29 @@ +"""For neatly implementing static typing in pip. + +`mypy` - the static type analysis tool we use - uses the `typing` module, which +provides core functionality fundamental to mypy's functioning. + +Generally, `typing` would be imported at runtime and used in that fashion - +it acts as a no-op at runtime and does not have any run-time overhead by +design. + +As it turns out, `typing` is not vendorable - it uses separate sources for +Python 2/Python 3. Thus, this codebase can not expect it to be present. +To work around this, mypy allows the typing import to be behind a False-y +optional to prevent it from running at runtime and type-comments can be used +to remove the need for the types to be accessible directly during runtime. + +This module provides the False-y guard in a nicely named fashion so that a +curious maintainer can reach here to read this. + +In pip, all static-typing related imports should be guarded as follows: + + from pip.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/utils/ui.py b/myenv/lib/python3.7/site-packages/pip/_internal/utils/ui.py new file mode 100644 index 000000000..d97ea36a9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/utils/ui.py @@ -0,0 +1,421 @@ +from __future__ import absolute_import, division + +import contextlib +import itertools +import logging +import sys +import time +from signal import SIGINT, default_int_handler, signal + +from pip._vendor import six +from pip._vendor.progress.bar import ( + Bar, ChargingBar, FillingCirclesBar, FillingSquaresBar, IncrementalBar, + ShadyBar, +) +from pip._vendor.progress.helpers import HIDE_CURSOR, SHOW_CURSOR, WritelnMixin +from pip._vendor.progress.spinner import Spinner + +from pip._internal.compat import WINDOWS +from pip._internal.utils.logging import get_indentation +from pip._internal.utils.misc import format_size +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any + +try: + from pip._vendor import colorama +# Lots of different errors can come from this, including SystemError and +# ImportError. +except Exception: + colorama = None + +logger = logging.getLogger(__name__) + + +def _select_progress_class(preferred, fallback): + encoding = getattr(preferred.file, "encoding", None) + + # If we don't know what encoding this file is in, then we'll just assume + # that it doesn't support unicode and use the ASCII bar. + if not encoding: + return fallback + + # Collect all of the possible characters we want to use with the preferred + # bar. + characters = [ + getattr(preferred, "empty_fill", six.text_type()), + getattr(preferred, "fill", six.text_type()), + ] + characters += list(getattr(preferred, "phases", [])) + + # Try to decode the characters we're using for the bar using the encoding + # of the given file, if this works then we'll assume that we can use the + # fancier bar and if not we'll fall back to the plaintext bar. + try: + six.text_type().join(characters).encode(encoding) + except UnicodeEncodeError: + return fallback + else: + return preferred + + +_BaseBar = _select_progress_class(IncrementalBar, Bar) # type: Any + + +class InterruptibleMixin(object): + """ + Helper to ensure that self.finish() gets called on keyboard interrupt. + + This allows downloads to be interrupted without leaving temporary state + (like hidden cursors) behind. + + This class is similar to the progress library's existing SigIntMixin + helper, but as of version 1.2, that helper has the following problems: + + 1. It calls sys.exit(). + 2. It discards the existing SIGINT handler completely. + 3. It leaves its own handler in place even after an uninterrupted finish, + which will have unexpected delayed effects if the user triggers an + unrelated keyboard interrupt some time after a progress-displaying + download has already completed, for example. + """ + + def __init__(self, *args, **kwargs): + """ + Save the original SIGINT handler for later. + """ + super(InterruptibleMixin, self).__init__(*args, **kwargs) + + self.original_handler = signal(SIGINT, self.handle_sigint) + + # If signal() returns None, the previous handler was not installed from + # Python, and we cannot restore it. This probably should not happen, + # but if it does, we must restore something sensible instead, at least. + # The least bad option should be Python's default SIGINT handler, which + # just raises KeyboardInterrupt. + if self.original_handler is None: + self.original_handler = default_int_handler + + def finish(self): + """ + Restore the original SIGINT handler after finishing. + + This should happen regardless of whether the progress display finishes + normally, or gets interrupted. + """ + super(InterruptibleMixin, self).finish() + signal(SIGINT, self.original_handler) + + def handle_sigint(self, signum, frame): + """ + Call self.finish() before delegating to the original SIGINT handler. + + This handler should only be in place while the progress display is + active. + """ + self.finish() + self.original_handler(signum, frame) + + +class SilentBar(Bar): + + def update(self): + pass + + +class BlueEmojiBar(IncrementalBar): + + suffix = "%(percent)d%%" + bar_prefix = " " + bar_suffix = " " + phases = (u"\U0001F539", u"\U0001F537", u"\U0001F535") # type: Any + + +class DownloadProgressMixin(object): + + def __init__(self, *args, **kwargs): + super(DownloadProgressMixin, self).__init__(*args, **kwargs) + self.message = (" " * (get_indentation() + 2)) + self.message + + @property + def downloaded(self): + return format_size(self.index) + + @property + def download_speed(self): + # Avoid zero division errors... + if self.avg == 0.0: + return "..." + return format_size(1 / self.avg) + "/s" + + @property + def pretty_eta(self): + if self.eta: + return "eta %s" % self.eta_td + return "" + + def iter(self, it, n=1): + for x in it: + yield x + self.next(n) + self.finish() + + +class WindowsMixin(object): + + def __init__(self, *args, **kwargs): + # The Windows terminal does not support the hide/show cursor ANSI codes + # even with colorama. So we'll ensure that hide_cursor is False on + # Windows. + # This call neds to go before the super() call, so that hide_cursor + # is set in time. The base progress bar class writes the "hide cursor" + # code to the terminal in its init, so if we don't set this soon + # enough, we get a "hide" with no corresponding "show"... + if WINDOWS and self.hide_cursor: + self.hide_cursor = False + + super(WindowsMixin, self).__init__(*args, **kwargs) + + # Check if we are running on Windows and we have the colorama module, + # if we do then wrap our file with it. + if WINDOWS and colorama: + self.file = colorama.AnsiToWin32(self.file) + # The progress code expects to be able to call self.file.isatty() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.isatty = lambda: self.file.wrapped.isatty() + # The progress code expects to be able to call self.file.flush() + # but the colorama.AnsiToWin32() object doesn't have that, so we'll + # add it. + self.file.flush = lambda: self.file.wrapped.flush() + + +class BaseDownloadProgressBar(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin): + + file = sys.stdout + message = "%(percent)d%%" + suffix = "%(downloaded)s %(download_speed)s %(pretty_eta)s" + +# NOTE: The "type: ignore" comments on the following classes are there to +# work around https://github.com/python/typing/issues/241 + + +class DefaultDownloadProgressBar(BaseDownloadProgressBar, + _BaseBar): # type: ignore + pass + + +class DownloadSilentBar(BaseDownloadProgressBar, SilentBar): # type: ignore + pass + + +class DownloadIncrementalBar(BaseDownloadProgressBar, # type: ignore + IncrementalBar): + pass + + +class DownloadChargingBar(BaseDownloadProgressBar, # type: ignore + ChargingBar): + pass + + +class DownloadShadyBar(BaseDownloadProgressBar, ShadyBar): # type: ignore + pass + + +class DownloadFillingSquaresBar(BaseDownloadProgressBar, # type: ignore + FillingSquaresBar): + pass + + +class DownloadFillingCirclesBar(BaseDownloadProgressBar, # type: ignore + FillingCirclesBar): + pass + + +class DownloadBlueEmojiProgressBar(BaseDownloadProgressBar, # type: ignore + BlueEmojiBar): + pass + + +class DownloadProgressSpinner(WindowsMixin, InterruptibleMixin, + DownloadProgressMixin, WritelnMixin, Spinner): + + file = sys.stdout + suffix = "%(downloaded)s %(download_speed)s" + + def next_phase(self): + if not hasattr(self, "_phaser"): + self._phaser = itertools.cycle(self.phases) + return next(self._phaser) + + def update(self): + message = self.message % self + phase = self.next_phase() + suffix = self.suffix % self + line = ''.join([ + message, + " " if message else "", + phase, + " " if suffix else "", + suffix, + ]) + + self.writeln(line) + + +BAR_TYPES = { + "off": (DownloadSilentBar, DownloadSilentBar), + "on": (DefaultDownloadProgressBar, DownloadProgressSpinner), + "ascii": (DownloadIncrementalBar, DownloadProgressSpinner), + "pretty": (DownloadFillingCirclesBar, DownloadProgressSpinner), + "emoji": (DownloadBlueEmojiProgressBar, DownloadProgressSpinner) +} + + +def DownloadProgressProvider(progress_bar, max=None): + if max is None or max == 0: + return BAR_TYPES[progress_bar][1]().iter + else: + return BAR_TYPES[progress_bar][0](max=max).iter + + +################################################################ +# Generic "something is happening" spinners +# +# We don't even try using progress.spinner.Spinner here because it's actually +# simpler to reimplement from scratch than to coerce their code into doing +# what we need. +################################################################ + +@contextlib.contextmanager +def hidden_cursor(file): + # The Windows terminal does not support the hide/show cursor ANSI codes, + # even via colorama. So don't even try. + if WINDOWS: + yield + # We don't want to clutter the output with control characters if we're + # writing to a file, or if the user is running with --quiet. + # See https://github.com/pypa/pip/issues/3418 + elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: + yield + else: + file.write(HIDE_CURSOR) + try: + yield + finally: + file.write(SHOW_CURSOR) + + +class RateLimiter(object): + def __init__(self, min_update_interval_seconds): + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 + + def ready(self): + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + self._last_update = time.time() + + +class InteractiveSpinner(object): + def __init__(self, message, file=None, spin_chars="-\\|/", + # Empirically, 8 updates/second looks nice + min_update_interval_seconds=0.125): + self._message = message + if file is None: + file = sys.stdout + self._file = file + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._finished = False + + self._spin_cycle = itertools.cycle(spin_chars) + + self._file.write(" " * get_indentation() + self._message + " ... ") + self._width = 0 + + def _write(self, status): + assert not self._finished + # Erase what we wrote before by backspacing to the beginning, writing + # spaces to overwrite the old text, and then backspacing again + backup = "\b" * self._width + self._file.write(backup + " " * self._width + backup) + # Now we have a blank slate to add our status + self._file.write(status) + self._width = len(status) + self._file.flush() + self._rate_limiter.reset() + + def spin(self): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + if self._finished: + return + self._write(final_status) + self._file.write("\n") + self._file.flush() + self._finished = True + + +# Used for dumb terminals, non-interactive installs (no tty), etc. +# We still print updates occasionally (once every 60 seconds by default) to +# act as a keep-alive for systems like Travis-CI that take lack-of-output as +# an indication that a task has frozen. +class NonInteractiveSpinner(object): + def __init__(self, message, min_update_interval_seconds=60): + self._message = message + self._finished = False + self._rate_limiter = RateLimiter(min_update_interval_seconds) + self._update("started") + + def _update(self, status): + assert not self._finished + self._rate_limiter.reset() + logger.info("%s: %s", self._message, status) + + def spin(self): + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # Interactive spinner goes directly to sys.stdout rather than being routed + # through the logging system, but it acts like it has level INFO, + # i.e. it's only displayed if we're at level INFO or better. + # Non-interactive spinner goes through the logging system, so it is always + # in sync with logging configuration. + if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: + spinner = InteractiveSpinner(message) + else: + spinner = NonInteractiveSpinner(message) + try: + with hidden_cursor(sys.stdout): + yield spinner + except KeyboardInterrupt: + spinner.finish("canceled") + raise + except Exception: + spinner.finish("error") + raise + else: + spinner.finish("done") diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py new file mode 100644 index 000000000..bff94fa9a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__init__.py @@ -0,0 +1,471 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +import copy +import errno +import logging +import os +import shutil +import sys + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import ( + display_path, backup_dir, call_subprocess, rmtree, ask_path_exists, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Dict, Optional, Tuple + from pip._internal.basecommand import Command + +__all__ = ['vcs', 'get_src_requirement'] + + +logger = logging.getLogger(__name__) + + +class RevOptions(object): + + """ + Encapsulates a VCS-specific revision to install, along with any VCS + install options. + + Instances of this class should be treated as if immutable. + """ + + def __init__(self, vcs, rev=None, extra_args=None): + """ + Args: + vcs: a VersionControl object. + rev: the name of the revision to install. + extra_args: a list of extra options. + """ + if extra_args is None: + extra_args = [] + + self.extra_args = extra_args + self.rev = rev + self.vcs = vcs + + def __repr__(self): + return '<RevOptions {}: rev={!r}>'.format(self.vcs.name, self.rev) + + @property + def arg_rev(self): + if self.rev is None: + return self.vcs.default_arg_rev + + return self.rev + + def to_args(self): + """ + Return the VCS-specific command arguments. + """ + args = [] + rev = self.arg_rev + if rev is not None: + args += self.vcs.get_base_rev_args(rev) + args += self.extra_args + + return args + + def to_display(self): + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + """ + Make a copy of the current instance, but with a new rev. + + Args: + rev: the name of the revision for the new object. + """ + return self.vcs.make_rev_options(rev, extra_args=self.extra_args) + + +class VcsSupport(object): + _registry = {} # type: Dict[str, Command] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # Register more schemes with urlparse for various version control + # systems + urllib_parse.uses_netloc.extend(self.schemes) + # Python >= 2.7.4, 3.3 doesn't have uses_fragment + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(self.schemes) + super(VcsSupport, self).__init__() + + def __iter__(self): + return self._registry.__iter__() + + @property + def backends(self): + return list(self._registry.values()) + + @property + def dirnames(self): + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + schemes = [] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + if not hasattr(cls, 'name'): + logger.warning('Cannot register VCS %s', cls.__name__) + return + if cls.name not in self._registry: + self._registry[cls.name] = cls + logger.debug('Registered VCS backend: %s', cls.name) + + def unregister(self, cls=None, name=None): + if name in self._registry: + del self._registry[name] + elif cls in self._registry.values(): + del self._registry[cls.name] + else: + logger.warning('Cannot unregister because no class or name given') + + def get_backend_name(self, location): + """ + Return the name of the version control backend if found at given + location, e.g. vcs.get_backend_name('/path/to/vcs/checkout') + """ + for vc_type in self._registry.values(): + if vc_type.controls_location(location): + logger.debug('Determine that %s uses VCS: %s', + location, vc_type.name) + return vc_type.name + return None + + def get_backend(self, name): + name = name.lower() + if name in self._registry: + return self._registry[name] + + def get_backend_from_location(self, location): + vc_type = self.get_backend_name(location) + if vc_type: + return self.get_backend(vc_type) + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + # List of supported schemes for this Version Control + schemes = () # type: Tuple[str, ...] + # Iterable of environment variable names to pass to call_subprocess(). + unset_environ = () # type: Tuple[str, ...] + default_arg_rev = None # type: Optional[str] + + def __init__(self, url=None, *args, **kwargs): + self.url = url + super(VersionControl, self).__init__(*args, **kwargs) + + def get_base_rev_args(self, rev): + """ + Return the base revision arguments for a vcs command. + + Args: + rev: the name of a revision to install. Cannot be None. + """ + raise NotImplementedError + + def make_rev_options(self, rev=None, extra_args=None): + """ + Return a RevOptions object. + + Args: + rev: the name of a revision to install. + extra_args: a list of extra options. + """ + return RevOptions(self, rev, extra_args=extra_args) + + def _is_local_repository(self, repo): + """ + posix absolute paths start with os.path.sep, + win32 ones start with drive (like c:\\folder) + """ + drive, tail = os.path.splitdrive(repo) + return repo.startswith(os.path.sep) or drive + + # See issue #1083 for why this method was introduced: + # https://github.com/pypa/pip/issues/1083 + def translate_egg_surname(self, surname): + # For example, Django has branches of the form "stable/1.7.x". + return surname.replace('/', '_') + + def export(self, location): + """ + Export the repository at the url to the destination location + i.e. only download the files, without vcs informations + """ + raise NotImplementedError + + def get_url_rev(self): + """ + Returns the correct repository URL and revision by parsing the given + repository URL + """ + error_message = ( + "Sorry, '%s' is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp" + ) + assert '+' in self.url, error_message % self.url + url = self.url.split('+', 1)[1] + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev + + def get_info(self, location): + """ + Returns (url, revision), where both are strings + """ + assert not location.rstrip('/').endswith(self.dirname), \ + 'Bad directory: %s' % location + return self.get_url(location), self.get_revision(location) + + def normalize_url(self, url): + """ + Normalize a URL for comparison by unquoting it and removing any + trailing slash. + """ + return urllib_parse.unquote(url).rstrip('/') + + def compare_urls(self, url1, url2): + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def obtain(self, dest): + """ + Called when installing or updating an editable package, takes the + source path of the checkout. + """ + raise NotImplementedError + + def switch(self, dest, url, rev_options): + """ + Switch the repo at ``dest`` to point to ``URL``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def update(self, dest, rev_options): + """ + Update an already-existing repo to the given ``rev_options``. + + Args: + rev_options: a RevOptions object. + """ + raise NotImplementedError + + def is_commit_id_equal(self, dest, name): + """ + Return whether the id of the current commit equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + raise NotImplementedError + + def check_destination(self, dest, url, rev_options): + """ + Prepare a location to receive a checkout/clone. + + Return True if the location is ready for (and requires) a + checkout/clone, False otherwise. + + Args: + rev_options: a RevOptions object. + """ + checkout = True + prompt = False + rev_display = rev_options.to_display() + if os.path.exists(dest): + checkout = False + if os.path.exists(os.path.join(dest, self.dirname)): + existing_url = self.get_url(dest) + if self.compare_urls(existing_url, url): + logger.debug( + '%s in %s exists, and has correct URL (%s)', + self.repo_name.title(), + display_path(dest), + url, + ) + if not self.is_commit_id_equal(dest, rev_options.rev): + logger.info( + 'Updating %s %s%s', + display_path(dest), + self.repo_name, + rev_display, + ) + self.update(dest, rev_options) + else: + logger.info( + 'Skipping because already up-to-date.') + else: + logger.warning( + '%s %s in %s exists with URL %s', + self.name, + self.repo_name, + display_path(dest), + existing_url, + ) + prompt = ('(s)witch, (i)gnore, (w)ipe, (b)ackup ', + ('s', 'i', 'w', 'b')) + else: + logger.warning( + 'Directory %s already exists, and is not a %s %s.', + dest, + self.name, + self.repo_name, + ) + prompt = ('(i)gnore, (w)ipe, (b)ackup ', ('i', 'w', 'b')) + if prompt: + logger.warning( + 'The plan is to install the %s repository %s', + self.name, + url, + ) + response = ask_path_exists('What to do? %s' % prompt[0], + prompt[1]) + + if response == 's': + logger.info( + 'Switching %s %s to %s%s', + self.repo_name, + display_path(dest), + url, + rev_display, + ) + self.switch(dest, url, rev_options) + elif response == 'i': + # do nothing + pass + elif response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + checkout = True + elif response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + checkout = True + elif response == 'a': + sys.exit(-1) + return checkout + + def unpack(self, location): + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + def get_src_requirement(self, dist, location): + """ + Return a string representing the requirement needed to + redownload the files currently present in location, something + like: + {repository_url}@{revision}#egg={project_name}-{version_identifier} + """ + raise NotImplementedError + + def get_url(self, location): + """ + Return the url used at location + Used in get_info or check_destination + """ + raise NotImplementedError + + def get_revision(self, location): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + def run_command(self, cmd, show_stdout=True, cwd=None, + on_returncode='raise', + command_desc=None, + extra_environ=None, spinner=None): + """ + Run a VCS subcommand + This is simply a wrapper around call_subprocess that adds the VCS + command name, and checks that the VCS is available + """ + cmd = [self.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode, + command_desc, extra_environ, + unset_environ=self.unset_environ, + spinner=spinner) + except OSError as e: + # errno.ENOENT = no such file or directory + # In other words, the VCS executable isn't available + if e.errno == errno.ENOENT: + raise BadCommand( + 'Cannot find command %r - do you have ' + '%r installed and in your ' + 'PATH?' % (self.name, self.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def controls_location(cls, location): + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + """ + logger.debug('Checking in %s for %s (%s)...', + location, cls.dirname, cls.name) + path = os.path.join(location, cls.dirname) + return os.path.exists(path) + + +def get_src_requirement(dist, location): + version_control = vcs.get_backend_from_location(location) + if version_control: + try: + return version_control().get_src_requirement(dist, + location) + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + version_control.name, + ) + return dist.as_requirement() + logger.warning( + 'cannot determine version of editable source in %s (is not SVN ' + 'checkout, Git clone, Mercurial clone or Bazaar branch)', + location, + ) + return dist.as_requirement() diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..32d803d75c30b27eaf3f397322d78a771c5be6f7 GIT binary patch literal 14147 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 T<=os0bFUV2b6+>UZk+xfc>C&y literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47110824fba89a2d46ba45d88545011d10df5399 GIT binary patch literal 3848 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/git.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..307afcfd7706274c7fc59336b2fba23a5d732de8 GIT binary patch literal 8502 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e2970d8fabed59fc41a40b74fef4a600998099f GIT binary patch literal 3874 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 Q1$L8iV*FZm!)bl}Jt^GPVE_OC literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc78767e02402e8c12c8ac33459c673fca8b5809 GIT binary patch literal 7472 zcmb_hOK=-UdY<<TKoA5Uq9lu!$F}4ZERnRm>)2Lgt!#PaJXG97c5E+JHUgpt;E;nE zuzNs}Q-j^?QmH*;U7Lq1mC6a+N>!4oJ>`;9&bg*4Id$cbs+@FARSvo&-`@j(4=Kqd zU`@|IJ>5Ose}Db`4}Lg1Th{Q~{&e}v&DS*T-|1oUvmo5TCH@5k)0iG<J-wmpBpZ>@ zFx1^_nCfmdEZoh=?l}!twXq_vS89}$Y)9qZOk+mLPE_g5HfDR(MpZq#(Oj?AsP*O> z^STyTqXp(2>5WAtl^`uCsSN3yl4c++E2#qMypm=iT?mZP#oz@<mp;~5mCZfY*j!LM zG#e|d#^xVujTeLY(dA&}h}K|yqSY6kU}aiemvgO6kwk+uXokIh!qW}Z+5Hw50R-!Q z81LX-4r3O?X){W?bwgHIDEd+BpxJMwThigZlm`LotDgm2gh_liiBq0L(%fr{Y<9q- z_g}g8!>?ZX@_PN1>|8tP^};j_*eVb9@Zuq(>eBB$xPQ~XwsyUqRUZU<Aq_KrUVJEC zM^jZbZ9jJl!`{BO_Imx+I!SF>&E#i}1@RXU0<EDl4Lhb|w+!r**|3?_aG1>;=*49& z^KkcAiIs6Lu^Cpuz077=755o7$7;A&*gRXneU>e<CETk&(>gjk$Ce*^jX8FnT|ixp zU1TrdKF=<(72Frti|jJ)i@_3miTRJUL+s<vG)rqNV+UTA<xd8idxgrRDfZ&bT0<$l z_Eyl|Nd{@%<}+A9=A!nx5L=l?!d9C0v(iKo<F|Wp+ZZpK?sVP7B|H>N&-E^Cy0MWN ztNd>vNJ|7!N19M9pG6Z@Jl$RI^Kh?~2J3q*zTQb9hS{z6`1<B{v-z%gJAP-6eW%^* z@4fX#+IhFT&7(IvZ@>56`lsvtu)i9{B5g&{DsR92?zhw37FDXN8OCYA<5si|K&*@D zqSyKda=sg+&CQkwnwUzn#k=AqnzmYto~;~fXziJX(*@h;L6=(a-$BUr5f*)<kMvyI zHjZ?DImO=R`Z9Llr&I?NkV=?EC<t}ter*no)E+rGS`W?K6fAW|9`n*tt{>`0hOXhc z%u09<nUz1$a&t7pa2`jMBW-A<vnTrgmFio0e&5_;vmI<kZcRp@r+PJ8e-NYt9t-~( z0DZ%sK)!y%f3y|wz~4;LEx!dpq&$qf;;Fu#&41WpJ_~u!P7{7`)4wXD6~>+99!~BD z8y`#kF1C6`Y$cDHB4vP-oDKF<-f9N%UdWR;`_|o794D#I0_;#Pi~}DB(N8))@a0c% zh+(srzduO(gVayATB+YII&B8NA_{iXFJBcv*Txea+Rtu0Gw5V7&l!26UIm5Fn)=cU zVkRDiAQcyjid(%vRzDCT;3??fdz>d+&hSCpBo1lCOwKeh%_h_Z@JL4lE#3wnfuy<t zm+qq$kD(~;U{2Cz!RDYV?JiFSeQ6iptEv8z$zc$jxGJ^wqNLrTk4gth!@8y2Yo!?6 z#K(>g46muigiO-<D|iw&P-w=IUe+z$(G9&~kYqtB8x`EE>doZY)3e1h7^jh@(5AVU za4Bg22tuxnv?J}IF*Jr|3Ml7BZXTLL3-yKquaTM~3nw0MKQaMZ`%wGEZQPx002*~V zzh3~83_(}Vtx@?%J5S@_K%CcxHjc+kZZnfvUjyo&Ys~&#?Sb|M?trP2-TB@=nF#;^ zNCZfD&`(52@biHTs)dUDG*Kc8L>k6Qlm0}d*~`TU*qXBgTou$2Aa(-vk$ZKWFJsXg z^@^M!Ef-t8C+Fya2qWp!E(y8BgI=;1G+TpotJ&d6kD78Hefc64L=VzPa6Af|73_y1 z72Kt2H%%1r@E7q^cN79RJOYi^shFcSGbcahwR^1SF{Mt01b!V&Z{rdRC^T$$1)E*f zJ-uRj`m&zQpV;bRg>CXQ=tmPIyQMbz3IwKOb4=Ro6PrWZj4e}ETvLP&*yF&ox9SFe z3%!apj8SZn`in(;o8EngiZfGw8+G?_2{n<klPtz=)5PdUZKjhXw5v%P<4Iz|z>le> zXr7wlpwD1bPEFA&)ck80g#V9|dk1fS2iJIVOQ$thj5<9kw3l=#4RQ$o_fbI$*a1M_ zIx=~TqhNu{ZL$OE0NJUl*x#a~!ptt(jl5I);b4SP?o1bJZDi-~lJzEVgE@fZ38r}k zQ-b;3t(Q4*1Yf0M4TYRnMB6-ZSY#QP9D7+OP)uxaVw>F)I-EjPX|urVWPs=FJ9up~ zZH4it7*Sk6p#iHCv=TYdU)i{DTH{5ZDI91zbSaH@AngBsZhWMD`30y6_VG~P)<H~` zcwv|HY3(@t4%0zX*2pC5Ouq9U8W%O#P^I@6Z9zYFu5a5r26updlW6G3VD?3zeb)gQ z5$c_dr~2xX|HAL7{wk;0bFw=)x&%;J3A$ZyK&#t>%POtyB#c4${U`*BN690Y26HDk z7$0<LK})Huv7is*6U6O<W(1#C6vyVfG&U{o%(0ObBA^MQwb4K<q0n&LiR}&DGcFqz zWI*=(i9>&?m-2DYiTHi0#$Vxq=|f}xmnj`}s0j-F=Ak(R$184z`gUCYRu>KgKnVrj z(spa4(!$jN)5E<P*|~aV=8-vcRE<M06<?vPHga>EPuLK5=%JksW&bF5nMJ2JUddhl z^PFr2+K9hA{T)~iBliwreRgY~!)9PJ?Ce3=AO8vuMlpY{wIB8dy{Q}HcM|TyJM=qY z6bOF+UE|sBhI>IgH4W2&)P8PA7aPdKKyczyoSSvrr1hv3?eI$^ItA<VH}JskQ1K>J z*P5i~W7l9$mf@N5v~Vp<Os!rzW_jsN8~|yNBT9(iLfUGgvOJzbvjblMFJM**?;t|2 z=b~aV+AgLdh$J=JGM0gb3UE=;7vK>XM%D08Q&n}<XE8DvqfNM`pLya^E=H=6^*=O5 zhVll07&yJ^Sn(_5>S8Z}p4?E*rMZzgh#zjQuV)t2a=mWhKn(f;=M(}LboASh>Sm#q zDVZSjD>a+#s3k<RS*(^^9@XRL5L9@f84FkoJelP)NFQ74DMQogoC5tbJmduQ4*^fG zf+_(<FavyWaS!jnB6wrbAyA7ki4_z(ldD61_?Q(Gq=`{X;)yy~*b{K3`v@?ykMAaf zi23B?b`Zt-lNSn*Q`Z?p?O!9TF$Ge%wb=KmXAKC}3ySd+1`EIu)(X@S7z>(ynWW!B zQ6C$)*C5N;gooWJUC3GJ^O!x(g2*NCLUn(Jo&~E|mVN=OQqesV++sL}XJiY{>UyeY z3L1%2h`2-_5MnyA7RX=>DULC=;UEGU+BTd#(1WRJz_xG=e*+c|y#0$R@iy7Ip-r4y zIDoOm6hDtj%*GCF=QboFl|pjS|5s@_ok=U(vv^mfT*jess1v6%{UT=ZzBZOh7qy|o z%53H_YCb|#Mvep^>&AbhMn!gm|7SWks^$0+NXircl+H7ZI*#BxWJ;=d;~+Z680q3@ ziCUf->8pcVSmQa$f55dh*#cYq+8CD7WsHj4%5;P!HNts}fLa=1=zgxnz6E;QDgUv~ zALttWF|CWJdgu(@A84`hg_gT`$I=VAiymd@24(K#Wp&`rZ4_|P<@|3JQL*xYRS3gB z#<oaJ>hDVZJ!!o8MrM{P<tKE)r^lU419^m>;8MpOG^~AjWvIihA|7Shj>WNuOuMLY z3q+u#L;X*TT?_cvpV00j@-w3#mL{Ta$i~_mQfFtt_OyH}g84%{)xZ7s^ey_Zqh;$S z&~=tf*KU#Bi^OdRlfIdK>%05CD7%1oG&-Q8g>VTu9v^;R3t=f&R{GTPhzQj3UVxyM zw@@r^gv9_j)5WN+@EteNj=zcmavL|P_s*<_2dMrBT;pXZ*FUpYS249oDDnS02j0Qg zo;QnsJf21UqP&1i$l5duvKH*OgCcI>4eC#3?Su_eY@!UAmB1;H77tpC6F*CfG%jJm z`bZe19CnS|8aOPlksnZlIc4^+-f^hJDVrk8pS7YvP@s=AI1Zd)Whij=h!;b||0;Np zOKJ#;LYv3qoUJXo^7|O9K67kK)q3E76=u8059%FQRKP%aRJ52q!LQLIOboB0tFsCu z{`_lPf?_E+rm!#Mnl2d@Vrlv-tSOb`ZPB|G*i;KP$TMoj1*4|d3<vJ3Wn`EB7bKr@ zWXU+)rH_7y0tN-gzeok)uz7r$ObsloeuOxi=oC&VjE#!BP1O=fMfg&7ZgtFMGD7wS zzlD*G-P5c_ruVA2b5*<w5A}UyOf3EbG(p+}4l89l)E;v3$tPjxM>K@8Ay8aDku_@C z=gBrQK1CM_PtPb&E-L?rx3Rms17wHD5&mbi6BQKXq<XrgQWV+c6Y6<Rr>TZa>W52d zh*ZUNtkK9``yhJMIuJe_gh4M*p5Hj5DSVd1-%5RzH@T-~IB_p1=#!RO@abq&E`&lQ zcS0moSQC?PMgNM%MLN*PUOX||XIoB>HZdn%YO;hO<w}E8$cxxE#?c2N4|1BeElPcC zQ`F($ayvHp9fkW#RuIcH5pUe#?_;2PNmgK*qi_@0Mv7c|cq&2*Ck|2&V{r@}fshXS zNsg(scLxDKz%iSIBxQ6O#Ht$-PULJMErB{Yr_xgWfHjN3B(-ez!=N1?b0P3>W~WvB z_-`0MsQ+cSWus;-<B()8ozT?tQX}>A(rYRJHJh^BZ1xg1hyuu!W|Oo|n*)z;h@lHt zyF~C)9i&?<PVjkp`#Ker_~4XE;1sg+U#H?86@=x&za*q9&xq$FQ7%hX;FhOhyBDNe z2`ggZ*|EFX4x(t{auP_82_lcN$g|L5FX9qcPyoxtpW&I_idXe4{LSHhsp5J|-VLwh zS<26yf|;!2^tk^L50g-fe4!jp^r6A8<mNW=z}psVKD?gzKI#cE4l>6MBH69n8Ik{_ zGYhpYvvU`<4-q)o$SH#!5MH6*ZXbb_GakcZZc*FS;L}+AagGdgZgq`!=-KAq;JK9B z<7W+cM6kumUsIShlU-HO(Ky6v`457<?-xeIPd14T*3^3-68Tbfwp3vJV=PbkB2V?3 z8<e8W%B!oBCM5T9bRQ+0(SLc0+%P5K>n{HT>iH8C(%otam~+nml%Bjvj{@qoUTddF z-j8!}h^<J$MF6dmXL`|-|2b9vl*X_qPshKZ=hF<JvLgS1df}tcEHFG69lWm6XbVOK zzAtSzWl}4KYF&Sc0NfcMc}|cu&`r9O1E$=siWm(ZG**-eMzF~ez9z!`HA)wXH5@4% zW=`~`7AzM}n`-*M*M5;!xODo>APpn2Hu(<G%~>;FwCIJRty0iMvT^?ODENm6r+?8X zl}VQzF~r9_rm8*_m#Mf)g`k4+TCxPDzORzp{Ew*8r-IIe(g($}UAPIb=f}EL5`}Kk lyH%WZ<b<JRGA+=lvYZu_uq4}ASXot?WwZ8U?T6mVe*-YxP|^SZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py new file mode 100644 index 000000000..6ed629a30 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/bazaar.py @@ -0,0 +1,113 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path, rmtree +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Bazaar(VersionControl): + name = 'bzr' + dirname = '.bzr' + repo_name = 'branch' + schemes = ( + 'bzr', 'bzr+http', 'bzr+https', 'bzr+ssh', 'bzr+sftp', 'bzr+ftp', + 'bzr+lp', + ) + + def __init__(self, url=None, *args, **kwargs): + super(Bazaar, self).__init__(url, *args, **kwargs) + # This is only needed for python <2.7.5 + # Register lp but do not expose as a scheme to support bzr+lp. + if getattr(urllib_parse, 'uses_fragment', None): + urllib_parse.uses_fragment.extend(['lp']) + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def export(self, location): + """ + Export the Bazaar repository at the url to the destination location + """ + # Remove the location to make sure Bazaar can export it correctly + if os.path.exists(location): + rmtree(location) + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['export', location], + cwd=temp_dir.path, show_stdout=False, + ) + + def switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, rev_options): + cmd_args = ['pull', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + rev_options = self.make_rev_options(rev) + if self.check_destination(dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['branch', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def get_url_rev(self): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev = super(Bazaar, self).get_url_rev() + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev + + def get_url(self, location): + urls = self.run_command(['info'], show_stdout=False, cwd=location) + for line in urls.splitlines(): + line = line.strip() + for x in ('checkout of branch: ', + 'parent branch: '): + if line.startswith(x): + repo = line.split(x)[1] + if self._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + def get_revision(self, location): + revision = self.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + current_rev = self.get_revision(location) + return '%s@%s#egg=%s' % (repo, current_rev, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Bazaar) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/git.py b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/git.py new file mode 100644 index 000000000..7a63dfae7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/git.py @@ -0,0 +1,311 @@ +from __future__ import absolute_import + +import logging +import os.path +import re + +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib import request as urllib_request + +from pip._internal.compat import samefile +from pip._internal.exceptions import BadCommand +from pip._internal.utils.misc import display_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +urlsplit = urllib_parse.urlsplit +urlunsplit = urllib_parse.urlunsplit + + +logger = logging.getLogger(__name__) + + +HASH_REGEX = re.compile('[a-fA-F0-9]{40}') + + +def looks_like_hash(sha): + return bool(HASH_REGEX.match(sha)) + + +class Git(VersionControl): + name = 'git' + dirname = '.git' + repo_name = 'clone' + schemes = ( + 'git', 'git+http', 'git+https', 'git+ssh', 'git+git', 'git+file', + ) + # Prevent the user's environment variables from interfering with pip: + # https://github.com/pypa/pip/issues/1130 + unset_environ = ('GIT_DIR', 'GIT_WORK_TREE') + default_arg_rev = 'HEAD' + + def __init__(self, url=None, *args, **kwargs): + + # Works around an apparent Git bug + # (see http://article.gmane.org/gmane.comp.version-control.git/146500) + if url: + scheme, netloc, path, query, fragment = urlsplit(url) + if scheme.endswith('file'): + initial_slashes = path[:-len(path.lstrip('/'))] + newpath = ( + initial_slashes + + urllib_request.url2pathname(path) + .replace('\\', '/').lstrip('/') + ) + url = urlunsplit((scheme, netloc, newpath, query, fragment)) + after_plus = scheme.find('+') + 1 + url = scheme[:after_plus] + urlunsplit( + (scheme[after_plus:], netloc, newpath, query, fragment), + ) + + super(Git, self).__init__(url, *args, **kwargs) + + def get_base_rev_args(self, rev): + return [rev] + + def get_git_version(self): + VERSION_PFX = 'git version ' + version = self.run_command(['version'], show_stdout=False) + if version.startswith(VERSION_PFX): + version = version[len(VERSION_PFX):].split()[0] + else: + version = '' + # get first 3 positions of the git version becasue + # on windows it is x.y.z.windows.t, and this parses as + # LegacyVersion which always smaller than a Version. + version = '.'.join(version.split('.')[:3]) + return parse_version(version) + + def export(self, location): + """Export the Git repository at the url to the destination location""" + if not location.endswith('/'): + location = location + '/' + + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + self.run_command( + ['checkout-index', '-a', '-f', '--prefix', location], + show_stdout=False, cwd=temp_dir.path + ) + + def get_revision_sha(self, dest, rev): + """ + Return a commit hash for the given revision if it names a remote + branch or tag. Otherwise, return None. + + Args: + dest: the repository directory. + rev: the revision name. + """ + # Pass rev to pre-filter the list. + output = self.run_command(['show-ref', rev], cwd=dest, + show_stdout=False, on_returncode='ignore') + refs = {} + for line in output.strip().splitlines(): + try: + sha, ref = line.split() + except ValueError: + # Include the offending line to simplify troubleshooting if + # this error ever occurs. + raise ValueError('unexpected show-ref line: {!r}'.format(line)) + + refs[ref] = sha + + branch_ref = 'refs/remotes/origin/{}'.format(rev) + tag_ref = 'refs/tags/{}'.format(rev) + + return refs.get(branch_ref) or refs.get(tag_ref) + + def check_rev_options(self, dest, rev_options): + """Check the revision options before checkout. + + Returns a new RevOptions object for the SHA1 of the branch or tag + if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + sha = self.get_revision_sha(dest, rev) + + if sha is not None: + return rev_options.make_new(sha) + + # Do not show a warning for the common case of something that has + # the form of a Git commit hash. + if not looks_like_hash(rev): + logger.warning( + "Did not find branch or tag '%s', assuming revision or ref.", + rev, + ) + return rev_options + + def is_commit_id_equal(self, dest, name): + """ + Return whether the current commit hash equals the given name. + + Args: + dest: the repository directory. + name: a string name. + """ + if not name: + # Then avoid an unnecessary subprocess call. + return False + + return self.get_revision(dest) == name + + def switch(self, dest, url, rev_options): + self.run_command(['config', 'remote.origin.url', url], cwd=dest) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + self.update_submodules(dest) + + def update(self, dest, rev_options): + # First fetch changes from the default remote + if self.get_git_version() >= parse_version('1.9.0'): + # fetch tags in addition to everything else + self.run_command(['fetch', '-q', '--tags'], cwd=dest) + else: + self.run_command(['fetch', '-q'], cwd=dest) + # Then reset to wanted revision (maybe even origin/master) + rev_options = self.check_rev_options(dest, rev_options) + cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + rev_options = self.make_rev_options(rev) + if self.check_destination(dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', url, rev_display, display_path(dest), + ) + self.run_command(['clone', '-q', url, dest]) + + if rev: + rev_options = self.check_rev_options(dest, rev_options) + # Only do a checkout if the current commit id doesn't match + # the requested revision. + if not self.is_commit_id_equal(dest, rev_options.rev): + rev = rev_options.rev + # Only fetch the revision if it's a ref + if rev.startswith('refs/'): + self.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + rev = 'FETCH_HEAD' + self.run_command(['checkout', '-q', rev], cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + def get_url(self, location): + """Return URL of the first remote encountered.""" + remotes = self.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + show_stdout=False, cwd=location, + ) + remotes = remotes.splitlines() + found_remote = remotes[0] + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + def get_revision(self, location): + current_rev = self.run_command( + ['rev-parse', 'HEAD'], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + def _get_subdirectory(self, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = self.run_command(['rev-parse', '--git-dir'], + show_stdout=False, cwd=location).strip() + if not os.path.isabs(git_dir): + git_dir = os.path.join(location, git_dir) + root_dir = os.path.join(git_dir, '..') + # find setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + # relative path of setup.py to repo root + if samefile(root_dir, location): + return None + return os.path.relpath(location, root_dir) + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev = self.get_revision(location) + req = '%s@%s#egg=%s' % (repo, current_rev, egg_project_name) + subdirectory = self._get_subdirectory(location) + if subdirectory: + req += '&subdirectory=' + subdirectory + return req + + def get_url_rev(self): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes doesn't + work with a ssh:// scheme (e.g. Github). But we need a scheme for + parsing. Hence we remove it again afterwards and return it as a stub. + """ + if '://' not in self.url: + assert 'file:' not in self.url + self.url = self.url.replace('git+', 'git+ssh://') + url, rev = super(Git, self).get_url_rev() + url = url.replace('ssh://', '') + else: + url, rev = super(Git, self).get_url_rev() + + return url, rev + + def update_submodules(self, location): + if not os.path.exists(os.path.join(location, '.gitmodules')): + return + self.run_command( + ['submodule', 'update', '--init', '--recursive', '-q'], + cwd=location, + ) + + @classmethod + def controls_location(cls, location): + if super(Git, cls).controls_location(location): + return True + try: + r = cls().run_command(['rev-parse'], + cwd=location, + show_stdout=False, + on_returncode='ignore') + return not r + except BadCommand: + logger.debug("could not determine if %s is under git control " + "because git is not available", location) + return False + + +vcs.register(Git) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py new file mode 100644 index 000000000..393647375 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/mercurial.py @@ -0,0 +1,105 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._vendor.six.moves import configparser + +from pip._internal.download import path_to_url +from pip._internal.utils.misc import display_path +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import VersionControl, vcs + +logger = logging.getLogger(__name__) + + +class Mercurial(VersionControl): + name = 'hg' + dirname = '.hg' + repo_name = 'clone' + schemes = ('hg', 'hg+http', 'hg+https', 'hg+ssh', 'hg+static-http') + + def get_base_rev_args(self, rev): + return [rev] + + def export(self, location): + """Export the Hg repository at the url to the destination location""" + with TempDirectory(kind="export") as temp_dir: + self.unpack(temp_dir.path) + + self.run_command( + ['archive', location], show_stdout=False, cwd=temp_dir.path + ) + + def switch(self, dest, url, rev_options): + repo_config = os.path.join(dest, self.dirname, 'hgrc') + config = configparser.SafeConfigParser() + try: + config.read(repo_config) + config.set('paths', 'default', url) + with open(repo_config, 'w') as config_file: + config.write(config_file) + except (OSError, configparser.NoSectionError) as exc: + logger.warning( + 'Could not switch Mercurial repository to %s: %s', url, exc, + ) + else: + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def update(self, dest, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def obtain(self, dest): + url, rev = self.get_url_rev() + rev_options = self.make_rev_options(rev) + if self.check_destination(dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning hg %s%s to %s', + url, + rev_display, + display_path(dest), + ) + self.run_command(['clone', '--noupdate', '-q', url, dest]) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def get_url(self, location): + url = self.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if self._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + def get_revision(self, location): + current_revision = self.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + def get_revision_hash(self, location): + current_rev_hash = self.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + egg_project_name = dist.egg_name().split('-', 1)[0] + if not repo: + return None + current_rev_hash = self.get_revision_hash(location) + return '%s@%s#egg=%s' % (repo, current_rev_hash, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Mercurial) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py new file mode 100644 index 000000000..95e5440ef --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/vcs/subversion.py @@ -0,0 +1,271 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._vendor.six.moves.urllib import parse as urllib_parse + +from pip._internal.index import Link +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, rmtree +from pip._internal.vcs import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_svn_url_re = re.compile(r'URL: (.+)') +_svn_revision_re = re.compile(r'Revision: (.+)') +_svn_info_xml_rev_re = re.compile(r'\s*revision="(\d+)"') +_svn_info_xml_url_re = re.compile(r'<url>(.*)</url>') + + +logger = logging.getLogger(__name__) + + +class Subversion(VersionControl): + name = 'svn' + dirname = '.svn' + repo_name = 'checkout' + schemes = ('svn', 'svn+ssh', 'svn+http', 'svn+https', 'svn+svn') + + def get_base_rev_args(self, rev): + return ['-r', rev] + + def get_info(self, location): + """Returns (url, revision), where both are strings""" + assert not location.rstrip('/').endswith(self.dirname), \ + 'Bad directory: %s' % location + output = self.run_command( + ['info', location], + show_stdout=False, + extra_environ={'LANG': 'C'}, + ) + match = _svn_url_re.search(output) + if not match: + logger.warning( + 'Cannot determine URL of svn checkout %s', + display_path(location), + ) + logger.debug('Output that cannot be parsed: \n%s', output) + return None, None + url = match.group(1).strip() + match = _svn_revision_re.search(output) + if not match: + logger.warning( + 'Cannot determine revision of svn checkout %s', + display_path(location), + ) + logger.debug('Output that cannot be parsed: \n%s', output) + return url, None + return url, match.group(1) + + def export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev = self.get_url_rev() + rev_options = get_rev_options(self, url, rev) + url = self.remove_auth_from_url(url) + logger.info('Exporting svn repository %s to %s', url, location) + with indent_log(): + if os.path.exists(location): + # Subversion doesn't like to check out over an existing + # directory --force fixes this, but was only added in svn 1.5 + rmtree(location) + cmd_args = ['export'] + rev_options.to_args() + [url, location] + self.run_command(cmd_args, show_stdout=False) + + def switch(self, dest, url, rev_options): + cmd_args = ['switch'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def update(self, dest, rev_options): + cmd_args = ['update'] + rev_options.to_args() + [dest] + self.run_command(cmd_args) + + def obtain(self, dest): + url, rev = self.get_url_rev() + rev_options = get_rev_options(self, url, rev) + url = self.remove_auth_from_url(url) + if self.check_destination(dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Checking out %s%s to %s', + url, + rev_display, + display_path(dest), + ) + cmd_args = ['checkout', '-q'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def get_location(self, dist, dependency_links): + for url in dependency_links: + egg_fragment = Link(url).egg_fragment + if not egg_fragment: + continue + if '-' in egg_fragment: + # FIXME: will this work when a package has - in the name? + key = '-'.join(egg_fragment.split('-')[:-1]).lower() + else: + key = egg_fragment + if key == dist.key: + return url.split('#', 1)[0] + return None + + def get_revision(self, location): + """ + Return the maximum revision for all files under a given location + """ + # Note: taken from setuptools.command.egg_info + revision = 0 + + for base, dirs, files in os.walk(location): + if self.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(self.dirname) + entries_fn = os.path.join(base, self.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = self._get_svn_url_rev(base) + + if base == location: + base = dirurl + '/' # save the root url + elif not dirurl or not dirurl.startswith(base): + dirs[:] = [] + continue # not part of the same svn tree, skip it + revision = max(revision, localrev) + return revision + + def get_url_rev(self): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev = super(Subversion, self).get_url_rev() + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev + + def get_url(self, location): + # In cases where the source is in a subdirectory, not alongside + # setup.py we have to look up in the location until we find a real + # setup.py + orig_location = location + while not os.path.exists(os.path.join(location, 'setup.py')): + last_location = location + location = os.path.dirname(location) + if location == last_location: + # We've traversed up to the root of the filesystem without + # finding setup.py + logger.warning( + "Could not find setup.py for directory %s (tried all " + "parent directories)", + orig_location, + ) + return None + + return self._get_svn_url_rev(location)[0] + + def _get_svn_url_rev(self, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, self.dirname, 'entries') + if os.path.exists(entries_path): + with open(entries_path) as f: + data = f.read() + else: # subversion >= 1.7 does not have the 'entries' file + data = '' + + if (data.startswith('8') or + data.startswith('9') or + data.startswith('10')): + data = list(map(str.splitlines, data.split('\n\x0c\n'))) + del data[0][0] # get rid of the '8' + url = data[0][3] + revs = [int(d[9]) for d in data if len(d) > 9 and d[9]] + [0] + elif data.startswith('<?xml'): + match = _svn_xml_url_re.search(data) + if not match: + raise ValueError('Badly formatted data: %r' % data) + url = match.group(1) # get repository URL + revs = [int(m.group(1)) for m in _svn_rev_re.finditer(data)] + [0] + else: + try: + # subversion >= 1.7 + xml = self.run_command( + ['info', '--xml', location], + show_stdout=False, + ) + url = _svn_info_xml_url_re.search(xml).group(1) + revs = [ + int(m.group(1)) for m in _svn_info_xml_rev_re.finditer(xml) + ] + except InstallationError: + url, revs = None, [] + + if revs: + rev = max(revs) + else: + rev = 0 + + return url, rev + + def get_src_requirement(self, dist, location): + repo = self.get_url(location) + if repo is None: + return None + # FIXME: why not project name? + egg_project_name = dist.egg_name().split('-', 1)[0] + rev = self.get_revision(location) + return 'svn+%s@%s#egg=%s' % (repo, rev, egg_project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + @staticmethod + def remove_auth_from_url(url): + # Return a copy of url with 'username:password@' removed. + # username/pass params are passed to subversion through flags + # and are not recognized in the url. + + # parsed url + purl = urllib_parse.urlsplit(url) + stripped_netloc = \ + purl.netloc.split('@')[-1] + + # stripped url + url_pieces = ( + purl.scheme, stripped_netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def get_rev_options(vcs, url, rev): + """ + Return a RevOptions object. + """ + r = urllib_parse.urlsplit(url) + if hasattr(r, 'username'): + # >= Python-2.5 + username, password = r.username, r.password + else: + netloc = r[1] + if '@' in netloc: + auth = netloc.split('@')[0] + if ':' in auth: + username, password = auth.split(':', 1) + else: + username, password = auth, None + else: + username, password = None, None + + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return vcs.make_rev_options(rev, extra_args=extra_args) + + +vcs.register(Subversion) diff --git a/myenv/lib/python3.7/site-packages/pip/_internal/wheel.py b/myenv/lib/python3.7/site-packages/pip/_internal/wheel.py new file mode 100644 index 000000000..36459dd78 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_internal/wheel.py @@ -0,0 +1,817 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import collections +import compileall +import copy +import csv +import hashlib +import logging +import os.path +import re +import shutil +import stat +import sys +import warnings +from base64 import urlsafe_b64encode +from email.parser import Parser + +from pip._vendor import pkg_resources +from pip._vendor.distlib.scripts import ScriptMaker +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.six import StringIO + +from pip._internal import pep425tags +from pip._internal.build_env import BuildEnvironment +from pip._internal.download import path_to_url, unpack_url +from pip._internal.exceptions import ( + InstallationError, InvalidWheelFilename, UnsupportedWheel, +) +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, distutils_scheme, +) +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + call_subprocess, captured_stdout, ensure_dir, read_chunks, +) +from pip._internal.utils.setuptools_build import SETUPTOOLS_SHIM +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.utils.ui import open_spinner + +if MYPY_CHECK_RUNNING: + from typing import Dict, List, Optional + +wheel_ext = '.whl' + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def rehash(path, algo='sha256', blocksize=1 << 20): + """Return (hash, length) for path using hashlib.new(algo)""" + h = hashlib.new(algo) + length = 0 + with open(path, 'rb') as f: + for block in read_chunks(f, size=blocksize): + length += len(block) + h.update(block) + digest = 'sha256=' + urlsafe_b64encode( + h.digest() + ).decode('latin1').rstrip('=') + return (digest, length) + + +def open_for_csv(name, mode): + if sys.version_info[0] < 3: + nl = {} + bin = 'b' + else: + nl = {'newline': ''} + bin = '' + return open(name, mode + bin, **nl) + + +def fix_script(path): + """Replace #!python with #!/path/to/python + Return True if file was changed.""" + # XXX RECORD hashes will need to be updated + if os.path.isfile(path): + with open(path, 'rb') as script: + firstline = script.readline() + if not firstline.startswith(b'#!python'): + return False + exename = sys.executable.encode(sys.getfilesystemencoding()) + firstline = b'#!' + exename + os.linesep.encode("ascii") + rest = script.read() + with open(path, 'wb') as script: + script.write(firstline) + script.write(rest) + return True + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + """ + Return True if the extracted wheel in wheeldir should go into purelib. + """ + name_folded = name.replace("-", "_") + for item in os.listdir(wheeldir): + match = dist_info_re.match(item) + if match and match.group('name') == name_folded: + with open(os.path.join(wheeldir, item, 'WHEEL')) as wheel: + for line in wheel: + line = line.lower().rstrip() + if line == "root-is-purelib: true": + return True + return False + + +def get_entrypoints(filename): + if not os.path.exists(filename): + return {}, {} + + # This is done because you can pass a string to entry_points wrappers which + # means that they may or may not be valid INI files. The attempt here is to + # strip leading and trailing whitespace in order to make them valid INI + # files. + with open(filename) as fp: + data = StringIO() + for line in fp: + data.write(line.strip()) + data.write("\n") + data.seek(0) + + # get the entry points and then the script names + entry_points = pkg_resources.EntryPoint.parse_map(data) + console = entry_points.get('console_scripts', {}) + gui = entry_points.get('gui_scripts', {}) + + def _split_ep(s): + """get the string representation of EntryPoint, remove space and split + on '='""" + return str(s).replace(" ", "").split("=") + + # convert the EntryPoint objects into strings with module:function + console = dict(_split_ep(v) for v in console.values()) + gui = dict(_split_ep(v) for v in gui.values()) + return console, gui + + +def message_about_scripts_not_on_PATH(scripts): + # type: (List[str]) -> Optional[str] + """Determine if any scripts are not on PATH and format a warning. + + Returns a warning message if one or more scripts are not on PATH, + otherwise None. + """ + if not scripts: + return None + + # Group scripts by the path they were installed in + grouped_by_dir = collections.defaultdict(set) # type: Dict[str, set] + for destfile in scripts: + parent_dir = os.path.dirname(destfile) + script_name = os.path.basename(destfile) + grouped_by_dir[parent_dir].add(script_name) + + # We don't want to warn for directories that are on PATH. + not_warn_dirs = [ + os.path.normcase(i) for i in os.environ["PATH"].split(os.pathsep) + ] + # If an executable sits with sys.executable, we don't warn for it. + # This covers the case of venv invocations without activating the venv. + not_warn_dirs.append(os.path.normcase(os.path.dirname(sys.executable))) + warn_for = { + parent_dir: scripts for parent_dir, scripts in grouped_by_dir.items() + if os.path.normcase(parent_dir) not in not_warn_dirs + } + if not warn_for: + return None + + # Format a message + msg_lines = [] + for parent_dir, scripts in warn_for.items(): + scripts = sorted(scripts) + if len(scripts) == 1: + start_text = "script {} is".format(scripts[0]) + else: + start_text = "scripts {} are".format( + ", ".join(scripts[:-1]) + " and " + scripts[-1] + ) + + msg_lines.append( + "The {} installed in '{}' which is not on PATH." + .format(start_text, parent_dir) + ) + + last_line_fmt = ( + "Consider adding {} to PATH or, if you prefer " + "to suppress this warning, use --no-warn-script-location." + ) + if len(msg_lines) == 1: + msg_lines.append(last_line_fmt.format("this directory")) + else: + msg_lines.append(last_line_fmt.format("these directories")) + + # Returns the formatted multiline message + return "\n".join(msg_lines) + + +def move_wheel_files(name, req, wheeldir, user=False, home=None, root=None, + pycompile=True, scheme=None, isolated=False, prefix=None, + warn_script_location=True): + """Install a wheel""" + + if not scheme: + scheme = distutils_scheme( + name, user=user, home=home, root=root, isolated=isolated, + prefix=prefix, + ) + + if root_is_purelib(name, wheeldir): + lib_dir = scheme['purelib'] + else: + lib_dir = scheme['platlib'] + + info_dir = [] + data_dirs = [] + source = wheeldir.rstrip(os.path.sep) + os.path.sep + + # Record details of the files moved + # installed = files copied from the wheel to the destination + # changed = files changed while installing (scripts #! line typically) + # generated = files newly generated during the install (script wrappers) + installed = {} + changed = set() + generated = [] + + # Compile all of the pyc files that we're going to be installing + if pycompile: + with captured_stdout() as stdout: + with warnings.catch_warnings(): + warnings.filterwarnings('ignore') + compileall.compile_dir(source, force=True, quiet=True) + logger.debug(stdout.getvalue()) + + def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + def record_installed(srcfile, destfile, modified=False): + """Map archive RECORD paths to installation RECORD paths.""" + oldpath = normpath(srcfile, wheeldir) + newpath = normpath(destfile, lib_dir) + installed[oldpath] = newpath + if modified: + changed.add(destfile) + + def clobber(source, dest, is_base, fixer=None, filter=None): + ensure_dir(dest) # common for the 'include' path + + for dir, subdirs, files in os.walk(source): + basedir = dir[len(source):].lstrip(os.path.sep) + destdir = os.path.join(dest, basedir) + if is_base and basedir.split(os.path.sep, 1)[0].endswith('.data'): + continue + for s in subdirs: + destsubdir = os.path.join(dest, basedir, s) + if is_base and basedir == '' and destsubdir.endswith('.data'): + data_dirs.append(s) + continue + elif (is_base and + s.endswith('.dist-info') and + canonicalize_name(s).startswith( + canonicalize_name(req.name))): + assert not info_dir, ('Multiple .dist-info directories: ' + + destsubdir + ', ' + + ', '.join(info_dir)) + info_dir.append(destsubdir) + for f in files: + # Skip unwanted files + if filter and filter(f): + continue + srcfile = os.path.join(dir, f) + destfile = os.path.join(dest, basedir, f) + # directory creation is lazy and after the file filtering above + # to ensure we don't install empty dirs; empty dirs can't be + # uninstalled. + ensure_dir(destdir) + + # We use copyfile (not move, copy, or copy2) to be extra sure + # that we are not moving directories over (copyfile fails for + # directories) as well as to ensure that we are not copying + # over any metadata because we want more control over what + # metadata we actually copy over. + shutil.copyfile(srcfile, destfile) + + # Copy over the metadata for the file, currently this only + # includes the atime and mtime. + st = os.stat(srcfile) + if hasattr(os, "utime"): + os.utime(destfile, (st.st_atime, st.st_mtime)) + + # If our file is executable, then make our destination file + # executable. + if os.access(srcfile, os.X_OK): + st = os.stat(srcfile) + permissions = ( + st.st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH + ) + os.chmod(destfile, permissions) + + changed = False + if fixer: + changed = fixer(destfile) + record_installed(srcfile, destfile, changed) + + clobber(source, lib_dir, True) + + assert info_dir, "%s .dist-info directory not found" % req + + # Get the defined entry points + ep_file = os.path.join(info_dir[0], 'entry_points.txt') + console, gui = get_entrypoints(ep_file) + + def is_entrypoint_wrapper(name): + # EP, EP.exe and EP-script.py are scripts generated for + # entry point EP by setuptools + if name.lower().endswith('.exe'): + matchname = name[:-4] + elif name.lower().endswith('-script.py'): + matchname = name[:-10] + elif name.lower().endswith(".pya"): + matchname = name[:-4] + else: + matchname = name + # Ignore setuptools-generated scripts + return (matchname in console or matchname in gui) + + for datadir in data_dirs: + fixer = None + filter = None + for subdir in os.listdir(os.path.join(wheeldir, datadir)): + fixer = None + if subdir == 'scripts': + fixer = fix_script + filter = is_entrypoint_wrapper + source = os.path.join(wheeldir, datadir, subdir) + dest = scheme[subdir] + clobber(source, dest, False, fixer=fixer, filter=filter) + + maker = ScriptMaker(None, scheme['scripts']) + + # Ensure old scripts are overwritten. + # See https://github.com/pypa/pip/issues/1800 + maker.clobber = True + + # Ensure we don't generate any variants for scripts because this is almost + # never what somebody wants. + # See https://bitbucket.org/pypa/distlib/issue/35/ + maker.variants = {''} + + # This is required because otherwise distlib creates scripts that are not + # executable. + # See https://bitbucket.org/pypa/distlib/issue/32/ + maker.set_mode = True + + # Simplify the script and fix the fact that the default script swallows + # every single stack trace. + # See https://bitbucket.org/pypa/distlib/issue/34/ + # See https://bitbucket.org/pypa/distlib/issue/33/ + def _get_script_text(entry): + if entry.suffix is None: + raise InstallationError( + "Invalid script entry point: %s for req: %s - A callable " + "suffix is required. Cf https://packaging.python.org/en/" + "latest/distributing.html#console-scripts for more " + "information." % (entry, req) + ) + return maker.script_template % { + "module": entry.prefix, + "import_name": entry.suffix.split(".")[0], + "func": entry.suffix, + } + + maker._get_script_text = _get_script_text + maker.script_template = r"""# -*- coding: utf-8 -*- +import re +import sys + +from %(module)s import %(import_name)s + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(%(func)s()) +""" + + # Special case pip and setuptools to generate versioned wrappers + # + # The issue is that some projects (specifically, pip and setuptools) use + # code in setup.py to create "versioned" entry points - pip2.7 on Python + # 2.7, pip3.3 on Python 3.3, etc. But these entry points are baked into + # the wheel metadata at build time, and so if the wheel is installed with + # a *different* version of Python the entry points will be wrong. The + # correct fix for this is to enhance the metadata to be able to describe + # such versioned entry points, but that won't happen till Metadata 2.0 is + # available. + # In the meantime, projects using versioned entry points will either have + # incorrect versioned entry points, or they will not be able to distribute + # "universal" wheels (i.e., they will need a wheel per Python version). + # + # Because setuptools and pip are bundled with _ensurepip and virtualenv, + # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we + # override the versioned entry points in the wheel and generate the + # correct ones. This code is purely a short-term measure until Metadata 2.0 + # is available. + # + # To add the level of hack in this section of code, in order to support + # ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment + # variable which will control which version scripts get installed. + # + # ENSUREPIP_OPTIONS=altinstall + # - Only pipX.Y and easy_install-X.Y will be generated and installed + # ENSUREPIP_OPTIONS=install + # - pipX.Y, pipX, easy_install-X.Y will be generated and installed. Note + # that this option is technically if ENSUREPIP_OPTIONS is set and is + # not altinstall + # DEFAULT + # - The default behavior is to install pip, pipX, pipX.Y, easy_install + # and easy_install-X.Y. + pip_script = console.pop('pip', None) + if pip_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'pip = ' + pip_script + generated.extend(maker.make(spec)) + + if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": + spec = 'pip%s = %s' % (sys.version[:1], pip_script) + generated.extend(maker.make(spec)) + + spec = 'pip%s = %s' % (sys.version[:3], pip_script) + generated.extend(maker.make(spec)) + # Delete any other versioned pip entry points + pip_ep = [k for k in console if re.match(r'pip(\d(\.\d)?)?$', k)] + for k in pip_ep: + del console[k] + easy_install_script = console.pop('easy_install', None) + if easy_install_script: + if "ENSUREPIP_OPTIONS" not in os.environ: + spec = 'easy_install = ' + easy_install_script + generated.extend(maker.make(spec)) + + spec = 'easy_install-%s = %s' % (sys.version[:3], easy_install_script) + generated.extend(maker.make(spec)) + # Delete any other versioned easy_install entry points + easy_install_ep = [ + k for k in console if re.match(r'easy_install(-\d\.\d)?$', k) + ] + for k in easy_install_ep: + del console[k] + + # Generate the console and GUI entry points specified in the wheel + if len(console) > 0: + generated_console_scripts = maker.make_multiple( + ['%s = %s' % kv for kv in console.items()] + ) + generated.extend(generated_console_scripts) + + if warn_script_location: + msg = message_about_scripts_not_on_PATH(generated_console_scripts) + if msg is not None: + logger.warn(msg) + + if len(gui) > 0: + generated.extend( + maker.make_multiple( + ['%s = %s' % kv for kv in gui.items()], + {'gui': True} + ) + ) + + # Record pip as the installer + installer = os.path.join(info_dir[0], 'INSTALLER') + temp_installer = os.path.join(info_dir[0], 'INSTALLER.pip') + with open(temp_installer, 'wb') as installer_file: + installer_file.write(b'pip\n') + shutil.move(temp_installer, installer) + generated.append(installer) + + # Record details of all files installed + record = os.path.join(info_dir[0], 'RECORD') + temp_record = os.path.join(info_dir[0], 'RECORD.pip') + with open_for_csv(record, 'r') as record_in: + with open_for_csv(temp_record, 'w+') as record_out: + reader = csv.reader(record_in) + writer = csv.writer(record_out) + for row in reader: + row[0] = installed.pop(row[0], row[0]) + if row[0] in changed: + row[1], row[2] = rehash(row[0]) + writer.writerow(row) + for f in generated: + h, l = rehash(f) + writer.writerow((normpath(f, lib_dir), h, l)) + for f in installed: + writer.writerow((installed[f], '', '')) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return False if we couldn't parse / extract it. + """ + try: + dist = [d for d in pkg_resources.find_on_path(None, source_dir)][0] + + wheel_data = dist.get_metadata('WHEEL') + wheel_data = Parser().parsestr(wheel_data) + + version = wheel_data['Wheel-Version'].strip() + version = tuple(map(int, version.split('.'))) + return version + except: + return False + + +def check_compatibility(version, name): + """ + Raises errors or warns if called with an incompatible Wheel-Version. + + Pip should refuse to install a Wheel-Version that's a major series + ahead of what it's compatible with (e.g 2.0 > 1.1); and warn when + installing a version only minor version ahead (e.g 1.2 > 1.1). + + version: a 2-tuple representing a Wheel-Version (Major, Minor) + name: name of wheel or package to raise exception about + + :raises UnsupportedWheel: when an incompatible Wheel-Version is given + """ + if not version: + raise UnsupportedWheel( + "%s is in an unsupported or invalid wheel" % name + ) + if version[0] > VERSION_COMPATIBLE[0]: + raise UnsupportedWheel( + "%s's Wheel-Version (%s) is not compatible with this version " + "of pip" % (name, '.'.join(map(str, version))) + ) + elif version > VERSION_COMPATIBLE: + logger.warning( + 'Installing from a newer Wheel-Version (%s)', + '.'.join(map(str, version)), + ) + + +class Wheel(object): + """A wheel file""" + + # TODO: maybe move the install code into this class + + wheel_file_re = re.compile( + r"""^(?P<namever>(?P<name>.+?)-(?P<ver>.*?)) + ((-(?P<build>\d[^-]*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?) + \.whl|\.dist-info)$""", + re.VERBOSE + ) + + def __init__(self, filename): + """ + :raises InvalidWheelFilename: when the filename is invalid for a wheel + """ + wheel_info = self.wheel_file_re.match(filename) + if not wheel_info: + raise InvalidWheelFilename( + "%s is not a valid wheel filename." % filename + ) + self.filename = filename + self.name = wheel_info.group('name').replace('_', '-') + # we'll assume "_" means "-" due to wheel naming scheme + # (https://github.com/pypa/pip/issues/1150) + self.version = wheel_info.group('ver').replace('_', '-') + self.build_tag = wheel_info.group('build') + self.pyversions = wheel_info.group('pyver').split('.') + self.abis = wheel_info.group('abi').split('.') + self.plats = wheel_info.group('plat').split('.') + + # All the tag combinations from this file + self.file_tags = { + (x, y, z) for x in self.pyversions + for y in self.abis for z in self.plats + } + + def support_index_min(self, tags=None): + """ + Return the lowest index that one of the wheel's file_tag combinations + achieves in the supported_tags list e.g. if there are 8 supported tags, + and one of the file tags is first in the list, then return 0. Returns + None is the wheel is not supported. + """ + if tags is None: # for mock + tags = pep425tags.get_supported() + indexes = [tags.index(c) for c in self.file_tags if c in tags] + return min(indexes) if indexes else None + + def supported(self, tags=None): + """Is this wheel supported on this system?""" + if tags is None: # for mock + tags = pep425tags.get_supported() + return bool(set(tags).intersection(self.file_tags)) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__(self, finder, preparer, wheel_cache, + build_options=None, global_options=None, no_clean=False): + self.finder = finder + self.preparer = preparer + self.wheel_cache = wheel_cache + + self._wheel_dir = preparer.wheel_download_dir + + self.build_options = build_options or [] + self.global_options = global_options or [] + self.no_clean = no_clean + + def _build_one(self, req, output_dir, python_tag=None): + """Build one wheel. + + :return: The filename of the built wheel, or None if the build failed. + """ + # Install build deps into temporary directory (PEP 518) + with req.build_env: + return self._build_one_inside_env(req, output_dir, + python_tag=python_tag) + + def _build_one_inside_env(self, req, output_dir, python_tag=None): + with TempDirectory(kind="wheel") as temp_dir: + if self.__build_one(req, temp_dir.path, python_tag=python_tag): + try: + wheel_name = os.listdir(temp_dir.path)[0] + wheel_path = os.path.join(output_dir, wheel_name) + shutil.move( + os.path.join(temp_dir.path, wheel_name), wheel_path + ) + logger.info('Stored in directory: %s', output_dir) + return wheel_path + except: + pass + # Ignore return, we can't do anything else useful. + self._clean_one(req) + return None + + def _base_setup_args(self, req): + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. + return [ + sys.executable, '-u', '-c', + SETUPTOOLS_SHIM % req.setup_py + ] + list(self.global_options) + + def __build_one(self, req, tempd, python_tag=None): + base_args = self._base_setup_args(req) + + spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,) + with open_spinner(spin_message) as spinner: + logger.debug('Destination directory: %s', tempd) + wheel_args = base_args + ['bdist_wheel', '-d', tempd] \ + + self.build_options + + if python_tag is not None: + wheel_args += ["--python-tag", python_tag] + + try: + call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + return True + except: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return False + + def _clean_one(self, req): + base_args = self._base_setup_args(req) + + logger.info('Running setup.py clean for %s', req.name) + clean_args = base_args + ['clean', '--all'] + try: + call_subprocess(clean_args, cwd=req.source_dir, show_stdout=False) + return True + except: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build(self, requirements, session, autobuilding=False): + """Build wheels. + + :param unpack: If True, replace the sdist we built from with the + newly built wheel, in preparation for installation. + :return: True if all the wheels built correctly. + """ + from pip._internal import index + + building_is_possible = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert building_is_possible + + buildset = [] + for req in requirements: + if req.constraint: + continue + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + elif autobuilding and req.editable: + pass + elif autobuilding and not req.source_dir: + pass + elif autobuilding and req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + buildset.append((req, True)) + else: + ephem_cache = False + if autobuilding: + link = req.link + base, ext = link.splitext() + if index.egg_info_matches(base, None, link) is None: + # E.g. local directory. Build wheel just for this run. + ephem_cache = True + if "binary" not in index.fmt_ctl_formats( + self.finder.format_control, + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + continue + buildset.append((req, ephem_cache)) + + if not buildset: + return True + + # Build the wheels. + logger.info( + 'Building wheels for collected packages: %s', + ', '.join([req.name for (req, _) in buildset]), + ) + _cache = self.wheel_cache # shorter name + with indent_log(): + build_success, build_failure = [], [] + for req, ephem in buildset: + python_tag = None + if autobuilding: + python_tag = pep425tags.implementation_tag + if ephem: + output_dir = _cache.get_ephem_path_for_link(req.link) + else: + output_dir = _cache.get_path_for_link(req.link) + try: + ensure_dir(output_dir) + except OSError as e: + logger.warning("Building wheel for %s failed: %s", + req.name, e) + build_failure.append(req) + continue + else: + output_dir = self._wheel_dir + wheel_file = self._build_one( + req, output_dir, + python_tag=python_tag, + ) + if wheel_file: + build_success.append(req) + if autobuilding: + # XXX: This is mildly duplicative with prepare_files, + # but not close enough to pull out to a single common + # method. + # The code below assumes temporary source dirs - + # prevent it doing bad things. + if req.source_dir and not os.path.exists(os.path.join( + req.source_dir, PIP_DELETE_MARKER_FILENAME)): + raise AssertionError( + "bad source dir - missing marker") + # Delete the source we built the wheel from + req.remove_temporary_source() + # set the build directory again - name is known from + # the work prepare_files did. + req.source_dir = req.build_location( + self.preparer.build_dir + ) + # Update the link for this. + req.link = index.Link(path_to_url(wheel_file)) + assert req.link.is_wheel + # extract the wheel into the dir + unpack_url( + req.link, req.source_dir, None, False, + session=session, + ) + else: + build_failure.append(req) + + # notify success/failure + if build_success: + logger.info( + 'Successfully built %s', + ' '.join([req.name for req in build_success]), + ) + if build_failure: + logger.info( + 'Failed to build %s', + ' '.join([req.name for req in build_failure]), + ) + # Return True if all builds were successful + return len(build_failure) == 0 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/__init__.py new file mode 100644 index 000000000..607757f90 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/__init__.py @@ -0,0 +1,109 @@ +""" +pip._vendor is for vendoring dependencies of pip to prevent needing pip to +depend on something external. + +Files inside of pip._vendor should be considered immutable and should only be +updated to versions from upstream. +""" +from __future__ import absolute_import + +import glob +import os.path +import sys + +# Downstream redistributors which have debundled our dependencies should also +# patch this value to be true. This will trigger the additional patching +# to cause things like "six" to be available as pip. +DEBUNDLED = False + +# By default, look in this directory for a bunch of .whl files which we will +# add to the beginning of sys.path before attempting to import anything. This +# is done to support downstream re-distributors like Debian and Fedora who +# wish to create their own Wheels for our dependencies to aid in debundling. +WHEEL_DIR = os.path.abspath(os.path.dirname(__file__)) + + +# Define a small helper function to alias our vendored modules to the real ones +# if the vendored ones do not exist. This idea of this was taken from +# https://github.com/kennethreitz/requests/pull/2567. +def vendored(modulename): + vendored_name = "{0}.{1}".format(__name__, modulename) + + try: + __import__(vendored_name, globals(), locals(), level=0) + except ImportError: + try: + __import__(modulename, globals(), locals(), level=0) + except ImportError: + # We can just silently allow import failures to pass here. If we + # got to this point it means that ``import pip._vendor.whatever`` + # failed and so did ``import whatever``. Since we're importing this + # upfront in an attempt to alias imports, not erroring here will + # just mean we get a regular import error whenever pip *actually* + # tries to import one of these modules to use it, which actually + # gives us a better error message than we would have otherwise + # gotten. + pass + else: + sys.modules[vendored_name] = sys.modules[modulename] + base, head = vendored_name.rsplit(".", 1) + setattr(sys.modules[base], head, sys.modules[modulename]) + + +# If we're operating in a debundled setup, then we want to go ahead and trigger +# the aliasing of our vendored libraries as well as looking for wheels to add +# to our sys.path. This will cause all of this code to be a no-op typically +# however downstream redistributors can enable it in a consistent way across +# all platforms. +if DEBUNDLED: + # Actually look inside of WHEEL_DIR to find .whl files and add them to the + # front of our sys.path. + sys.path[:] = glob.glob(os.path.join(WHEEL_DIR, "*.whl")) + sys.path + + # Actually alias all of our vendored dependencies. + vendored("cachecontrol") + vendored("colorama") + vendored("distlib") + vendored("distro") + vendored("html5lib") + vendored("lockfile") + vendored("six") + vendored("six.moves") + vendored("six.moves.urllib") + vendored("six.moves.urllib.parse") + vendored("packaging") + vendored("packaging.version") + vendored("packaging.specifiers") + vendored("pkg_resources") + vendored("progress") + vendored("pytoml") + vendored("retrying") + vendored("requests") + vendored("requests.packages") + vendored("requests.packages.urllib3") + vendored("requests.packages.urllib3._collections") + vendored("requests.packages.urllib3.connection") + vendored("requests.packages.urllib3.connectionpool") + vendored("requests.packages.urllib3.contrib") + vendored("requests.packages.urllib3.contrib.ntlmpool") + vendored("requests.packages.urllib3.contrib.pyopenssl") + vendored("requests.packages.urllib3.exceptions") + vendored("requests.packages.urllib3.fields") + vendored("requests.packages.urllib3.filepost") + vendored("requests.packages.urllib3.packages") + vendored("requests.packages.urllib3.packages.ordered_dict") + vendored("requests.packages.urllib3.packages.six") + vendored("requests.packages.urllib3.packages.ssl_match_hostname") + vendored("requests.packages.urllib3.packages.ssl_match_hostname." + "_implementation") + vendored("requests.packages.urllib3.poolmanager") + vendored("requests.packages.urllib3.request") + vendored("requests.packages.urllib3.response") + vendored("requests.packages.urllib3.util") + vendored("requests.packages.urllib3.util.connection") + vendored("requests.packages.urllib3.util.request") + vendored("requests.packages.urllib3.util.response") + vendored("requests.packages.urllib3.util.retry") + vendored("requests.packages.urllib3.util.ssl_") + vendored("requests.packages.urllib3.util.timeout") + vendored("requests.packages.urllib3.util.url") diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d5c0e21e5548a656d8034ac3338b90e87f9b1a0 GIT binary patch literal 2851 zcmbW2U2oMk7{~1-C+DRt6jln|1`F>LMh<V)U_#TxS~MiY#l{3X+LWcSPft#rIM_aC zoX}o%yPUL7FtyTd_LZz@H@o61?25-ZZim=<ibxdy9Q&Uq_VYZp@6F7#5M2Go^WVQb ziqPNYW%u%-@;N;6FN_dD9Yip37|xuIgH7FKZpW?Yb!rv;j!(Q!o!0t|?PgWB=+qA0 z!JTPRBmPgQGehgYVxg(K?N<GV=rpPCI6Ij7{l;-*O5zgtXXh@WGo-PFv0>A)WjSRz zZ8>9k$nvn|tmP5Qqn7Vk&RHI_oVPq~dBSqR@_ow>EI+h7X?e=>Bg??@wB;GgvzF&9 z&s$!wyl8pJa?$d#<rT}1Ew5UJmTk*xme(zBSl+a}Wk}qw(c)71XRAnyFdEXFa1o?3 z=mN%XX}%T^T0jrYla$JUcLNXyiU)<Dpix0iDKWBfb8D;)cpgZeQPneD^tqxUk6GAi z-A@@<NpqPJYK`svS@!sVkzkbu39kf#k|52pfr?id4dR>xR>E^O0$poRkXV5ThBKr> zrtn$N6+8<Dg;avZS=f4Ma(WT#!||%*Y@leAW(61O(ftH+ySh9mr{MVl9{D>I1aBjS zH_(o=iAN`tvw@Yng_O62h(p|8JdB>8y!4Q&t+&K)7@51$q5sj%S=|p~-M1+J^eIw) zzrKMM#>98g2HtKEkJNUY@0?9%(^bt%;VhsHcUQaRVgz41Phmwu-26vn{l&G-@Wu5_ zVP*nztT6})(>Q!tHMF!3k<4PH8&Q<U8I2;{itPNMUSDH;HD*%#j3<Uu4=UHJ2*HJR z<w)v!#>oI8rhOp`mMUGBRK-e(MNhZJea5h!8K(;+)qk|N8cV9Z9*xN#NX)_L{z=<~ zNQV%u_AnOhE@uP+*3LwGwI4;d<x>91klae5VtC`4>fT=K3wFJ`bmva{aT^lrDkO}G z8M`WyrQ0{vv)D9NkImXPOe;@S6oth|H+Bbe(gbuK3WTQ}2cN))a8)*aXBN+5VY<rN z<?zQI)6+?u^e7~r5}fHq!WkEF7VA1mrDEx-_Dw}_-RP-|Et!@ExNW@)2@SqVpO;N2 z!i*28ENAzs;Xp9Zmh*46ghedCN6jKm*5fr;CFPO5YG{+Wocp&)7Boq_DL75f6zgk| zppp+n0-<RXg0I0V1gRJ)p26q^Rbm7-P3_r$N+ru9yEXW+`6G;S;Xh4wv^UEO`*wv9 zxQ5Y0nZ;I~+g}H+%*V3w(%YyC&RKbSqEZR)<mCe;VXhb?GMKw^u(lX+*xsaMljcI7 zC$t#PIN0ALM28Vso|&XzwBS-r((Hw&y}zAZO~?f-BUp7LP1K~I?R{Vpb?Ge(gF_<N zIg(z~gYlX*Uaq{;XQA0|7|r0Qh>Zu!^ApTK%(6I#<P?)K!5Wz4L|6_5<R>jp?f<ud zN?Ex$xj%d@izloJV=CMo*2M!%?u~82;;{x{6_;lZFlQn)DfE>om1dL=CgxqGgWYQJ zu&zfD;mP>4=nm9Cz{w#T*etbYjtpJr5_S>Q(+-zn+O#*9SMGiDX!+sFvi7Q;Ivls- z3Q6JUha&>cAhTD3)#j5gS5_WI%MZS)c3|!Gd74+J#B0SdW43X3e8zlMhd0Tf@L(rz aV7P0ZKj$}2`tCWmdN*zFevfUw@%<}?7=Ahc literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c7e71baffb2c862a64e884ba699954c088275bb5 GIT binary patch literal 20617 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/distro.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79cd2951912c197ebfa788444a45bb9845f7c5c3 GIT binary patch literal 33491 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/ipaddress.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..826670aaf5391f72229389c388c371f0352c89cd GIT binary patch literal 66460 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 K@OKYA@c#q7A4*{W literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dc5782716d9aad84cd2534e94a08a6165fdc712 GIT binary patch literal 202102 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%0A<3!oA@p7mpAt!@c9I4Jat@l^W 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%0D_xbM4B%E0i$z)mZI! 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/retrying.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..477c410151780a84f070da5363abdd2c9ed57d7d GIT binary patch literal 8098 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..41c1bba3afdb1888012f5cc49c426584b99ed3fb GIT binary patch literal 25003 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 L0N+qDJwyKwjhnWK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/appdirs.py b/myenv/lib/python3.7/site-packages/pip/_vendor/appdirs.py new file mode 100644 index 000000000..7ff6a0701 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/appdirs.py @@ -0,0 +1,604 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 3) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical site data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user config directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by default "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + r"""Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical site config directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific state dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user state directories are: + Mac OS X: same as user_data_dir + Unix: ~/.local/state/<AppName> # or in $XDG_STATE_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow this Debian proposal <https://wiki.debian.org/XDGBaseDirectorySpecification#state> + to extend the XDG spec and support $XDG_STATE_HOME. + + That means, by default "~/.local/state/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user log directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname=None, appauthor=None, version=None, + roaming=False, multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_state_dir(self): + return user_state_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + if PY3: + import winreg as _winreg + else: + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernel.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", + "user_config_dir", + "user_cache_dir", + "user_state_dir", + "user_log_dir", + "site_data_dir", + "site_config_dir") + + print("-- app dirs %s --" % __version__) + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 000000000..ced6d94e5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -0,0 +1,11 @@ +"""CacheControl import Interface. + +Make it easy to import from cachecontrol without long namespaces. +""" +__author__ = 'Eric Larson' +__email__ = 'eric@ionrock.org' +__version__ = '0.12.4' + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..391c93121e82628b3ddef926708ff39549acb3ec GIT binary patch literal 558 zcmYjNO-~y!5Z%q!CQDF}D)sDZ4y=I^HIXVrK^!Wzy_C~Rm1Wl6;NY*0okipy@t5}6 zQ~yFw%%&h^tQo&I@{Hfi)!|{DpsjB|{92|-@~0zj)<bZK9u^oxQYIoTQ_(AXqF?sK zKn(T349j7fARg(F$;xbpGd(twa)NmLGnq}cch|hSm)FilaGEIN9YpfgMhP{qWRd6J z`GX`X63N38iSF%54bG6NtF2yZA62|}n@F^?D`L5k!DEL|<lBQAP!;*cAvn7|l1MI< zv*4<S!og}gIw?-iiu1oXVlqqH>AoW5@Avr^!98lj^t=7EmhfYiw;5x?RgAScV|;^h z0P%z|X}Hn|4;X7C1pFLH_6Xd23DB*w&G`S$(C=9OIu!PW0VbXknBuhy{~GE+H9Sh% zaG<r*0((*e^lr`ABFyclMx0m7H)kiYUaZ!jPwV+|NpGoF{#e-%xz@)}%@-fzZ{8($ nj?%1fK=+qQ8B<n8#tQ$`jz1eGHd<bEibAJnknT=znoiRf;Jm43 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f07fb9578b8a59c5c43d0f2bb79f7b35ce506c56 GIT binary patch literal 1567 zcmZ`(OOM+&5GE;E(#ntBra_PvMe8(&#)quZ$D*5{2%2n)<`5V~*SQEN1XbkPa`XyG zyN%(THrM<I@3DW0*Pi+pdg=_N-39?7fTNGYhi1O{MvsTXkifH?-T0072>BZ)myZMB zM;Pi)Fr08&kQm>rpe2hLMeGz#>Bg?bZqX~f*t57-_+=0W7JJ2B8O9-Cp9gP9+~<2d zg!h2=`2gNSe!z!(^oGVGvCsEkFsa4poWOp1N+uuu179c82{nNfFIPfo1^DBWG+T(1 zy3(>P9`Ur%LV|nmNuFuD1QV~Q=X2{GJ(BZPDJuO-DwU8K-iQx{fmxowP+x-4WJfhy zIv11@&35hud5yl_mY|0dh=)!mo&>6h36#*!#99=_$1mm8-1MIO^!WMDW_YTlNXw^b z#S0-#m~!4>2+Loz?!Sl}!ZrWOsFC?P)goG_GCHdZE~JV|8U4OYl4EsLeZS`4Wl6LC z=AJ$~o-bwb_1V$=`_U|F^5$+{DV-L@U6~ynf2&`n=(HnQi;CAW%8;n6B`Qj?k{>p& z%n(9fHAxrt0Mqxt5IUd%mHU9MIASotHOtXM0Geoe4z+>mgBISpz!2Lxz!crmoy#5I z3bbLd+hMZoZE50dv7Wu@Y~q-{4J#2kohuVUP4cwJH^9~2Lab!2be?Veh1Si3DB1)F z6rhPOv0TzcgMk_UR4A3#mFboBs?sLxGDX@C+Hd^tnK0w0tyYYy;Giu)Yeslme=c-_ z3vlB#aH#8G2xZiT!Dzq&AZP$qeggh0icm%vlBMV~0GgbGaJFPgfhNYCw@3)tu?rNC zJ2lQq7Mq*1g&05o_1Re0V=Z5eK^0>gF=)hHh@zP|5{WkhkWZ3!3N~Sb8pb*HfoEs( z{X_yx1h?FR3%b&JbVTJBFwZbve2~klxMwhF<HqvZVlv18TH!U*F1F*AE_*v~%a%Tj zpe-_Z_Rw=d<x?GUdJb(;1%MbL+c3^_<DZ}i`K`@xTI)7RK7Md#(zo$gGK~Wv%TFN) zD?fPykQucVltMLirG)XjKY(#$`bW3QlS^k0`l!+%E*CSGH}M7+&%V!&Tc&yS6)dX* zFob&4a|Vv*TysV=WbzIk43Y$QB?&hCfeg^shu%8u`pU{L9>3!`w83_2JM463^%{Tv z!EN@8)pLCN!<*Xf1x<H99>}k)JL;q53kBJ-c^Q6{mLf^s$sPYT(&{|;p{)6;5D!ra X3aJj*fPu6@+yf`@g8je?uLtx$mg9}I literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed72c781fea621d5b7c4270026cddf1769380144 GIT binary patch literal 3067 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4a424244c6b32b601d00528d47882ac51b918ce GIT binary patch literal 1769 zcma)7OK;Oa5Z<*N$1zP?KolVX@&O@5q6x2xRsvKg5<)@|k4m6OXytl0ty9N#cQ=t* z<pjO+7vRWW@|6>RffF<9ItdX1*4o+Ec;}m$Z|tYdrca;^cGo^UvI+T)i>f&=*@mv} zgW#k`IOSGChgQ#`<T>FscTNd+g#F3xIk2vA7uK$DU|r+&x1{Br?D@L~B8b8WWVSaD zkq(}`dJ*(98N|ap5krycINdKbR69UzF8bjp(Lt<&Fwh55gxptQUj%WwJ`}@D9tS** zbeyH3JZ}3x03B)3!g-lRhY>ESX2E0|y1E5IkRAmmEOg?O^z0IT&naOeVD7=b%NqdP zFB(rnC3X;Zgx6rhkwV{rt}twxd?Fv=Qh0%O0l{)N(=RHo1aDb|qeRj#>_c(<jmSE@ z@>6wk8IMCPI^$4w`dPw-RGp#h><t*(R2%7oF~1+Ne0=w|?r-i7WOAp!v9;CN?c{O3 z9;Zr&NwO}Zjm>-dD8x<E*;u4JlN}T3C`+}>l5)|`j|+QWXauZ`EA*r}b*>F3kqt-K zaQvHt5*g95Weo=Df+%X^Fc}HsSt&f+wUy9KnEb&Uocwn@OLNxD+@c+qi$rL#I%jHi z=2>|dp+nekoH~b&oaN12+M=ZuOwpVpwJ6DyxCon-D=V}6%~`iqFFeN5a3~lne8z?u zA0;?nV(e%XCgq82;Kk=qETO>Y%z0zXV(28M04EBCXL&Y0W;cS3X+yPb=&B83%50xo z+&-niZD2KU+2Jm)!&u`UZy0V<pz67z@eInxaJ&0kGLRiRc<UMnB=>|cI-&V;j5Dhu zx-C($a1yAu!r`F~TV;}pMx4f)VR6nmXD9(NGH2`x-jCrY)T1XCrbybA!f%LB(I8re z$%G8Z7r?{GSF0>JOJZ(JaL*tZS}qtj=hr~7N@8<nb&>v<Cu8vDnZeI%6b;ia)`U*1 zn0}>{yaVpMCU405ibGHn7Z3=dDcn&GF%k21BC+@uQ6U=w=(A|d;aaSdDK7k!VIV$V z1zZ%79lG**h4A0#>^#f=7AvIZ4Mc_YjXCn^$?7a#Wl`bht}Zbras>repuB`)f#<V& zno;~b=v{_>MseQ(iaQc_yDhh<Gsd$B>ZehD`QhhK(#<V@AEp+J_FO!tmlxi{vH%|= NbBqrTU9wkKegR$eRo?&r literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b50dbfacd70e52e93eec6a72da39cb947d4c867 GIT binary patch literal 765 zcmZ`#-D(p-6rS0iW}9we@Irdg3$KI--L2MO3PnT^^rjRIr~|TWXD4-&*`4W`Nod}| z7x5*03a|D`5CmVrE6--PF%_I;&YU^l&z?Cidc7{eHJjY~_{|~YM}4_j0VdCJo1Yj~ zgN$TUl7ccy$vaZs_lR)jT{xno{?@45pdU!-yeF#=YmW4okL-h%%{FXD`pj>cwYMvG ziVo}C^8UPGyE16dErlm{i!STlQhePgJh|7Pts)R1>tQGR*hwGz{@yUf9oB0Yne&zm z{a^T2GNe^!0dl7D@(lCv)ns!1Mi{M1BkFr@lBrI(R7PaOK@}ob<`<Dp!3e-Hl4|dD zp%vJd01B!A@ikU;_<7FfQdB#7eX>aBI!czJ%oIc*t`@>rgGPLwUJ4U6#>a>>KL;1h z*}=BxUkZD;jsD+qVRH#yZMVNIxUs8Y9736Mm5FNCiffzLmB#ceEkyG!*I4*MppPc& z@Y}{3@?~m8yi6gUDwzo|aRKqgEJ?;@R6bp1Pk5r2kB{thd^rR8XgWGMi6=3(aG00I zrcxdPAB~UgRazI<yPZ$WQ~pVCRa#Io=Bm)Cjr6JtP79SSq<BWL5%U0pLkF}^@45~R O@$CEU-T7M&u>J?rkkD-a literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dc1d6555d68adf673f3096e5c1192e344c41726 GIT binary patch literal 7648 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 P?`ZgkGqg2Zw<`Y&7M2kJ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..803162ab3b4ec72c7cb08254e9ad6e86a0af6c09 GIT binary patch literal 2162 zcmZ`)PjA~c6elU!Rvae{_NQx$qT_n1fi`Zp1#7WlNZYN$F4-Xkwiy@*TBK?vvZRu< zT?gK&`5?)0UrE=U`W1HCdz77|g+_yq6d(Ec`@KK(^R2Befp+xj`k#+r_78rnTL_bV z=$3;}MA3{)=#WzKGf_+hr$hysy$gnc3J*!Y^&WPSKCL>>7f#z>evR>a-2#~GL$}XC zXfmXV44I;E)>|5eDpajgGHj`~>cH4mk=lT<qpqn<)jOrbNNuTYSlLirxNWEU^o7i_ zk&KUDrkVcD$g<Q%&L|;W4()IPT0XCrxirNzS6uR><i+Sn$Bxg(X*}lh6m~hSxt?jW zaN{(8&5f3dr@1S*^rlABB+=$RmtbK&);V`$>39OS^3?J;E3Ah7U=eNUw>q9W4Ohi0 zc(Crqa7KG$agjTnJIjltwo_Z*?RxDquppf?=?H9CfUS9Hinl3T0C2zt2O8RB3&iOW z)NEGAUyVH=X)T{xI6u*okv6tQAh{~0BLMA9*th`W_k`&44EUnG(&!|8%PsJ>9!*|2 zyjI3>ssJ<aS#Ud+s+fZ>E^+SG#4y6xaAeS5K({wQIP#7xiJ(ggk}Vm?KoN)`J?Mu9 zw^lbrLokH^-&8l6RY_UhY1XX$-VdtK>MW@k?2Xo|e-ncV|L<Z@nsg?e9?YZ}Bt-^p zwS$QnjE;nOZ1?i-X6oBml(VlNy5#ZeBa=N!_MSW$yc(2g`5?_Ly5oU~_a1-a-bh^Z zUCeZ@3NwghJk}U%Q)B}S)G8Bq%S9Clk>;rrVh26c20>^<+w|migA;bwn`3koHuNuc z@88d0vLt6vo9FZ|<|ufVzGL89c3@hd>$7S{h}YU(WR(zAXZ76=Ob7N<VJ;`yL@@Qf zsl_I0HZRT!@i{D5d=kh;m!5ptjCEyMh!_gdHyqKlhx;Q;7QH1oB1iB597l&FB#s?- z4W|Tue~_I0P8N~h5nO10xT;mu(|ZZIgA6_HYWvx`YJM`NFjc!Q%RcoCKc=+}PPHN_ zMZN1QFk?RfK`5g=x=q`RK}28-PwqDJyn6fts^}n3mBR#SnCloHn9(zKPR`-=R9Fol z>k0@AW`MzSRRr#v$!x0s2Y0&${1Eo8@}^C9Iw!XpF?wzX&1rLg1?~)r5)%jDv9n;w z5FWq{&xyGQW9uAZvcz<PQf+&8S0O%+HQd(Rq)u0No9pnZiwq{uI^6;}aaE|KlOM&! zT!&rXBRT({1fl3b7$SCZqlqBmXlAz$CeZa4?5Lv0%<v^stR4?h|1smIA21FM-ebjC z6kFXj`>wDu(c;1f<_l08eC4iEG&gbK77Ao?Sy1LSeERg*h6w?FJ3+`+Eblb2yu1%% z(8b3Cs}-uaE5xKw(+uZ5A>K@7w$gNjP(>_+>EY%0%3LD!KK3xKK=UB6;7tGmQ_&*6 rs2j4V74@QP(PlUDI(V@wmKOD^-LC(9yrRik6+NvHLjA5h*$e&y1x*(h literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffa65ab8b4544deb41a14ffe5bb67a53f17254e6 GIT binary patch literal 4697 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 D`^j6I literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67e00c669a2fd08d37e872fa283526676975d995 GIT binary patch literal 4255 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 JS<|yT>))aYs~G?Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b950779d51bba6554d49b7b31b0a9cbced1dc5c9 GIT binary patch literal 666 zcmYjP&5qMB5VrH*ZVN?7h$leGVF`Z~U4#&9Irl<Ol~Cl3-EAtTF=Mxg%00oAcYq_W z<SQp$ffM6&S9GlT^v#dQGm~5nhkb&wo<I0F3<>$|jax~PyhYWI5IEsfl7=oQ^*oS4 z6D~sJDUW&bjV>Y{ejs`FhhlP0-Tf)6R$|(247BncXUYgbckg{&nJzS&R~e>y>7jZ) zMb(!Gma5E<ujD{&qDF=u5}R0R0~^}N#x~{jdveGu`4RBIW<LW;Iv(C~Y$TfHu{*1L z6QwZhTD!g$P%~NY1-RZyY@ybsuH2|P_9z9Em1J7Gd)+N|B}Lf?vue5Crz>OBtD@Lv zo@iuw2)Hi-0fLL0cDpfo&qZ2bfw(IGk&nk75)XczZpe<SI6eh_YM0*lei68X_TO!x zpx!YfiXDSu*-9=z7Y!6w>$05a@#f`@zo<&Jd-lXEC)aC`PnYA1i(+1=TAkM$ZJ3nj zP>m<g%_ruaot8VX;Vl$hb2md5pMfbQ;IaDR2Gf%-=G)c}5lF93Ga8(nEEv#103(d$ u>1;mplE*MayW0kwdDbn*=X5ijz+LpY>~+)ftrTzk-=cjQ){F@KfBpg3G^HE> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 000000000..10bc01eae --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,60 @@ +import logging + +from pip._vendor import requests + +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import logger + +from argparse import ArgumentParser + + +def setup_logging(): + logger.setLevel(logging.DEBUG) + handler = logging.StreamHandler() + logger.addHandler(handler) + + +def get_session(): + adapter = CacheControlAdapter( + DictCache(), + cache_etags=True, + serializer=None, + heuristic=None, + ) + sess = requests.Session() + sess.mount('http://', adapter) + sess.mount('https://', adapter) + + sess.cache_controller = adapter.controller + return sess + + +def get_args(): + parser = ArgumentParser() + parser.add_argument('url', help='The URL to try and cache') + return parser.parse_args() + + +def main(args=None): + args = get_args() + sess = get_session() + + # Make a request to get a response + resp = sess.get(args.url) + + # Turn on logging + setup_logging() + + # try setting the cache + sess.cache_controller.cache_response(resp.request, resp.raw) + + # Now try to get it + if sess.cache_controller.cached_request(resp.request): + print('Cached!') + else: + print('Not cached :(') + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 000000000..03c95c94f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,134 @@ +import types +import functools +import zlib + +from pip._vendor.requests.adapters import HTTPAdapter + +from .controller import CacheController +from .cache import DictCache +from .filewrapper import CallbackFileWrapper + + +class CacheControlAdapter(HTTPAdapter): + invalidating_methods = set(['PUT', 'DELETE']) + + def __init__(self, cache=None, + cache_etags=True, + controller_class=None, + serializer=None, + heuristic=None, + cacheable_methods=None, + *args, **kw): + super(CacheControlAdapter, self).__init__(*args, **kw) + self.cache = cache or DictCache() + self.heuristic = heuristic + self.cacheable_methods = cacheable_methods or ('GET',) + + controller_factory = controller_class or CacheController + self.controller = controller_factory( + self.cache, + cache_etags=cache_etags, + serializer=serializer, + ) + + def send(self, request, cacheable_methods=None, **kw): + """ + Send a request. Use the request information to see if it + exists in the cache and cache the response if we need to and can. + """ + cacheable = cacheable_methods or self.cacheable_methods + if request.method in cacheable: + try: + cached_response = self.controller.cached_request(request) + except zlib.error: + cached_response = None + if cached_response: + return self.build_response(request, cached_response, + from_cache=True) + + # check for etags and add headers if appropriate + request.headers.update( + self.controller.conditional_headers(request) + ) + + resp = super(CacheControlAdapter, self).send(request, **kw) + + return resp + + def build_response(self, request, response, from_cache=False, + cacheable_methods=None): + """ + Build a response by making a request or using the cache. + + This will end up calling send and returning a potentially + cached response + """ + cacheable = cacheable_methods or self.cacheable_methods + if not from_cache and request.method in cacheable: + # Check for any heuristics that might update headers + # before trying to cache. + if self.heuristic: + response = self.heuristic.apply(response) + + # apply any expiration heuristics + if response.status == 304: + # We must have sent an ETag request. This could mean + # that we've been expired already or that we simply + # have an etag. In either case, we want to try and + # update the cache if that is the case. + cached_response = self.controller.update_cached_response( + request, response + ) + + if cached_response is not response: + from_cache = True + + # We are done with the server response, read a + # possible response body (compliant servers will + # not return one, but we cannot be 100% sure) and + # release the connection back to the pool. + response.read(decode_content=False) + response.release_conn() + + response = cached_response + + # We always cache the 301 responses + elif response.status == 301: + self.controller.cache_response(request, response) + else: + # Wrap the response file with a wrapper that will cache the + # response when the stream has been consumed. + response._fp = CallbackFileWrapper( + response._fp, + functools.partial( + self.controller.cache_response, + request, + response, + ) + ) + if response.chunked: + super_update_chunk_length = response._update_chunk_length + + def _update_chunk_length(self): + super_update_chunk_length() + if self.chunk_left == 0: + self._fp._close() + response._update_chunk_length = types.MethodType(_update_chunk_length, response) + + resp = super(CacheControlAdapter, self).build_response( + request, response + ) + + # See if we should invalidate the cache. + if request.method in self.invalidating_methods and resp.ok: + cache_url = self.controller.cache_url(request.url) + self.cache.delete(cache_url) + + # Give the request a from_cache attr to let people use it + resp.from_cache = from_cache + + return resp + + def close(self): + self.cache.close() + super(CacheControlAdapter, self).close() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 000000000..04d148856 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/cache.py @@ -0,0 +1,39 @@ +""" +The cache object API for implementing caches. The default is a thread +safe in-memory dictionary. +""" +from threading import Lock + + +class BaseCache(object): + + def get(self, key): + raise NotImplemented() + + def set(self, key, value): + raise NotImplemented() + + def delete(self, key): + raise NotImplemented() + + def close(self): + pass + + +class DictCache(BaseCache): + + def __init__(self, init_dict=None): + self.lock = Lock() + self.data = init_dict or {} + + def get(self, key): + return self.data.get(key, None) + + def set(self, key, value): + with self.lock: + self.data.update({key: value}) + + def delete(self, key): + with self.lock: + if key in self.data: + self.data.pop(key) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 000000000..1193f2608 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -0,0 +1,2 @@ +from .file_cache import FileCache # noqa +from .redis_cache import RedisCache # noqa diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7898edb8016b46738560e814e44e6d319a6b963 GIT binary patch literal 302 zcmXv}%}T^D5Kh`fw7OSMzCaIa{3~`rL=-%F&^^e4gqWn7k~VP?3m$wRU#VA5zJezw zRR?C~`x%Cr%lW(@80~8J;U4>EBL9&gxWEj1SQJszl8&w^O*pezm#=fg`5h@|Uld15 zI&NJXtFMH7)<}w5txTBMO*tEj20bp532F7X4axsga#TJDY+#$p_dD}o1`#zI1hB?g zr6I5m*kj9i9jg9xP$!c6;piYX^-~M>u&I_ywqoA+h3P{S)-FI+^>KU=Nt}`ox>pX^ jbcb|(1ZRIqV4R!YM9%m9+qikwIrVDwdHO7*dw1v$MZ{AX literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03bd3c9e9a2cd7d1aa069495225e3238751d820a GIT binary patch literal 3222 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 O0;n;e6TDyl!+!zEeE5j~ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92703dacdd2813be7b67f6a07d2efdd7d91a208c GIT binary patch literal 1816 zcmaJ>UvC>l5Z^y{_Qg1fOHCRC3X9<7Bx*w;kV>dTX(iw#LbM3UQgyoCuH!T3J7;(8 z#+D-?r5_}I<SX4PPyGr!F|%hUCaPFzc4v2XcYgEtWP7_oU<_aEy_|W3{EeISfIT?| zGB`;hX+}o0M=A0wV<XmMj^`O4c|8w!Px^02&;OCgnykMevaY-<-mA&rISIGk!Y?GG zWgydOYSJQid~B6XM+*3@lh~-IaWYT|#j7wl5TbYrWS+rf$pUa(F}-K$f?TsDxuVbE zY{)NRKlFfn$=XEnHhDlU8Qh`^COzCq?<03R^ymA(%<Q1Z#iP!*A}L1W*v7BYEVZ+8 z+ZHy?BBPQbm*(w0=uBHXFdd)llCW0R2eFB*)g@1Jt9=lc%~6`@V)de|uNhCqGZXTX zSy{4?DLoLFzlh$2H~;+E9qV)ows)to?)HmJDs8$W-F-ETq9b#de>auiB++>K=u6u_ zIveWjtN!8R$K4m*aXNmO<_17!4|Q^Q^tC;Y@z7B;Rk<v5H*sDp0AZ0;8`ITFrY3Td z&Uoga*8z%g@n;R%WHs8R?mU6>n}IPn1~N}zQlv*E=`l$qgGh79r3b4gcU;72&zFJR zf|HtT$oF8a%ck6hHIP2!z;4<26=76SX7C{nT#;Oq5e~$RM380hf}TQVco2*{Waz@I zuiu9o&WqL5f^8W@QJSYVitfYCxR2@l{;jUgTApkwMbn(pCNPjX<Qmdt2?>R2nNw8q zGi8Cte@p&{n%&W?KLEiV&|2xvhEjNXnqdCoz!mewDLevZ!A*OubitNTOSxEZ%dYv7 z?2}9GWZr^Wf5ERHi<ca$tpZnDfiuc#w4$s{Y?2qROCL_ug^Ob7In)}_mHsr&CaSEf zi*c%zxogD(xbq>931A}Bqb=5?^G#de-*@{C{l7M2>6*iT{8y7I14t_uIxu&Ye+)ke zptTF{ZMd*{ebW#ydN&Q>bJ$!QRJxbs8F|@qO#s>gMv;>9=I_uf01cb}{FBPYN{fD> zMUtslr}>$H5)yWx1Vq({G#9au*a)Btb;NH*iPxzeG{kBo@x(&U`t&s9mG3=#rV;!9 z*jD;Z+h=H<O9bAc^VWuaPJCk?_B|w*BY1xW{|EO%OpG$nuku_ah((NxA_GId5P2bT zrKGS0SO=}hnRR=ybLw0k(kdaa1646_wF400NeG8k0N5RXD1>_0!XnG#k&2?S5k;dy zPBP@1QFK0uvr3}d_&3&s#*}jI(Fe$Vg43;L$Dw+C4<;moMHsMv2fR^-x#lFNVI8&g zCw8Jio5loi8Q(jArq@|DyiT&w@T!eQ_qjT7|GZ0e8GK(^@dSPDQojjl-{e8#U*boS AGXMYp literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 000000000..f7eb890c0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,133 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = OSError + + +def _secure_open_write(filename, fmode): + # We only want to write to this file, so open it in write only mode + flags = os.O_WRONLY + + # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only + # will open *new* files. + # We specify this because we want to ensure that the mode we pass is the + # mode of the file. + flags |= os.O_CREAT | os.O_EXCL + + # Do not follow symlinks to prevent someone from making a symlink that + # we follow and insecurely open a cache file. + if hasattr(os, "O_NOFOLLOW"): + flags |= os.O_NOFOLLOW + + # On Windows we'll mark this file as binary + if hasattr(os, "O_BINARY"): + flags |= os.O_BINARY + + # Before we open our file, we want to delete any existing file that is + # there + try: + os.remove(filename) + except (IOError, OSError): + # The file must not exist already, so we can just skip ahead to opening + pass + + # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a + # race condition happens between the os.remove and this line, that an + # error will be raised. Because we utilize a lockfile this should only + # happen if someone is attempting to attack us. + fd = os.open(filename, flags, fmode) + try: + return os.fdopen(fd, "wb") + except: + # An error occurred wrapping our FD in a file object + os.close(fd) + raise + + +class FileCache(BaseCache): + def __init__(self, directory, forever=False, filemode=0o0600, + dirmode=0o0700, use_dir_lock=None, lock_class=None): + + if use_dir_lock is not None and lock_class is not None: + raise ValueError("Cannot use use_dir_lock and lock_class together") + + try: + from pip._vendor.lockfile import LockFile + from pip._vendor.lockfile.mkdirlockfile import MkdirLockFile + except ImportError: + notice = dedent(""" + NOTE: In order to use the FileCache you must have + lockfile installed. You can install it via pip: + pip install lockfile + """) + raise ImportError(notice) + else: + if use_dir_lock: + lock_class = MkdirLockFile + + elif lock_class is None: + lock_class = LockFile + + self.directory = directory + self.forever = forever + self.filemode = filemode + self.dirmode = dirmode + self.lock_class = lock_class + + @staticmethod + def encode(x): + return hashlib.sha224(x.encode()).hexdigest() + + def _fn(self, name): + # NOTE: This method should not change as some may depend on it. + # See: https://github.com/ionrock/cachecontrol/issues/63 + hashed = self.encode(name) + parts = list(hashed[:5]) + [hashed] + return os.path.join(self.directory, *parts) + + def get(self, key): + name = self._fn(key) + if not os.path.exists(name): + return None + + with open(name, 'rb') as fh: + return fh.read() + + def set(self, key, value): + name = self._fn(key) + + # Make sure the directory exists + try: + os.makedirs(os.path.dirname(name), self.dirmode) + except (IOError, OSError): + pass + + with self.lock_class(name) as lock: + # Write our actual file + with _secure_open_write(lock.path, self.filemode) as fh: + fh.write(value) + + def delete(self, key): + name = self._fn(key) + if not self.forever: + try: + os.remove(name) + except FileNotFoundError: + pass + + +def url_to_file_path(url, filecache): + """Return the file cache path based on the URL. + + This does not ensure the file exists! + """ + key = CacheController.cache_url(url) + return filecache._fn(key) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 000000000..db1e09d97 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,43 @@ +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +def total_seconds(td): + """Python 2.6 compatability""" + if hasattr(td, 'total_seconds'): + return int(td.total_seconds()) + + ms = td.microseconds + secs = (td.seconds + td.days * 24 * 3600) + return int((ms + secs * 10**6) / 10**6) + + +class RedisCache(BaseCache): + + def __init__(self, conn): + self.conn = conn + + def get(self, key): + return self.conn.get(key) + + def set(self, key, value, expires=None): + if not expires: + self.conn.set(key, value) + else: + expires = expires - datetime.utcnow() + self.conn.setex(key, total_seconds(expires), value) + + def delete(self, key): + self.conn.delete(key) + + def clear(self): + """Helper for clearing all the keys in a database. Use with + caution!""" + for key in self.conn.keys(): + self.conn.delete(key) + + def close(self): + """Redis uses connection pooling, no need to close the connection.""" + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 000000000..e3f3243e8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/compat.py @@ -0,0 +1,29 @@ +try: + from urllib.parse import urljoin +except ImportError: + from urlparse import urljoin + + +try: + import cPickle as pickle +except ImportError: + import pickle + + +# Handle the case where the requests module has been patched to not have +# urllib3 bundled as part of its source. +try: + from pip._vendor.requests.packages.urllib3.response import HTTPResponse +except ImportError: + from pip._vendor.urllib3.response import HTTPResponse + +try: + from pip._vendor.requests.packages.urllib3.util import is_fp_closed +except ImportError: + from pip._vendor.urllib3.util import is_fp_closed + +# Replicate some six behaviour +try: + text_type = unicode +except NameError: + text_type = str diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 000000000..bf4cc7f48 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,373 @@ +""" +The httplib2 algorithms ported for use with requests. +""" +import logging +import re +import calendar +import time +from email.utils import parsedate_tz + +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .cache import DictCache +from .serialize import Serializer + + +logger = logging.getLogger(__name__) + +URI = re.compile(r"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?") + + +def parse_uri(uri): + """Parses a URI using the regex given in Appendix B of RFC 3986. + + (scheme, authority, path, query, fragment) = parse_uri(uri) + """ + groups = URI.match(uri).groups() + return (groups[1], groups[3], groups[4], groups[6], groups[8]) + + +class CacheController(object): + """An interface to see if request should cached or not. + """ + def __init__(self, cache=None, cache_etags=True, serializer=None, + status_codes=None): + self.cache = cache or DictCache() + self.cache_etags = cache_etags + self.serializer = serializer or Serializer() + self.cacheable_status_codes = status_codes or (200, 203, 300, 301) + + @classmethod + def _urlnorm(cls, uri): + """Normalize the URL to create a safe key for the cache""" + (scheme, authority, path, query, fragment) = parse_uri(uri) + if not scheme or not authority: + raise Exception("Only absolute URIs are allowed. uri = %s" % uri) + + scheme = scheme.lower() + authority = authority.lower() + + if not path: + path = "/" + + # Could do syntax based normalization of the URI before + # computing the digest. See Section 6.2.2 of Std 66. + request_uri = query and "?".join([path, query]) or path + defrag_uri = scheme + "://" + authority + request_uri + + return defrag_uri + + @classmethod + def cache_url(cls, uri): + return cls._urlnorm(uri) + + def parse_cache_control(self, headers): + known_directives = { + # https://tools.ietf.org/html/rfc7234#section-5.2 + 'max-age': (int, True,), + 'max-stale': (int, False,), + 'min-fresh': (int, True,), + 'no-cache': (None, False,), + 'no-store': (None, False,), + 'no-transform': (None, False,), + 'only-if-cached' : (None, False,), + 'must-revalidate': (None, False,), + 'public': (None, False,), + 'private': (None, False,), + 'proxy-revalidate': (None, False,), + 's-maxage': (int, True,) + } + + cc_headers = headers.get('cache-control', + headers.get('Cache-Control', '')) + + retval = {} + + for cc_directive in cc_headers.split(','): + parts = cc_directive.split('=', 1) + directive = parts[0].strip() + + try: + typ, required = known_directives[directive] + except KeyError: + logger.debug('Ignoring unknown cache-control directive: %s', + directive) + continue + + if not typ or not required: + retval[directive] = None + if typ: + try: + retval[directive] = typ(parts[1].strip()) + except IndexError: + if required: + logger.debug('Missing value for cache-control ' + 'directive: %s', directive) + except ValueError: + logger.debug('Invalid value for cache-control directive ' + '%s, must be %s', directive, typ.__name__) + + return retval + + def cached_request(self, request): + """ + Return a cached response if it exists in the cache, otherwise + return False. + """ + cache_url = self.cache_url(request.url) + logger.debug('Looking up "%s" in the cache', cache_url) + cc = self.parse_cache_control(request.headers) + + # Bail out if the request insists on fresh data + if 'no-cache' in cc: + logger.debug('Request header has "no-cache", cache bypassed') + return False + + if 'max-age' in cc and cc['max-age'] == 0: + logger.debug('Request header has "max_age" as 0, cache bypassed') + return False + + # Request allows serving from the cache, let's see if we find something + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug('No cache entry available') + return False + + # Check whether it can be deserialized + resp = self.serializer.loads(request, cache_data) + if not resp: + logger.warning('Cache entry deserialization failed, entry ignored') + return False + + # If we have a cached 301, return it immediately. We don't + # need to test our response for other headers b/c it is + # intrinsically "cacheable" as it is Permanent. + # See: + # https://tools.ietf.org/html/rfc7231#section-6.4.2 + # + # Client can try to refresh the value by repeating the request + # with cache busting headers as usual (ie no-cache). + if resp.status == 301: + msg = ('Returning cached "301 Moved Permanently" response ' + '(ignoring date and etag information)') + logger.debug(msg) + return resp + + headers = CaseInsensitiveDict(resp.headers) + if not headers or 'date' not in headers: + if 'etag' not in headers: + # Without date or etag, the cached response can never be used + # and should be deleted. + logger.debug('Purging cached response: no date or etag') + self.cache.delete(cache_url) + logger.debug('Ignoring cached response: no date') + return False + + now = time.time() + date = calendar.timegm( + parsedate_tz(headers['date']) + ) + current_age = max(0, now - date) + logger.debug('Current age based on date: %i', current_age) + + # TODO: There is an assumption that the result will be a + # urllib3 response object. This may not be best since we + # could probably avoid instantiating or constructing the + # response until we know we need it. + resp_cc = self.parse_cache_control(headers) + + # determine freshness + freshness_lifetime = 0 + + # Check the max-age pragma in the cache control header + if 'max-age' in resp_cc: + freshness_lifetime = resp_cc['max-age'] + logger.debug('Freshness lifetime from max-age: %i', + freshness_lifetime) + + # If there isn't a max-age, check for an expires header + elif 'expires' in headers: + expires = parsedate_tz(headers['expires']) + if expires is not None: + expire_time = calendar.timegm(expires) - date + freshness_lifetime = max(0, expire_time) + logger.debug("Freshness lifetime from expires: %i", + freshness_lifetime) + + # Determine if we are setting freshness limit in the + # request. Note, this overrides what was in the response. + if 'max-age' in cc: + freshness_lifetime = cc['max-age'] + logger.debug('Freshness lifetime from request max-age: %i', + freshness_lifetime) + + if 'min-fresh' in cc: + min_fresh = cc['min-fresh'] + # adjust our current age by our min fresh + current_age += min_fresh + logger.debug('Adjusted current age from min-fresh: %i', + current_age) + + # Return entry if it is fresh enough + if freshness_lifetime > current_age: + logger.debug('The response is "fresh", returning cached response') + logger.debug('%i > %i', freshness_lifetime, current_age) + return resp + + # we're not fresh. If we don't have an Etag, clear it out + if 'etag' not in headers: + logger.debug( + 'The cached response is "stale" with no etag, purging' + ) + self.cache.delete(cache_url) + + # return the original handler + return False + + def conditional_headers(self, request): + cache_url = self.cache_url(request.url) + resp = self.serializer.loads(request, self.cache.get(cache_url)) + new_headers = {} + + if resp: + headers = CaseInsensitiveDict(resp.headers) + + if 'etag' in headers: + new_headers['If-None-Match'] = headers['ETag'] + + if 'last-modified' in headers: + new_headers['If-Modified-Since'] = headers['Last-Modified'] + + return new_headers + + def cache_response(self, request, response, body=None, + status_codes=None): + """ + Algorithm for caching requests. + + This assumes a requests Response object. + """ + # From httplib2: Don't cache 206's since we aren't going to + # handle byte range requests + cacheable_status_codes = status_codes or self.cacheable_status_codes + if response.status not in cacheable_status_codes: + logger.debug( + 'Status code %s not in %s', + response.status, + cacheable_status_codes + ) + return + + response_headers = CaseInsensitiveDict(response.headers) + + # If we've been given a body, our response has a Content-Length, that + # Content-Length is valid then we can check to see if the body we've + # been given matches the expected size, and if it doesn't we'll just + # skip trying to cache it. + if (body is not None and + "content-length" in response_headers and + response_headers["content-length"].isdigit() and + int(response_headers["content-length"]) != len(body)): + return + + cc_req = self.parse_cache_control(request.headers) + cc = self.parse_cache_control(response_headers) + + cache_url = self.cache_url(request.url) + logger.debug('Updating cache with response from "%s"', cache_url) + + # Delete it from the cache if we happen to have it stored there + no_store = False + if 'no-store' in cc: + no_store = True + logger.debug('Response header has "no-store"') + if 'no-store' in cc_req: + no_store = True + logger.debug('Request header has "no-store"') + if no_store and self.cache.get(cache_url): + logger.debug('Purging existing cache entry to honor "no-store"') + self.cache.delete(cache_url) + + # If we've been given an etag, then keep the response + if self.cache_etags and 'etag' in response_headers: + logger.debug('Caching due to etag') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + # Add to the cache any 301s. We do this before looking that + # the Date headers. + elif response.status == 301: + logger.debug('Caching permanant redirect') + self.cache.set( + cache_url, + self.serializer.dumps(request, response) + ) + + # Add to the cache if the response headers demand it. If there + # is no date header then we can't do anything about expiring + # the cache. + elif 'date' in response_headers: + # cache when there is a max-age > 0 + if 'max-age' in cc and cc['max-age'] > 0: + logger.debug('Caching b/c date exists and max-age > 0') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + # If the request can expire, it means we should cache it + # in the meantime. + elif 'expires' in response_headers: + if response_headers['expires']: + logger.debug('Caching b/c of expires header') + self.cache.set( + cache_url, + self.serializer.dumps(request, response, body=body), + ) + + def update_cached_response(self, request, response): + """On a 304 we will get a new set of headers that we want to + update our cached value with, assuming we have one. + + This should only ever be called when we've sent an ETag and + gotten a 304 as the response. + """ + cache_url = self.cache_url(request.url) + + cached_response = self.serializer.loads( + request, + self.cache.get(cache_url) + ) + + if not cached_response: + # we didn't have a cached response + return response + + # Lets update our headers with the headers from the new request: + # http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-26#section-4.1 + # + # The server isn't supposed to send headers that would make + # the cached body invalid. But... just in case, we'll be sure + # to strip out ones we know that might be problmatic due to + # typical assumptions. + excluded_headers = [ + "content-length", + ] + + cached_response.headers.update( + dict((k, v) for k, v in response.headers.items() + if k.lower() not in excluded_headers) + ) + + # we want a 200 b/c we have content via the cache + cached_response.status = 200 + + # update our cache + self.cache.set( + cache_url, + self.serializer.dumps(request, cached_response), + ) + + return cached_response diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 000000000..83ce91250 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,78 @@ +from io import BytesIO + + +class CallbackFileWrapper(object): + """ + Small wrapper around a fp object which will tee everything read into a + buffer, and when that file is closed it will execute a callback with the + contents of that buffer. + + All attributes are proxied to the underlying file object. + + This class uses members with a double underscore (__) leading prefix so as + not to accidentally shadow an attribute. + """ + + def __init__(self, fp, callback): + self.__buf = BytesIO() + self.__fp = fp + self.__callback = callback + + def __getattr__(self, name): + # The vaguaries of garbage collection means that self.__fp is + # not always set. By using __getattribute__ and the private + # name[0] allows looking up the attribute value and raising an + # AttributeError when it doesn't exist. This stop thigns from + # infinitely recursing calls to getattr in the case where + # self.__fp hasn't been set. + # + # [0] https://docs.python.org/2/reference/expressions.html#atom-identifiers + fp = self.__getattribute__('_CallbackFileWrapper__fp') + return getattr(fp, name) + + def __is_fp_closed(self): + try: + return self.__fp.fp is None + except AttributeError: + pass + + try: + return self.__fp.closed + except AttributeError: + pass + + # We just don't cache it then. + # TODO: Add some logging here... + return False + + def _close(self): + if self.__callback: + self.__callback(self.__buf.getvalue()) + + # We assign this to None here, because otherwise we can get into + # really tricky problems where the CPython interpreter dead locks + # because the callback is holding a reference to something which + # has a __del__ method. Setting this to None breaks the cycle + # and allows the garbage collector to do it's thing normally. + self.__callback = None + + def read(self, amt=None): + data = self.__fp.read(amt) + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data + + def _safe_read(self, amt): + data = self.__fp._safe_read(amt) + if amt == 2 and data == b'\r\n': + # urllib executes this read to toss the CRLF at the end + # of the chunk. + return data + + self.__buf.write(data) + if self.__is_fp_closed(): + self._close() + + return data diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 000000000..aad333d0c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,138 @@ +import calendar +import time + +from email.utils import formatdate, parsedate, parsedate_tz + +from datetime import datetime, timedelta + +TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" + + +def expire_after(delta, date=None): + date = date or datetime.utcnow() + return date + delta + + +def datetime_to_header(dt): + return formatdate(calendar.timegm(dt.timetuple())) + + +class BaseHeuristic(object): + + def warning(self, response): + """ + Return a valid 1xx warning header value describing the cache + adjustments. + + The response is provided too allow warnings like 113 + http://tools.ietf.org/html/rfc7234#section-5.5.4 where we need + to explicitly say response is over 24 hours old. + """ + return '110 - "Response is Stale"' + + def update_headers(self, response): + """Update the response headers with any new headers. + + NOTE: This SHOULD always include some Warning header to + signify that the response was cached by the client, not + by way of the provided headers. + """ + return {} + + def apply(self, response): + updated_headers = self.update_headers(response) + + if updated_headers: + response.headers.update(updated_headers) + warning_header_value = self.warning(response) + if warning_header_value is not None: + response.headers.update({'Warning': warning_header_value}) + + return response + + +class OneDayCache(BaseHeuristic): + """ + Cache the response by providing an expires 1 day in the + future. + """ + def update_headers(self, response): + headers = {} + + if 'expires' not in response.headers: + date = parsedate(response.headers['date']) + expires = expire_after(timedelta(days=1), + date=datetime(*date[:6])) + headers['expires'] = datetime_to_header(expires) + headers['cache-control'] = 'public' + return headers + + +class ExpiresAfter(BaseHeuristic): + """ + Cache **all** requests for a defined time period. + """ + + def __init__(self, **kw): + self.delta = timedelta(**kw) + + def update_headers(self, response): + expires = expire_after(self.delta) + return { + 'expires': datetime_to_header(expires), + 'cache-control': 'public', + } + + def warning(self, response): + tmpl = '110 - Automatically cached for %s. Response might be stale' + return tmpl % self.delta + + +class LastModified(BaseHeuristic): + """ + If there is no Expires header already, fall back on Last-Modified + using the heuristic from + http://tools.ietf.org/html/rfc7234#section-4.2.2 + to calculate a reasonable value. + + Firefox also does something like this per + https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ + http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 + Unlike mozilla we limit this to 24-hr. + """ + cacheable_by_default_statuses = set([ + 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + ]) + + def update_headers(self, resp): + headers = resp.headers + + if 'expires' in headers: + return {} + + if 'cache-control' in headers and headers['cache-control'] != 'public': + return {} + + if resp.status not in self.cacheable_by_default_statuses: + return {} + + if 'date' not in headers or 'last-modified' not in headers: + return {} + + date = calendar.timegm(parsedate_tz(headers['date'])) + last_modified = parsedate(headers['last-modified']) + if date is None or last_modified is None: + return {} + + now = time.time() + current_age = max(0, now - date) + delta = date - calendar.timegm(last_modified) + freshness_lifetime = max(0, min(delta / 10, 24 * 3600)) + if freshness_lifetime <= current_age: + return {} + + expires = date + freshness_lifetime + return {'expires': time.strftime(TIME_FMT, time.gmtime(expires))} + + def warning(self, resp): + return None diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 000000000..cd21cae0d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,194 @@ +import base64 +import io +import json +import zlib + +from pip._vendor import msgpack +from pip._vendor.requests.structures import CaseInsensitiveDict + +from .compat import HTTPResponse, pickle, text_type + + +def _b64_decode_bytes(b): + return base64.b64decode(b.encode("ascii")) + + +def _b64_decode_str(s): + return _b64_decode_bytes(s).decode("utf8") + + +class Serializer(object): + + def dumps(self, request, response, body=None): + response_headers = CaseInsensitiveDict(response.headers) + + if body is None: + body = response.read(decode_content=False) + + # NOTE: 99% sure this is dead code. I'm only leaving it + # here b/c I don't have a test yet to prove + # it. Basically, before using + # `cachecontrol.filewrapper.CallbackFileWrapper`, + # this made an effort to reset the file handle. The + # `CallbackFileWrapper` short circuits this code by + # setting the body as the content is consumed, the + # result being a `body` argument is *always* passed + # into cache_response, and in turn, + # `Serializer.dump`. + response._fp = io.BytesIO(body) + + # NOTE: This is all a bit weird, but it's really important that on + # Python 2.x these objects are unicode and not str, even when + # they contain only ascii. The problem here is that msgpack + # understands the difference between unicode and bytes and we + # have it set to differentiate between them, however Python 2 + # doesn't know the difference. Forcing these to unicode will be + # enough to have msgpack know the difference. + data = { + u"response": { + u"body": body, + u"headers": dict( + (text_type(k), text_type(v)) + for k, v in response.headers.items() + ), + u"status": response.status, + u"version": response.version, + u"reason": text_type(response.reason), + u"strict": response.strict, + u"decode_content": response.decode_content, + }, + } + + # Construct our vary headers + data[u"vary"] = {} + if u"vary" in response_headers: + varied_headers = response_headers[u'vary'].split(',') + for header in varied_headers: + header = header.strip() + header_value = request.headers.get(header, None) + if header_value is not None: + header_value = text_type(header_value) + data[u"vary"][header] = header_value + + return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + + def loads(self, request, data): + # Short circuit if we've been given an empty set of data + if not data: + return + + # Determine what version of the serializer the data was serialized + # with + try: + ver, data = data.split(b",", 1) + except ValueError: + ver = b"cc=0" + + # Make sure that our "ver" is actually a version and isn't a false + # positive from a , being in the data stream. + if ver[:3] != b"cc=": + data = ver + data + ver = b"cc=0" + + # Get the version number out of the cc=N + ver = ver.split(b"=", 1)[-1].decode("ascii") + + # Dispatch to the actual load method for the given version + try: + return getattr(self, "_loads_v{0}".format(ver))(request, data) + except AttributeError: + # This is a version we don't have a loads function for, so we'll + # just treat it as a miss and return None + return + + def prepare_response(self, request, cached): + """Verify our vary headers match and construct a real urllib3 + HTTPResponse object. + """ + # Special case the '*' Vary value as it means we cannot actually + # determine if the cached response is suitable for this request. + if "*" in cached.get("vary", {}): + return + + # Ensure that the Vary headers for the cached response match our + # request + for header, value in cached.get("vary", {}).items(): + if request.headers.get(header, None) != value: + return + + body_raw = cached["response"].pop("body") + + headers = CaseInsensitiveDict(data=cached['response']['headers']) + if headers.get('transfer-encoding', '') == 'chunked': + headers.pop('transfer-encoding') + + cached['response']['headers'] = headers + + try: + body = io.BytesIO(body_raw) + except TypeError: + # This can happen if cachecontrol serialized to v1 format (pickle) + # using Python 2. A Python 2 str(byte string) will be unpickled as + # a Python 3 str (unicode string), which will cause the above to + # fail with: + # + # TypeError: 'str' does not support the buffer interface + body = io.BytesIO(body_raw.encode('utf8')) + + return HTTPResponse( + body=body, + preload_content=False, + **cached["response"] + ) + + def _loads_v0(self, request, data): + # The original legacy cache data. This doesn't contain enough + # information to construct everything we need, so we'll treat this as + # a miss. + return + + def _loads_v1(self, request, data): + try: + cached = pickle.loads(data) + except ValueError: + return + + return self.prepare_response(request, cached) + + def _loads_v2(self, request, data): + try: + cached = json.loads(zlib.decompress(data).decode("utf8")) + except (ValueError, zlib.error): + return + + # We need to decode the items that we've base64 encoded + cached["response"]["body"] = _b64_decode_bytes( + cached["response"]["body"] + ) + cached["response"]["headers"] = dict( + (_b64_decode_str(k), _b64_decode_str(v)) + for k, v in cached["response"]["headers"].items() + ) + cached["response"]["reason"] = _b64_decode_str( + cached["response"]["reason"], + ) + cached["vary"] = dict( + (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) + for k, v in cached["vary"].items() + ) + + return self.prepare_response(request, cached) + + def _loads_v3(self, request, data): + # Due to Python 2 encoding issues, it's impossible to know for sure + # exactly how to load v3 entries, thus we'll treat these as a miss so + # that they get rewritten out as v4 entries. + return + + def _loads_v4(self, request, data): + try: + cached = msgpack.loads(data, encoding='utf-8') + except ValueError: + return + + return self.prepare_response(request, cached) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 000000000..2ceac99eb --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,27 @@ +from .adapter import CacheControlAdapter +from .cache import DictCache + + +def CacheControl(sess, + cache=None, + cache_etags=True, + serializer=None, + heuristic=None, + controller_class=None, + adapter_class=None, + cacheable_methods=None): + + cache = cache or DictCache() + adapter_class = adapter_class or CacheControlAdapter + adapter = adapter_class( + cache, + cache_etags=cache_etags, + serializer=serializer, + heuristic=heuristic, + controller_class=controller_class, + cacheable_methods=cacheable_methods + ) + sess.mount('http://', adapter) + sess.mount('https://', adapter) + + return sess diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py new file mode 100644 index 000000000..3d73ece4f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where, old_where + +__version__ = "2018.01.18" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py new file mode 100644 index 000000000..e30b50d5a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from certifi import where +print(where()) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c77c2c0065e90812e455e46431e847bcee3ecfd GIT binary patch literal 285 zcmXv}%}T^D5Khu6y0YL&e1#siX;+I~5RrWVFYc)zLv2z`Nq=?{EBZ#hQm&qS1y3dm z4t(GI^3BY4xm*x$-R|OP>-~2~{*C$I-ospa5=2l<dRoz*Rg4nBsz^kSB#D2hZzs$h zy}wG7?sU`w4&mowo#kbk<!N3%B(aN|5hVsyj6AtBfLWqZ;{fnQ@HjLA{qFgMYOby1 zbB(<9f_{wm$e%la(iFqZEUp`v=5=P<@})zax5Z||cYIRQN)5)=TCcDv$}79CL-7E= jZ4e{!Mxs@%;s9z;79gEI+{tY}iZ?Cq!ZRk^c+UO+sEbUW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2e2f7aad6db97d8eae5e779fdcbb2b43e030d50 GIT binary patch literal 256 zcmXv|!Ab)$5KXo$irA|M|6q|iT3y_Ni1-0s+EYP7++=H(Y&M<5i06KdzqD6R{(>iG zi+%9kym<pN^E92FFhaXJd%2+cJvIkqWFCp(oJ29jE$jH2bEY%RcWg&aWlL5}erV1L zKI9*78ufEA8IEd=(KH6f9YgNXxcJ2|r*1F5Tc9k-s3A#&rngFCfDYlc6`~5IyG!b} z7Cz0dVpDBewAW3!SilOr@iXH>l-AC$E~}fkm1DT4NZP3$;r~1c(MjWkxb&aH@qO2; OcdH*beG$gTPWd0{o<tP@ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b32a5e206760fbebec46c67f2dc7588384853006 GIT binary patch literal 1220 zcmZ`&&2AGh5Vm(W$!66;RSA&b;v+dU+X5A>giuuwNE|98f{-F1YqNG*r<?WG_9kit zT-qz|&>ndb-eIqtcm+<(Y<^lHYRTiVJ@(9e^UeP1YD8d+diOsopO9a;S&RUbJ(%_# z2toQpP~l~?PwUm|dvA&GMQ}kxApLW{ABcu%UXXr6v_uGNQ?^9=*fVcrC>!VGoKhmZ z52O>FeT-6RoEoZbaT<MFjwtFKDa*!Ml$m5ky3*v9xg*I`Ze5aPiBmdfnNDYl9<nsS zpSpz{ccb4BCOJq^E(Qf<52jrMAqj*|`ktVDzYfH&9=w)?k?@@q`(-XN`6)5E$`8-J zM+`;}Tu)_k%&bgHquePQ)K(0l97wQZV)?$y-e)qgk_|LOY}lzT4ZJfGmCE|F!sv+- zaN{&Pln(P6qi&rpSZVRM)M#rrtUAo4U`A_ayY<t9PEduM=gC-dUPYYGAOd}b^OG{k z<~J?Qg-$vDK}-u0uEn2mTo^Th6yr%^;-StU1{;q}JQ#7lW4H6?6Y(tN#pKDR8}1yA zOtv-L-rbFRaiNNhIr1AO-QIcXP7*w<C!fe%XcNyX8K>GvD5vqj@g0O5l`yFH%bH+4 zkXEnI;2{V{M)cBi{uTW?(}OQSvn!;DcW@S6m$%cXJZ-C>NZe7?63Sr82+B}p2ud*0 zD(}#W4zE);A$X`7Qz(bLhaS;2p(~!b3+pl{JX{8~4jV@<f#c4*@+fisIhh6X^Hw$- zB}fOE17*j0B1M-i=nY`=+Wq4WawgYPmgFqS6udz8&bwf4vZPR12&mVLLa7!KX;K2U z{;{vyLMFHPo2o2>uogjqF?+JPwbMl|O=mO*JW;D_RAX`jyP7~XfbC@#j{qEtXM_gS z^P8SQxUdT2MCF`!+NKEyri}tyu3BF-7&Pv@w{CdD*TzS?25>ZY|8*a}n6dpO{%Vn0 P0S#&BueHKv*beDmP_s+h literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem new file mode 100644 index 000000000..101ac98fa --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4433 @@ + +# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA +# Label: "GlobalSign Root CA" +# Serial: 4835703278459707669005204 +# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a +# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c +# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99 +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG +A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv +b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw +MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i +YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT +aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ +jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp +xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp +1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG +snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ +U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 +9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E +BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B +AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz +yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE +38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP +AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad +DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME +HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2 +# Label: "GlobalSign Root CA - R2" +# Serial: 4835703278459682885658125 +# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30 +# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe +# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 +MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL +v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 +eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq +tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd +C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa +zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB +mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH +V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n +bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG +3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs +J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO +291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS +ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd +AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only +# Label: "Verisign Class 3 Public Primary Certification Authority - G3" +# Serial: 206684696279472310254277870180966723415 +# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09 +# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6 +# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44 +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl +cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu +LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT +aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD +VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT +aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ +bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu +IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b +N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t +KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu +kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm +CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ +Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu +imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te +2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe +DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p +F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt +TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Premium 2048 Secure Server CA" +# Serial: 946069240 +# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90 +# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31 +# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77 +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML +RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp +bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 +IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3 +MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 +LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp +YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG +A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq +K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe +sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX +MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT +XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ +HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH +4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub +j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo +U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b +u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+ +bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er +fF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust +# Label: "Baltimore CyberTrust Root" +# Serial: 33554617 +# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4 +# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74 +# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ +RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD +VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX +DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y +ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy +VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr +mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr +IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK +mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu +XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy +dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye +jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 +BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 +DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 +9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx +jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 +Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz +ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS +R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network +# Label: "AddTrust External Root" +# Serial: 1 +# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f +# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68 +# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2 +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU +MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs +IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 +MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h +bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v +dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt +H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 +uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX +mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX +a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN +E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 +WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD +VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 +Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU +cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx +IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN +AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH +YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC +Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX +c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a +mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc. +# Label: "Entrust Root Certification Authority" +# Serial: 1164660820 +# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4 +# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9 +# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 +Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW +KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw +NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw +NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy +ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV +BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo +Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 +4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 +KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI +rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi +94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB +sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi +gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo +kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE +vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t +O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua +AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP +9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ +eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m +0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Global CA O=GeoTrust Inc. +# Label: "GeoTrust Global CA" +# Serial: 144470 +# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5 +# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12 +# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT +MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i +YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg +R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 +9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq +fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv +iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU +1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ +bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW +MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA +ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l +uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn +Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS +tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF +PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un +hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV +5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc. +# Label: "GeoTrust Universal CA" +# Serial: 1 +# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48 +# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79 +# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12 +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy +c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 +IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV +VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 +cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT +QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh +F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v +c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w +mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd +VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX +teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ +f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe +Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ +nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB +/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY +MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG +9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX +IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn +ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z +uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN +Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja +QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW +koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 +ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt +DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm +bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc. +# Label: "GeoTrust Universal CA 2" +# Serial: 1 +# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7 +# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79 +# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW +MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy +c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD +VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 +c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 +WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG +FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq +XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL +se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb +KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd +IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 +y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt +hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc +QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 +Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV +HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ +KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ +L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr +Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo +ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY +T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz +GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m +1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV +OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH +6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX +QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association +# Label: "Visa eCommerce Root" +# Serial: 25952180776285836048024890241505565794 +# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02 +# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62 +# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22 +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr +MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl +cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw +CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h +dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l +cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h +2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E +lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV +ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq +299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t +vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL +dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF +AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR +zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 +LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd +7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw +++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +# Issuer: CN=AAA Certificate Services O=Comodo CA Limited +# Subject: CN=AAA Certificate Services O=Comodo CA Limited +# Label: "Comodo AAA Services root" +# Serial: 1 +# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0 +# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49 +# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4 +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb +MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow +GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj +YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM +GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua +BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe +3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 +YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR +rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm +ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU +oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v +QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t +b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF +AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q +GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 +G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi +l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 +smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority +# Label: "QuoVadis Root CA" +# Serial: 985026699 +# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24 +# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9 +# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73 +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 +aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz +MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw +IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR +dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp +li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D +rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ +WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug +F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU +xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC +Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv +dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw +ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl +IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh +c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy +ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI +KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T +KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq +y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p +dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD +VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL +MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk +fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 +7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R +cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y +mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW +xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK +SnQ2+Q== +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2" +# Serial: 1289 +# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b +# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7 +# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86 +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa +GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg +Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J +WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB +rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp ++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 +ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i +Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz +PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og +/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH +oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI +yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud +EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 +A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL +MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f +BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn +g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl +fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K +WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha +B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc +hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR +TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD +mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z +ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y +4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza +8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3" +# Serial: 1478 +# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf +# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85 +# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35 +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x +GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv +b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV +BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W +YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM +V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB +4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr +H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd +8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv +vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT +mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe +btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc +T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt +WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ +c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A +4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD +VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG +CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 +aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu +dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw +czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G +A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC +TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg +Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 +7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem +d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd ++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B +4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN +t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x +DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 +k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s +zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j +Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT +mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK +4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1 +# Subject: O=SECOM Trust.net OU=Security Communication RootCA1 +# Label: "Security Communication Root CA" +# Serial: 0 +# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a +# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7 +# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY +MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t +dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 +WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD +VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 +9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ +DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 +Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N +QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ +xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G +A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T +AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG +kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr +Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 +Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU +JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot +RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== +-----END CERTIFICATE----- + +# Issuer: CN=Sonera Class2 CA O=Sonera +# Subject: CN=Sonera Class2 CA O=Sonera +# Label: "Sonera Class 2 Root CA" +# Serial: 29 +# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb +# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27 +# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27 +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP +MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx +MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV +BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o +Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt +5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s +3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej +vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu +8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw +DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG +MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil +zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ +3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD +FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 +Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 +ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M +-----END CERTIFICATE----- + +# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com +# Label: "XRamp Global CA Root" +# Serial: 107108908803651509692980124233745014957 +# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1 +# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6 +# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2 +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB +gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk +MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY +UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx +NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 +dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy +dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 +38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP +KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q +DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 +qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa +JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi +PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P +BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs +jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 +eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR +vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa +IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy +i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ +O+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority +# Label: "Go Daddy Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67 +# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4 +# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4 +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh +MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE +YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 +MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo +ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg +MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN +ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA +PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w +wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi +EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY +avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ +YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE +sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h +/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 +IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy +OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P +TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER +dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf +ReYNnyicsbkqWletNw+vHX/bvZ8= +-----END CERTIFICATE----- + +# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority +# Label: "Starfield Class 2 CA" +# Serial: 0 +# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24 +# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a +# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58 +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl +MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp +U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw +NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp +ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 +DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf +8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN ++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 +X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa +K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA +1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G +A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR +zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 +YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD +bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w +DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 +L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D +eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp +VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY +WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +# Issuer: O=Government Root Certification Authority +# Subject: O=Government Root Certification Authority +# Label: "Taiwan GRCA" +# Serial: 42023070807708724159991140556527066870 +# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e +# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9 +# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3 +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ +MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow +PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR +IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q +gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy +yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts +F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 +jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx +ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC +VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK +YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH +EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN +Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud +DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE +MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK +UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf +qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK +ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE +JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 +hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 +EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm +nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX +udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz +ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe +LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl +pYYsfPQS +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root CA" +# Serial: 17154717934120587862167794914071425081 +# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72 +# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43 +# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c +JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP +mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ +wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 +VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ +AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB +AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW +BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun +pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC +dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf +fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm +NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx +H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root CA" +# Serial: 10944719598952040374951832963794454346 +# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e +# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36 +# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61 +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD +QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB +CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 +nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt +43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P +T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 +gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR +TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw +DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr +hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg +06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF +PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls +YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert High Assurance EV Root CA" +# Serial: 3553400076410547919724730734378100087 +# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a +# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25 +# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j +ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 +LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug +RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm ++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW +PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM +xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB +Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 +hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg +EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA +FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec +nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z +eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF +hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 +Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep ++OkuE6N36B9K +-----END CERTIFICATE----- + +# Issuer: CN=Class 2 Primary CA O=Certplus +# Subject: CN=Class 2 Primary CA O=Certplus +# Label: "Certplus Class 2 Primary CA" +# Serial: 177770208045934040241468760488327595043 +# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b +# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb +# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw +PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz +cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 +MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz +IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ +ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR +VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL +kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd +EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas +H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 +HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud +DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 +QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu +Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ +AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 +yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR +FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA +ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB +kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co. +# Label: "DST Root CA X3" +# Serial: 91299735575339953335919266965803778155 +# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5 +# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13 +# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39 +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ +MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT +DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O +rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq +OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b +xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw +7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD +aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG +SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 +ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr +AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz +R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 +JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo +Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG +# Label: "SwissSign Gold CA - G2" +# Serial: 13492815561806991280 +# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93 +# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61 +# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG +# Label: "SwissSign Silver CA - G2" +# Serial: 5700383053117599563 +# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13 +# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb +# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5 +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc. +# Label: "GeoTrust Primary Certification Authority" +# Serial: 32798226551256963324313806436981982369 +# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf +# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96 +# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY +MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo +R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx +MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 +AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA +ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 +7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W +kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI +mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ +KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 +6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl +4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K +oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj +UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU +AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA" +# Serial: 69529181992039203566298953787712940909 +# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12 +# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81 +# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB +qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV +BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw +NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j +LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG +A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs +W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta +3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk +6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 +Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J +NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP +r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU +DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz +YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 +/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ +LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 +jVaMaA== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G5" +# Serial: 33037644167568058970164719475676101450 +# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c +# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5 +# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW +ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 +nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex +t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz +SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG +BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ +rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ +NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E +BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH +BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv +MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE +p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y +5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK +WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ +4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N +hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +# Issuer: CN=SecureTrust CA O=SecureTrust Corporation +# Subject: CN=SecureTrust CA O=SecureTrust Corporation +# Label: "SecureTrust CA" +# Serial: 17199774589125277788362757014266862032 +# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1 +# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11 +# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73 +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz +MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv +cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz +Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO +0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao +wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj +7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS +8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT +BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg +JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 +6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ +3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm +D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS +CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +# Issuer: CN=Secure Global CA O=SecureTrust Corporation +# Subject: CN=Secure Global CA O=SecureTrust Corporation +# Label: "Secure Global CA" +# Serial: 9751836167731051554232119481456978597 +# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de +# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b +# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69 +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK +MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x +GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx +MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg +Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ +iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa +/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ +jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI +HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 +sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w +gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw +KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG +AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L +URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO +H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm +I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY +iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO Certification Authority O=COMODO CA Limited +# Label: "COMODO Certification Authority" +# Serial: 104350513648249232941998508985834464573 +# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75 +# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b +# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66 +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB +gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV +BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw +MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl +YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P +RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 +UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI +2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 +Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp ++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ +DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O +nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW +/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g +PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u +QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY +SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv +IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 +zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd +BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB +ZQ== +-----END CERTIFICATE----- + +# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C. +# Label: "Network Solutions Certificate Authority" +# Serial: 116697915152937497490437556386812487904 +# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e +# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce +# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi +MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp +dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV +UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO +ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG +SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz +c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP +OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl +mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF +BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 +qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw +gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu +bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp +dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 +6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ +h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH +/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN +pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited +# Label: "COMODO ECC Certification Authority" +# Serial: 41578283867086692638256921589707938090 +# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 +# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 +# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL +MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE +BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT +IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw +MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy +ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N +T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR +FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J +cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW +BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm +fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv +GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GA CA" +# Serial: 86718877871133159090080555911823548314 +# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93 +# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9 +# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5 +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB +ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly +aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w +NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G +A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX +SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR +VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 +w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF +mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg +4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 +4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw +EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx +SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 +ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 +vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi +Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ +/L7fCg0= +-----END CERTIFICATE----- + +# Issuer: CN=Certigna O=Dhimyotis +# Subject: CN=Certigna O=Dhimyotis +# Label: "Certigna" +# Serial: 18364802974209362175 +# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff +# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97 +# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV +BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X +DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ +BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 +QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny +gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw +zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q +130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 +JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw +ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT +AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj +AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG +9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h +bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc +fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu +HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w +t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center +# Label: "Deutsche Telekom Root CA 2" +# Serial: 38 +# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08 +# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf +# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3 +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc +MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj +IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB +IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE +RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl +U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 +IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU +ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC +QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr +rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S +NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc +QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH +txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP +BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC +AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp +tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa +IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl +6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ +xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc +# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc +# Label: "Cybertrust Global Root" +# Serial: 4835703278459682877484360 +# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1 +# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6 +# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3 +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG +A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh +bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE +ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS +b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 +7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS +J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y +HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP +t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz +FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY +XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ +MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw +hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js +MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA +A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj +Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx +XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o +omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc +A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority +# Label: "ePKI Root Certification Authority" +# Serial: 28956088682735189655030529057352760477 +# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3 +# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0 +# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5 +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe +MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 +ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw +IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL +SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH +SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh +ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X +DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 +TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ +fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA +sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU +WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS +nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH +dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip +NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC +AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF +MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB +uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl +PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP +JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ +gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 +j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 +5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB +o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS +/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z +Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE +W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D +hNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +# Issuer: O=certSIGN OU=certSIGN ROOT CA +# Subject: O=certSIGN OU=certSIGN ROOT CA +# Label: "certSIGN ROOT CA" +# Serial: 35210227249154 +# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17 +# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b +# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT +AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD +QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP +MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do +0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ +UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d +RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ +OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv +JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C +AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O +BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ +LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY +MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ +44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I +Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw +i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN +9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G3" +# Serial: 28809105769928564313984085209975885599 +# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05 +# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd +# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4 +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB +mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT +MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ +BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0 +BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz ++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm +hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn +5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W +JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL +DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC +huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB +AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB +zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN +kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH +SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G +spki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G2" +# Serial: 71758320672825410020661621085256472406 +# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f +# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12 +# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57 +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL +MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp +IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi +BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw +MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig +YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v +dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/ +BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6 +papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K +DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3 +KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox +XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only +# Label: "thawte Primary Root CA - G3" +# Serial: 127614157056681299805556476275995414779 +# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31 +# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2 +# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB +rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf +Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw +MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV +BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa +Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl +LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u +MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm +gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8 +YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf +b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9 +9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S +zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk +OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA +2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW +oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c +KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM +m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu +MdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only +# Label: "GeoTrust Primary Certification Authority - G2" +# Serial: 80682863203381065782177908751794619243 +# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a +# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0 +# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66 +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL +MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj +KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2 +MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw +NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV +BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH +MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL +So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal +tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG +CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT +qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz +rD6ogRLQy7rQkgu2npaqBA+K +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Universal Root Certification Authority" +# Serial: 85209574734084581917763752644031726877 +# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19 +# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54 +# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB +vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL +ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp +U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W +ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe +Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX +MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0 +IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y +IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh +bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF +9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH +H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H +LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN +/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT +rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw +WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs +exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4 +sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+ +seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz +4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+ +BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR +lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3 +7M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only +# Label: "VeriSign Class 3 Public Primary Certification Authority - G4" +# Serial: 63143484348153506665311985501458640051 +# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41 +# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a +# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79 +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW +ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln +biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp +U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y +aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp +U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg +SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln +biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm +GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve +fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ +aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj +aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW +kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC +4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga +FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) +# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" +# Serial: 80544274841616 +# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 +# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 +# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG +EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 +MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl +cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR +dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB +pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM +b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm +aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz +IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT +lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz +AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 +VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG +ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 +BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG +AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M +U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh +bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C ++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F +uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 +XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G2" +# Serial: 10000012 +# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a +# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16 +# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f +-----BEGIN CERTIFICATE----- +MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX +DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291 +qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp +uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU +Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE +pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp +5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M +UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN +GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy +5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv +6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK +eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6 +B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/ +BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov +L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV +HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG +SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS +CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen +5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897 +IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK +gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL ++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL +vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm +bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk +N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC +Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z +ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ== +-----END CERTIFICATE----- + +# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post +# Label: "Hongkong Post Root CA 1" +# Serial: 1000 +# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca +# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 +# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx +FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg +Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG +A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr +b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ +jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn +PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh +ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 +nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h +q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED +MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC +mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 +7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB +oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs +EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO +fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi +AmvZWg== +-----END CERTIFICATE----- + +# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. +# Label: "SecureSign RootCA11" +# Serial: 1 +# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26 +# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3 +# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12 +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr +MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG +A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0 +MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp +Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD +QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz +i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8 +h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV +MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9 +UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni +8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC +h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD +VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB +AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm +KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ +X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr +QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5 +pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN +QSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. +# Label: "Microsec e-Szigno Root CA 2009" +# Serial: 14014712776195784473 +# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 +# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e +# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD +VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 +ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G +CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y +OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx +FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp +Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP +kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc +cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U +fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 +N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC +xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 ++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM +Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG +SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h +mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk +ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c +2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t +HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 +# Label: "GlobalSign Root CA - R3" +# Serial: 4835703278459759426209954 +# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 +# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad +# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G +A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp +Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 +MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG +A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 +RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT +gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm +KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd +QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ +XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o +LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU +RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp +jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK +6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX +mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs +Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH +WD9f +-----END CERTIFICATE----- + +# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 +# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" +# Serial: 6047274297262753887 +# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3 +# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa +# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE +BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h +cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy +MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg +Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 +thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM +cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG +L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i +NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h +X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b +m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy +Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja +EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T +KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF +6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh +OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD +VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv +ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl +AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF +661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9 +am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1 +ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481 +PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS +3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k +SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF +3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM +ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g +StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz +Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB +jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +# Issuer: CN=Izenpe.com O=IZENPE S.A. +# Subject: CN=Izenpe.com O=IZENPE S.A. +# Label: "Izenpe.com" +# Serial: 917563065490389241595536686991402621 +# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 +# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 +# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4 +MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6 +ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD +VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j +b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq +scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO +xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H +LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX +uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD +yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+ +JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q +rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN +BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L +hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB +QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+ +HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu +Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg +QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB +BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA +A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb +laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56 +awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo +JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw +LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT +VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk +LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb +UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/ +QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+ +naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls +QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A. +# Label: "Chambers of Commerce Root - 2008" +# Serial: 11806822484801597146 +# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7 +# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c +# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0 +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz +IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz +MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj +dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw +EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp +MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9 +28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq +VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q +DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR +5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL +ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a +Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl +UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s ++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5 +Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx +hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV +HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1 ++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN +YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t +L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy +ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt +IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV +HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w +DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW +PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF +5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1 +glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH +FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2 +pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD +xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG +tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq +jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De +fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ +d0jQ +-----END CERTIFICATE----- + +# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A. +# Label: "Global Chambersign Root - 2008" +# Serial: 14541511773111788494 +# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3 +# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c +# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD +VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0 +IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3 +MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx +MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy +cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG +A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl +BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed +KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7 +G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2 +zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4 +ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG +HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2 +Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V +yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e +beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r +6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog +zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW +BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr +ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp +ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk +cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt +YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC +CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow +KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI +hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ +UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz +X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x +fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz +a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd +Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd +SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O +AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso +M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge +v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. +# Label: "Go Daddy Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 +# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b +# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT +EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp +ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz +NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH +EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE +AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD +E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH +/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy +DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh +GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR +tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA +AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX +WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu +9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr +gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo +2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI +4uJEvlz36hz1 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 +# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e +# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs +ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw +MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj +aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp +Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg +nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 +HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N +Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN +dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 +HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G +CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU +sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 +4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg +8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 +mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. +# Label: "Starfield Services Root Certificate Authority - G2" +# Serial: 0 +# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 +# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f +# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx +EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT +HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs +ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD +VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy +ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy +dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p +OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 +8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K +Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe +hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk +6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q +AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI +bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB +ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z +qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn +0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN +sSi6 +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Commercial O=AffirmTrust +# Subject: CN=AffirmTrust Commercial O=AffirmTrust +# Label: "AffirmTrust Commercial" +# Serial: 8608355977964138876 +# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7 +# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7 +# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7 +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP +Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr +ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL +MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1 +yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr +VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/ +nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG +XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj +vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt +Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g +N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC +nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Networking O=AffirmTrust +# Subject: CN=AffirmTrust Networking O=AffirmTrust +# Label: "AffirmTrust Networking" +# Serial: 8957382827206547757 +# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f +# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f +# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz +dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL +MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp +cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y +YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua +kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL +QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp +6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG +yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i +QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ +KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO +tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu +QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ +Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u +olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48 +x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium O=AffirmTrust +# Subject: CN=AffirmTrust Premium O=AffirmTrust +# Label: "AffirmTrust Premium" +# Serial: 7893706540734352110 +# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57 +# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27 +# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE +BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz +dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG +A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U +cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf +qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ +JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ ++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS +s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5 +HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7 +70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG +V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S +qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S +5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia +C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX +OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE +FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2 +KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B +8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ +MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc +0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ +u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF +u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH +YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8 +GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO +RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e +KeC2uAloGRwYQw== +-----END CERTIFICATE----- + +# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust +# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust +# Label: "AffirmTrust Premium ECC" +# Serial: 8401224907861490260 +# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d +# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb +# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23 +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC +VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ +cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ +BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt +VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D +0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9 +ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G +A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs +aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I +flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA" +# Serial: 279744 +# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 +# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e +# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM +MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D +ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU +cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 +WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg +Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw +IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH +UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM +TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU +BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM +kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x +AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV +HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y +sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL +I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 +J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY +VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA +# Label: "TWCA Root Certification Authority" +# Serial: 1 +# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 +# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 +# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES +MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU +V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz +WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO +LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE +AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH +K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX +RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z +rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx +3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq +hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC +MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls +XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D +lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn +aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ +YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 +# Label: "Security Communication RootCA2" +# Serial: 0 +# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 +# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 +# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl +MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe +U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX +DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy +dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj +YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV +OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr +zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM +VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ +hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO +ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw +awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs +OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF +coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc +okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 +t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy +1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ +SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2011" +# Serial: 0 +# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9 +# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d +# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71 +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix +RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p +YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw +NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK +EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl +cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz +dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ +fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns +bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD +75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP +FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV +HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp +5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu +b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA +A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p +6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7 +dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys +Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI +l7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 +# Label: "Actalis Authentication Root CA" +# Serial: 6271844772424770508 +# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 +# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac +# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE +BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w +MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC +SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 +ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv +UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX +4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 +KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ +gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb +rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ +51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F +be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe +KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F +v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn +fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 +jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz +ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL +e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 +jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz +WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V +SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j +pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX +X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok +fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R +K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU +ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU +LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT +LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +# Issuer: O=Trustis Limited OU=Trustis FPS Root CA +# Subject: O=Trustis Limited OU=Trustis FPS Root CA +# Label: "Trustis FPS Root CA" +# Serial: 36053640375399034304724988975563710553 +# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d +# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04 +# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL +ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx +MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc +MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+ +AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH +iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj +vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA +0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB +OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/ +BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E +FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01 +GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW +zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4 +1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE +f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F +jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN +ZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 2 Root CA" +# Serial: 2 +# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 +# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 +# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr +6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV +L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 +1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx +MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ +QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB +arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr +Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi +FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS +P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN +9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz +uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h +9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t +OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo ++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 +KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 +DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us +H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ +I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 +5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h +3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz +Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= +-----END CERTIFICATE----- + +# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 +# Label: "Buypass Class 3 Root CA" +# Serial: 2 +# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec +# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 +# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd +MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg +Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow +TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw +HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB +BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y +ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E +N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 +tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX +0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c +/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X +KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY +zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS +O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D +34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP +K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 +AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv +Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj +QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS +IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 +HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa +O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv +033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u +dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE +kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 +3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD +u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq +4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 3" +# Serial: 1 +# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef +# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 +# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN +8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ +RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 +hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 +ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM +EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 +A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy +WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ +1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 +6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT +91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p +TpPDpFQUWw== +-----END CERTIFICATE----- + +# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus +# Label: "EE Certification Centre Root CA" +# Serial: 112324828676200291871926431888494945866 +# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f +# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7 +# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76 +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1 +MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1 +czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG +CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy +MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl +ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS +b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy +euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO +bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw +WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d +MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE +1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/ +zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB +BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF +BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV +v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG +E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW +iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v +GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 2009" +# Serial: 623603 +# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f +# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 +# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha +ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM +HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 +UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 +tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R +ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM +lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp +/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G +A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy +MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl +cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js +L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL +BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni +acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K +zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 +PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y +Johw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH +# Label: "D-TRUST Root Class 3 CA 2 EV 2009" +# Serial: 623604 +# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 +# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 +# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF +MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD +bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw +NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV +BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn +ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 +3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z +qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR +p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 +HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw +ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea +HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw +Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh +c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E +RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt +dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku +Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp +3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF +CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na +xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX +KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +# Issuer: CN=CA Disig Root R2 O=Disig a.s. +# Subject: CN=CA Disig Root R2 O=Disig a.s. +# Label: "CA Disig Root R2" +# Serial: 10572350602393338211 +# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 +# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 +# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV +BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu +MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy +MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx +EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe +NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH +PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I +x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe +QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR +yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO +QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 +H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ +QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD +i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs +nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 +rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI +hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf +GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb +lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka ++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal +TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i +nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 +gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr +G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os +zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x +L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV +# Label: "ACCVRAIZ1" +# Serial: 6828503384748696800 +# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 +# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 +# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE +AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw +CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ +BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND +VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb +qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY +HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo +G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA +lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr +IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ +0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH +k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 +4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO +m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa +cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl +uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI +KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls +ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG +AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT +VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG +CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA +cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA +QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA +7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA +cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA +QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA +czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu +aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt +aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud +DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF +BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp +D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU +JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m +AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD +vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms +tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH +7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA +h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF +d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H +pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA +# Label: "TWCA Global Root CA" +# Serial: 3262 +# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 +# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 +# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx +EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT +VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 +NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT +B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF +10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz +0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh +MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH +zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc +46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 +yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi +laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP +oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA +BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE +qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm +4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL +1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF +H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo +RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ +nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh +15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW +6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW +nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j +wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz +aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy +KwbQBM0= +-----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Subject: CN=T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5 O=T\xdcRKTRUST Bilgi \u0130leti\u015fim ve Bili\u015fim G\xfcvenli\u011fi Hizmetleri A.\u015e. +# Label: "T\xdcRKTRUST Elektronik Sertifika Hizmet Sa\u011flay\u0131c\u0131s\u0131 H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GB CA" +# Serial: 157768595616588414422159278966750757568 +# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d +# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed +# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt +MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg +Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i +YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x +CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG +b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 +HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx +WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX +1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk +u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P +99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r +M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB +BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh +cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 +gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO +ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf +aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. +# Label: "SZAFIR ROOT CA2" +# Serial: 357043034767186914217277344587386743377558296292 +# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 +# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de +# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL +BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 +ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw +NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L +cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg +Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN +QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT +3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw +3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 +3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 +BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN +XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD +AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF +AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw +8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG +nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP +oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy +d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg +LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority +# Label: "Certum Trusted Network CA 2" +# Serial: 44979900017204383099463764357512596969 +# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 +# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 +# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB +gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu +QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG +A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz +OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ +VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 +b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA +DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn +0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB +OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE +fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E +Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m +o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i +sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW +OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez +Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS +adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n +3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ +F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf +CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 +XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm +djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ +WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb +AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq +P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko +b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj +XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P +5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi +DrW5viSP +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce +# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 +# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix +DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k +IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT +N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v +dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG +A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh +ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx +QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 +dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA +4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 +AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 +4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C +ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV +9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD +gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 +Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq +NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko +LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd +ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I +XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI +M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot +9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V +Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea +j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh +X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ +l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf +bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 +pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK +e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 +vm9qp/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority +# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" +# Serial: 0 +# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef +# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 +# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN +BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl +c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl +bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv +b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ +BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj +YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 +MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 +dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg +QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa +jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi +C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep +lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof +TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G1 O=Certplus +# Subject: CN=Certplus Root CA G1 O=Certplus +# Label: "Certplus Root CA G1" +# Serial: 1491911565779898356709731176965615564637713 +# MD5 Fingerprint: 7f:09:9c:f7:d9:b9:5c:69:69:56:d5:37:3e:14:0d:42 +# SHA1 Fingerprint: 22:fd:d0:b7:fd:a2:4e:0d:ac:49:2c:a0:ac:a6:7b:6a:1f:e3:f7:66 +# SHA256 Fingerprint: 15:2a:40:2b:fc:df:2c:d5:48:05:4d:22:75:b3:9c:7f:ca:3e:c0:97:80:78:b0:f0:ea:76:e5:61:a6:c7:43:3e +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgISESBVg+QtPlRWhS2DN7cs3EYRMA0GCSqGSIb3DQEBDQUA +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBa +MD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2Vy +dHBsdXMgUm9vdCBDQSBHMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB +ANpQh7bauKk+nWT6VjOaVj0W5QOVsjQcmm1iBdTYj+eJZJ+622SLZOZ5KmHNr49a +iZFluVj8tANfkT8tEBXgfs+8/H9DZ6itXjYj2JizTfNDnjl8KvzsiNWI7nC9hRYt +6kuJPKNxQv4c/dMcLRC4hlTqQ7jbxofaqK6AJc96Jh2qkbBIb6613p7Y1/oA/caP +0FG7Yn2ksYyy/yARujVjBYZHYEMzkPZHogNPlk2dT8Hq6pyi/jQu3rfKG3akt62f +6ajUeD94/vI4CTYd0hYCyOwqaK/1jpTvLRN6HkJKHRUxrgwEV/xhc/MxVoYxgKDE +EW4wduOU8F8ExKyHcomYxZ3MVwia9Az8fXoFOvpHgDm2z4QTd28n6v+WZxcIbekN +1iNQMLAVdBM+5S//Ds3EC0pd8NgAM0lm66EYfFkuPSi5YXHLtaW6uOrc4nBvCGrc +h2c0798wct3zyT8j/zXhviEpIDCB5BmlIOklynMxdCm+4kLV87ImZsdo/Rmz5yCT +mehd4F6H50boJZwKKSTUzViGUkAksnsPmBIgJPaQbEfIDbsYIC7Z/fyL8inqh3SV +4EJQeIQEQWGw9CEjjy3LKCHyamz0GqbFFLQ3ZU+V/YDI+HLlJWvEYLF7bY5KinPO +WftwenMGE9nTdDckQQoRb5fc5+R+ob0V8rqHDz1oihYHAgMBAAGjYzBhMA4GA1Ud +DwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSowcCbkahDFXxd +Bie0KlHYlwuBsTAfBgNVHSMEGDAWgBSowcCbkahDFXxdBie0KlHYlwuBsTANBgkq +hkiG9w0BAQ0FAAOCAgEAnFZvAX7RvUz1isbwJh/k4DgYzDLDKTudQSk0YcbX8ACh +66Ryj5QXvBMsdbRX7gp8CXrc1cqh0DQT+Hern+X+2B50ioUHj3/MeXrKls3N/U/7 +/SMNkPX0XtPGYX2eEeAC7gkE2Qfdpoq3DIMku4NQkv5gdRE+2J2winq14J2by5BS +S7CTKtQ+FjPlnsZlFT5kOwQ/2wyPX1wdaR+v8+khjPPvl/aatxm2hHSco1S1cE5j +2FddUyGbQJJD+tZ3VTNPZNX70Cxqjm0lpu+F6ALEUz65noe8zDUa3qHpimOHZR4R +Kttjd5cUvpoUmRGywO6wT/gUITJDT5+rosuoD6o7BlXGEilXCNQ314cnrUlZp5Gr +RHpejXDbl85IULFzk/bwg2D5zfHhMf1bfHEhYxQUqq/F3pN+aLHsIqKqkHWetUNy +6mSjhEv9DKgma3GX7lZjZuhCVPnHHd/Qj1vfyDBviP4NxDMcU6ij/UgQ8uQKTuEV +V/xuZDDCVRHc6qnNSlSsKWNEz0pAoNZoWRsz+e86i9sgktxChL8Bq4fA1SCC28a5 +g4VCXA9DO2pJNdWY9BW/+mGBDAkgGNLQFwzLSABQ6XaCjGTXOqAHVcweMcDvOrRl +++O/QmueD6i9a5jc2NvLi6Td11n0bt3+qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo= +-----END CERTIFICATE----- + +# Issuer: CN=Certplus Root CA G2 O=Certplus +# Subject: CN=Certplus Root CA G2 O=Certplus +# Label: "Certplus Root CA G2" +# Serial: 1492087096131536844209563509228951875861589 +# MD5 Fingerprint: a7:ee:c4:78:2d:1b:ee:2d:b9:29:ce:d6:a7:96:32:31 +# SHA1 Fingerprint: 4f:65:8e:1f:e9:06:d8:28:02:e9:54:47:41:c9:54:25:5d:69:cc:1a +# SHA256 Fingerprint: 6c:c0:50:41:e6:44:5e:74:69:6c:4c:fb:c9:f8:0f:54:3b:7e:ab:bb:44:b4:ce:6f:78:7c:6a:99:71:c4:2f:17 +-----BEGIN CERTIFICATE----- +MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjAeFw0xNDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4x +CzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBs +dXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABM0PW1aC3/BFGtat +93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uNAm8x +Ik0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwj +FNiPwyCrKGBZMB8GA1UdIwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqG +SM49BAMDA2gAMGUCMHD+sAvZ94OX7PNVHdTcswYO/jOYnYs5kGuUIe22113WTNch +p+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjlvPl5adytRSv3tjFzzAal +U5ORGpOucGpnutee5WEaXw== +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G1 O=OpenTrust +# Subject: CN=OpenTrust Root CA G1 O=OpenTrust +# Label: "OpenTrust Root CA G1" +# Serial: 1492036577811947013770400127034825178844775 +# MD5 Fingerprint: 76:00:cc:81:29:cd:55:5e:88:6a:7a:2e:f7:4d:39:da +# SHA1 Fingerprint: 79:91:e8:34:f7:e2:ee:dd:08:95:01:52:e9:55:2d:14:e9:58:d5:7e +# SHA256 Fingerprint: 56:c7:71:28:d9:8c:18:d9:1b:4c:fd:ff:bc:25:ee:91:03:d4:75:8e:a2:ab:ad:82:6a:90:f3:45:7d:46:0e:b4 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESCzkFU5fX82bWTCp59rY45nMA0GCSqGSIb3DQEBCwUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcxMB4XDTE0MDUyNjA4NDU1MFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQD4eUbalsUwXopxAy1wpLuwxQjczeY1wICkES3d5oeuXT2R0odsN7faYp6b +wiTXj/HbpqbfRm9RpnHLPhsxZ2L3EVs0J9V5ToybWL0iEA1cJwzdMOWo010hOHQX +/uMftk87ay3bfWAfjH1MBcLrARYVmBSO0ZB3Ij/swjm4eTrwSSTilZHcYTSSjFR0 +77F9jAHiOH3BX2pfJLKOYheteSCtqx234LSWSE9mQxAGFiQD4eCcjsZGT44ameGP +uY4zbGneWK2gDqdkVBFpRGZPTBKnjix9xNRbxQA0MMHZmf4yzgeEtE7NCv82TWLx +p2NX5Ntqp66/K7nJ5rInieV+mhxNaMbBGN4zK1FGSxyO9z0M+Yo0FMT7MzUj8czx +Kselu7Cizv5Ta01BG2Yospb6p64KTrk5M0ScdMGTHPjgniQlQ/GbI4Kq3ywgsNw2 +TgOzfALU5nsaqocTvz6hdLubDuHAk5/XpGbKuxs74zD0M1mKB3IDVedzagMxbm+W +G+Oin6+Sx+31QrclTDsTBM8clq8cIqPQqwWyTBIjUtz9GVsnnB47ev1CI9sjgBPw +vFEVVJSmdz7QdFG9URQIOTfLHzSpMJ1ShC5VkLG631UAC9hWLbFJSXKAqWLXwPYY +EQRVzXR7z2FwefR7LFxckvzluFqrTJOVoSfupb7PcSNCupt2LQIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUl0YhVyE1 +2jZVx/PxN3DlCPaTKbYwHwYDVR0jBBgwFoAUl0YhVyE12jZVx/PxN3DlCPaTKbYw +DQYJKoZIhvcNAQELBQADggIBAB3dAmB84DWn5ph76kTOZ0BP8pNuZtQ5iSas000E +PLuHIT839HEl2ku6q5aCgZG27dmxpGWX4m9kWaSW7mDKHyP7Rbr/jyTwyqkxf3kf +gLMtMrpkZ2CvuVnN35pJ06iCsfmYlIrM4LvgBBuZYLFGZdwIorJGnkSI6pN+VxbS +FXJfLkur1J1juONI5f6ELlgKn0Md/rcYkoZDSw6cMoYsYPXpSOqV7XAp8dUv/TW0 +V8/bhUiZucJvbI/NeJWsZCj9VrDDb8O+WVLhX4SPgPL0DTatdrOjteFkdjpY3H1P +XlZs5VVZV6Xf8YpmMIzUUmI4d7S+KNfKNsSbBfD4Fdvb8e80nR14SohWZ25g/4/I +i+GOvUKpMwpZQhISKvqxnUOOBZuZ2mKtVzazHbYNeS2WuOvyDEsMpZTGMKcmGS3t +TAZQMPH9WD25SxdfGbRqhFS0OE85og2WaMMolP3tLR9Ka0OWLpABEPs4poEL0L91 +09S5zvE/bw4cHjdx5RiHdRk/ULlepEU0rbDK5uUTdg8xFKmOLZTW1YVNcxVPS/Ky +Pu1svf0OnWZzsD2097+o4BGkxK51CUpjAEggpsadCwmKtODmzj7HPiY46SvepghJ +AwSQiumPv+i2tCqjI40cHLI5kqiPAlxAOXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj +1oxx +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G2 O=OpenTrust +# Subject: CN=OpenTrust Root CA G2 O=OpenTrust +# Label: "OpenTrust Root CA G2" +# Serial: 1492012448042702096986875987676935573415441 +# MD5 Fingerprint: 57:24:b6:59:24:6b:ae:c8:fe:1c:0c:20:f2:c0:4e:eb +# SHA1 Fingerprint: 79:5f:88:60:c5:ab:7c:3d:92:e6:cb:f4:8d:e1:45:cd:11:ef:60:0b +# SHA256 Fingerprint: 27:99:58:29:fe:6a:75:15:c1:bf:e8:48:f9:c4:76:1d:b1:6c:22:59:29:25:7b:f4:0d:08:94:f2:9e:a8:ba:f2 +-----BEGIN CERTIFICATE----- +MIIFbzCCA1egAwIBAgISESChaRu/vbm9UpaPI+hIvyYRMA0GCSqGSIb3DQEBDQUA +MEAxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9w +ZW5UcnVzdCBSb290IENBIEcyMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAw +MFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwU +T3BlblRydXN0IFJvb3QgQ0EgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDMtlelM5QQgTJT32F+D3Y5z1zCU3UdSXqWON2ic2rxb95eolq5cSG+Ntmh +/LzubKh8NBpxGuga2F8ORAbtp+Dz0mEL4DKiltE48MLaARf85KxP6O6JHnSrT78e +CbY2albz4e6WiWYkBuTNQjpK3eCasMSCRbP+yatcfD7J6xcvDH1urqWPyKwlCm/6 +1UWY0jUJ9gNDlP7ZvyCVeYCYitmJNbtRG6Q3ffyZO6v/v6wNj0OxmXsWEH4db0fE +FY8ElggGQgT4hNYdvJGmQr5J1WqIP7wtUdGejeBSzFfdNTVY27SPJIjki9/ca1TS +gSuyzpJLHB9G+h3Ykst2Z7UJmQnlrBcUVXDGPKBWCgOz3GIZ38i1MH/1PCZ1Eb3X +G7OHngevZXHloM8apwkQHZOJZlvoPGIytbU6bumFAYueQ4xncyhZW+vj3CzMpSZy +YhK05pyDRPZRpOLAeiRXyg6lPzq1O4vldu5w5pLeFlwoW5cZJ5L+epJUzpM5ChaH +vGOz9bGTXOBut9Dq+WIyiET7vycotjCVXRIouZW+j1MY5aIYFuJWpLIsEPUdN6b4 +t/bQWVyJ98LVtZR00dX+G7bw5tYee9I8y6jj9RjzIR9u701oBnstXW5DiabA+aC/ +gh7PU3+06yzbXfZqfUAkBXKJOAGTy3HCOV0GEfZvePg3DTmEJwIDAQABo2MwYTAO +BgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUajn6QiL3 +5okATV59M4PLuG53hq8wHwYDVR0jBBgwFoAUajn6QiL35okATV59M4PLuG53hq8w +DQYJKoZIhvcNAQENBQADggIBAJjLq0A85TMCl38th6aP1F5Kr7ge57tx+4BkJamz +Gj5oXScmp7oq4fBXgwpkTx4idBvpkF/wrM//T2h6OKQQbA2xx6R3gBi2oihEdqc0 +nXGEL8pZ0keImUEiyTCYYW49qKgFbdEfwFFEVn8nNQLdXpgKQuswv42hm1GqO+qT +RmTFAHneIWv2V6CG1wZy7HBGS4tz3aAhdT7cHcCP009zHIXZ/n9iyJVvttN7jLpT +wm+bREx50B1ws9efAvSyB7DH5fitIw6mVskpEndI2S9G/Tvw/HRwkqWOOAgfZDC2 +t0v7NqwQjqBSM2OdAzVWxWm9xiNaJ5T2pBL4LTM8oValX9YZ6e18CL13zSdkzJTa +TkZQh+D5wVOAHrut+0dSixv9ovneDiK3PTNZbNTe9ZUGMg1RGUFcPk8G97krgCf2 +o6p6fAbhQ8MTOWIaNr3gKC6UAuQpLmBVrkA9sHSSXvAgZJY/X0VdiLWK2gKgW0VU +3jg9CcCoSmVGFvyqv1ROTVu+OEO3KMqLM6oaJbolXCkvW0pujOotnCr2BXbgd5eA +iN1nE28daCSLT7d0geX0YJ96Vdc+N9oWaz53rK4YcJUIeSkDiv7BO7M/Gg+kO14f +WKGVyasvc0rQLW6aWQ9VGHgtPFGml4vmu7JwqkwR3v98KzfUetF3NI/n+UL3PIEM +S1IK +-----END CERTIFICATE----- + +# Issuer: CN=OpenTrust Root CA G3 O=OpenTrust +# Subject: CN=OpenTrust Root CA G3 O=OpenTrust +# Label: "OpenTrust Root CA G3" +# Serial: 1492104908271485653071219941864171170455615 +# MD5 Fingerprint: 21:37:b4:17:16:92:7b:67:46:70:a9:96:d7:a8:13:24 +# SHA1 Fingerprint: 6e:26:64:f3:56:bf:34:55:bf:d1:93:3f:7c:01:de:d8:13:da:8a:a6 +# SHA256 Fingerprint: b7:c3:62:31:70:6e:81:07:8c:36:7c:b8:96:19:8f:1e:32:08:dd:92:69:49:dd:8f:57:09:a4:10:f7:5b:62:92 +-----BEGIN CERTIFICATE----- +MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAx +CzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5U +cnVzdCBSb290IENBIEczMB4XDTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFow +QDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9wZW5UcnVzdDEdMBsGA1UEAwwUT3Bl +blRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARK7liuTcpm +3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5Bta1d +oYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5 +DMlv4VBN0BBY3JWIbTAfBgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAK +BggqhkjOPQQDAwNpADBmAjEAj6jcnboMBBf6Fek9LykBl7+BFjNAk2z8+e2AcG+q +j9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta3U1fJAuwACEl74+nBCZx +4nxp5V2a+EEfOzmTk51V6s2N8fvB +-----END CERTIFICATE----- + +# Issuer: CN=ISRG Root X1 O=Internet Security Research Group +# Subject: CN=ISRG Root X1 O=Internet Security Research Group +# Label: "ISRG Root X1" +# Serial: 172886928669790476064670243504169061120 +# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e +# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 +# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 +WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu +ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc +h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ +0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U +A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW +T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH +B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC +B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv +KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn +OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn +jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw +qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI +rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq +hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ +3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK +NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 +ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur +TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC +jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc +oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq +4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA +mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d +emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM +# Label: "AC RAIZ FNMT-RCM" +# Serial: 485876308206448804701554682760554759 +# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d +# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 +# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx +CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ +WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ +BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG +Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ +yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf +BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz +WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF +tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z +374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC +IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL +mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 +wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS +MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 +ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet +UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H +YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 +LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 +RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM +LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf +77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N +JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm +fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp +6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp +1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B +9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok +RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv +uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 1 O=Amazon +# Subject: CN=Amazon Root CA 1 O=Amazon +# Label: "Amazon Root CA 1" +# Serial: 143266978916655856878034712317230054538369994 +# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 +# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 +# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA +A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI +U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs +N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv +o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU +5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy +rqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 2 O=Amazon +# Subject: CN=Amazon Root CA 2 O=Amazon +# Label: "Amazon Root CA 2" +# Serial: 143266982885963551818349160658925006970653239 +# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 +# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a +# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK +gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ +W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg +1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K +8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r +2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me +z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR +8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj +mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz +7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 ++XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI +0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB +Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm +UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 +LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS +k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl +7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm +btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl +urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ +fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 +n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE +76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H +9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT +4PsJYGw= +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 3 O=Amazon +# Subject: CN=Amazon Root CA 3 O=Amazon +# Label: "Amazon Root CA 3" +# Serial: 143266986699090766294700635381230934788665930 +# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 +# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e +# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl +ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr +ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr +BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM +YyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +# Issuer: CN=Amazon Root CA 4 O=Amazon +# Subject: CN=Amazon Root CA 4 O=Amazon +# Label: "Amazon Root CA 4" +# Serial: 143266989758080763974105200630763877849284878 +# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd +# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be +# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 +MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g +Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG +A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg +Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi +9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk +M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB +MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw +CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW +1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +# Issuer: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Subject: CN=LuxTrust Global Root 2 O=LuxTrust S.A. +# Label: "LuxTrust Global Root 2" +# Serial: 59914338225734147123941058376788110305822489521 +# MD5 Fingerprint: b2:e1:09:00:61:af:f7:f1:91:6f:c4:ad:8d:5e:3b:7c +# SHA1 Fingerprint: 1e:0e:56:19:0a:d1:8b:25:98:b2:04:44:ff:66:8a:04:17:99:5f:3f +# SHA256 Fingerprint: 54:45:5f:71:29:c2:0b:14:47:c4:18:f9:97:16:8f:24:c5:8f:c5:02:3b:f5:da:5b:e2:eb:6e:1d:d8:90:2e:d5 +-----BEGIN CERTIFICATE----- +MIIFwzCCA6ugAwIBAgIUCn6m30tEntpqJIWe5rgV0xZ/u7EwDQYJKoZIhvcNAQEL +BQAwRjELMAkGA1UEBhMCTFUxFjAUBgNVBAoMDUx1eFRydXN0IFMuQS4xHzAdBgNV +BAMMFkx1eFRydXN0IEdsb2JhbCBSb290IDIwHhcNMTUwMzA1MTMyMTU3WhcNMzUw +MzA1MTMyMTU3WjBGMQswCQYDVQQGEwJMVTEWMBQGA1UECgwNTHV4VHJ1c3QgUy5B +LjEfMB0GA1UEAwwWTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMjCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBANeFl78RmOnwYoNMPIf5U2o3C/IPPIfOb9wmKb3F +ibrJgz337spbxm1Jc7TJRqMbNBM/wYlFV/TZsfs2ZUv7COJIcRHIbjuend+JZTem +hfY7RBi2xjcwYkSSl2l9QjAk5A0MiWtj3sXh306pFGxT4GHO9hcvHTy95iJMHZP1 +EMShduxq3sVs35a0VkBCwGKSMKEtFZSg0iAGCW5qbeXrt77U8PEVfIvmTroTzEsn +Xpk8F12PgX8zPU/TPxvsXD/wPEx1bvKm1Z3aLQdjAsZy6ZS8TEmVT4hSyNvoaYL4 +zDRbIvCGp4m9SAptZoFtyMhk+wHh9OHe2Z7d21vUKpkmFRseTJIpgp7VkoGSQXAZ +96Tlk0u8d2cx3Rz9MXANF5kM+Qw5GSoXtTBxVdUPrljhPS80m8+f9niFwpN6cj5m +j5wWEWCPnolvZ77gR1o7DJpni89Gxq44o/KnvObWhWszJHAiS8sIm7vI+AIpHb4g +DEa/a4ebsypmQjVGbKq6rfmYe+lQVRQxv7HaLe2ArWgk+2mr2HETMOZns4dA/Yl+ +8kPREd8vZS9kzl8UubG/Mb2HeFpZZYiq/FkySIbWTLkpS5XTdvN3JW1CHDiDTf2j +X5t/Lax5Gw5CMZdjpPuKadUiDTSQMC6otOBttpSsvItO13D8xTiOZCXhTTmQzsmH +hFhxAgMBAAGjgagwgaUwDwYDVR0TAQH/BAUwAwEB/zBCBgNVHSAEOzA5MDcGByuB +KwEBAQowLDAqBggrBgEFBQcCARYeaHR0cHM6Ly9yZXBvc2l0b3J5Lmx1eHRydXN0 +Lmx1MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBT/GCh2+UgFLKGu8SsbK7JT ++Et8szAdBgNVHQ4EFgQU/xgodvlIBSyhrvErGyuyU/hLfLMwDQYJKoZIhvcNAQEL +BQADggIBAGoZFO1uecEsh9QNcH7X9njJCwROxLHOk3D+sFTAMs2ZMGQXvw/l4jP9 +BzZAcg4atmpZ1gDlaCDdLnINH2pkMSCEfUmmWjfrRcmF9dTHF5kH5ptV5AzoqbTO +jFu1EVzPig4N1qx3gf4ynCSecs5U89BvolbW7MM3LGVYvlcAGvI1+ut7MV3CwRI9 +loGIlonBWVx65n9wNOeD4rHh4bhY79SV5GCc8JaXcozrhAIuZY+kt9J/Z93I055c +qqmkoCUUBpvsT34tC38ddfEz2O3OuHVtPlu5mB0xDVbYQw8wkbIEa91WvpWAVWe+ +2M2D2RjuLg+GLZKecBPs3lHJQ3gCpU3I+V/EkVhGFndadKpAvAefMLmx9xIX3eP/ +JEAdemrRTxgKqpAd60Ae36EeRJIQmvKN4dFLRp7oRUKX6kWZ8+xm1QL68qZKJKre +zrnK+T+Tb/mjuuqlPpmt/f97mfVl7vBZKGfXkJWkE4SphMHozs51k2MavDzq1WQf +LSoSOcbDWjLtR5EWDrw4wVDej8oqkDQc7kGUnF4ZLvhFSZl0kbAEb+MEWrGrKqv+ +x9CWttrhSmQGbmBNvUJO/3jaJMobtNeWOWyu8Q6qp31IiyBMz2TWuJdGsE7RKlY6 +oJO9r4Ak4Ap+58rVyuiFVdw2KuGUaJPHZnJED4AhMmwlxyOAgwrr +-----END CERTIFICATE----- + +# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM +# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" +# Serial: 1 +# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 +# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca +# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx +GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp +bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w +KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 +BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy +dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG +EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll +IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU +QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT +TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg +LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 +a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr +LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr +N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X +YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ +iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f +AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH +V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf +IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 +lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c +8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf +lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. +# Label: "GDCA TrustAUTH R5 ROOT" +# Serial: 9009899650740120186 +# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 +# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 +# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE +BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 +MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w +HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj +Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj +TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u +KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj +qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm +MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 +ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP +zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk +L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC +jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA +HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC +AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm +DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 +COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry +L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf +JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg +IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io +2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV +09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ +XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq +T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe +MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-1" +# Serial: 15752444095811006489 +# MD5 Fingerprint: 6e:85:f1:dc:1a:00:d3:22:d5:b2:b2:ac:6b:37:05:45 +# SHA1 Fingerprint: ff:bd:cd:e7:82:c8:43:5e:3c:6f:26:86:5c:ca:a8:3a:45:5b:c3:0a +# SHA256 Fingerprint: d4:0e:9c:86:cd:8f:e4:68:c1:77:69:59:f4:9e:a7:74:fa:54:86:84:b6:c4:06:f3:90:92:61:f4:dc:e2:57:5c +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29y +IFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkxMjMxMTcyMzE2WjCB +pDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFuYW1h +IENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUG +A1UECwweVHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZU +cnVzdENvciBSb290Q2VydCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAv463leLCJhJrMxnHQFgKq1mqjQCj/IDHUHuO1CAmujIS2CNUSSUQIpid +RtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4pQa81QBeCQryJ3pS/C3V +seq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0JEsq1pme +9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CV +EY4hgLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorW +hnAbJN7+KIor0Gqw/Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/ +DeOxCbeKyKsZn3MzUOcwHwYDVR0jBBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcw +DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD +ggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5mDo4Nvu7Zp5I +/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf +ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZ +yonnMlo2HD6CqFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djts +L1Ac59v2Z3kf9YKVmgenFK+P3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdN +zl/HHk484IkzlQsPpTLWPFp5LBk= +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor RootCert CA-2 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor RootCert CA-2" +# Serial: 2711694510199101698 +# MD5 Fingerprint: a2:e1:f8:18:0b:ba:45:d5:c7:41:2a:bb:37:52:45:64 +# SHA1 Fingerprint: b8:be:6d:cb:56:f1:55:b9:63:d4:12:ca:4e:06:34:c7:94:b2:1c:c0 +# SHA256 Fingerprint: 07:53:e9:40:37:8c:1b:d5:e3:83:6e:39:5d:ae:a5:cb:83:9e:50:46:f1:bd:0e:ae:19:51:cf:10:fe:c7:c9:65 +-----BEGIN CERTIFICATE----- +MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEfMB0GA1UEAwwWVHJ1c3RDb3Ig +Um9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEyMzExNzI2MzlaMIGk +MQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEg +Q2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYD +VQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRy +dXN0Q29yIFJvb3RDZXJ0IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCnIG7CKqJiJJWQdsg4foDSq8GbZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+ +QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9NkRvRUqdw6VC0xK5mC8tkq +1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1oYxOdqHp +2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nK +DOObXUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hape +az6LMvYHL1cEksr1/p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF +3wP+TfSvPd9cW436cOGlfifHhi5qjxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88 +oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQPeSghYA2FFn3XVDjxklb9tTNM +g9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+CtgrKAmrhQhJ8Z3 +mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh +8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAd +BgNVHQ4EFgQU2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6U +nrybPZx9mCAZ5YwwYrIwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYw +DQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/hOsh80QA9z+LqBrWyOrsGS2h60COX +dKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnpkpfbsEZC89NiqpX+ +MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv2wnL +/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RX +CI/hOWB3S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYa +ZH9bDTMJBzN7Bj8RpFxwPIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW +2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dvDDqPys/cA8GiCcjl/YBeyGBCARsaU1q7 +N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYURpFHmygk71dSTlxCnKr3 +Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANExdqtvArB +As8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp +5KeXRKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu +1uwJ +-----END CERTIFICATE----- + +# Issuer: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Subject: CN=TrustCor ECA-1 O=TrustCor Systems S. de R.L. OU=TrustCor Certificate Authority +# Label: "TrustCor ECA-1" +# Serial: 9548242946988625984 +# MD5 Fingerprint: 27:92:23:1d:0a:f5:40:7c:e9:e6:6b:9d:d8:f5:e7:6c +# SHA1 Fingerprint: 58:d1:df:95:95:67:6b:63:c0:f0:5b:1c:17:4d:8b:84:0b:c8:78:bd +# SHA256 Fingerprint: 5a:88:5d:b1:9c:01:d9:12:c5:75:93:88:93:8c:af:bb:df:03:1a:b2:d4:8e:91:ee:15:58:9b:42:97:1d:03:9c +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYD +VQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEk +MCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U +cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxFzAVBgNVBAMMDlRydXN0Q29y +IEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3MjgwN1owgZwxCzAJBgNV +BAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQw +IgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRy +dXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3Ig +RUNBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb +3w9U73NjKYKtR8aja+3+XzP4Q1HpGjORMRegdMTUpwHmspI+ap3tDvl0mEDTPwOA +BoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23xFUfJ3zSCNV2HykVh0A5 +3ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmcp0yJF4Ou +owReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/ +wZ0+fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZF +ZtS6mFjBAgMBAAGjYzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAf +BgNVHSMEGDAWgBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAQEABT41XBVwm8nHc2Fv +civUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u/ukZMjgDfxT2 +AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F +hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50 +soIipX1TH0XsJ5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BI +WJZpTdwHjFGTot+fDz2LYLSCjaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1Wi +tJ/X5g== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation +# Label: "SSL.com Root Certification Authority RSA" +# Serial: 8875640296558310041 +# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 +# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb +# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE +BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK +DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz +OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN +AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R +xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX +qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC +C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 +6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh +/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF +YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E +JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc +US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 +ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm ++Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi +M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G +A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV +cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc +Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs +PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ +q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 +cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr +a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I +H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y +K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu +nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf +oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY +Ic2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com Root Certification Authority ECC" +# Serial: 8495723813297216424 +# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e +# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a +# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz +WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 +b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS +b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI +7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg +CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD +VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T +kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ +gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority RSA R2" +# Serial: 6248227494352943350 +# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 +# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a +# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV +BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE +CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy +MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G +A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD +DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq +M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf +OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa +4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 +HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR +aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA +b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ +Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV +PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO +pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu +UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY +MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 +9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW +s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 +Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg +cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM +79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz +/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt +ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm +Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK +QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ +w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi +S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 +mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation +# Label: "SSL.com EV Root Certification Authority ECC" +# Serial: 3182246526754555285 +# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 +# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d +# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC +VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T +U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx +NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv +dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv +bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 +AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA +VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku +WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX +5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ +ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg +h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py new file mode 100644 index 000000000..0ac5ee1af --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/certifi/core.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os +import warnings + + +class DeprecatedBundleWarning(DeprecationWarning): + """ + The weak security bundle is being deprecated. Please bother your service + provider to get them to stop using cross-signed roots. + """ + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +def old_where(): + warnings.warn( + "The weak security bundle has been removed. certifi.old_where() is now an alias " + "of certifi.where(). Please update your code to use certifi.where() instead. " + "certifi.old_where() will be removed in 2018.", + DeprecatedBundleWarning + ) + return where() + +if __name__ == '__main__': + print(where()) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py new file mode 100644 index 000000000..45bf7e68a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__init__.py @@ -0,0 +1,39 @@ +######################## BEGIN LICENSE BLOCK ######################## +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +from .compat import PY2, PY3 +from .universaldetector import UniversalDetector +from .version import __version__, VERSION + + +def detect(byte_str): + """ + Detect the encoding of the given byte string. + + :param byte_str: The byte sequence to examine. + :type byte_str: ``bytes`` or ``bytearray`` + """ + if not isinstance(byte_str, bytearray): + if not isinstance(byte_str, bytes): + raise TypeError('Expected object of type bytes or bytearray, got: ' + '{0}'.format(type(byte_str))) + else: + byte_str = bytearray(byte_str) + detector = UniversalDetector() + detector.feed(byte_str) + return detector.close() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7494d491a71d112d682fc32b693eaf8df3c1c25 GIT binary patch literal 852 zcmYjQQE$^Q5Vq4aNdrS2NQg&2Qi&~NTeYr269Ov1%RsCkQ3<79>~^V=ICH#e9qkL{ zhiu}BzvNe*_zOI7c30q}JKfp$-F>#tFE%zp1TyJA{Cwmg^wR`ualm;FT6MrM#Bhdk zJixg#aIlG;td_e2*ZQ@ro_hl?_Xj@2E~|e-gMfJ_sOA5{0B<?E_U_ZJF?%hnH$N2V zl*@`{uejog5)u;b#IadRMG?o^|JZwf^5*SvV$enmn>y%A(CRf9h2}`%rBm%#&jIhT zsxf@+s`?x)@eN+$ueb;lHqinpZ;2Loj<5YWy1^KM7u+CV=v;jd3CM~HQD>a+A`vVt z#zc&4JO;J}Ih`p^DkWiKJG78)NhQtgMhqKWQ-<`Rz$%rWUqB^Jlpy?)=4rvVS1>gz zS2_PsWH>aSYB(f9-Ud`kIvWlx=4!upS;AFuM#Sj^9LsH8r!pXew~!}fEL4|#*;%w2 zI!vpys1yYvy74zf*KIf5=tGH~ltOB6BxFvNb`3k}!WC<G#5vRTBoh^f7YYo<P}Tvv zeYYP-ZbIho^Qe^Rlqw!gsf<P<WAKzwE~C>)9CxaAaWG~3NnB2Mchsmep2+O!sC{@C z^`kN^w=BUd+mcDUv!~9fS+oihQ7|E+<cvya8O3p0q$-ZL%bE6893Gj0Xo5k0h(qk* zdrkm0#PR{G9m5THiO5T;q!}Su1EV)D*7LVM$LhTP?Ep$MX%apJvPJ9>|1<YZjo?`> S*hR*VOq<H&Ht}8Dto;En*zc|Y literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad75761cac1381e52e75261b4d37ffa53ceb1f8a GIT binary patch literal 27187 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a817e3b0a9937629d87cc256531f58e4ca3c512 GIT binary patch literal 1128 zcmah|O>Yx15ViL!+bC(F6@>#QI7OmeJ{r+V2tiU*A(4WVo>oHEX6>X~c{i!;L`v0L zD)n!aBY$bHocIfznDI6=T)>g-=b3ms^X6@**{l;7XD8cV8#O|H;9)sD0PkSxLs&TB zRFa&=lp=Pdle@8Nu`9jYk9~_h8RWINM#&N3J`b)44+LGfamZ_Z(h7f42-TwHc5f<8 z)|ng8Jxx?!m@jHP5DGk--7(LKQQss+^pf;6D+E{{b+S?WFw;h5gQ>~J#rq<WbDe4M zH9H@V+N|GWz0ZdqKBe%$pW)sjy$3*$m~s+3*JMaJ<<3<YyTaox_pZo-#y()1G2q~u zcqGP*Yh@juuF^{}dmOl9Y@GTTEQT0*NfyqH^9`KFHQoZw%s0V;z+Sr~Hz9gBftd8T zwO0CiIuS|*aJdW_%Zkh}rZAxL(YBUa9+=J*_Mv>hSE^?TmVY5s=_{dy0Tw(h<Pi2X z#!{JR&DeMHOGgux&49^hmZ)ermRu+u<tiGSF}APU#p@a0OW9=h^0^uAkIs~QF>D_k zL?_WCo9twTHi?uwDsAt-GUo{z?PN1i@Ue<g=p7d(8URBR+rZt)T!oPCQ<xe7q3g6x zLwd1wN8|3Y+`srlPP=#w%jFb!a*j(6Z>e>#w5V#pW^uJ_z_Dy#4!{5_l3cXFq8(U> zbMbKHz19Ex|IJz#MW@BTo(*MEjHby*?5sSwTH?~*3bDJG9Ajmjv3$&@5^;mE^JyY0 zkL9ckfkV)QnXCH{Rc*miHgDUR3MoM!$iy<QCSoMPis%UdjcN*MBWQTmhC18G2e;){ z9a6|oxml?T`fEg9ePvdA<vrWe6{%I~3m}RHDWWuO=(|iRWSbGbsmgo%7?Z*FH>mx& FzX8gV6GH$1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a40afb388dd621b578030cd4555c9c9d3cabdc3 GIT binary patch literal 6314 zcmcIo&2Jmm5#LX8Nl_B@VTrPxn0DO6Y-7tGRcxn8Y)O`FIX2}|G@2~XE-1d0Oo<=z z+m#)$6pA7)a_Aq>UfS9~Fa1E!-g{_)0{s`-J*DW0r`&sKe=|!`6eZd%1TC?%Z|1!> zJ8#}^XXbHka4@dmTF*~>|M%Zelz$P^z6>;O;`aUyA{3#Pm5OSs70uQvx~;1u)5=E0 zw9QJyj#Q#{lx2F^s>JMAC2q$n1NH#RjB=tfXb)C~?4ioAJ<Kw*oUDx4Bb8Bmv@&Lo zsmdKiL`3wtBBJj2=em6iyd`4bW9~8V6X4@w0Q>;+li(9#5d0wXDeyyL82m8vQ{a<g z1pEl|$H9+^G4Nx|pAh5AO6FKo#qu(GkXm>&pZ}gSe|I+L<d>Y=xrOgKOSxMMxgZ(# z<Y(vZFF4DK_Ck<uNj`nJI6r&exwW{Q&n?b9$}cWuo!l%QEqx#7`sqVYk3N#TO5fC- zxyx5BT|P+RNUN($<LS2ORVpXv7Vpd)q;Qx!y40Nt1+P*zac^<?AYDTw?^5+9^L;fH zu^XLBL+d7P?>>mD*s4%$O{lgmG}{omZ3@GV2vbC!D|S>wg@q>|BjR|*#DGZP85e_M z2+sjAERuL8#0a*1G)T=qF34LY&zGf@Ex%N&&Q=TMZLj2&6d-@?%RB$9kAL~~jkO<+ zQ}g+arVbm51QxpJN!HEd_AY`5rJ*<>g_US)Om(IPQ?sGGh`hv9p}+z)n~4TvP7zi( ze$82x?h~gbg)4&r$1kjuUB@fc-Qc*ty;&+2%8uwV)sY2Q9GH%%Rox(g`94OFDi5<+ zRmhmq^;|!r28QRBSAV0(6EOAP+tZt}^t9l+(@zU>dbL)@TfOOuoL*UXoNL}p_3Bgc z?V_{!^zuc2_1fCHEMHokxqf{*KfPJnJYTAMcw70rEY4iJ;y)>nkZ<RyTNO1qO|KTN zA3nRRzOcC+SdLSwmVC##K#m&%QS^u!F>&*+etN#owp?h>Ja`W#ph>8_2O6j<h-yNI zr;Yk4c0;<rJM7AL)5Wq|kl?q|Sc~u8ZjvF{j4nxyoFtM0$*A%;waIHCIZ3T4kPmTt z5fH_I<y!sCzIOAwi-aD!D5_GMf%6F(4FGyWlj8t~(okQjJ9^a++K%4Pg}!0Rd;?R~ zRbgBO-W;`|H<Wd4Ly>s_IIUyUl(J#8Mj5S9hKOL<(fXNH*A?kPnl_|R^j(>LR`MUG zH>$N~)pXgduKACf1mfm@aLG5(l7#CLAv>EfgV>tuhnNgqGEO7Lh_G`Ec1~cB`oJRU zKxtqyihFz(7-Y+B%=MBWie_mE%}_0MNQ<jOYW<DA?xT5~EhlR`-phl553ubUsyBfa zwjaJx<w^3)GWU^mLzmfBFUiytQDa;=q3oy)nq$JB*@nt9On6SKpOdb?C9COTt-4wg zZnfy9R|+1SS*xbq&w%MtbuBFleu2G~iR?lqn0T<5U3~E9fpcp%KkMZ0<`$OkF5SNs zM3*1s7M$#oJO;A^i@8r1mNQ!DMOF5CY>2$SYXGe_^qnyQz$M_dIDUp+f2XhS_G;*O zaZm6{w7f{3*)YPur15%!V++}(M|bY_tmNR2A{bt)`HowyZLK|a$TNcMrTtR$`nmoV z?wwTR37A7qGLt_O`ep>SC!=L$8g2Ge+i}*)wvSlp_xews#>f)x&<L}BroRzwm}fJC z6rrkxit9K*+;J*3v4u$NAjUdRwhHC2M}CWpI7j3iB5xCUg9t?ii9$+|-z4%b5wfFe zZ#kB57#TqaDe>sLvQ#7dY1Xh6vxcmsWl9=R#ND|F`*e9{LD~uN3uRRm2zbveBt~5r zNOHy(h#EFw*$k$*SUD)u?EwU-rkhp!ijNQDbM1vj`N~JoaSR^;$BFn+P^+E6Vu9&x zZMsrk!pzVGv~yvQAZ?Ok25lhYzJ(nmq?qFr%LUJKoX|Jy5%wX*dKQQRgi}(epXs}R z-JH<IO?wsdq=oWw1Fo4;b~J=p4dL{h(5aPD#;M1cQYIB)rjU;*Wb&$_S^lP*f5qhH z4?s93HeXUJO@uZOnSv9;d9;K0YDs$dR1pBX_L&z%d;b~ka6zVpfS1zhZ}neLC*mTe zP>Ph(L}($QcS&I|*z#S`EtlK=W2;nog+}tLX-A&m_Q?5`nuzco6~S~aau!|xFPc8i z9TA%3WmqGx6JaQr)Z&CgnKr~ylv)%+J6H-Az589!)SuwqkD`MOKS~t+fvlY&q7r$J zNSa75isaR{wCj7I-To=={qX6tlK%xh^4gv^!Hv71A=f{r7j{5Hl0$>$cz7B)Qq+8h zR>i2H;1QxGMlFs&bj*D{YJQGUdr|XNf6Mp7hMY#<)I6#A2qX+XpxP8N+74B9C`l29 z-a~a~&=XZ0Bpi-(gd*dhP!vMvedr7E!*EIy%ODENFiD|^K@<#lF3JYcHz55IBU^|X zRg>ztRzLfSRUQ^nv@buSH+CRJl0!o(HCI}jIZ{A<2s1-K4N!~25EV-ypa!Y++A#Dx zjM@vR)BWsz4V*rKroM1`*n-ph`{5)ala$@|!YoQK!!g5Z<-Ay!^TJH`Yg!ovs^%|< z+#qrjq$_UqLQZ}_{e;Gz;Ppp{JaU?1jw1I__M6b^XZrf!uwbJ-`z^h*12&Qz9&F3_ z)8a_MHU~39u+f<~1lusRIC{~M>Gfdy3r6*Tt)Jcd!A7aJ6T2jszF@nEh-KiEb#WI| zJ4W?wNF#`7IXt82&2eueh5zs-QEXv^A!0aT84Zea@f0Kg?EucMRS`p*P9BMF82%VG zG=D|pPei^V@->lDAR!iKiTx3=90<+bnk>wwjLNg^{vK%l4RWr$37SdNnn`sOC(;B! zYM|!q>$$^1ly>^h^zIHsNpfh2Qk8%2;gMqW9_&0UMgv;;zUuy9!}o)f0NMd*-|8Mo zl&gD_tNQ~}YV!rHg%c^4WGb;~B8;T2>Rz5{OMCG1738ff+Ev!~S;=8RL$3b^y|4os zl4LU{gP6Nj^q<jReo})-l6xeL;+_r3JzPg~2~E{=5MNuNzmmC&izTj;;?!lWAgyu- zCq2%0l<I=$ddXus$0rU=6qSNVZDrjp`g~LkPk~&%Q;wIMK?&WGp|hJGxJ9Rw!1^FO YVt+)ONB_Q!YptJ=TuhGfZz4JMUxNh?*#H0l literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25675629cb02768a0568cee21c8f1bb521dfd819 GIT binary patch literal 2235 zcmb_d&2Jk;6rb6hU9TNGEg}5?B9WpZa7AMZiJD5#7Ft?yz(s9JC5vk0c*cv}jX!4A zQR;3aq(<tA8wZZbkxT!ey&+CLap%PE%{obeaAWQF_RX8wnfLK~Z@#S6DhyA5<Lu+L zQ;hvigTqHaxCyc!fhneV!nSyebCSKp+wxmJXLp(MmDpoSX#ct25-NDW>ftMnPwG6c zertxCy+QmSZKoRJ+N~ej=7CO0txX4ujvhLV9(x~5vldsZ<*E4>tjm?B{JnC^cQQ`c zi&{blDpaLC_MEpu$dM{Lxuhy;ZjZGhRaG^-%P*K<tqN>9l`qT=ziWn*QDH%|<GDi_ zqqjdJ`yqssr95NLy}p-m#eX8Vy^KjeX5c~*4-~`3eiM$(CG9~hyS*gU<`r#O5A(oI zM%oy1ERUq@4SK1R`J8Nb(%!a~gUME28o5B&d_it%o62~it(Aqc?&ZSjq-z4&j^|}5 zJ4qYU@>llfv&P8uwh`3EcH1<%!$fIg8(XHa*_U$Nt_`kktJRJiZGZA{+Fg(PCb`mG zyLPRy(HQkcmwN-7wv*(t>8!1PnvUC~bR@U+Kn+c!gET3fy0_J7Oc5)rS{Xex5e&Kj zvLrCRz(f3|@BBNwD~Dcp2oLm7m?<C>YTE=m4D-Hszz|}DT>3jJ8S9JN?D552o^i93 z@!2d=A%hGX^nK-D#b(kUFFgVt@m1)OA(|${t{cVyuw+UY6d4GNh9{;>3c`FI7I`pp z7}Pyeb-G#Txv9~*d15FFW=?~B0J0=7J`abhT<{3*1wK80g6r<MBfrTU^8FUbE`z~C zX3uAApOfFkh&&*v?*Uf4S@)f7`FyNX*%=PHJ*5X7omVM4@I?;VTPP}Ld130Yy^A>F z3Z3Q3+Y6ngf=}N)!P3{a`#%geZ{pxQqKcTb<Nvbo3>IBG!NQYZbhy<~wGxDgTsVJ( zu(Lyf17rrfUgp__ag=#|Zr`T&K45decm2$_moWBIzb~G6=4M9q3^?^egq^e{Xd^(- zlYk*W7AbF?Ko((5r2Hq`M6?QDm5Z;&(IZM2zORes9fvswzk0<%%)9~1a?#aV8A^U0 z-MRO$d0T$HQ6x4%6{b25oA);4H(xnu=Am@Tx+nk{Z9YvkRK_e|19P63%kpum&qDVF z$X*0v4wfEZ>G28xN}Q^b_&j(7nw~oW1Z3n<@~Puc<+$+v0s&4ks>PJ|Jp^e{afFOU zK1S~;;8pp%o~uK#^F3AvNX2~@^6TT(%<qTxJ7`P$krEh{4?NCDzh60EyJ9vI&<toU z69)n{;br0pGpm_EN__-fj8|Q_h5cFiIG?H{Y{oC|{x)5F`Nxg;*&>O1H)0s<o@woU zyF3`C%SEM6&tQoEaVaf-j&Z$Ogq1R6&JlZy7`27hvKS`AIMyZ)l-``ghU&}V+z^iI zK~aR1p1kZjIUVA1mJ28TBWYA34?*@47;^~{NR7a+=q!}N(@0;$&w^+!1fO0wA$5Om z57ap3=)R%ufcvH*<<?M55|XP@jwkJ;m~m~~HMTrL+rw3rJ}vwrmkhzGsN~x0;_2ul zk@6URXg#h=x&}$rxD2w?M<YHTRx8!08byn)`!?%A9%$TnwkU+!tmhQ%*3fO>)*WwN VNVIhxeO5SdeTnv`gQ~ph{{<7^>iPfx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92af6b9754364a9778544e9f9b773fe889f278b5 GIT binary patch literal 3445 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3824e7c5f58f8cf8350bf93c7968b680bdebaacd GIT binary patch literal 2892 zcma)8%aR*46jgWoH6D)%36G@0Lu{zHNbEpJ<xv#m2^%s{GgB;F1znn!Y`1B5JCf{V z!eo_v1M6hTFZGsHet{L|s@<OPj7cGv)UDUKSLfWT_PwpGCPNwTeemmVZN~nlPFX5= zxr1shp^;2_3F|ZI%OLS4e&6@l4@_2M^(B*46}$-g73uA=PVEg=v+Xw?+K!jE9*Jla zr)t*<t0I~zOMsU<sOAA0#rmFPeP4S0fK0q(fOFves;tR6`Zd{*8+g`bQ*PqfP#dx( zw_dUrUcV{ZF#S$`_I@Vgbm)vN42wT;jwVOB%MCffCxu7cW_+%6JUHNj?;l{osK+yv zMv4zIjj^fFHjZYA&>W)<xXZuKv;$KBDR$YB;!@#o7Q3{HR6JMaGLJ2P5+?~CC?&Za z3A<RGaRsZe8CfiJSgUS{xrh_7pQy_`OI5K8y9KxLM0NQd%&l&SMj{<51B>Pu+`cd{ zoTW6(r&`V9Y-ScaMM^F$u;FOwwL{m63)E{zSb$Dpf7Plx5-rRIn6^qQV~J9Mr8Apd zDJi+#bU?d%cX##*h}$?r3{2yEC{VExFPb>BBOILgPt;H(tI9Yi(sEfY#a)mh_*^8h z<WNcRX$F5fPDD_nLA26*Bn;nI3Uo-7+ISEv*)2SK^ssbm;a4i-2ysI0fp_9*_2fqg zu)7jCC*5-ZIH#Ga2qq)qhw#WPqb$V;W~DOmFojqy?3^^ho`wR$v^vdr1`Lg38WST- zmchxNjA8_31O=ijwF079BAQ%030H<XDUKyBQsG>p1R}$U7*8fj#*{BG6jQ81TJr>k z;pRy=I#en6g4TySJ3sA|%oc(lBlc~aLZjqJ`;(^lYMMHVkJ9t#H0zFX8Y@MNoj6-T z+7aY~GPfN`>S>hB5M;#cX}EG1ALwjCDi{Qdh6UuI8-j4in6&G*Mm}ynD)bCc@1vTl zXb!zY7UIT5>$%pK4DW%hysFyTYZ|W~vR94Q%)`x$tIyxo?!w*3YvBY*kmT(!nrR)9 z_#qT5`xJU%qSAb`n0KL_*OP2G#KoC!43+&6?@H&5Figcng<)Q!S&USX<H~mYykb-` z$bB>Ui|I3P_n$v{QytF{EWNqVy+M}X)TTGlz5Q_*-Za<K8*}+}6i(+~UA2Ro!?8}j z99+M3tGCyi#?vct3NMo6ijJ<|yk;K@8gw<Bt5jyXM@}QWdc`H|TwYw_-RS{28mF-h z!y80j3k~yXi(kuocJcH#p<C{Vh%_qnBo&+j1Yy~jSO)K4*W2y{ngq(L?jF+(ymvf} zFJ?i2V?n=5-7PfVp&BQy_w4){^Nz=*`t+S$sy{;Kkd2}J1w_FG_S{F$v;H{v-Pczo zdSS)Q2blL!Sy-hNZme>Fy@$~c+4I2ltC**Ch@wMQVdILd-M}#&0)4CN+xcdc2xCG^ z9~>7#dAkgeVlZzND+ahnGo5cb_805vh@G0Q;^8Q99O-k^tx;2_`HG_{_oBS%g3-a{ zO&6UGtRRo#$T65VQ}xt_Zt5Ne%~>=oXnQSadd6>4>$SaSAFm<yXy=Nuq^?tzydq`_ zO})awwL0eKkO?kD@VN+y5+u#f*k0=T`5N<UwygNEj4=As<rIR#E_?F|<r+eYxLhAu z`FRKL{)ZIogo`BDJ?7RI|K--2egD_DMuI;WGckO-fBI9n@ypT`e{JHGNZXxFy@|DX zGo<@!me4)Z3d6@Ukt}YVdKk(q3PVl$yR_05>FpzGKB2vhsm`WK+XH9%SQss1NmFip zhH5BP8}C=VMxzll+Ngn>>s0jyK~+^co0uZUYuWx7|K{BMI?%lFP2uvl<cc8^4Zjuq E3qMW`mH+?% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd59c13cc3a919f33a760163f1e166bc071a40db GIT binary patch literal 363 zcmXwy!A`?442ILBUAt+!Ahc&-hY{GA*d&Ay2aX7dU8sbju5qEIOG1)W^euP|Ua413 zdj(D;L)h|X`?vJ_b~G9w7u9<F{23zj?U(<+Zn$w}JUHS(jZy@t3OIg4`h=4d^Dre4 zLR8?i2T>Y}W2azuA&@|LP{TCl!6TYPd*_1gCwNa>*MY<OZqo0FX-zk5K$}tuR*FJ) z<l$-NF?UC+yLczcTyp4=O=f_3sc+%KGTSQXqD^bTd?7vbwjMu{DqS|21=?hq7P98f zoo+SVRE#anLR>cdB4?_Zo!MgfQtA4<SgclbO;xF;r7$+D>#5Ec%ej5eym%<qfZ$To n{58`YEY0OsW%g9HU2?URd{@Ku*u6JL4hb0qq01!b;lKV1cM)PB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f69d311e32db3d365396d894e116397105cbd486 GIT binary patch literal 1135 zcmah|O>Yx15ViLs*_Nb*0u@M{;1of-e6*sG5Q3%^hmum!a#;yko3)c}<=t#;CsL~3 zQmKEV9QjLo<-}j$#EiFr^a74-KhLaZ#&2G>o6SW6<K$@dYf&fU2Oeg_1Mm)}-hqV^ zP9@1`L@8oNI++`}7Q52R{K&W1leMfK)hYQvxX)`Bgx7>Wb)$gS4@oQdNg-5=mJfHo zboM^)q}r&oH!|rkf1k&4qEijdmClf-`QXsRMs(xkIL!rESGyx=((Q>6o#R*?3Ui=_ zJ)yv})H!HxwAo>obwBOweoP?6pW$93y#YXwh;kA+m!wZQ<<3PAxx(Wv_b$kkMm}I$ zGvL}K@koR<*UMWrew8l42jIXRgX7fCU@^qdb24?VoNwSXuJNXDX1=LS3GDTAauuM5 z69`K8TMMPHM}<(T2A9i#u{2K&V+sQ*A8iYX<$>u;Ie5O$=lEhV5_Tq3=_{dy0UkUp zWFPhg#u6E8&DeMH%Y=nW$G~Jbj#bznN-mTRGZpqu7~9gD`Rg&?NLVp``P}rk1}93s z=x?^$;Zazm#afzc6HB?KlFhAG<}^m5oop;}K2%`>z2L%xNdYY=Y)96Mi3*_JConYv zLYL^G8_=_Rb40Gs9(;pQWVM6$P<xyLQ_g<r+iPkGOf9M!uvuI!%Wy0kSO$>5@;DPu z!J?5c;+#F0&p7|l|FhQihDyZwztRRW&IhA-Ai}wnHy%0rpcP<;u{y@eMaHrrA4$Xw z#!g4EtUQ*sG5{Ju7iOaFKv;Dbma=)>(nLrJ8bK;%g*6c)3sy*v0cccIKpR2Bvo_S) zZQH0h{Zx`#sU!wXHX^J3YF2>da@M=1t7@vkhLkn1YLFw!(}w<ANrh}Tf;ZLk-af)& KPyr2Uf9`K|a}$aH literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24beb00960ece98117cbaa3541e2adcaae1203ad GIT binary patch literal 2626 zcmbVO>2BLb5T-7QV(c6)&_6BE1$v+Y8mUbiG;xE%I%tQnOc^3wGy)2W=B^|<6sasp z1=io>W%>qvg}%c6?JvDT@0pck$F*Z5r7)wN-Qn)+9N)0Hxv4AgoH+0Q^sA~UzoD>x ziZIv#O2)vb(pUBrnxpww3eB_J%R)a7a)A~>E=suoa*3)St5Pn4T&5bxnv_c*SEvrM zE@c(u8*~HY4JnuDrma+O&bi(QLlO^3I%dR(vPl9XFC`vlBuf|tiO1P!9A~Li@y8yg zEG1LVf98!?P1m=*EFH&uo3y=%G(#_vD&%wOMYZF#xHFn~L0I$SNmcjZhG$O>Mms>s zhrpQ9&%xdEG}kZCe7{Hw{SqzqRaydDRiT^FG)wK&OWEAk2|Ug?NC*R~31?Hz5*DRs zKO;044jBiLB&ePck7Q9WV?6Of0`@aMjXCkb;$udFs3vz?fC<V1En4J(S=F-8TsQJ2 z%yotCx|5h@A&xg(_j%@ptCh0r(%46p!=s+zHtd#Zii%;k*2Bl<-eb4<)G>Zm_y%k& z+3!((%7YmgSD$&jK8!;O*3~DxethD(50d-Qw=?>U?@nj;zD$P?MkhS{YIy(Q!@5(S z2GhGi1Q!d#yWGG3;Oq3chm(@r8H;Gl>#IQ3(K|_Pddl%$8c>2vD-?71ld~5Bf;Znm zwMW3-9FTsQs(p=?`xRDXrKZx?na<Rv!pbndK{W_iMcnLo(I|s7*$u*!@%hQy1`X0i zzDI`g#e}?IGFaYp8lI9gCZ61BFgRKVwY`ezV6coOFM#<Rt7;(`UV3pG*+;;v>IN^t zKZi0@co`Wgh^^LR(=u$swatUWj=5_ZZSmfE&gnJUrek)kMn`B*8ix(k6zYDrXEZEP zwz`(vda^GHjZR0DS1*YIOq~aPIoibYZUVallxzXhipy}Uxt5db7XtGxm9lZj<KrM2 zEo)`(ZQXuWD^qx#U8)a`xpD4TsE;e1SZN!M(Q-^{PiVW{BdhJ2j!><x;~p4Sy5a-a zmH=JMOq~7y4mj}qaS*Yk1FUy;fb;~JEI0WtPQ0ZbO19JJIih6rdflE-O~-zd12844 zmmGkz7aV{oy@P6B0K2X<nMPGwex<z3^((7V+_Ks8j72`{1kYF)jN_Qjf4tr;;h84( z2ah14cs|rI0k8_=7m!~PYXNv?L7XKdj-VePEdR$r3pCuv{KW_Vky=0r)+WsXSmfv1 z+nl8tkCJVGbw&WTFa_b{*X-~CE=MsB0MLU-9**!<<F{ZNnOfDHDEMLWTAE?8iLDV! zUC?yTH~0>Z$Anf2^G`23r*`=btEyj_@0w-oH5~H?Luf}<$J{qMPldYr*ABZjU<Rz+ z@Ix<2CJcHd<)6W^uh}S@f<%RnVc{N7f>Udd22{v%T=9X<9`xZ3Q1S_|>#|`9)Zk-H z+-a?2*jjq>bpFfrNpRjs&s|5(;2An13lqo(E_WFWY)FcbHBVE9CnYRJAYyzlAkewb zGYG?%#_;ig+0uwkQ>fJu30We)J|fcUT28OqA<*6ZI7$L&jqoYrfkq1Xx9Zmaz`YlL zBl`>4pUD0IW>qU!#;F2OWb6XIw}sw;Keq|My)RVz=|QvG5v8`d2S8O`oqc6^u<#l{ z%kZdcxQ0H8D^^uowh=WxK7lU`*<2-%a|APv1uf$!wXZrrXpfd38Q)`flBX04w=1`A H0RjIPl;(pf literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d56ff9417f75eabccdad9cb5aca9070947aa0a3b GIT binary patch literal 2613 zcma)7Pj4GV6rb5$uh;h4NlhD4pz0D%Mzk)0iWDJeNt`xq<5Y2=Xr*d!cE*m~_1c-) zgd}oKiRcA5apaI3x%3n8Ex7Fsaq5XXC*GU2-G)?%S<Rcb^WOY<@BQAJFN?)If!5ua zdGh-dA%Eh}xLLs5hOWK=!U?A#=~16j<c-kinZBucGqidcKhv{)yO;H|dd>=+Ue3?; z@_xQo@C!ZHcPY6`c!t}@gxi81nSPOH8>HgAps;;~CdI|Arfi7#k?d~@2@~bTKJP^B zM%;|WYBSjCM51CQrH9R^z0+)q<xUt2nYgGwR!iKGqFz+7lEOWoHCEZ`+EVRdQeJ7S z&EJ@xU#y>>yZ`9?+=KPWTmW~RG;|C$^)(Pde9DP$aO#_U>KSQKZgT55=UbXbgB?F3 zY@X%LF*%}s7Wf>`Yu@1n?j93A$BVoKWBwVjh+hD=OefPd6`XO&!EbpF+QwE#d1nOP zjuOgidUHXa3r_`Gq9^9O=3pTE;5M(-mmU|f2x4%PCnC@SMtz`n`)*4}vAOSwrs{<I zo)kg99d!<xo1yT83Yr7q!E&|LX~mur+dHrv&yoUE!;auyKl0+f-m1ez6n9$tUc4m~ ztR5e9T}$hMp`Atuj_5)Yx;g<8lb8<4k<m4Vl+zypVQn%b%p8)g6=%BkZ6cR|H&3#$ z6X%ZTDQHao^OJwnEr9N~6PbHPRs`8_A}ggbjwelNI<4siP0K@a^2RAaEJHAiI>50I z0`OQ%qpor>$*7%ykg@>xPaMWNQ72|B$)(O^swZ8LNVF4xd~c;*Yt&d{W%bd+mF1P% zQes1RM8qXJL1vLSsOsFm^XLxh${haM57yRecj^+8G?{8b1a}4O&4T_;6eky08dkws z0J)<?oRnWq;dL=j5}PSZp(G<AEOEt1EG5F0z8{#CV=M@pN-_2;`CC>8va<`y)!nA7 zw)!C#QdN7hy4huHLEVf#+2tPxY_L0jBW^9UyE6Q+b@SG(>PB_Y8C>f`a8MXtlflh} zkK*knPU_Bf!PLI2;w|CIRR9)X6SDmJU|*KNw)df{cYqLDrZ#oyG<-<0+oSK`^1n0U z`q=LQ)(~unEp(~IRvnlzwoVL;=H48}e~CPqJ)}dbyzLndBeRAym2b~HCUFLJjsTI& z)>z1D>Wq-EQOU_7Y^)<MXOV-#386}(lbE51<VBpmgk%Ot#gLbgN4*M_Zz2CS60}%v z@hLE>41~}U*lbZld%*>IFmujo9mk2uXgc;q=*k8H*GJG&0Ij|Q4ElI|<mBAM9btw= z&7P>?Vx6GI!Ig6dzN-2E&edkW{#<7a%#~NpJRjPz*6YthU!k2c&uIgmBj{+eS#LkT z`^Uk>=YM_C1`XZ*+Y6<(h#{S#7FMr7tilrQL;|k2jDxG^d~sHPQq(fA5W9}TFTm{m zJfr}$9}bPZ@A0O<4-d_uDa%8%OV!*qj3>s>IHiZy(2C8j_0*6Y;Ak>{o<+JDZY%(v z8NxBc&8JlU6x-b_z|w)4T!X+4xGoRt${;CdiFx9lVo58)DJ2-E#=4Kmw*44=1}iI8 zeOV%AUO<PpMk7;R0Y1q`VlPe$hD0zWncDjL+Ios;G%&I2Ya48}Cg0T3w6xeO8x5FC zoaMEz>Pu{8BbiP8gfC6H8|$S{c$yX-EKYMHqrsUtoBJ`8wpb=KNE6B(mr^WVX}-J! zuhkNQH((Pr2ZYc(WKABjCJ&ztIh3akd`PjEjDt((0*O0dlDJsDF$bW0=Naqu`A&$u z%h>i#GaN~>jPZWJm@Zd3XA=i%7(4;-zPyUocu3wwat%mQ9M#o8gdr@OB;U9I=-kKG z<2~pKi=dOSjMB7Qa4pwzY+YaKl~Ph1WnWq`B_?T79=+k{nz3K8<Ruvq?evs>b|gk? r6hol`c#$U0jDB47qmov!$>m;_rNsFx^~C3RQH76_3qHO`XRUt#N#=Ld literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8a3eccea648e484b97ef3627a4d56bdb27cc24f GIT binary patch literal 7074 zcmeHMOK;Oa5VjM?dG`s01F8^kAV|S&N=1<nqAd}jPn6_j30Wq)DXknQ*l7g(7XASL z2<?@V{{kmwHn!s!r<GCFNF}j$z4P?Uc=og9>=cVR0e)xAl@HPrLHLD)_p8C;H4OV_ zQV@thL__F^swfI1p(dz!mV_Y@oP$F`Zp26dFKT$Y+y~(lK|P7cd`^*+%N@!j0tc6j zX4DVH;IG?js!Y;qnkK-TOw%MovLyFiRx>28X3>hrkDh#+(3)Qbco&_c@(S~O`(gAU zk38cb53=U@2YD0Lf7xE5mu$aQbEKf=X_gdej^@dnTa^NtSBqeMc~!7lenyw9!<Cps z`~HUa-}4$-uVHt1nR{p7gJ<iWy(<Rgm)W4Mr^9=rT~p`Cf;vx&WRcF%d9p;7c`q%H zTk0ZcM^`O)&EVRLDSY;IqVvX##_Qwe=-Hvav0iRJR+nH8EYn5ks3p2gZj%)r_bqa# zA(ZYqBJA;!$O?yg>(i-88-2Y`9}B>>P~yN4EI@$iO&G>>BbaLXH~r#{<lSE<1uG}v zk-YzAle-aTg}ClQIDF^v?&OUrLt~cYi;?JCuBMjX?vyJV>lK#XML@M_NoM($q1(3B z*FPGR6^2AxZ}qzt%iD;!u4u0HNw+kEnl3GwdWW)%p_?b?`iYCn7|6w8T#NK-a5+8o zWPJR&ma5$VIOqL0n*?iCgK5;Dl#R7foh%^CxBR=tak;Wqsg!q*hHtl5gQBAr_{WVM z2SuGIu#DpUV=S@EGCpwo0P2i*Ay*5ij8D;6x9&zOk2+_zng)#g=jdI^#ot{Hek}|@ z>E3&m+0%PEzT{pdsD{8JJ{bp8t%(5Y<68VmU6I8MF=IY3W>7kVQhdvpQXd4calg*w z{jNoI^Qd&2rKow{u`T?z#pIf*?H)8(s?pr8H(9D$uOEZ*yJkZ>tg;kH8%?%|O115} zc2GUin%g@ERhCD|p>}xurh34N@IH&Lv%5#!S7Ahg@!b&>^073M{N-xz{g^8t1Fldw z9**Y<^}<o@*T-A|8E}QdXjiD`y80nl@Q2iJ`fVyb>vRBLNtA(ZDebO7sAVf1OZj-F zX<PQD`Fud0wY1)#ves{Jot#<5dVBN53#F;_PJ8836TYw*M%ij@Zf*2G>&WCo8&H#U zEd{^15ZYI$-LgARdtX`RWv5Hd4f^UHgkXPxsgRT&u8Q}?RdEH52T3WB5WOSg%20Y= Uya(ga1UX7kXOhM$NXKpe021+y2><{9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30baca1e464501de0942c14b813271c854f90c4c GIT binary patch literal 2421 zcmai0OK%%D5GMEKl`PAOlQ?!z6b{f7P|-wbo3suP6isY355%%zD<~=;VAo4ZUS)SB zb1B0Xl#^ZL+Mi$_d+YDvp_iU==@00oo#9G?T=cOr$(i9}h9BqQCkqQj0$;be{F*Kj z@*6Uf&jI2aXxR_Yal&a#6567P)v_q^R%|Cu%Q3VayNTEG4DG~oiQn=K?Z$<q*eV*@ zi|3P4t3=6D!sobuMz}AWQ@gdm3wxwmd{045)zYOM+1roO&YlXC(50;)Jcv?ZxGL4l zTZ33dPfnEBI0)pPP`Fx1m|5EB@yWLFCXlYyUv0eD*^DwJqy2%3dg<ddh)=R8gUM@V za-)|jaja(KWg};MTWo84v;Hy!!=|4-rm`I%1Zh!DTGl(#rkrx?%x~F-wz&heBV6us z?~I(%mIt)CHPCasz>8<3<@0%7g0b+9IHXks6c+Tn(VgEaL`d+%5fx+0?n9@Dq9bx@ zom&?$schw(0?%CKoe~)5lyAnuh@2O31t)MgZB*yAn+^Ix$^smsea50RQjAF#Sm~pz z5E>X+mPilz>wE?~79e;-*guDJl`w~HD%P$PnNR?&lZm(uV}Y?S4zi4~pUEGp)|b%{ zJZtSJkhOL%=0aw*MAr7ZjIC!6(yxyA{gCyKKEJ2h>z%HQKWjgD_^{Tj^`risD9uz5 z$9H7-VEqeq7@*KJb|g~XleG{$f(um>gRtB08^5^QKaulb>TPJ5adldzMe4(En7@9G z^xX*({|xyDu>CURBhs~V@F&nZ63;ilN(dz)%g|M+tmMNL6fI$Q6+2w<DYOiujDS(Y zD>Dy&*T8tm7IcA)$p%j0IjzRfgFSa%?3i=Ms&XAuMY@Ejz?-l%NW?unz=Dog!<AWm zvy1*$t@d98{UC*x{x8LT9HgB=&=Kgb6Q!3hpDYNCMX(CJ5FN|h^Gmq#@$Uw8dJ4Zy z^7_}e7T|83+ao%%R>=i@YmdP7yY3rHHekj(pW_e)T_0LuWL-dRQpN5(1Vm|v9G1=6 z1z5{LTD~M*1Sv@1?8*gs>x?XJf#jDF#PlizRQC$EAK|!keigZqa{)OJsB5!4XvkN9 zb=+Pd*xw*O;t8|s|7G^D{2c*(&RCyi^j!x_m)}@FQF+gtedB`U^!dsK>R)~1AV0Ye zNUnotxQ*eh+u0iY<x#M95UDi?+MZks)Y?8IPndfTKof~>_5M%zsy88c;l+fuW0A@d z$aOJ=yvQKxl#rNuv|HcZ-QLw+-0O6N)GinMgO0q02Q6cV52?Mzc9U(@wU_VI-t*=j z^8UBmuNs@|c~iT4&Bwb<eYFE_84jcrDU9Hzpja0fq>G$25u}~A5L_-8^~Mxk*sM3} z8_nm9r+Tr|Q%t12LFa(+Kn1#N&g`Y_h>J87dTH<3_HJ|IRg*QJ?bd;Lxmk5hOllv2 z02`&I5roM&?U}0Mqcse1Fo86UCiyX#u@227VM3RzipeHr$S01Wu*dvTrWKf7p&nhK zMXPL;X$d60HLT2r9bRo3Zip~8<NY530k28UDflD$v}Gtu8Q(v(@^tPPh~y`*I7i4% zg5#>4-w&>23LAs5txMxPZn(c+3lI1nT81f~m@5o#&Ki0dRVX7+IxwLy1`o!P9v{R= zml!)71aUrN60b>g+6O;`s-sS3d<CI2mg|LajR-{?LoJ#@4jIj4O_MOOV0{EFL(lYS zX|Ckp&%b3dZlhY(u1E(-W_&RB*2QFhoY(R&keF-rQvTA$m6H6Q3se4}nqmEzsdjk* s^t$~pRmXY7^Wew~N+XuaJk?LF&Fw~8wf`tb<ZG-O#^4G(|M+MB1>GY}RR910 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b708adcc90d8aebe0ee298d9d82ca53fd3e1dcac GIT binary patch literal 12071 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27392c49ad7b93b64b78b3cafba7d2b6e001aed3 GIT binary patch literal 1136 zcmah|O>Yx15ViL!+mf_Z1r<n~;1r3ne6*sK5Q3%^hmwMta#;yko3)c}@orMviIk|f zRO;U-NB+`YIq?@bG2?9@y?`Uz&ok@s%$t|JMq`=4I6K++;?@ZHfrt6<0KA2%_hI3L zQ%Q0fQ;OJ;PVUC8#jf;nKlUy5WRTb58YS-u_jzzhcp&J^jYD4RkY@OkLZ~J!H`*g< zvb~8Bt<ywxg!!ZfU7^6U-Wu?%=yyzFL_0}OvqFIN!NKR&;qiW^jmo+slMRY@MIt9U z)8JgOPS$C&_Q(B$4=FtHXSg>=ZvhY_rkupi73on<xpNuDuJE|ay-PBqu@Bhh3^=$V z9*HsMT6xFDuQE)r035huaGd%HEQT0*L1xai^9`KFHQo%)%s0V|z+Sr`*CBd1fuQuL zxm5akG!#k&aJdW_%Zkh}rZAxL(YBOYDwxg{wxYbp7wTsT5-=62^p()U01uuPvIqMT zW2sEEX6!rpWul?V#z1B?PE^zzNG_C)aus#Y7~9d?#j7#jO4)Gy;+g5~^v{%h-rL^Y zjZUIrHr&h#Z4xOrRl2?N(wrw~w3CfR!3Qczp?zGKNQ~02YG|AIbU0BV<og(=MnLEa zU8W(O-d!N_>Ac`uj3TQoyoUvI3QRdi(*Uk*9v-U|ur;Zw!)9@{tirLZV;;Z)E0SC^ z!J-{lh%>#v_~hb8|9!R$4hKpk#lM~nWm5D<NndO(JbA0i`3KDqTa4K;RxUG^5BNwT zt}}K%N@V4+yp<vF2*NNEwFY6;IxJ=5rl+Zp5=4Sj%oA%MMi#7+9s$rOsgTx#x@T=D zw$;3QQ-0MYg#?xBmBgUQM&#AM%?hwwvyENQTP48&qG-?~>eGh)n@NRiH^SFdd2b$K LGAMyMwLkYag~AmE literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb782cdc91ed4e9ba0aba51cc45d0b99bb4e1ef3 GIT binary patch literal 27191 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..60d9ed028641621db574d394cc1241ee84a70377 GIT binary patch literal 1136 zcmah|OK%e~5VrS~ZAl-hpaO{toQOnO9<694grI4~g%qR&RayyIo3)c}<=v#VlPXbf zsnowwj{K#)a^f#=V#eD*dI3kaKhLbkGv9pKUs+iuFitz0UulhyA9$D#55PN^`T!PA zIF%%)F{Owd>Ev$gTI@<M_ha8;PX>7{u2J%VaGwX4ga?Ao+&JX5Hfe-EDTHd!a<es( zCflDF(L701TbR#k&=m?i8_faFihkQ9MzoUjBr6119~^#Zc8(7+ZB*7BnQTzJFA_P? znFi;ob+UGgwLTpjeoWzsKf}F2dK-WsG36w7u1Jq^%ALzFc7?}X?p=}@jeWp2XTZS~ z@koq0*UCFKewAU01>nFPgX7dsVKKze3o>)Aop0bYuJLAYX1)n#1oqkmxen382?V7_ zjiu7pqoGhLfXijbSXN|)F@*t@kG7@MQo(etuodM!zED3)kbtRBrLTk*26*takUiL! z7)xcMHDlk&FB1(_HU=`IaiXH$KysmUl&h$F%Gj>nDPE8HcFKn1m(NXaw|}bSi{8%O zUet+(*>Ec>v`M7gQt8g_D|42h(M~oN1s|v=h4yh_A~8zM`Or4;*>Ivl$oDZ!jeyWq zx=cely}Ll<vw6X{7)4f_cn=Ha6qs_3rU6{r>Kv<8ur;Wv!)9@{tiiFYV;;Z)E0SD1 z0gHBEA<p#v;**OX{rA~2=p@;BQvB=LP$orxl=KA(VE*K-D(4?GLToW+$5^?{SU%t* ziMY<#*(i~f$MRN&z#|C5Ow>ArRU5FBD>pq&g_Ix?q+*`f3SwlzD(Mjbjgks!J*a!u zhGJXGyEo-mT~bI;xlu_BnruW~{oAYn%XQn>1-(@g3?PaIJ)%Bs=)aj%$aW)qQ<eAj NAtr+os8joMegld36>|Up literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..25ad8ba52704d227849531b1f8fac04b4acb2b50 GIT binary patch literal 19115 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 TJ69+eZoz-~6emHv1o8h5)KrEH literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a34c4faf5a48e320cf52bbe6bc2a2d34bd06054 GIT binary patch literal 1144 zcmah|O>Yx15ViL!+bU_HsFgrm;6x<K(l60U2tiZS3n@tHX(eQB)=s*Wcaz%QNU3^D zrT&d_<S*@&6MumdGu{T$3pld<JhPq|zj--qwU!Bt^V5y5VS|t#c$g0lz<Zeb2o_E_ zl_aMzrHCEr<ZkR*>`E{9W8Y#=26-cHP;yMT&x32i13_nQ9P&nww8NhiLbYkN(JiIP z4yQ(R&JxuV=8GEjg#yo7XT-B&*fWU{-6TEB3IWz9$A{ZHTiZvOHY)3vCL0wWibPIz zrop>fds(l`x}T3eeo7(9pW)siy$e8)m~s+3H)KFL<<4~&yTaox_pZr|#y((MHQ?Ze zcqGQE8&$JTP#2lv8*t!`(Q)dRuoz<K6`47=&Npxx*LX8HGv5R=0(;|%+=l4k1ftTD z_EP2Rax9bz;Bpl*mKB*{OkqIfqird*Y%rZG>_)ZD7Z_j(QgA6$<tw3u0VX^x<N)?1 z#!{JR&DeMHtBl4fn*g8DBvH{|B)L#J%2m`qXKY{Z6>lbdH)Z3=_G>fPAD%0@HP|~i zh)$z%Hr~t%Z4xOrRl2voV=fXj+Q}xO;3E~K&_OOtH0)!G#<r2K##0qS!Ovl81ca{8 zWg61U^+hUQ&7XXaQ{=US7xBrQ0$0vS71a0C3fS6IHDR;3URL2)HL()lffY$EUVueA zun_0+@x7djU;RICqk|IE;$MkFnH0k^8447^Jn8+1&cA4f*k>$|v1*yIe8fwMxXIW> znaJ8>xvN6p64YU)>LJ8ck6@`<ca2Sjl%N!3V_sPcF%n_r^bCMTU4^t6G(BrW#jWQ3 zI|AxXDdebHt91sQHX^V8bykJd1KZsN(bYN(Ac_W2qDXD%zm?R;HY9voKkwaBECyxJ Ir1t0h2CXj>`Tzg` literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de4871f2dec022dee021554104e6aea737d20866 GIT binary patch literal 2978 zcmZuz%WoS+7@ygPv)-)Tyx)YjJPl1uOG6V;71G2_EgGkaT`H|qjU3O~v9qzASvzfv zD<L&fIdVoE5{V0!9uVR$;IG&l;uH`MiN~QA_`X@&iQVpMe)G-yH}gGaZbl*|fv=Pq zdvN6%AwOfG{b?Y449U9$zzL@=*`+q6C@ZeAtJ*3hYlN#@J0x6l=o8h}xSl4l&<TYh zG3rNFwzDGb)b5JPmLs6TLaA6Tq-)ullY>s3Pi;xw5eN>kDJQnVsjYGaW>sySYj%k1 zb{`Mf2Jf@O+^|g^w)?qhTfE<naLbPJh<%Pn?SZExPx(1MaA??re2@<v5_^ab^AX60 z`6wTQe1wnl3CKtJB%gwO%o*p?eCCimq4osGukcwZPlEg^KQHB}r$i(6H0<z#Z{2pb zg!3@i*~u?J`s7!H-w=LB_ygfjguf8}M)(KeUj!YX@Y%?-wVxV?A2rNmdSh;Jaban0 zv0*(dmU-o&H+T8U!a@#D5<krGj4*jO0BWR0o8*adq#Q#dCr!dsiJC-RVn|}2M59TL z!a-ly0ZqkBU-#-&M+nrkZ!lIY7i*09lPq5>XI+*9<uSKXDCVHx<toDQC(btQ7rlC? zMQ2sv?E4nma`MnKD4pvJuSyH>qpUTkRn~>$IW;g0&2!v5<YC5gZr1Y{`<6Vf$E%{a z50(<&&x&}y;&MlL@m&$$DlxX`EtIeA^Q$>l-M{i)Ex%YO3HNe-VQDFziC2r&xnkL? zWnFhp<Q5j+ukB^AQYN<VzyXUm?vFdQ__ow!z-YdDAO_($zQSW303b9<LudZR=vl?j zw-2pLPYMiM!3kynIB1ClNVx*CA`x^2T2NCb(1kpw=VO`}0!a)bj3A5x#Hg4=dAb8Q zrI-Nt29jq05M-x?Xk)00nLOEC+pRF~(87H+C9NhB0#^$RLJ?!oBE|t?s$AHQwDcd? zxo-vP3ran#{6SD9+pTcN1?{85d(U7d53LJ1HfFo{z0f&_{P4p(1gUd`$h8CpUcww0 zmsChvLEi}lymdc(E16op!#-KQ)fU$i>uoW0FXbCShr0>CKaeu%<<(?N33f?yy?Zf= zUSR6q0g=`gqO?c(?LJ-1(Xl0SRMLyg3tF4C=9{UF&Gi=Twv4>nG7=BB`rJ*l$cndM z-d?&EP$^f+0p%Y$l>1HEnCv?Bv;8`>(Kt{`lJ@r?!0|$KDJeUO7{WXaHAiZb9@EG4 z(U(oSN*;XiSZP9hh8|T^21u&-8hYta3LR6CX~LAHKCWB?eX_niY=a0S+dzi4aH}m` zzSNpQ>6+ndIlr9sY;T+cj8>DT8``^gADNocm&7b^7xM1uhuDU9jKID5q0~l(ttb4^ ze9?tEwp}c2v#o=g!zyL>Kzf>Z8^=n=lYTgdMRZ0#yqd@)Rx-)dTH7fMIn=8OU(MA; zuP(H_<M1D0q<0>GOj}AwF%^><im6)40JYQs)ubazlp5638iQT>!LglKg4{7ly*vT| z_AcFEf;^_uw3HoP%s{OQ8j{Y@Pj;x7$MZy;mGq;~G3I@k!zj=hl#CrsY(kEsWEn;g z!J!66QP3q3qE(W;VoIt2%gZkoJ`Gg<_<AzM0*6|;y}Zd*lj+QIY9-+h-`QA8u7GXd zPTbr~+-Ip}IR2qelj(cibu!}k(E>z{T&0{Za;KbgWCZeuaPIYu)x@37v>gS=3(Bi+ z`G$-)AoXg&!sw1Mrkve%{sZPR7!%E+Cd49(hExNvC2Iym&>l}YJHDe4v@J|hBj_@m zg5@bGKNM(DvUqvW_6;{%F4VIHX9{NUWUy0u0!q6_*Lt0>jTQ=8fiPH8N-B8XMby!0 z32V~?5Z_>MzlVZwJ`cmB8;Cec7~REXfS1!0*nJim%DY94%KNY9Zjr7Po542&9xuEZ zOooxa?xJilwg(S`phaB7^<oIGA-sd|I>NgMZy?|UQ@jb_Tdim(qqA7R`XvN-n-cK> z0$$GY{u38al3pu)^(qv711=tT(bNvab!^3VlH8CVX}v3Qj_WdZYAkRFQ`kvftEkY= zA$fQPhN96IeqGZwtXC}4Fbxg<sPUmSZE5lim5S+pq-8h34Jc4~zV4LkyI!CJT;p{4 VK*Gg+<9cv_H?Smc9E)1H{{aQGtbhOj literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f499d7347ee7da99850c127ac69d8391d47e31a4 GIT binary patch literal 22143 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 VgL-zZS~$D|zfX&b9V>RM{{gq!+=c)E literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e170af7957224902d7d3323890f5a313a493bcdc GIT binary patch literal 38022 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 amw0CVug^bFzL7sRxIevD?>u+sgZ~4dfKf~U literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6ba94664aab633c3c5acacfd9dd2952f48d680c GIT binary patch literal 23636 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 Fe*pauzgPeO literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langcyrillicmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..038419a26acae520261b791e5d16d53d0aff2d0b GIT binary patch literal 29092 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db6bac63f5957892f1b20925ded6ea6e8c7b7117 GIT binary patch literal 23594 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 BAD93D literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..041984fe75d80905c35ec25238d4e389a4a3fc15 GIT binary patch literal 22223 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc8364821c943f199a7cebd70434b86ff7e181d3 GIT binary patch literal 23625 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 Mj644~=YQh=0*?4GG5`Po literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3b243bac80ce6aa6c272c22b7d12d8a256cb049 GIT binary patch literal 22202 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 VxTt@Na^poC-{0D}e%-_W{TuVE%}M|O literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73a2e773b0f993c7f61028782e140d89a1815769 GIT binary patch literal 22225 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a852a29758c337c3f02c86aff087e2aa01a3c6e8 GIT binary patch literal 2935 zcmc&$OLH4V5T2QRXtiG1N^qP6hu4LQsB%Ogt~gaGVxzpMiXR{cs<sjaSu;|ktXA^u z$Pgi4u&Z+506!r)a^XktGxkPtp!@^4aH4zGu_TiOQXJT+Y4vpX%=CQyus<#od;(v4 zbMF54rwI8C7e^l@WEmF8my8fW1dT|ChLj@DBG$1&3wSHEg&jJAgsyPHoNz-AWO<Pb zec^>uA|D3A4-3-$-$zcq`WW}xldnF;_d9?<FoA*(D_=ThqW1Ve>j3ltSRB{A>N+n+ z!-w-mtBjkJxnp|N_;PA&1mMy58u>|?JEliX@FQ)Ia9T`-Gq;EcL}8zZf~0#^SQOJ$ zQkpq{WFsY-7Ag;Fsw(w{>TXE|f&jTz+^p)FmIpRi9l#_9kdx%VLgFBCk>rqgKuXIB zrT?1XM)h)H&U?9u(LT=(-=+*19q>Xsd`V_(xaZl8P8o3{yU|6Xdq=XD+Z~-(2QQ93 zgc-l&4iHH~3f0aYlLi%3uzfGIgeB~K657%cj&S$M9t~aKbHX!xPUM9TdQVJ=0Dkk2 ziA_Qu;$BFDJ2l;kFJ|$sqo4TUFW!nXc^8N#nhwbxd%~WAQjj6xmZA2LJaIA^oJZG6 zZt5ico>VG;ZK=n3D{g7d(;|;*iRN|4FJ1>WNejH8<TkH&`>~cPb(Bn`hLp1t88zTH z&oe{Le<FYO%RSZFfgCLF)Kt0Ajf7N5xueQkZO)gH#rX1$xK!u8oe$pEjiqK=MHd^3 zSFV&d%e_`_p%o{(7DWrHzPR+E-man0Oui#y(N$%1OGsUg3>rO?{TF(V)HFPzh9F>C z6FN;@7=u&epj~+O#J{0e!HsVN(TEpBt4TGRHP~tUi8CZmO*aSJ*qW&o0MA<Aysc(n zPa53(?8c|Ova-q7?yjmLh!hr`Isv3a)k)-Mj|lwr$W%>W5=>nJo(6Pqa>7@G@r0uo zYU3!@wxGtDf&WQ$ePL;7@yfzQbI0@VO9O-rg2v-oM@FzeK@SNVoSnFI-0C0iPP13N z;6^X1#m#=LDSKnLO@`x{Mcw!UW>|7K%`3Nnfs`df`jqa{Z#IVXI=O#)mqB{7vt-xO zY)IOcwjoT`X#x^^Xbbv~sb%f7T?k`t1NOJQq3wWHu**;*SHTtwV!QYS>hgf0l?Bu^ zl9Hd!H(C+oIRCn(A8;8rqgL{OM^b|<Ne?5$D*)zZw_<9em;q=Ot6d?ZEGP1nJ1f<y zNeC>>)LmQO<f}JQmqUKTVVEUQf5?{{lOn0N^+-!ltCZGLA473iel}L$u?$M>hLl3X zDajlVLVXyXnI8NydXoBVaAG35xZ^0Q=oL<b^*vw!4`>~21_%~0yEGuxw)X)0Ar!<z zqRtDp%i?n=71mj_hks}QS!b4<fhf(BT{dKbf#n8T0`JZm8K9h7YkoWX^Q~V8``0k- z&6oWh!K^+MU0QD5`{9>A&foj}8esAcC=`0A-U5<ZNxx%ID_I#_j_yLI0HC^Yqa|cq zm&YNRZbHJ3)Zf7|hhPQNW(b$d=AiaGYFi#1%uj$dxwkZh4HAn78l=y8rz`pq@&V`D z{aTc1OcOF?pL)=lpttHr>I^>NbtKrH)q6mop=P12%P8V}<TupPYiMM81h(a`U?#|T zG;lp9umjthHVu2NbRsPr)@#-UP18vo8TUI$2Ha`bm|AzQ-&B|*skKtAAgKbWe2!!t ym&jGu)tg|V&LMdN30^vKEaT9v)VrEJ{v$L?LLdPRn9Xc@Y*<D5U&dVCp85-EH&!nI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89ae42628d03aac728ef9869e40d7e4b45951540 GIT binary patch literal 2240 zcma)7&2Aev5GMD}D|sb5w)2O!soEkf1k_ggV>AKMqK)k)25LF5l@?eaAl4!!ud>=z zxRenK%B6OZQ{O>4_LfKJbMV?zUZDuk&QP*y12Ira<j!!&nc;B0;e%4CNT78Z*PgyE z5%L!@XUzfPd+7Nc7&zfHAzd0$inNtjT|2b9PUukbkZ_wjr-VC#p4g$w-F;H^-cZ<9 zrMk3n7|DI19?R@N$f~6Sq~f%_uOcOMuoE>8<5U=~30r0j?PJS-hCz^!auQmchBjY# zMOxI@EQF4sUGAOwp({K-$Nf`sLc=+r3%qD(pU?B)l!OId;$`?2UlE6d^Wf#8zP8g( zRQ%vri3@%XD#Z%4cMFZE-n5K+gy7en_WW}o6j5|YPOOeKq@4b4LN+AK<^)EETij|} zK)IZN3w9lXG@nFio3-LZ3Hb)qRz2<J{hpB01y1{n#c8Y<(^q+%D;Xd3Rh*?PN~7d> zAfzrdGY&Cjc~=)%66K0DA?y%sCl^UedZ?1>0%J`O=8XM8{(e#G$@mEFpmr3=S}RMq zka?{uYX=?1?&j<1H%I*IChHx2c}KPGwmUNUqP2eSUae8<#l6)y%~g~ntFpO%_bc^0 z!b#KFkw|$aYiOSfRqGxgl?&A~39!~XmId(UGw8Vw1EEXQgWur8cL#gz?C4EQC~Wwh z#rr-mXYn3cV-OBW$CkHnobira1KyeN9PZ>?{H?m2107XQqBoOpyHbF|avmoTATq!e zR02fsQ^u(U92Rl70>diw99I!qhQkz1AH09bk&OBa=fN{=pbm6GkzXO%AvY-I#&SJV z+udFwx*}DAZ%LWSsV@^JW}fI^8funCU9pbpOpaQEPcCuf{QCdtk6Z%1m)Q3)jr&ns z+&gFcvU@#SJHruXI$ni|g9Q<J@u#_2dIG;q^7QpfKuyOQ*+V+CZjv#5X%B7Xblhi_ ztb@cG&2hk8$A?}RT4N|ps@Rzaqy>-3^Rii6g0&oG%NJ%BU>0UT_u`nmbcTRXm>B_j z!4Aw{;r4y}E{&Fv8#-ff4>V3@z#DGgAUIwpzu}Il{1*ZmoT&!OXjlQ;S3&n%v-jGV zAT_!^M(sDAIr8n9Z@{lW2DtUXN4N6|{3r0K9LA~wRUwm=NL3D?Y=O)qu*4L4^AEJ@ zP3=m!2%+snq$Z1XF%>Tq1IR*w!NRKDt-Zb7J?$k~yAAcj<>H{<mdhZLD>xv)v{&D4 zu$?XKO?GN;yRnbF|KskH`X<|MXm`Ky!(Kx#w*^$3zLb!nrt+X+goA;Pc3MJkC}^hQ z7dE#VTN{n-`a`|Y&J+`A)^8s&9;rx|jh-xR#ayIKp_ld_?d~-;o-|nF(cTs?KW$cB z14HfO;lVGdX$*-!Eq}&>k7>=&1p|#4KIF&X(YMg^H5jn)ECNz}K&($4L*Y1?S+Z`> zqE)s6;6ZK;-n#@sc(e=9LCBdD#>xTLNJex#1+z7&CZB@f-3XE>3ZYMcO9!_vv3fC1 zSSSK~BoO!TNE8|CX1t#u9WeI1A0<=C9Ai9dGG=P9sa)EJ%z}qT9iO{>43zOjm!?lf zQzQv&n+5c&44Mjv$i*!=Rz}};tg;vQffG3X2d1Fb;W;Z^cm^a!NxLHLcXN|#CM(V2 Y|7=Vsw4nX_lLLKs3(a5#2XxW?7k*(QX#fBK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd412dabc7b7b24d6705fff119aa5375f9219d5a GIT binary patch literal 1131 zcmZ8fOK;Oa5Z?7858G*JiV!F6L23<cBN7QAlmHb)L={PeWC^Vt+X)Hl#NBnmLpdO& zQcwH`IP#bF%89?giJ48BR$Xhx-;CFqneUrcrQ#4c<KDdw)e<3pFt|DvfahTHJGhv{ zl#`SOlp;2`k(z<2vB|B}4s4ArUPy~UQDd8z(sEGNxWJv%4P1?j+)FD#MdK3RO1Fb; zjm!K_x)bbBa!g_;b}vZmCUj{A)!6HjTIDZ=HfmH=+aE*GP4Z(gon@zD+D`;zowMGn z#&y&^dEMPa?#r|G$>}Eaj#~$Zj}JC6etz@rI&7adkD8m%X^n>UO@w!Q?^j_2{cH}B zg-1RBmym$QBrsy@k_>2U#O6ggFfWNk0t-g5)%M#~yL)4RPGso63BflAK}<0D0$fgV zx*$tqY%FL@e*pctxg@y-W`h;LieM$MGMKX@!_tB<cR_x7zX%cw6^#y1<nnMbWP=gU zfw79R<t$5taG{1OF*cfva>fMK6*!Er(G}1Y(P2}fj1D(O6*JAeRJKTDlGhAn$%GGt z2OptUnX!n6QZn|N{QKf(Vl)r)#Gi-4A53|i2<fN7?~fU4$ok~TJU)t8Ha~cj4;sU< z;ExCOX4CKa*(lo^O=KQ&z9*u3<1jxDF{zEslSw=kegyjvC%K>YBRRySShcpFeHB~K z%|kGG7aXBg!=g7I$M|;tmJ<6{Ow?!xgaTqFVVW?e9LCaVJmZKx#?EIUUwzR<RAoJI zlyD9-?m{{3YE)DaV*{G&8UU$PraJD_c2yNe02Xg_FYt<TW<bbl9IcFU<ai|42~<hB z$t)VLC)ScFZ`jB6USC21^`%c@ok2B~8)dNM>kLY(oIdRNI)O6lpYqS^3~H|1y`F4^ Va4uDPx}xS8F2BTiJ$mag{{wb98l?aL literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9b57aa69a42f708caaeab360d4d93eac668fed6 GIT binary patch literal 15686 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f4260ff2bc94b72d7ea4cfeb52f539146bd7e56 GIT binary patch literal 2993 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 Kno!~k?*9M<N8DNf literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..801399184196f4db5d3fed5b71505829cc733923 GIT binary patch literal 1621 zcmaJ>TW{Mo6ecBKWLvUj$4RqcH(*c3*1AdS)CGoNNPuO<)?$DS3?MKNvP3&dN!g`j zw;9|g7wDhZLjvq&e~GVq+F#hyct|I0I$#v|;oK<lob!>#K~P6}oR9Z@{j!PBU!Yu% zk`}(xGyh#ff)dP;zyxEE9qtI1xJGt)Nt8)hR7gcsNmY2n6E#v3by7F}5^o5f_#z;I z(aXFkTBIdH5*oe2+oD4{My~Q5(Is6Ydwf^ykv${V_#LrN_Axp|Nj+)2K}mz*jY~dC z{1NH}e`9^b9#)-`vq+9uaVqD_#m{m+VNzS~jM8kz+3`iew*IZFqPoAN*}>u9;N(K4 zoTu^AdBV7=|2R*F(#ktOMMatoZU=-<qxiO^@nj-~M@M#zQ3eB}^c)qMUpzXMj6Jsj zZM*G*cP1UywL2Xz`7DxYl-bbT?Fnz2byltMlhM)P{qb3p+KqJjHg@m>n@INZ+Ui^N zrW_r+&v+@Hr}>$Qigo#JhP##WPqe@g!3iSHTQtQ9PMkL$ao?g6A|+jSSG7jRC!_bO z9YZ5v0C@sE;b-|D8VXe4HQG3r&K1I_aEsCgYb+bA7_1uf4Au<R4K@t=1_OglgRKpo z`D;YOqP;<{;cuM;uQe@RJ4SYl?5^?U&e~bKR}MyNbRJ%I*BJDfd!@;|Mwh#Aq69%g z&%Ph`_Eb4vE|`=ZeQf1Xnr3N1sf1J{<R!}h6@V&$2T%im%Oo2BJ^&Oz>T88$TZ5`D z3?p+Hf~f_jcFqbafOK^0R2BBBU|FKdl4)nJq)IvCQx%+<rf$R3E}zfRIO6oSxw}g9 z<%d>HmKvookMf+-KhZz0`U{z^qJs5Tk?c?BJYh2L3)!EXQ##BC*`rnRFs6&u;r(Jd zoSjR4FdaO8+#mNB>Edph<weB#T^SFC4~iEN7|o<BeeAjH$NCN?tmx;HIG@2qw3*#o zT*$7@`D;CM0EC-P1^?$OSFo?`CF~iWkL%cTe%t?mX!ow$(knxYvPdvWRh>dHmmFlD z(igfE)?;>7!L|x9<6JlNGkpdFJuE*3`Evm1`d519js_1K{aNp0)q%WpN8U?GLWpYV zM6JsvYKWrRJj!PA_E|9<{(tVMCM=l28)2hwxTHGZnOr{$)_cP*6@a(UuYh#`-Bb%~ zmKoM+$mUzi_LM+E6`IBNC9sjeRFm_&@>mIqqr7i)l&<f$P_G<H<zpXz;f6SLK+>Q4 EFP9avrvLx| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2eabd52df748c9a2dbcffa3072ea807677333e9b GIT binary patch literal 2447 zcmZuzOK%%D5GMDfl`P4Moj7(-6fV#J70^U!o3suP6isX=aS%UXDJUu+VAmogud=(6 zxs+iG%E>Nr%}<bz{S*Bmy!Pa4kG-@rT+5c*?26>@v7DK2UV2t46$m`t#=_e>vxNMK zlgZ-%@e{Q4SLit5G$Ju=Qi`+{S+U);4Q)qG>^5CPJCPUXnmI$ekss%qc|&_qA)aZ@ z#KmTjk{5*MxPMBxFX)NgEb)AuR14=6*i@-r*c?PEe0HqF>V6>WLhZ=jo{+FJx7y=j z(y6OJiOrz3A0`4;7wfM!>T6-DWVkm_VJ~@_1krICrm#1Ud#k-fi6b?&T*75m-(;KH zYwNG8mM$WX$<?}eak*jC0;w(^`+`b$fDoifIcZuSNSkuXty8~g8`|a$(2j7q%e_-_ zLYp4YMrELLJkJZKr0Me+UW76KfjFdD00>IDfP!WEwh#_{a74b?(udF~qUea6SYzu9 zHkGZM6PPnsc_#$Mobt_>ACYkZPjCWv)2-@^cGE#$NSTLAw9i<Wgo-hV7fTP<@+|`} zOJj+~*SGi-tSmrWhw#0NdzDrO>*ca`rAUPW)SXmBZ5Z>6wW1(R8T+05o!0s?JOs<t z4g*<h_aZK2T8m|Euglm<`Y8F~kUwm({^7R|RC}e<mC-ltM~@%Z8nu4dzZWK{3Zm$q zY&}}}P8|feXc{{d3Gc~T3w(tORZF{J+BXh!zke)eK+?O=Qsd>cObgV9cWC?~!}<OM zhff3k8GL;m@Db_S8T1oi9f{W)SS17zk!9$rR93R#1}@EEH;)~j_!?S@5EGDTSh=$L zeS_gOQPBRYc;1H&n3FEe>}eT3x`?U+@GJ>phzG+pV|T^#CVct;@35dF*6{We$LY^M z%@_sc$kf`>{;QxLBw%R6;?wN39|cKg5Of5(>xAbt=9B%Fkp~W;OXZ*$MPGx;AL)^0 zaHl8mu93HYy|+MlYiy6`$XX(2^u0X-*YCRTEV%<a-Z;l047xtF{Kz_UAT$cy83>5t z4mqfpvn4p&hSl=5)md1rn7b=y<h?VpxCJYJj3A_!5bzt^euCrNc;3vMk+TRv^&9Rw zXBNf1o7rAA2X5JEkd)iE;nX4l%FU?%eP>RY6L9uw_n`7K0U5jt87w2iEs%cUo%NB* z=Z44aGe8RI@!}cEvGmTt`9w!pxdnF1Z4JM;n=ZpI3ytOdP%T3s_vCV*miHjl!rnQ+ zPb7NVIa=i$)57^b@Ko<WXoEq8wj+_qBCP8|0vVM-Oe!JKFSWbAySu%sy{Ome2&r8z z_68k^ekT{OL*r_1YrDZV*R_{@slAOx9q0b@?KfL%Y@?ywdgJMCL(g}>pIZYdMFJ!E zH!#)(2FWCwW}fe~h2XMe*c(xFer>(6zS`K>dZA}KJ;g-Q8+7&=4^*Jb=FVQy4!KBL zLeJG-Ztpf$-!xd`<?cF6UawVM6Fu5TNI*uZX$bLkkrYu`?V~gdaWK(!6=Gk37%R}y z@1Y~~CasucQ-*Zo7z%q#KV`Z=JvwL2!I?!`u*z1M7U8sS4QHpq5_P)_N3;bt6CR%f z0fr@G3hs(7ZyCx`CNxg0EIT*`BZ-+NgUF79qpF=L2s)XX$Y5;i;zgP_v;XRa7yJS( z#R@@;4#TA>Ij^G%MFt8BW+KMGU@Y$OL4<UXv4cSnWjiJ>n?$I6@JOgh>Uhdm5K1Gs zE?rcRmWU##RF{xL-Z5F#BvdSCUqVaKGksdj6&-y2FHA<>s+RR^ymyi1GXIz8;Ce1I ztnr*U`#WK3A(S>OCR3#^tA<{;-%8X`R{lJ=GKD&6>ZU7_L7W;NH_?!lf=g*LxlvZ_ TKgkgJ5$lQ(xCqA2-irM%3@lG{ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4c3311f249704d64a1f483f861b9ea02e70e0b5 GIT binary patch literal 5837 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83c2c8d0db8cf0bed10c85be0864b27f235c0956 GIT binary patch literal 1978 zcmah~OHU(55bmCr$7T!&R(VKKgc4;VM+?p-K?_n8vVa$mz()3<NS0PDGu`&u%#2OX z7%i4LfwZ?h<p;nqm;FI~N|Y0)<eXEgdcbR<L>Z~8tE*pCUsrvzSu7R^d_DhzmrFB* z{EmbB&jRH~Xvr=JPB;xoM4ObNZiGf;HqFRtT6%1TcH}f2ty^I(a+@wCJA~WZxgy*V z^wMnRd9Fc9?k$DmN>mlMUbSRHq=&M9EM&=09%|jV(@0yXP~Jf+c-4)C9>Ma3tv<h> zyqm&9j{FyEtZ~2&YTK3l08XBK=AD-Kpa{~WoHPwio8}wRrrhA>mD{wmZgCrQTR7a| zxhrx>n>o;3p4Ym|3w-8^fcqXVLSJ}8EYh5TP-ayDug?PLWY_(=5nz1yVUJE=OTGe; zl9Z0grEzWCz+`Hs)+LOY%?U_nOs;ci=LC+X)sn01WH=B~=3uLG8SBQ~lrd?;P&#PK z2O1KVM5@T*VZ@?i767P;vZY8w3iw!w2;0!-84JQzk}&oQ`70?8WcLg}E}ykzx!n)B zkV!d`<>MY>YsqT-?2LaGu)*0kU#IQ0PEUqU+pFvAWxqV=4wk!dlD5KdSq7_X-=?Q6 zH0s9AM9llLj4p7ImWQx;pdWW-a4z%U@ndL-3xd#DTA&UcExreE<vzlH2k<l4^$@@@ z>6san9AUIHa7OhO&o9{$@6p&v4>inl2`LWP%3{{dqG=ArJPKU)1X_aNW*&~_r~K2H zK5!0Scnf!6sc;JKW>iNu#J#+x&%L`UyJK>Z^7JE#l*O$`JjMM62x5#roVsm#&HrAi zvN-<ZJ~wQ|onfmZR;TWoM*e<2(0;%oj0c+z?q^V5_r`Rayga@z0CjRr$Hoo4Fvn(U z^vn}OK1r>fjY)h+P91H{fprtC?gMKctdQt%Lg5AgJF#(Ok=_h9o)LqvnN#N{D2AQ~ zJBzUPEfmG<4O-?-Ecy2SJX`@_o7G!%SZYF<*DtIJv3Q*_$k0?sj6m6ydc9VcScJ-{ z)_itQQBJl%IeUHs$L@>TQFWW``O0qi&+EQg?7-^;Ln%cJJ>+vJVx2rtlbW6K+ZDgE z<?mH@)U00HkK0`?;y|c{#%`_dZyou}->p|*u)kfhbjm6B_&gPGw^THMEV!#)?W@j? z_bFnvh2ZPpbMh$&0>$D%bE!3vvvk4mpp0B&G&hwtxNnj!hz<s>pK%2gPA{NTdcfZ& zL_Qv)uE&dHom^0Ej_F6hK4ZvaT})QB^KR$2(W7^NY}{f|+;QBW8zmz{qgbm}*w*gz zIy<b_Ho=OOrJP|Lc2C4V(q1mX+&;8K|8jIF^XUG^Q|>>+vg9G}VU;kZ3XDa4J`7R! z7&{%d!fZx<35RNa(Iu>0ARXY%^jt3B#3K}6pjZL{OqnrZAi@yXbb>q7j^+bR1xUG{ zLrc&Es2iT+*`DQD?xLoYYN?=#cNLmZoJ6dZEr5m-oore5Eo6_ZlP1c3Xqv#46CDRh h5@{mOSZd-)<`ep%-0!oHfA|EQK}PfFJfwnW{SDAR!TkUL literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf2be3adde41ed1d33b89d9f85cd1f171919987a GIT binary patch literal 447 zcmXv~u};G<5KY=ZQ4lNhjdUOe+KPe@swx;*ibN}hO2~3!r*Uy?V>^NJH83*sH(B`$ zSa3@@>7MW1o#c0KxVIMvJ{FVxhadlbt;l~geKGK9_dU>H8qjbWvhb}z8}H$?Nt@%K z9ld_Wlbl;96fFe<_QI{RprlxWQ($?a1<#gXm@}MJT+YGe3@T<UR}y4d%$Na{L7Edo znTs={3V7x&=MpS)rB3t`h@`L{Y_`CbGfmP*GG{i4<8xBFT$yvYA`*sz$n_c=P$HAr zKOM{q!bOs*q8-0(b&{i`TZhT09n~$2sY)@fcQM`w^JL3<<*shsU*C;yZbu)1+4eT9 z;aekZctspT6)`ANg8F+<VbE-Wao_gjX+^s!*44?8%lh+$5yx5Y><mqi=K7FJ>xdAC nChhe*?uo3L>-4`%stnp(i8f-q1NF|upTU<a5jOG=HKOnr{=1DP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py new file mode 100644 index 000000000..88023ae4a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5freq.py @@ -0,0 +1,386 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Big5 frequency table +# by Taiwan's Mandarin Promotion Council +# <http://www.edu.tw:81/mandr/> +# +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +#Char to FreqOrder table +BIG5_TABLE_SIZE = 5376 + +BIG5_CHAR_TO_FREQ_ORDER = ( + 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 +3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 +1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 + 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 +3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 +4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 +5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 + 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 + 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 + 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 +2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 +1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 +3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 + 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 +3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 +2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 + 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 +3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 +1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 +5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 + 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 +5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 +1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 + 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 + 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 +3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 +3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 + 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 +2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 +2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 + 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 + 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 +3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 +1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 +1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 +1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 +2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 + 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 +4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 +1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 +5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 +2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 + 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 + 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 + 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 + 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 +5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 + 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 +1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 + 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 + 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 +5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 +1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 + 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 +3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 +4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 +3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 + 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 + 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 +1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 +4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 +3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 +3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 +2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 +5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 +3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 +5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 +1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 +2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 +1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 + 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 +1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 +4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 +3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 + 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 + 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 + 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 +2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 +5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 +1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 +2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 +1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 +1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 +5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 +5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 +5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 +3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 +4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 +4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 +2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 +5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 +3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 + 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 +5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 +5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 +1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 +2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 +3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 +4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 +5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 +3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 +4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 +1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 +1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 +4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 +1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 + 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 +1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 +1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 +3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 + 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 +5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 +2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 +1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 +1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 +5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 + 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 +4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 + 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 +2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 + 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 +1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 +1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 + 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 +4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 +4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 +1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 +3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 +5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 +5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 +1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 +2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 +1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 +3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 +2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 +3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 +2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 +4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 +4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 +3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 + 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 +3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 + 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 +3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 +4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 +3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 +1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 +5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 + 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 +5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 +1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 + 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 +4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 +4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 + 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 +2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 +2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 +3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 +1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 +4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 +2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 +1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 +1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 +2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 +3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 +1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 +5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 +1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 +4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 +1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 + 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 +1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 +4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 +4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 +2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 +1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 +4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 + 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 +5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 +2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 +3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 +4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 + 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 +5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 +5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 +1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 +4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 +4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 +2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 +3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 +3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 +2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 +1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 +4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 +3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 +3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 +2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 +4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 +5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 +3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 +2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 +3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 +1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 +2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 +3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 +4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 +2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 +2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 +5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 +1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 +2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 +1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 +3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 +4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 +2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 +3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 +3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 +2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 +4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 +2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 +3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 +4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 +5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 +3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 + 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 +1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 +4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 +1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 +4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 +5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 + 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 +5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 +5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 +2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 +3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 +2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 +2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 + 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 +1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 +4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 +3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 +3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 + 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 +2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 + 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 +2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 +4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 +1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 +4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 +1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 +3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 + 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 +3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 +5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 +5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 +3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 +3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 +1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 +2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 +5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 +1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 +1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 +3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 + 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 +1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 +4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 +5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 +2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 +3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 + 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 +1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 +2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 +2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 +5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 +5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 +5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 +2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 +2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 +1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 +4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 +3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 +3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 +4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 +4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 +2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 +2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 +5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 +4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 +5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 +4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 + 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 + 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 +1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 +3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 +4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 +1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 +5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 +2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 +2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 +3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 +5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 +1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 +3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 +5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 +1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 +5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 +2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 +3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 +2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 +3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 +3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 +3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 +4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 + 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 +2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 +4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 +3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 +5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 +1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 +5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 + 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 +1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 + 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 +4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 +1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 +4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 +1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 + 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 +3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 +4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 +5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 + 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 +3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 + 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 +2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 +) + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py new file mode 100644 index 000000000..5b1227a5a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/big5prober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import Big5DistributionAnalysis +from .mbcssm import BIG5_SM_MODEL + + +class Big5Prober(MultiByteCharSetProber): + def __init__(self): + super(Big5Prober, self).__init__() + self.coding_sm = CodingStateMachine(BIG5_SM_MODEL) + self.distribution_analyzer = Big5DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "Big5" + + @property + def language(self): + return "Chinese" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 000000000..e5509a01a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/chardistribution.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .euctwfreq import (EUCTW_CHAR_TO_FREQ_ORDER, EUCTW_TABLE_SIZE, + EUCTW_TYPICAL_DISTRIBUTION_RATIO) +from .euckrfreq import (EUCKR_CHAR_TO_FREQ_ORDER, EUCKR_TABLE_SIZE, + EUCKR_TYPICAL_DISTRIBUTION_RATIO) +from .gb2312freq import (GB2312_CHAR_TO_FREQ_ORDER, GB2312_TABLE_SIZE, + GB2312_TYPICAL_DISTRIBUTION_RATIO) +from .big5freq import (BIG5_CHAR_TO_FREQ_ORDER, BIG5_TABLE_SIZE, + BIG5_TYPICAL_DISTRIBUTION_RATIO) +from .jisfreq import (JIS_CHAR_TO_FREQ_ORDER, JIS_TABLE_SIZE, + JIS_TYPICAL_DISTRIBUTION_RATIO) + + +class CharDistributionAnalysis(object): + ENOUGH_DATA_THRESHOLD = 1024 + SURE_YES = 0.99 + SURE_NO = 0.01 + MINIMUM_DATA_THRESHOLD = 3 + + def __init__(self): + # Mapping table to get frequency order from char order (get from + # GetOrder()) + self._char_to_freq_order = None + self._table_size = None # Size of above table + # This is a constant value which varies from language to language, + # used in calculating confidence. See + # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html + # for further detail. + self.typical_distribution_ratio = None + self._done = None + self._total_chars = None + self._freq_chars = None + self.reset() + + def reset(self): + """reset analyser, clear any state""" + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + self._total_chars = 0 # Total characters encountered + # The number of characters whose frequency order is less than 512 + self._freq_chars = 0 + + def feed(self, char, char_len): + """feed a character with known length""" + if char_len == 2: + # we only care about 2-bytes character in our distribution analysis + order = self.get_order(char) + else: + order = -1 + if order >= 0: + self._total_chars += 1 + # order is valid + if order < self._table_size: + if 512 > self._char_to_freq_order[order]: + self._freq_chars += 1 + + def get_confidence(self): + """return confidence based on existing data""" + # if we didn't receive any character in our consideration range, + # return negative answer + if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD: + return self.SURE_NO + + if self._total_chars != self._freq_chars: + r = (self._freq_chars / ((self._total_chars - self._freq_chars) + * self.typical_distribution_ratio)) + if r < self.SURE_YES: + return r + + # normalize confidence (we don't want to be 100% sure) + return self.SURE_YES + + def got_enough_data(self): + # It is not necessary to receive all data to draw conclusion. + # For charset detection, certain amount of data is enough + return self._total_chars > self.ENOUGH_DATA_THRESHOLD + + def get_order(self, byte_str): + # We do not handle characters based on the original encoding string, + # but convert this encoding string to a number, here called order. + # This allows multiple encodings of a language to share one frequency + # table. + return -1 + + +class EUCTWDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCTWDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER + self._table_size = EUCTW_TABLE_SIZE + self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-TW encoding, we are interested + # first byte range: 0xc4 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xC4: + return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1 + else: + return -1 + + +class EUCKRDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCKRDistributionAnalysis, self).__init__() + self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER + self._table_size = EUCKR_TABLE_SIZE + self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-KR encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char = byte_str[0] + if first_char >= 0xB0: + return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1 + else: + return -1 + + +class GB2312DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(GB2312DistributionAnalysis, self).__init__() + self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER + self._table_size = GB2312_TABLE_SIZE + self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for GB2312 encoding, we are interested + # first byte range: 0xb0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0xB0) and (second_char >= 0xA1): + return 94 * (first_char - 0xB0) + second_char - 0xA1 + else: + return -1 + + +class Big5DistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(Big5DistributionAnalysis, self).__init__() + self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER + self._table_size = BIG5_TABLE_SIZE + self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for big5 encoding, we are interested + # first byte range: 0xa4 -- 0xfe + # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if first_char >= 0xA4: + if second_char >= 0xA1: + return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 + else: + return 157 * (first_char - 0xA4) + second_char - 0x40 + else: + return -1 + + +class SJISDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(SJISDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for sjis encoding, we are interested + # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe + # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe + # no validation needed here. State machine has done that + first_char, second_char = byte_str[0], byte_str[1] + if (first_char >= 0x81) and (first_char <= 0x9F): + order = 188 * (first_char - 0x81) + elif (first_char >= 0xE0) and (first_char <= 0xEF): + order = 188 * (first_char - 0xE0 + 31) + else: + return -1 + order = order + second_char - 0x40 + if second_char > 0x7F: + order = -1 + return order + + +class EUCJPDistributionAnalysis(CharDistributionAnalysis): + def __init__(self): + super(EUCJPDistributionAnalysis, self).__init__() + self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER + self._table_size = JIS_TABLE_SIZE + self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO + + def get_order(self, byte_str): + # for euc-JP encoding, we are interested + # first byte range: 0xa0 -- 0xfe + # second byte range: 0xa1 -- 0xfe + # no validation needed here. State machine has done that + char = byte_str[0] + if char >= 0xA0: + return 94 * (char - 0xA1) + byte_str[1] - 0xa1 + else: + return -1 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 000000000..1720ddc96 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetgroupprober.py @@ -0,0 +1,106 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState +from .charsetprober import CharSetProber + + +class CharSetGroupProber(CharSetProber): + def __init__(self, lang_filter=None): + super(CharSetGroupProber, self).__init__(lang_filter=lang_filter) + self._active_num = 0 + self.probers = [] + self._best_guess_prober = None + + def reset(self): + super(CharSetGroupProber, self).reset() + self._active_num = 0 + for prober in self.probers: + if prober: + prober.reset() + prober.active = True + self._active_num += 1 + self._best_guess_prober = None + + @property + def charset_name(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.charset_name + + @property + def language(self): + if not self._best_guess_prober: + self.get_confidence() + if not self._best_guess_prober: + return None + return self._best_guess_prober.language + + def feed(self, byte_str): + for prober in self.probers: + if not prober: + continue + if not prober.active: + continue + state = prober.feed(byte_str) + if not state: + continue + if state == ProbingState.FOUND_IT: + self._best_guess_prober = prober + return self.state + elif state == ProbingState.NOT_ME: + prober.active = False + self._active_num -= 1 + if self._active_num <= 0: + self._state = ProbingState.NOT_ME + return self.state + return self.state + + def get_confidence(self): + state = self.state + if state == ProbingState.FOUND_IT: + return 0.99 + elif state == ProbingState.NOT_ME: + return 0.01 + best_conf = 0.0 + self._best_guess_prober = None + for prober in self.probers: + if not prober: + continue + if not prober.active: + self.logger.debug('%s not active', prober.charset_name) + continue + conf = prober.get_confidence() + self.logger.debug('%s %s confidence = %s', prober.charset_name, prober.language, conf) + if best_conf < conf: + best_conf = conf + self._best_guess_prober = prober + if not self._best_guess_prober: + return 0.0 + return best_conf diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 000000000..1fc27464c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/charsetprober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging +import re + +from .enums import ProbingState + + +class CharSetProber(object): + + SHORTCUT_THRESHOLD = 0.95 + + def __init__(self, lang_filter=None): + self._state = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + + def reset(self): + self._state = ProbingState.DETECTING + + @property + def charset_name(self): + return None + + def feed(self, buf): + pass + + @property + def state(self): + return self._state + + def get_confidence(self): + return 0.0 + + @staticmethod + def filter_high_byte_only(buf): + buf = re.sub(b'([\x00-\x7F])+', b' ', buf) + return buf + + @staticmethod + def filter_international_words(buf): + """ + We define three types of bytes: + alphabet: english alphabets [a-zA-Z] + international: international characters [\x80-\xFF] + marker: everything else [^a-zA-Z\x80-\xFF] + + The input buffer can be thought to contain a series of words delimited + by markers. This function works to filter all words that contain at + least one international character. All contiguous sequences of markers + are replaced by a single space ascii character. + + This filter applies to all scripts which do not use English characters. + """ + filtered = bytearray() + + # This regex expression filters out only words that have at-least one + # international character. The word may include one marker character at + # the end. + words = re.findall(b'[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?', + buf) + + for word in words: + filtered.extend(word[:-1]) + + # If the last character in the word is a marker, replace it with a + # space as markers shouldn't affect our analysis (they are used + # similarly across all languages and may thus have similar + # frequencies). + last_char = word[-1:] + if not last_char.isalpha() and last_char < b'\x80': + last_char = b' ' + filtered.extend(last_char) + + return filtered + + @staticmethod + def filter_with_english_letters(buf): + """ + Returns a copy of ``buf`` that retains only the sequences of English + alphabet and high byte characters that are not between <> characters. + Also retains English alphabet and high byte characters immediately + before occurrences of >. + + This filter can be applied to all scripts which contain both English + characters and extended ASCII characters, but is currently only used by + ``Latin1Prober``. + """ + filtered = bytearray() + in_tag = False + prev = 0 + + for curr in range(len(buf)): + # Slice here to get bytes instead of an int with Python 3 + buf_char = buf[curr:curr + 1] + # Check if we're coming out of or entering an HTML tag + if buf_char == b'>': + in_tag = False + elif buf_char == b'<': + in_tag = True + + # If current character is not extended-ASCII and not alphabetic... + if buf_char < b'\x80' and not buf_char.isalpha(): + # ...and we're not in a tag + if curr > prev and not in_tag: + # Keep everything after last non-extended-ASCII, + # non-alphabetic character + filtered.extend(buf[prev:curr]) + # Output a space to delimit stretch we kept + filtered.extend(b' ') + prev = curr + 1 + + # If we're not in a tag... + if not in_tag: + # Keep everything after last non-extended-ASCII, non-alphabetic + # character + filtered.extend(buf[prev:]) + + return filtered diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 000000000..d3f5a12fa --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..917a9c54451e0d6266de5d9a8c5a62fd4bd7b85f GIT binary patch literal 204 zcmYL@O$x#=6ogZ8A%a`);G#bNiY<tU2XJGz5@M2SO4`PkG~kiEl3Q=#%2W^szIktE zHT%(MNP^0IeCmb!>cUS^cy<BX4<^WwOrpbsU|0X`-GV{onUmldLeXd;(L#lAE-6iI zQm?&OaccZx=8E)EqMjE?mO&0inON1<F|A|dNxF15)|FqVm$hgR_?4lM4!Bl8sj8Ku TbZYL;!KP|NtL3(vV*}&^4qrA% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cb089da010c510a834d102d5d236bccb0697566 GIT binary patch literal 2693 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 KqdU>vhWkIub07Ku literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 000000000..daabecdfa --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cli/chardetect.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +""" +Script which takes one or more file paths and reports on their detected +encodings + +Example:: + + % chardetect somefile someotherfile + somefile: windows-1252 with confidence 0.5 + someotherfile: ascii with confidence 1.0 + +If no paths are provided, it takes its input from stdin. + +""" + +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys + +from pip._vendor.chardet import __version__ +from pip._vendor.chardet.compat import PY2 +from pip._vendor.chardet.universaldetector import UniversalDetector + + +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ + u = UniversalDetector() + for line in lines: + line = bytearray(line) + u.feed(line) + # shortcut out of the loop to save reading further - particularly useful if we read a BOM. + if u.done: + break + u.close() + result = u.result + if PY2: + name = name.decode(sys.getfilesystemencoding(), 'ignore') + if result['encoding']: + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) + else: + return '{0}: no result'.format(name) + + +def main(argv=None): + """ + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + """ + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings") + parser.add_argument('input', + help='File whose encoding we would like to determine. \ + (default: stdin)', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin if PY2 else sys.stdin.buffer]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 000000000..c562e1dc9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/codingstatemachine.py @@ -0,0 +1,88 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import logging + +from .enums import MachineState + + +class CodingStateMachine(object): + """ + A state machine to verify a byte sequence for a particular encoding. For + each byte the detector receives, it will feed that byte to every active + state machine available, one byte at a time. The state machine changes its + state based on its previous state and the byte it receives. There are 3 + states in a state machine that are of interest to an auto-detector: + + START state: This is the state to start with, or a legal byte sequence + (i.e. a valid code point) for character has been identified. + + ME state: This indicates that the state machine identified a byte sequence + that is specific to the charset it is designed for and that + there is no other possible encoding which can contain this byte + sequence. This will to lead to an immediate positive answer for + the detector. + + ERROR state: This indicates the state machine identified an illegal byte + sequence for that encoding. This will lead to an immediate + negative answer for this encoding. Detector will exclude this + encoding from consideration from here on. + """ + def __init__(self, sm): + self._model = sm + self._curr_byte_pos = 0 + self._curr_char_len = 0 + self._curr_state = None + self.logger = logging.getLogger(__name__) + self.reset() + + def reset(self): + self._curr_state = MachineState.START + + def next_state(self, c): + # for each byte we get its class + # if it is first byte, we also get byte length + byte_class = self._model['class_table'][c] + if self._curr_state == MachineState.START: + self._curr_byte_pos = 0 + self._curr_char_len = self._model['char_len_table'][byte_class] + # from byte's class and state_table, we get its next state + curr_state = (self._curr_state * self._model['class_factor'] + + byte_class) + self._curr_state = self._model['state_table'][curr_state] + self._curr_byte_pos += 1 + return self._curr_state + + def get_current_charlen(self): + return self._curr_char_len + + def get_coding_state_machine(self): + return self._model['name'] + + @property + def language(self): + return self._model['language'] diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py new file mode 100644 index 000000000..fa100a32d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/compat.py @@ -0,0 +1,34 @@ +######################## BEGIN LICENSE BLOCK ######################## +# Contributor(s): +# Dan Blanchard +# Ian Cordasco +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +import sys + + +if sys.version_info < (3, 0): + PY2 = True + PY3 = False + base_str = (str, unicode) + text_type = unicode +else: + PY2 = False + PY3 = True + base_str = (bytes, str) + text_type = str diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 000000000..de0ceab09 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/cp949prober.py @@ -0,0 +1,49 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .chardistribution import EUCKRDistributionAnalysis +from .codingstatemachine import CodingStateMachine +from .mbcharsetprober import MultiByteCharSetProber +from .mbcssm import CP949_SM_MODEL + + +class CP949Prober(MultiByteCharSetProber): + def __init__(self): + super(CP949Prober, self).__init__() + self.coding_sm = CodingStateMachine(CP949_SM_MODEL) + # NOTE: CP949 is a superset of EUC-KR, so the distribution should be + # not different. + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "CP949" + + @property + def language(self): + return "Korean" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py new file mode 100644 index 000000000..c8e60013d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/enums.py @@ -0,0 +1,76 @@ +""" +All of the Enums that are used throughout the chardet package. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + + +class InputState(object): + """ + This enum represents the different states a universal detector can be in. + """ + PURE_ASCII = 0 + ESC_ASCII = 1 + HIGH_BYTE = 2 + + +class LanguageFilter(object): + """ + This enum represents the different language filters we can apply to a + ``UniversalDetector``. + """ + CHINESE_SIMPLIFIED = 0x01 + CHINESE_TRADITIONAL = 0x02 + JAPANESE = 0x04 + KOREAN = 0x08 + NON_CJK = 0x10 + ALL = 0x1F + CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL + CJK = CHINESE | JAPANESE | KOREAN + + +class ProbingState(object): + """ + This enum represents the different states a prober can be in. + """ + DETECTING = 0 + FOUND_IT = 1 + NOT_ME = 2 + + +class MachineState(object): + """ + This enum represents the different states a state machine can be in. + """ + START = 0 + ERROR = 1 + ITS_ME = 2 + + +class SequenceLikelihood(object): + """ + This enum represents the likelihood of a character following the previous one. + """ + NEGATIVE = 0 + UNLIKELY = 1 + LIKELY = 2 + POSITIVE = 3 + + @classmethod + def get_num_categories(cls): + """:returns: The number of likelihood categories in the enum.""" + return 4 + + +class CharacterCategory(object): + """ + This enum represents the different categories language models for + ``SingleByteCharsetProber`` put characters into. + + Anything less than CONTROL is considered a letter. + """ + UNDEFINED = 255 + LINE_BREAK = 254 + SYMBOL = 253 + DIGIT = 252 + CONTROL = 251 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py new file mode 100644 index 000000000..c52060d0f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escprober.py @@ -0,0 +1,101 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .codingstatemachine import CodingStateMachine +from .enums import LanguageFilter, ProbingState, MachineState +from .escsm import (HZ_SM_MODEL, ISO2022CN_SM_MODEL, ISO2022JP_SM_MODEL, + ISO2022KR_SM_MODEL) + + +class EscCharSetProber(CharSetProber): + """ + This CharSetProber uses a "code scheme" approach for detecting encodings, + whereby easily recognizable escape or shift sequences are relied on to + identify these encodings. + """ + + def __init__(self, lang_filter=None): + super(EscCharSetProber, self).__init__(lang_filter=lang_filter) + self.coding_sm = [] + if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED: + self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL)) + self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL)) + if self.lang_filter & LanguageFilter.JAPANESE: + self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL)) + if self.lang_filter & LanguageFilter.KOREAN: + self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL)) + self.active_sm_count = None + self._detected_charset = None + self._detected_language = None + self._state = None + self.reset() + + def reset(self): + super(EscCharSetProber, self).reset() + for coding_sm in self.coding_sm: + if not coding_sm: + continue + coding_sm.active = True + coding_sm.reset() + self.active_sm_count = len(self.coding_sm) + self._detected_charset = None + self._detected_language = None + + @property + def charset_name(self): + return self._detected_charset + + @property + def language(self): + return self._detected_language + + def get_confidence(self): + if self._detected_charset: + return 0.99 + else: + return 0.00 + + def feed(self, byte_str): + for c in byte_str: + for coding_sm in self.coding_sm: + if not coding_sm or not coding_sm.active: + continue + coding_state = coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + coding_sm.active = False + self.active_sm_count -= 1 + if self.active_sm_count <= 0: + self._state = ProbingState.NOT_ME + return self.state + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + self._detected_charset = coding_sm.get_coding_state_machine() + self._detected_language = coding_sm.language + return self.state + + return self.state diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py new file mode 100644 index 000000000..b83770457 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/escsm.py @@ -0,0 +1,246 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +HZ_CLS = ( +1,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,0,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,4,0,5,2,0, # 78 - 7f +1,1,1,1,1,1,1,1, # 80 - 87 +1,1,1,1,1,1,1,1, # 88 - 8f +1,1,1,1,1,1,1,1, # 90 - 97 +1,1,1,1,1,1,1,1, # 98 - 9f +1,1,1,1,1,1,1,1, # a0 - a7 +1,1,1,1,1,1,1,1, # a8 - af +1,1,1,1,1,1,1,1, # b0 - b7 +1,1,1,1,1,1,1,1, # b8 - bf +1,1,1,1,1,1,1,1, # c0 - c7 +1,1,1,1,1,1,1,1, # c8 - cf +1,1,1,1,1,1,1,1, # d0 - d7 +1,1,1,1,1,1,1,1, # d8 - df +1,1,1,1,1,1,1,1, # e0 - e7 +1,1,1,1,1,1,1,1, # e8 - ef +1,1,1,1,1,1,1,1, # f0 - f7 +1,1,1,1,1,1,1,1, # f8 - ff +) + +HZ_ST = ( +MachineState.START,MachineState.ERROR, 3,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START, 4,MachineState.ERROR,# 10-17 + 5,MachineState.ERROR, 6,MachineState.ERROR, 5, 5, 4,MachineState.ERROR,# 18-1f + 4,MachineState.ERROR, 4, 4, 4,MachineState.ERROR, 4,MachineState.ERROR,# 20-27 + 4,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 28-2f +) + +HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +HZ_SM_MODEL = {'class_table': HZ_CLS, + 'class_factor': 6, + 'state_table': HZ_ST, + 'char_len_table': HZ_CHAR_LEN_TABLE, + 'name': "HZ-GB-2312", + 'language': 'Chinese'} + +ISO2022CN_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,0,0,0,0, # 20 - 27 +0,3,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,4,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022CN_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 20-27 + 5, 6,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,# 38-3f +) + +ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022CN_SM_MODEL = {'class_table': ISO2022CN_CLS, + 'class_factor': 9, + 'state_table': ISO2022CN_ST, + 'char_len_table': ISO2022CN_CHAR_LEN_TABLE, + 'name': "ISO-2022-CN", + 'language': 'Chinese'} + +ISO2022JP_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,2,2, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,7,0,0,0, # 20 - 27 +3,0,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +6,0,4,0,8,0,0,0, # 40 - 47 +0,9,5,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022JP_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 00-07 +MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 08-0f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 10-17 +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 20-27 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 6,MachineState.ITS_ME,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,# 28-2f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,# 30-37 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 38-3f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.START,# 40-47 +) + +ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + +ISO2022JP_SM_MODEL = {'class_table': ISO2022JP_CLS, + 'class_factor': 10, + 'state_table': ISO2022JP_ST, + 'char_len_table': ISO2022JP_CHAR_LEN_TABLE, + 'name': "ISO-2022-JP", + 'language': 'Japanese'} + +ISO2022KR_CLS = ( +2,0,0,0,0,0,0,0, # 00 - 07 +0,0,0,0,0,0,0,0, # 08 - 0f +0,0,0,0,0,0,0,0, # 10 - 17 +0,0,0,1,0,0,0,0, # 18 - 1f +0,0,0,0,3,0,0,0, # 20 - 27 +0,4,0,0,0,0,0,0, # 28 - 2f +0,0,0,0,0,0,0,0, # 30 - 37 +0,0,0,0,0,0,0,0, # 38 - 3f +0,0,0,5,0,0,0,0, # 40 - 47 +0,0,0,0,0,0,0,0, # 48 - 4f +0,0,0,0,0,0,0,0, # 50 - 57 +0,0,0,0,0,0,0,0, # 58 - 5f +0,0,0,0,0,0,0,0, # 60 - 67 +0,0,0,0,0,0,0,0, # 68 - 6f +0,0,0,0,0,0,0,0, # 70 - 77 +0,0,0,0,0,0,0,0, # 78 - 7f +2,2,2,2,2,2,2,2, # 80 - 87 +2,2,2,2,2,2,2,2, # 88 - 8f +2,2,2,2,2,2,2,2, # 90 - 97 +2,2,2,2,2,2,2,2, # 98 - 9f +2,2,2,2,2,2,2,2, # a0 - a7 +2,2,2,2,2,2,2,2, # a8 - af +2,2,2,2,2,2,2,2, # b0 - b7 +2,2,2,2,2,2,2,2, # b8 - bf +2,2,2,2,2,2,2,2, # c0 - c7 +2,2,2,2,2,2,2,2, # c8 - cf +2,2,2,2,2,2,2,2, # d0 - d7 +2,2,2,2,2,2,2,2, # d8 - df +2,2,2,2,2,2,2,2, # e0 - e7 +2,2,2,2,2,2,2,2, # e8 - ef +2,2,2,2,2,2,2,2, # f0 - f7 +2,2,2,2,2,2,2,2, # f8 - ff +) + +ISO2022KR_ST = ( +MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,# 00-07 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,# 08-0f +MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 4,MachineState.ERROR,MachineState.ERROR,# 10-17 +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,# 18-1f +MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.START,MachineState.START,MachineState.START,MachineState.START,# 20-27 +) + +ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0) + +ISO2022KR_SM_MODEL = {'class_table': ISO2022KR_CLS, + 'class_factor': 6, + 'state_table': ISO2022KR_ST, + 'char_len_table': ISO2022KR_CHAR_LEN_TABLE, + 'name': "ISO-2022-KR", + 'language': 'Korean'} + + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 000000000..a81ee1e21 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/eucjpprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import ProbingState, MachineState +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCJPDistributionAnalysis +from .jpcntx import EUCJPContextAnalysis +from .mbcssm import EUCJP_SM_MODEL + + +class EUCJPProber(MultiByteCharSetProber): + def __init__(self): + super(EUCJPProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL) + self.distribution_analyzer = EUCJPDistributionAnalysis() + self.context_analyzer = EUCJPContextAnalysis() + self.reset() + + def reset(self): + super(EUCJPProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return "EUC-JP" + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + # PY3K: byte_str is a byte array, so byte_str[i] is an int, not a byte + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char, char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 000000000..ae25c1bfe --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrfreq.py @@ -0,0 +1,195 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology + +# 128 --> 0.79 +# 256 --> 0.92 +# 512 --> 0.986 +# 1024 --> 0.99944 +# 2048 --> 0.99999 +# +# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 +# Random Distribution Ration = 512 / (2350-512) = 0.279. +# +# Typical Distribution Ratio + +EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 + +EUCKR_TABLE_SIZE = 2352 + +# Char to FreqOrder table , +EUCKR_CHAR_TO_FREQ_ORDER = ( + 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, +1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, +1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, + 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, + 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, + 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, +1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, + 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, + 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, +1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, +1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, +1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, +1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, +1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, + 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, +1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, +1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, +1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, +1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, + 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, +1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, + 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, + 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, +1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, + 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, +1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, + 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, + 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, +1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, +1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, +1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, +1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, + 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, +1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, + 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, + 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, +1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, +1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, +1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, +1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, +1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, +1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, + 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, + 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, + 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, +1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, + 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, +1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, + 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, + 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, +2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, + 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, + 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, +2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, +2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, +2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, + 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, + 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, +2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, + 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, +1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, +2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, +1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, +2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, +2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, +1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, + 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, +2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, +2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, + 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, + 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, +2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, +1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, +2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, +2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, +2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, +2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, +2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, +2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, +1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, +2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, +2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, +2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, +2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, +2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, +1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, +1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, +2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, +1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, +2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, +1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, + 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, +2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, + 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, +2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, + 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, +2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, +2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, + 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, +2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, +1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, + 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, +1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, +2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, +1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, +2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, + 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, +2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, +1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, +2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, +1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, +2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, +1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, + 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, +2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, +2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, + 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, + 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, +1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, +1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, + 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, +2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, +2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, + 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, + 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, + 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, +2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, + 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, + 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, +2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, +2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, + 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, +2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, +1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, + 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, +2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, +2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, +2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, + 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, + 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, + 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, +2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, +2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, +2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, +1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, +2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, + 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 +) + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 000000000..99d5b154b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euckrprober.py @@ -0,0 +1,47 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCKRDistributionAnalysis +from .mbcssm import EUCKR_SM_MODEL + + +class EUCKRProber(MultiByteCharSetProber): + def __init__(self): + super(EUCKRProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL) + self.distribution_analyzer = EUCKRDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-KR" + + @property + def language(self): + return "Korean" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 000000000..5195275e3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwfreq.py @@ -0,0 +1,387 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# EUCTW frequency table +# Converted from big5 work +# by Taiwan's Mandarin Promotion Council +# <http:#www.edu.tw:81/mandr/> + +# 128 --> 0.42261 +# 256 --> 0.57851 +# 512 --> 0.74851 +# 1024 --> 0.89384 +# 2048 --> 0.97583 +# +# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 +# Random Distribution Ration = 512/(5401-512)=0.105 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR + +EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 + +# Char to FreqOrder table , +EUCTW_TABLE_SIZE = 5376 + +EUCTW_CHAR_TO_FREQ_ORDER = ( + 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 +3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 +1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 + 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 +3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 +4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 +7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 + 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 + 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 + 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 +2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 +1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 +3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 + 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 +1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 +3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 +2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 + 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 +3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 +1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 +7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 + 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 +7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 +1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 + 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 + 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 +3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 +3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 + 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 +2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 +2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 + 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 + 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 +3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 +1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 +1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 +1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 +2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 + 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 +4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 +1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 +7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 +2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 + 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 + 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 + 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 + 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 +7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 + 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 +1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 + 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 + 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 +7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 +1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 + 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 +3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 +4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 +3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 + 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 + 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 +1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 +4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 +3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 +3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 +2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 +7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 +3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 +7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 +1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 +2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 +1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 + 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 +1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 +4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 +3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 + 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 + 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 + 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 +2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 +7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 +1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 +2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 +1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 +1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 +7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 +7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 +7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 +3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 +4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 +1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 +7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 +2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 +7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 +3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 +3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 +7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 +2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 +7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 + 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 +4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 +2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 +7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 +3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 +2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 +2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 + 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 +2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 +1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 +1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 +2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 +1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 +7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 +7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 +2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 +4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 +1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 +7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 + 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 +4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 + 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 +2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 + 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 +1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 +1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 + 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 +3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 +3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 +1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 +3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 +7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 +7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 +1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 +2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 +1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 +3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 +2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 +3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 +2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 +4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 +4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 +3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 + 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 +3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 + 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 +3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 +3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 +3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 +1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 +7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 + 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 +7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 +1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 + 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 +4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 +3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 + 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 +2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 +2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 +3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 +1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 +4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 +2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 +1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 +1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 +2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 +3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 +1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 +7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 +1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 +4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 +1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 + 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 +1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 +3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 +3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 +2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 +1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 +4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 + 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 +7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 +2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 +3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 +4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 + 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 +7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 +7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 +1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 +4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 +3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 +2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 +3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 +3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 +2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 +1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 +4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 +3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 +3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 +2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 +4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 +7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 +3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 +2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 +3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 +1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 +2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 +3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 +4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 +2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 +2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 +7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 +1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 +2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 +1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 +3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 +4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 +2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 +3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 +3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 +2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 +4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 +2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 +3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 +4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 +7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 +3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 + 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 +1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 +4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 +1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 +4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 +7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 + 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 +7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 +2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 +1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 +1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 +3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 + 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 + 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 + 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 +3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 +2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 + 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 +7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 +1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 +3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 +7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 +1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 +7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 +4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 +1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 +2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 +2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 +4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 + 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 + 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 +3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 +3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 +1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 +2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 +7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 +1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 +1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 +3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 + 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 +1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 +4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 +7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 +2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 +3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 + 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 +1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 +2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 +2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 +7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 +7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 +7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 +2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 +2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 +1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 +4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 +3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 +3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 +4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 +4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 +2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 +2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 +7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 +4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 +7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 +2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 +1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 +3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 +4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 +2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 + 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 +2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 +1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 +2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 +2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 +4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 +7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 +1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 +3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 +7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 +1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 +8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 +2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 +8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 +2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 +2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 +8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 +8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 +8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 + 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 +8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 +4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 +3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 +8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 +1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 +8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 + 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 +1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 + 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 +4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 +1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 +4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 +1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 + 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 +3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 +4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 +8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 + 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 +3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 + 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 +2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 +) + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 000000000..7dbc136e8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/euctwprober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import EUCTWDistributionAnalysis +from .mbcssm import EUCTW_SM_MODEL + +class EUCTWProber(MultiByteCharSetProber): + def __init__(self): + super(EUCTWProber, self).__init__() + self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL) + self.distribution_analyzer = EUCTWDistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "EUC-TW" + + @property + def language(self): + return "Taiwan" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 000000000..a0167b381 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312freq.py @@ -0,0 +1,283 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# GB2312 most frequently used character table +# +# Char to FreqOrder table , from hz6763 + +# 512 --> 0.79 -- 0.79 +# 1024 --> 0.92 -- 0.13 +# 2048 --> 0.98 -- 0.06 +# 6768 --> 1.00 -- 0.02 +# +# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 +# Random Distribution Ration = 512 / (3755 - 512) = 0.157 +# +# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR + +GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 + +GB2312_TABLE_SIZE = 3760 + +GB2312_CHAR_TO_FREQ_ORDER = ( +1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, +2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, +2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, + 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, +1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, +1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, + 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, +1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, +2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, +3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, + 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, +1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, + 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, +2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, + 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, +2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, +1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, +3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, + 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, +1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, + 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, +2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, +1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, +3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, +1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, +2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, +1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, + 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, +3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, +3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, + 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, +3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, + 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, +1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, +3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, +2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, +1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, + 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, +1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, +4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, + 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, +3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, +3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, + 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, +1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, +2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, +1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, +1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, + 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, +3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, +3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, +4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, + 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, +3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, +1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, +1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, +4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, + 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, + 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, +3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, +1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, + 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, +1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, +2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, + 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, + 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, + 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, +3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, +4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, +3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, + 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, +2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, +2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, +2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, + 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, +2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, + 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, + 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, + 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, +3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, +2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, +2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, +1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, + 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, +2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, + 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, + 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, +1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, +1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, + 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, + 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, +1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, +2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, +3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, +2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, +2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, +2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, +3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, +1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, +1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, +2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, +1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, +3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, +1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, +1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, +3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, + 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, +2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, +1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, +4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, +1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, +1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, +3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, +1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, + 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, + 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, +1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, + 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, +1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, +1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, + 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, +3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, +4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, +3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, +2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, +2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, +1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, +3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, +2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, +1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, +1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, + 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, +2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, +2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, +3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, +4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, +3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, + 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, +3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, +2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, +1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, + 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, + 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, +3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, +4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, +2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, +1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, +1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, + 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, +1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, +3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, + 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, + 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, +1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, + 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, +1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, + 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, +2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, + 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, +2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, +2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, +1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, +1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, +2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, + 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, +1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, +1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, +2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, +2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, +3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, +1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, +4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, + 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, + 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, +3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, +1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, + 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, +3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, +1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, +4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, +1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, +2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, +1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, + 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, +1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, +3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, + 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, +2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, + 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, +1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, +1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, +1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, +3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, +2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, +3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, +3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, +3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, + 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, +2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, + 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, +2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, + 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, +1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, + 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, + 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, +1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, +3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, +3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, +1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, +1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, +3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, +2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, +2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, +1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, +3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, + 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, +4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, +1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, +2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, +3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, +3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, +1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, + 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, + 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, +2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, + 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, +1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, + 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, +1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, +1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, +1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, +1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, +1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, + 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, + 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512 +) + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 000000000..7cae6b51a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/gb2312prober.py @@ -0,0 +1,46 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import GB2312DistributionAnalysis +from .mbcssm import GB2312_SM_MODEL + +class GB2312Prober(MultiByteCharSetProber): + def __init__(self): + super(GB2312Prober, self).__init__() + self.coding_sm = CodingStateMachine(GB2312_SM_MODEL) + self.distribution_analyzer = GB2312DistributionAnalysis() + self.reset() + + @property + def charset_name(self): + return "GB2312" + + @property + def language(self): + return "Chinese" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 000000000..10b812248 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/hebrewprober.py @@ -0,0 +1,292 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Shy Shalom +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +# This prober doesn't actually recognize a language or a charset. +# It is a helper prober for the use of the Hebrew model probers + +### General ideas of the Hebrew charset recognition ### +# +# Four main charsets exist in Hebrew: +# "ISO-8859-8" - Visual Hebrew +# "windows-1255" - Logical Hebrew +# "ISO-8859-8-I" - Logical Hebrew +# "x-mac-hebrew" - ?? Logical Hebrew ?? +# +# Both "ISO" charsets use a completely identical set of code points, whereas +# "windows-1255" and "x-mac-hebrew" are two different proper supersets of +# these code points. windows-1255 defines additional characters in the range +# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific +# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. +# x-mac-hebrew defines similar additional code points but with a different +# mapping. +# +# As far as an average Hebrew text with no diacritics is concerned, all four +# charsets are identical with respect to code points. Meaning that for the +# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters +# (including final letters). +# +# The dominant difference between these charsets is their directionality. +# "Visual" directionality means that the text is ordered as if the renderer is +# not aware of a BIDI rendering algorithm. The renderer sees the text and +# draws it from left to right. The text itself when ordered naturally is read +# backwards. A buffer of Visual Hebrew generally looks like so: +# "[last word of first line spelled backwards] [whole line ordered backwards +# and spelled backwards] [first word of first line spelled backwards] +# [end of line] [last word of second line] ... etc' " +# adding punctuation marks, numbers and English text to visual text is +# naturally also "visual" and from left to right. +# +# "Logical" directionality means the text is ordered "naturally" according to +# the order it is read. It is the responsibility of the renderer to display +# the text from right to left. A BIDI algorithm is used to place general +# punctuation marks, numbers and English text in the text. +# +# Texts in x-mac-hebrew are almost impossible to find on the Internet. From +# what little evidence I could find, it seems that its general directionality +# is Logical. +# +# To sum up all of the above, the Hebrew probing mechanism knows about two +# charsets: +# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are +# backwards while line order is natural. For charset recognition purposes +# the line order is unimportant (In fact, for this implementation, even +# word order is unimportant). +# Logical Hebrew - "windows-1255" - normal, naturally ordered text. +# +# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be +# specifically identified. +# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew +# that contain special punctuation marks or diacritics is displayed with +# some unconverted characters showing as question marks. This problem might +# be corrected using another model prober for x-mac-hebrew. Due to the fact +# that x-mac-hebrew texts are so rare, writing another model prober isn't +# worth the effort and performance hit. +# +#### The Prober #### +# +# The prober is divided between two SBCharSetProbers and a HebrewProber, +# all of which are managed, created, fed data, inquired and deleted by the +# SBCSGroupProber. The two SBCharSetProbers identify that the text is in +# fact some kind of Hebrew, Logical or Visual. The final decision about which +# one is it is made by the HebrewProber by combining final-letter scores +# with the scores of the two SBCharSetProbers to produce a final answer. +# +# The SBCSGroupProber is responsible for stripping the original text of HTML +# tags, English characters, numbers, low-ASCII punctuation characters, spaces +# and new lines. It reduces any sequence of such characters to a single space. +# The buffer fed to each prober in the SBCS group prober is pure text in +# high-ASCII. +# The two SBCharSetProbers (model probers) share the same language model: +# Win1255Model. +# The first SBCharSetProber uses the model normally as any other +# SBCharSetProber does, to recognize windows-1255, upon which this model was +# built. The second SBCharSetProber is told to make the pair-of-letter +# lookup in the language model backwards. This in practice exactly simulates +# a visual Hebrew model using the windows-1255 logical Hebrew model. +# +# The HebrewProber is not using any language model. All it does is look for +# final-letter evidence suggesting the text is either logical Hebrew or visual +# Hebrew. Disjointed from the model probers, the results of the HebrewProber +# alone are meaningless. HebrewProber always returns 0.00 as confidence +# since it never identifies a charset by itself. Instead, the pointer to the +# HebrewProber is passed to the model probers as a helper "Name Prober". +# When the Group prober receives a positive identification from any prober, +# it asks for the name of the charset identified. If the prober queried is a +# Hebrew model prober, the model prober forwards the call to the +# HebrewProber to make the final decision. In the HebrewProber, the +# decision is made according to the final-letters scores maintained and Both +# model probers scores. The answer is returned in the form of the name of the +# charset identified, either "windows-1255" or "ISO-8859-8". + +class HebrewProber(CharSetProber): + # windows-1255 / ISO-8859-8 code points of interest + FINAL_KAF = 0xea + NORMAL_KAF = 0xeb + FINAL_MEM = 0xed + NORMAL_MEM = 0xee + FINAL_NUN = 0xef + NORMAL_NUN = 0xf0 + FINAL_PE = 0xf3 + NORMAL_PE = 0xf4 + FINAL_TSADI = 0xf5 + NORMAL_TSADI = 0xf6 + + # Minimum Visual vs Logical final letter score difference. + # If the difference is below this, don't rely solely on the final letter score + # distance. + MIN_FINAL_CHAR_DISTANCE = 5 + + # Minimum Visual vs Logical model score difference. + # If the difference is below this, don't rely at all on the model score + # distance. + MIN_MODEL_DISTANCE = 0.01 + + VISUAL_HEBREW_NAME = "ISO-8859-8" + LOGICAL_HEBREW_NAME = "windows-1255" + + def __init__(self): + super(HebrewProber, self).__init__() + self._final_char_logical_score = None + self._final_char_visual_score = None + self._prev = None + self._before_prev = None + self._logical_prober = None + self._visual_prober = None + self.reset() + + def reset(self): + self._final_char_logical_score = 0 + self._final_char_visual_score = 0 + # The two last characters seen in the previous buffer, + # mPrev and mBeforePrev are initialized to space in order to simulate + # a word delimiter at the beginning of the data + self._prev = ' ' + self._before_prev = ' ' + # These probers are owned by the group prober. + + def set_model_probers(self, logicalProber, visualProber): + self._logical_prober = logicalProber + self._visual_prober = visualProber + + def is_final(self, c): + return c in [self.FINAL_KAF, self.FINAL_MEM, self.FINAL_NUN, + self.FINAL_PE, self.FINAL_TSADI] + + def is_non_final(self, c): + # The normal Tsadi is not a good Non-Final letter due to words like + # 'lechotet' (to chat) containing an apostrophe after the tsadi. This + # apostrophe is converted to a space in FilterWithoutEnglishLetters + # causing the Non-Final tsadi to appear at an end of a word even + # though this is not the case in the original text. + # The letters Pe and Kaf rarely display a related behavior of not being + # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' + # for example legally end with a Non-Final Pe or Kaf. However, the + # benefit of these letters as Non-Final letters outweighs the damage + # since these words are quite rare. + return c in [self.NORMAL_KAF, self.NORMAL_MEM, + self.NORMAL_NUN, self.NORMAL_PE] + + def feed(self, byte_str): + # Final letter analysis for logical-visual decision. + # Look for evidence that the received buffer is either logical Hebrew + # or visual Hebrew. + # The following cases are checked: + # 1) A word longer than 1 letter, ending with a final letter. This is + # an indication that the text is laid out "naturally" since the + # final letter really appears at the end. +1 for logical score. + # 2) A word longer than 1 letter, ending with a Non-Final letter. In + # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, + # should not end with the Non-Final form of that letter. Exceptions + # to this rule are mentioned above in isNonFinal(). This is an + # indication that the text is laid out backwards. +1 for visual + # score + # 3) A word longer than 1 letter, starting with a final letter. Final + # letters should not appear at the beginning of a word. This is an + # indication that the text is laid out backwards. +1 for visual + # score. + # + # The visual score and logical score are accumulated throughout the + # text and are finally checked against each other in GetCharSetName(). + # No checking for final letters in the middle of words is done since + # that case is not an indication for either Logical or Visual text. + # + # We automatically filter out all 7-bit characters (replace them with + # spaces) so the word boundary detection works properly. [MAP] + + if self.state == ProbingState.NOT_ME: + # Both model probers say it's not them. No reason to continue. + return ProbingState.NOT_ME + + byte_str = self.filter_high_byte_only(byte_str) + + for cur in byte_str: + if cur == ' ': + # We stand on a space - a word just ended + if self._before_prev != ' ': + # next-to-last char was not a space so self._prev is not a + # 1 letter word + if self.is_final(self._prev): + # case (1) [-2:not space][-1:final letter][cur:space] + self._final_char_logical_score += 1 + elif self.is_non_final(self._prev): + # case (2) [-2:not space][-1:Non-Final letter][ + # cur:space] + self._final_char_visual_score += 1 + else: + # Not standing on a space + if ((self._before_prev == ' ') and + (self.is_final(self._prev)) and (cur != ' ')): + # case (3) [-2:space][-1:final letter][cur:not space] + self._final_char_visual_score += 1 + self._before_prev = self._prev + self._prev = cur + + # Forever detecting, till the end or until both model probers return + # ProbingState.NOT_ME (handled above) + return ProbingState.DETECTING + + @property + def charset_name(self): + # Make the decision: is it Logical or Visual? + # If the final letter score distance is dominant enough, rely on it. + finalsub = self._final_char_logical_score - self._final_char_visual_score + if finalsub >= self.MIN_FINAL_CHAR_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # It's not dominant enough, try to rely on the model scores instead. + modelsub = (self._logical_prober.get_confidence() + - self._visual_prober.get_confidence()) + if modelsub > self.MIN_MODEL_DISTANCE: + return self.LOGICAL_HEBREW_NAME + if modelsub < -self.MIN_MODEL_DISTANCE: + return self.VISUAL_HEBREW_NAME + + # Still no good, back to final letter distance, maybe it'll save the + # day. + if finalsub < 0.0: + return self.VISUAL_HEBREW_NAME + + # (finalsub > 0 - Logical) or (don't know what to do) default to + # Logical. + return self.LOGICAL_HEBREW_NAME + + @property + def language(self): + return 'Hebrew' + + @property + def state(self): + # Remain active as long as any of the model probers are active. + if (self._logical_prober.state == ProbingState.NOT_ME) and \ + (self._visual_prober.state == ProbingState.NOT_ME): + return ProbingState.NOT_ME + return ProbingState.DETECTING diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 000000000..510b94000 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jisfreq.py @@ -0,0 +1,325 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# Sampling from about 20M text materials include literature and computer technology +# +# Japanese frequency table, applied to both S-JIS and EUC-JP +# They are sorted in order. + +# 128 --> 0.77094 +# 256 --> 0.85710 +# 512 --> 0.92635 +# 1024 --> 0.97130 +# 2048 --> 0.99431 +# +# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 +# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 +# +# Typical Distribution Ratio, 25% of IDR + +JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 + +# Char to FreqOrder table , +JIS_TABLE_SIZE = 4368 + +JIS_CHAR_TO_FREQ_ORDER = ( + 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 +3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 +1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 +2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 +2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 +5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 +1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 +5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 +5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 +5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 +5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 +5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 +5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 +1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 +1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 +1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 +2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 +3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 +3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 + 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 + 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 +1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 + 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 +5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 + 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 + 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 + 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 + 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 + 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 +5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 +5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 +5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 +4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 +5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 +5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 +5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 +5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 +5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 +5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 +5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 +5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 +5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 +3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 +5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 +5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 +5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 +5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 +5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 +5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 +5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 +5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 +5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 +5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 +5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 +5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 +5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 +5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 +5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 +5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 +5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 +5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 +5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 +5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 +5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 +5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 +5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 +5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 +5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 +5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 +5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 +5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 +5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 +5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 +5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 +5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 +5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 +5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 +5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 +5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 +5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 +5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 +6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 +6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 +6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 +6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 +6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 +6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 +6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 +6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 +4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 + 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 + 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 +1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 +1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 + 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 +3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 +3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 + 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 +3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 +3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 + 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 +2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 + 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 +3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 +1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 + 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 +1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 + 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 +2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 +2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 +2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 +2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 +1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 +1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 +1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 +1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 +2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 +1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 +2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 +1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 +1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 +1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 +1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 +1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 +1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 + 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 + 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 +1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 +2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 +2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 +2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 +3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 +3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 + 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 +3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 +1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 + 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 +2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 +1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 + 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 +3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 +4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 +2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 +1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 +2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 +1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 + 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 + 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 +1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 +2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 +2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 +2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 +3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 +1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 +2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 + 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 + 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 + 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 +1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 +2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 + 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 +1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 +1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 + 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 +1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 +1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 +1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 + 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 +2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 + 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 +2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 +3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 +2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 +1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 +6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 +1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 +2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 +1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 + 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 + 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 +3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 +3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 +1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 +1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 +1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 +1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 + 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 + 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 +2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 + 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 +3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 +2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 + 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 +1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 +2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 + 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 +1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 + 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 +4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 +2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 +1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 + 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 +1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 +2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 + 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 +6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 +1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 +1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 +2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 +3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 + 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 +3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 +1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 + 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 +1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 + 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 +3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 + 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 +2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 + 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 +4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 +2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 +1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 +1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 +1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 + 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 +1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 +3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 +1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 +3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 + 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 + 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 + 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 +2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 +1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 + 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 +1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 + 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 +1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 + 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 + 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 + 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 +1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 +1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 +2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 +4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 + 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 +1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 + 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 +1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 +3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 +1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 +2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 +2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 +1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 +1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 +2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 + 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 +2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 +1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 +1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 +1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 +1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 +3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 +2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 +2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 + 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 +3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 +3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 +1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 +2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 +1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 +2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 +) + + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 000000000..624d53490 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/jpcntx.py @@ -0,0 +1,233 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + + +# This is hiragana 2-char sequence table, the number in each cell represents its frequency category +jp2CharContext = ( +(0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1), +(2,4,0,4,0,3,0,4,0,3,4,4,4,2,4,3,3,4,3,2,3,3,4,2,3,3,3,2,4,1,4,3,3,1,5,4,3,4,3,4,3,5,3,0,3,5,4,2,0,3,1,0,3,3,0,3,3,0,1,1,0,4,3,0,3,3,0,4,0,2,0,3,5,5,5,5,4,0,4,1,0,3,4), +(0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2), +(0,4,0,5,0,5,0,4,0,4,5,4,4,3,5,3,5,1,5,3,4,3,4,4,3,4,3,3,4,3,5,4,4,3,5,5,3,5,5,5,3,5,5,3,4,5,5,3,1,3,2,0,3,4,0,4,2,0,4,2,1,5,3,2,3,5,0,4,0,2,0,5,4,4,5,4,5,0,4,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,4,0,3,0,3,0,4,5,4,3,3,3,3,4,3,5,4,4,3,5,4,4,3,4,3,4,4,4,4,5,3,4,4,3,4,5,5,4,5,5,1,4,5,4,3,0,3,3,1,3,3,0,4,4,0,3,3,1,5,3,3,3,5,0,4,0,3,0,4,4,3,4,3,3,0,4,1,1,3,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,4,0,3,0,3,0,4,0,3,4,4,3,2,2,1,2,1,3,1,3,3,3,3,3,4,3,1,3,3,5,3,3,0,4,3,0,5,4,3,3,5,4,4,3,4,4,5,0,1,2,0,1,2,0,2,2,0,1,0,0,5,2,2,1,4,0,3,0,1,0,4,4,3,5,4,3,0,2,1,0,4,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,5,0,4,0,2,1,4,4,2,4,1,4,2,4,2,4,3,3,3,4,3,3,3,3,1,4,2,3,3,3,1,4,4,1,1,1,4,3,3,2,0,2,4,3,2,0,3,3,0,3,1,1,0,0,0,3,3,0,4,2,2,3,4,0,4,0,3,0,4,4,5,3,4,4,0,3,0,0,1,4), +(1,4,0,4,0,4,0,4,0,3,5,4,4,3,4,3,5,4,3,3,4,3,5,4,4,4,4,3,4,2,4,3,3,1,5,4,3,2,4,5,4,5,5,4,4,5,4,4,0,3,2,2,3,3,0,4,3,1,3,2,1,4,3,3,4,5,0,3,0,2,0,4,5,5,4,5,4,0,4,0,0,5,4), +(0,5,0,5,0,4,0,3,0,4,4,3,4,3,3,3,4,0,4,4,4,3,4,3,4,3,3,1,4,2,4,3,4,0,5,4,1,4,5,4,4,5,3,2,4,3,4,3,2,4,1,3,3,3,2,3,2,0,4,3,3,4,3,3,3,4,0,4,0,3,0,4,5,4,4,4,3,0,4,1,0,1,3), +(0,3,1,4,0,3,0,2,0,3,4,4,3,1,4,2,3,3,4,3,4,3,4,3,4,4,3,2,3,1,5,4,4,1,4,4,3,5,4,4,3,5,5,4,3,4,4,3,1,2,3,1,2,2,0,3,2,0,3,1,0,5,3,3,3,4,3,3,3,3,4,4,4,4,5,4,2,0,3,3,2,4,3), +(0,2,0,3,0,1,0,1,0,0,3,2,0,0,2,0,1,0,2,1,3,3,3,1,2,3,1,0,1,0,4,2,1,1,3,3,0,4,3,3,1,4,3,3,0,3,3,2,0,0,0,0,1,0,0,2,0,0,0,0,0,4,1,0,2,3,2,2,2,1,3,3,3,4,4,3,2,0,3,1,0,3,3), +(0,4,0,4,0,3,0,3,0,4,4,4,3,3,3,3,3,3,4,3,4,2,4,3,4,3,3,2,4,3,4,5,4,1,4,5,3,5,4,5,3,5,4,0,3,5,5,3,1,3,3,2,2,3,0,3,4,1,3,3,2,4,3,3,3,4,0,4,0,3,0,4,5,4,4,5,3,0,4,1,0,3,4), +(0,2,0,3,0,3,0,0,0,2,2,2,1,0,1,0,0,0,3,0,3,0,3,0,1,3,1,0,3,1,3,3,3,1,3,3,3,0,1,3,1,3,4,0,0,3,1,1,0,3,2,0,0,0,0,1,3,0,1,0,0,3,3,2,0,3,0,0,0,0,0,3,4,3,4,3,3,0,3,0,0,2,3), +(2,3,0,3,0,2,0,1,0,3,3,4,3,1,3,1,1,1,3,1,4,3,4,3,3,3,0,0,3,1,5,4,3,1,4,3,2,5,5,4,4,4,4,3,3,4,4,4,0,2,1,1,3,2,0,1,2,0,0,1,0,4,1,3,3,3,0,3,0,1,0,4,4,4,5,5,3,0,2,0,0,4,4), +(0,2,0,1,0,3,1,3,0,2,3,3,3,0,3,1,0,0,3,0,3,2,3,1,3,2,1,1,0,0,4,2,1,0,2,3,1,4,3,2,0,4,4,3,1,3,1,3,0,1,0,0,1,0,0,0,1,0,0,0,0,4,1,1,1,2,0,3,0,0,0,3,4,2,4,3,2,0,1,0,0,3,3), +(0,1,0,4,0,5,0,4,0,2,4,4,2,3,3,2,3,3,5,3,3,3,4,3,4,2,3,0,4,3,3,3,4,1,4,3,2,1,5,5,3,4,5,1,3,5,4,2,0,3,3,0,1,3,0,4,2,0,1,3,1,4,3,3,3,3,0,3,0,1,0,3,4,4,4,5,5,0,3,0,1,4,5), +(0,2,0,3,0,3,0,0,0,2,3,1,3,0,4,0,1,1,3,0,3,4,3,2,3,1,0,3,3,2,3,1,3,0,2,3,0,2,1,4,1,2,2,0,0,3,3,0,0,2,0,0,0,1,0,0,0,0,2,2,0,3,2,1,3,3,0,2,0,2,0,0,3,3,1,2,4,0,3,0,2,2,3), +(2,4,0,5,0,4,0,4,0,2,4,4,4,3,4,3,3,3,1,2,4,3,4,3,4,4,5,0,3,3,3,3,2,0,4,3,1,4,3,4,1,4,4,3,3,4,4,3,1,2,3,0,4,2,0,4,1,0,3,3,0,4,3,3,3,4,0,4,0,2,0,3,5,3,4,5,2,0,3,0,0,4,5), +(0,3,0,4,0,1,0,1,0,1,3,2,2,1,3,0,3,0,2,0,2,0,3,0,2,0,0,0,1,0,1,1,0,0,3,1,0,0,0,4,0,3,1,0,2,1,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4,2,2,3,1,0,3,0,0,0,1,4,4,4,3,0,0,4,0,0,1,4), +(1,4,1,5,0,3,0,3,0,4,5,4,4,3,5,3,3,4,4,3,4,1,3,3,3,3,2,1,4,1,5,4,3,1,4,4,3,5,4,4,3,5,4,3,3,4,4,4,0,3,3,1,2,3,0,3,1,0,3,3,0,5,4,4,4,4,4,4,3,3,5,4,4,3,3,5,4,0,3,2,0,4,4), +(0,2,0,3,0,1,0,0,0,1,3,3,3,2,4,1,3,0,3,1,3,0,2,2,1,1,0,0,2,0,4,3,1,0,4,3,0,4,4,4,1,4,3,1,1,3,3,1,0,2,0,0,1,3,0,0,0,0,2,0,0,4,3,2,4,3,5,4,3,3,3,4,3,3,4,3,3,0,2,1,0,3,3), +(0,2,0,4,0,3,0,2,0,2,5,5,3,4,4,4,4,1,4,3,3,0,4,3,4,3,1,3,3,2,4,3,0,3,4,3,0,3,4,4,2,4,4,0,4,5,3,3,2,2,1,1,1,2,0,1,5,0,3,3,2,4,3,3,3,4,0,3,0,2,0,4,4,3,5,5,0,0,3,0,2,3,3), +(0,3,0,4,0,3,0,1,0,3,4,3,3,1,3,3,3,0,3,1,3,0,4,3,3,1,1,0,3,0,3,3,0,0,4,4,0,1,5,4,3,3,5,0,3,3,4,3,0,2,0,1,1,1,0,1,3,0,1,2,1,3,3,2,3,3,0,3,0,1,0,1,3,3,4,4,1,0,1,2,2,1,3), +(0,1,0,4,0,4,0,3,0,1,3,3,3,2,3,1,1,0,3,0,3,3,4,3,2,4,2,0,1,0,4,3,2,0,4,3,0,5,3,3,2,4,4,4,3,3,3,4,0,1,3,0,0,1,0,0,1,0,0,0,0,4,2,3,3,3,0,3,0,0,0,4,4,4,5,3,2,0,3,3,0,3,5), +(0,2,0,3,0,0,0,3,0,1,3,0,2,0,0,0,1,0,3,1,1,3,3,0,0,3,0,0,3,0,2,3,1,0,3,1,0,3,3,2,0,4,2,2,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,2,1,2,0,1,0,1,0,0,0,1,3,1,2,0,0,0,1,0,0,1,4), +(0,3,0,3,0,5,0,1,0,2,4,3,1,3,3,2,1,1,5,2,1,0,5,1,2,0,0,0,3,3,2,2,3,2,4,3,0,0,3,3,1,3,3,0,2,5,3,4,0,3,3,0,1,2,0,2,2,0,3,2,0,2,2,3,3,3,0,2,0,1,0,3,4,4,2,5,4,0,3,0,0,3,5), +(0,3,0,3,0,3,0,1,0,3,3,3,3,0,3,0,2,0,2,1,1,0,2,0,1,0,0,0,2,1,0,0,1,0,3,2,0,0,3,3,1,2,3,1,0,3,3,0,0,1,0,0,0,0,0,2,0,0,0,0,0,2,3,1,2,3,0,3,0,1,0,3,2,1,0,4,3,0,1,1,0,3,3), +(0,4,0,5,0,3,0,3,0,4,5,5,4,3,5,3,4,3,5,3,3,2,5,3,4,4,4,3,4,3,4,5,5,3,4,4,3,4,4,5,4,4,4,3,4,5,5,4,2,3,4,2,3,4,0,3,3,1,4,3,2,4,3,3,5,5,0,3,0,3,0,5,5,5,5,4,4,0,4,0,1,4,4), +(0,4,0,4,0,3,0,3,0,3,5,4,4,2,3,2,5,1,3,2,5,1,4,2,3,2,3,3,4,3,3,3,3,2,5,4,1,3,3,5,3,4,4,0,4,4,3,1,1,3,1,0,2,3,0,2,3,0,3,0,0,4,3,1,3,4,0,3,0,2,0,4,4,4,3,4,5,0,4,0,0,3,4), +(0,3,0,3,0,3,1,2,0,3,4,4,3,3,3,0,2,2,4,3,3,1,3,3,3,1,1,0,3,1,4,3,2,3,4,4,2,4,4,4,3,4,4,3,2,4,4,3,1,3,3,1,3,3,0,4,1,0,2,2,1,4,3,2,3,3,5,4,3,3,5,4,4,3,3,0,4,0,3,2,2,4,4), +(0,2,0,1,0,0,0,0,0,1,2,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,0,0,0,3,0,0,1,0,1,1,3,1,0,0,0,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,1,2,2,0,3,4,0,0,0,1,1,0,0,1,0,0,0,0,0,1,1), +(0,1,0,0,0,1,0,0,0,0,4,0,4,1,4,0,3,0,4,0,3,0,4,0,3,0,3,0,4,1,5,1,4,0,0,3,0,5,0,5,2,0,1,0,0,0,2,1,4,0,1,3,0,0,3,0,0,3,1,1,4,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0), +(1,4,0,5,0,3,0,2,0,3,5,4,4,3,4,3,5,3,4,3,3,0,4,3,3,3,3,3,3,2,4,4,3,1,3,4,4,5,4,4,3,4,4,1,3,5,4,3,3,3,1,2,2,3,3,1,3,1,3,3,3,5,3,3,4,5,0,3,0,3,0,3,4,3,4,4,3,0,3,0,2,4,3), +(0,1,0,4,0,0,0,0,0,1,4,0,4,1,4,2,4,0,3,0,1,0,1,0,0,0,0,0,2,0,3,1,1,1,0,3,0,0,0,1,2,1,0,0,1,1,1,1,0,1,0,0,0,1,0,0,3,0,0,0,0,3,2,0,2,2,0,1,0,0,0,2,3,2,3,3,0,0,0,0,2,1,0), +(0,5,1,5,0,3,0,3,0,5,4,4,5,1,5,3,3,0,4,3,4,3,5,3,4,3,3,2,4,3,4,3,3,0,3,3,1,4,4,3,4,4,4,3,4,5,5,3,2,3,1,1,3,3,1,3,1,1,3,3,2,4,5,3,3,5,0,4,0,3,0,4,4,3,5,3,3,0,3,4,0,4,3), +(0,5,0,5,0,3,0,2,0,4,4,3,5,2,4,3,3,3,4,4,4,3,5,3,5,3,3,1,4,0,4,3,3,0,3,3,0,4,4,4,4,5,4,3,3,5,5,3,2,3,1,2,3,2,0,1,0,0,3,2,2,4,4,3,1,5,0,4,0,3,0,4,3,1,3,2,1,0,3,3,0,3,3), +(0,4,0,5,0,5,0,4,0,4,5,5,5,3,4,3,3,2,5,4,4,3,5,3,5,3,4,0,4,3,4,4,3,2,4,4,3,4,5,4,4,5,5,0,3,5,5,4,1,3,3,2,3,3,1,3,1,0,4,3,1,4,4,3,4,5,0,4,0,2,0,4,3,4,4,3,3,0,4,0,0,5,5), +(0,4,0,4,0,5,0,1,1,3,3,4,4,3,4,1,3,0,5,1,3,0,3,1,3,1,1,0,3,0,3,3,4,0,4,3,0,4,4,4,3,4,4,0,3,5,4,1,0,3,0,0,2,3,0,3,1,0,3,1,0,3,2,1,3,5,0,3,0,1,0,3,2,3,3,4,4,0,2,2,0,4,4), +(2,4,0,5,0,4,0,3,0,4,5,5,4,3,5,3,5,3,5,3,5,2,5,3,4,3,3,4,3,4,5,3,2,1,5,4,3,2,3,4,5,3,4,1,2,5,4,3,0,3,3,0,3,2,0,2,3,0,4,1,0,3,4,3,3,5,0,3,0,1,0,4,5,5,5,4,3,0,4,2,0,3,5), +(0,5,0,4,0,4,0,2,0,5,4,3,4,3,4,3,3,3,4,3,4,2,5,3,5,3,4,1,4,3,4,4,4,0,3,5,0,4,4,4,4,5,3,1,3,4,5,3,3,3,3,3,3,3,0,2,2,0,3,3,2,4,3,3,3,5,3,4,1,3,3,5,3,2,0,0,0,0,4,3,1,3,3), +(0,1,0,3,0,3,0,1,0,1,3,3,3,2,3,3,3,0,3,0,0,0,3,1,3,0,0,0,2,2,2,3,0,0,3,2,0,1,2,4,1,3,3,0,0,3,3,3,0,1,0,0,2,1,0,0,3,0,3,1,0,3,0,0,1,3,0,2,0,1,0,3,3,1,3,3,0,0,1,1,0,3,3), +(0,2,0,3,0,2,1,4,0,2,2,3,1,1,3,1,1,0,2,0,3,1,2,3,1,3,0,0,1,0,4,3,2,3,3,3,1,4,2,3,3,3,3,1,0,3,1,4,0,1,1,0,1,2,0,1,1,0,1,1,0,3,1,3,2,2,0,1,0,0,0,2,3,3,3,1,0,0,0,0,0,2,3), +(0,5,0,4,0,5,0,2,0,4,5,5,3,3,4,3,3,1,5,4,4,2,4,4,4,3,4,2,4,3,5,5,4,3,3,4,3,3,5,5,4,5,5,1,3,4,5,3,1,4,3,1,3,3,0,3,3,1,4,3,1,4,5,3,3,5,0,4,0,3,0,5,3,3,1,4,3,0,4,0,1,5,3), +(0,5,0,5,0,4,0,2,0,4,4,3,4,3,3,3,3,3,5,4,4,4,4,4,4,5,3,3,5,2,4,4,4,3,4,4,3,3,4,4,5,5,3,3,4,3,4,3,3,4,3,3,3,3,1,2,2,1,4,3,3,5,4,4,3,4,0,4,0,3,0,4,4,4,4,4,1,0,4,2,0,2,4), +(0,4,0,4,0,3,0,1,0,3,5,2,3,0,3,0,2,1,4,2,3,3,4,1,4,3,3,2,4,1,3,3,3,0,3,3,0,0,3,3,3,5,3,3,3,3,3,2,0,2,0,0,2,0,0,2,0,0,1,0,0,3,1,2,2,3,0,3,0,2,0,4,4,3,3,4,1,0,3,0,0,2,4), +(0,0,0,4,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,1,0,2,0,1,0,0,0,0,0,3,1,3,0,3,2,0,0,0,1,0,3,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,0,2,0,0,0,0,0,0,2), +(0,2,1,3,0,2,0,2,0,3,3,3,3,1,3,1,3,3,3,3,3,3,4,2,2,1,2,1,4,0,4,3,1,3,3,3,2,4,3,5,4,3,3,3,3,3,3,3,0,1,3,0,2,0,0,1,0,0,1,0,0,4,2,0,2,3,0,3,3,0,3,3,4,2,3,1,4,0,1,2,0,2,3), +(0,3,0,3,0,1,0,3,0,2,3,3,3,0,3,1,2,0,3,3,2,3,3,2,3,2,3,1,3,0,4,3,2,0,3,3,1,4,3,3,2,3,4,3,1,3,3,1,1,0,1,1,0,1,0,1,0,1,0,0,0,4,1,1,0,3,0,3,1,0,2,3,3,3,3,3,1,0,0,2,0,3,3), +(0,0,0,0,0,0,0,0,0,0,3,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,0,3,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,2,3,0,0,0,0,0,0,0,0,3), +(0,2,0,3,1,3,0,3,0,2,3,3,3,1,3,1,3,1,3,1,3,3,3,1,3,0,2,3,1,1,4,3,3,2,3,3,1,2,2,4,1,3,3,0,1,4,2,3,0,1,3,0,3,0,0,1,3,0,2,0,0,3,3,2,1,3,0,3,0,2,0,3,4,4,4,3,1,0,3,0,0,3,3), +(0,2,0,1,0,2,0,0,0,1,3,2,2,1,3,0,1,1,3,0,3,2,3,1,2,0,2,0,1,1,3,3,3,0,3,3,1,1,2,3,2,3,3,1,2,3,2,0,0,1,0,0,0,0,0,0,3,0,1,0,0,2,1,2,1,3,0,3,0,0,0,3,4,4,4,3,2,0,2,0,0,2,4), +(0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,3,1,0,0,0,0,0,0,0,3), +(0,3,0,3,0,2,0,3,0,3,3,3,2,3,2,2,2,0,3,1,3,3,3,2,3,3,0,0,3,0,3,2,2,0,2,3,1,4,3,4,3,3,2,3,1,5,4,4,0,3,1,2,1,3,0,3,1,1,2,0,2,3,1,3,1,3,0,3,0,1,0,3,3,4,4,2,1,0,2,1,0,2,4), +(0,1,0,3,0,1,0,2,0,1,4,2,5,1,4,0,2,0,2,1,3,1,4,0,2,1,0,0,2,1,4,1,1,0,3,3,0,5,1,3,2,3,3,1,0,3,2,3,0,1,0,0,0,0,0,0,1,0,0,0,0,4,0,1,0,3,0,2,0,1,0,3,3,3,4,3,3,0,0,0,0,2,3), +(0,0,0,1,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,0,0,0,3), +(0,1,0,3,0,4,0,3,0,2,4,3,1,0,3,2,2,1,3,1,2,2,3,1,1,1,2,1,3,0,1,2,0,1,3,2,1,3,0,5,5,1,0,0,1,3,2,1,0,3,0,0,1,0,0,0,0,0,3,4,0,1,1,1,3,2,0,2,0,1,0,2,3,3,1,2,3,0,1,0,1,0,4), +(0,0,0,1,0,3,0,3,0,2,2,1,0,0,4,0,3,0,3,1,3,0,3,0,3,0,1,0,3,0,3,1,3,0,3,3,0,0,1,2,1,1,1,0,1,2,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,2,2,1,2,0,0,2,0,0,0,0,2,3,3,3,3,0,0,0,0,1,4), +(0,0,0,3,0,3,0,0,0,0,3,1,1,0,3,0,1,0,2,0,1,0,0,0,0,0,0,0,1,0,3,0,2,0,2,3,0,0,2,2,3,1,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,2,3), +(2,4,0,5,0,5,0,4,0,3,4,3,3,3,4,3,3,3,4,3,4,4,5,4,5,5,5,2,3,0,5,5,4,1,5,4,3,1,5,4,3,4,4,3,3,4,3,3,0,3,2,0,2,3,0,3,0,0,3,3,0,5,3,2,3,3,0,3,0,3,0,3,4,5,4,5,3,0,4,3,0,3,4), +(0,3,0,3,0,3,0,3,0,3,3,4,3,2,3,2,3,0,4,3,3,3,3,3,3,3,3,0,3,2,4,3,3,1,3,4,3,4,4,4,3,4,4,3,2,4,4,1,0,2,0,0,1,1,0,2,0,0,3,1,0,5,3,2,1,3,0,3,0,1,2,4,3,2,4,3,3,0,3,2,0,4,4), +(0,3,0,3,0,1,0,0,0,1,4,3,3,2,3,1,3,1,4,2,3,2,4,2,3,4,3,0,2,2,3,3,3,0,3,3,3,0,3,4,1,3,3,0,3,4,3,3,0,1,1,0,1,0,0,0,4,0,3,0,0,3,1,2,1,3,0,4,0,1,0,4,3,3,4,3,3,0,2,0,0,3,3), +(0,3,0,4,0,1,0,3,0,3,4,3,3,0,3,3,3,1,3,1,3,3,4,3,3,3,0,0,3,1,5,3,3,1,3,3,2,5,4,3,3,4,5,3,2,5,3,4,0,1,0,0,0,0,0,2,0,0,1,1,0,4,2,2,1,3,0,3,0,2,0,4,4,3,5,3,2,0,1,1,0,3,4), +(0,5,0,4,0,5,0,2,0,4,4,3,3,2,3,3,3,1,4,3,4,1,5,3,4,3,4,0,4,2,4,3,4,1,5,4,0,4,4,4,4,5,4,1,3,5,4,2,1,4,1,1,3,2,0,3,1,0,3,2,1,4,3,3,3,4,0,4,0,3,0,4,4,4,3,3,3,0,4,2,0,3,4), +(1,4,0,4,0,3,0,1,0,3,3,3,1,1,3,3,2,2,3,3,1,0,3,2,2,1,2,0,3,1,2,1,2,0,3,2,0,2,2,3,3,4,3,0,3,3,1,2,0,1,1,3,1,2,0,0,3,0,1,1,0,3,2,2,3,3,0,3,0,0,0,2,3,3,4,3,3,0,1,0,0,1,4), +(0,4,0,4,0,4,0,0,0,3,4,4,3,1,4,2,3,2,3,3,3,1,4,3,4,0,3,0,4,2,3,3,2,2,5,4,2,1,3,4,3,4,3,1,3,3,4,2,0,2,1,0,3,3,0,0,2,0,3,1,0,4,4,3,4,3,0,4,0,1,0,2,4,4,4,4,4,0,3,2,0,3,3), +(0,0,0,1,0,4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,3,2,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2), +(0,2,0,3,0,4,0,4,0,1,3,3,3,0,4,0,2,1,2,1,1,1,2,0,3,1,1,0,1,0,3,1,0,0,3,3,2,0,1,1,0,0,0,0,0,1,0,2,0,2,2,0,3,1,0,0,1,0,1,1,0,1,2,0,3,0,0,0,0,1,0,0,3,3,4,3,1,0,1,0,3,0,2), +(0,0,0,3,0,5,0,0,0,0,1,0,2,0,3,1,0,1,3,0,0,0,2,0,0,0,1,0,0,0,1,1,0,0,4,0,0,0,2,3,0,1,4,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,3), +(0,2,0,5,0,5,0,1,0,2,4,3,3,2,5,1,3,2,3,3,3,0,4,1,2,0,3,0,4,0,2,2,1,1,5,3,0,0,1,4,2,3,2,0,3,3,3,2,0,2,4,1,1,2,0,1,1,0,3,1,0,1,3,1,2,3,0,2,0,0,0,1,3,5,4,4,4,0,3,0,0,1,3), +(0,4,0,5,0,4,0,4,0,4,5,4,3,3,4,3,3,3,4,3,4,4,5,3,4,5,4,2,4,2,3,4,3,1,4,4,1,3,5,4,4,5,5,4,4,5,5,5,2,3,3,1,4,3,1,3,3,0,3,3,1,4,3,4,4,4,0,3,0,4,0,3,3,4,4,5,0,0,4,3,0,4,5), +(0,4,0,4,0,3,0,3,0,3,4,4,4,3,3,2,4,3,4,3,4,3,5,3,4,3,2,1,4,2,4,4,3,1,3,4,2,4,5,5,3,4,5,4,1,5,4,3,0,3,2,2,3,2,1,3,1,0,3,3,3,5,3,3,3,5,4,4,2,3,3,4,3,3,3,2,1,0,3,2,1,4,3), +(0,4,0,5,0,4,0,3,0,3,5,5,3,2,4,3,4,0,5,4,4,1,4,4,4,3,3,3,4,3,5,5,2,3,3,4,1,2,5,5,3,5,5,2,3,5,5,4,0,3,2,0,3,3,1,1,5,1,4,1,0,4,3,2,3,5,0,4,0,3,0,5,4,3,4,3,0,0,4,1,0,4,4), +(1,3,0,4,0,2,0,2,0,2,5,5,3,3,3,3,3,0,4,2,3,4,4,4,3,4,0,0,3,4,5,4,3,3,3,3,2,5,5,4,5,5,5,4,3,5,5,5,1,3,1,0,1,0,0,3,2,0,4,2,0,5,2,3,2,4,1,3,0,3,0,4,5,4,5,4,3,0,4,2,0,5,4), +(0,3,0,4,0,5,0,3,0,3,4,4,3,2,3,2,3,3,3,3,3,2,4,3,3,2,2,0,3,3,3,3,3,1,3,3,3,0,4,4,3,4,4,1,1,4,4,2,0,3,1,0,1,1,0,4,1,0,2,3,1,3,3,1,3,4,0,3,0,1,0,3,1,3,0,0,1,0,2,0,0,4,4), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0), +(0,3,0,3,0,2,0,3,0,1,5,4,3,3,3,1,4,2,1,2,3,4,4,2,4,4,5,0,3,1,4,3,4,0,4,3,3,3,2,3,2,5,3,4,3,2,2,3,0,0,3,0,2,1,0,1,2,0,0,0,0,2,1,1,3,1,0,2,0,4,0,3,4,4,4,5,2,0,2,0,0,1,3), +(0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,4,2,1,1,0,1,0,3,2,0,0,3,1,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,2,0,0,0,1,4,0,4,2,1,0,0,0,0,0,1), +(0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,3,1,0,0,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,0,0,1,0,0,2,1,0,0,0,0,0,0,0,0,2), +(0,4,0,4,0,4,0,3,0,4,4,3,4,2,4,3,2,0,4,4,4,3,5,3,5,3,3,2,4,2,4,3,4,3,1,4,0,2,3,4,4,4,3,3,3,4,4,4,3,4,1,3,4,3,2,1,2,1,3,3,3,4,4,3,3,5,0,4,0,3,0,4,3,3,3,2,1,0,3,0,0,3,3), +(0,4,0,3,0,3,0,3,0,3,5,5,3,3,3,3,4,3,4,3,3,3,4,4,4,3,3,3,3,4,3,5,3,3,1,3,2,4,5,5,5,5,4,3,4,5,5,3,2,2,3,3,3,3,2,3,3,1,2,3,2,4,3,3,3,4,0,4,0,2,0,4,3,2,2,1,2,0,3,0,0,4,1), +) + +class JapaneseContextAnalysis(object): + NUM_OF_CATEGORY = 6 + DONT_KNOW = -1 + ENOUGH_REL_THRESHOLD = 100 + MAX_REL_THRESHOLD = 1000 + MINIMUM_DATA_THRESHOLD = 4 + + def __init__(self): + self._total_rel = None + self._rel_sample = None + self._need_to_skip_char_num = None + self._last_char_order = None + self._done = None + self.reset() + + def reset(self): + self._total_rel = 0 # total sequence received + # category counters, each integer counts sequence in its category + self._rel_sample = [0] * self.NUM_OF_CATEGORY + # if last byte in current buffer is not the last byte of a character, + # we need to know how many bytes to skip in next buffer + self._need_to_skip_char_num = 0 + self._last_char_order = -1 # The order of previous char + # If this flag is set to True, detection is done and conclusion has + # been made + self._done = False + + def feed(self, byte_str, num_bytes): + if self._done: + return + + # The buffer we got is byte oriented, and a character may span in more than one + # buffers. In case the last one or two byte in last buffer is not + # complete, we record how many byte needed to complete that character + # and skip these bytes here. We can choose to record those bytes as + # well and analyse the character once it is complete, but since a + # character will not make much difference, by simply skipping + # this character will simply our logic and improve performance. + i = self._need_to_skip_char_num + while i < num_bytes: + order, char_len = self.get_order(byte_str[i:i + 2]) + i += char_len + if i > num_bytes: + self._need_to_skip_char_num = i - num_bytes + self._last_char_order = -1 + else: + if (order != -1) and (self._last_char_order != -1): + self._total_rel += 1 + if self._total_rel > self.MAX_REL_THRESHOLD: + self._done = True + break + self._rel_sample[jp2CharContext[self._last_char_order][order]] += 1 + self._last_char_order = order + + def got_enough_data(self): + return self._total_rel > self.ENOUGH_REL_THRESHOLD + + def get_confidence(self): + # This is just one way to calculate confidence. It works well for me. + if self._total_rel > self.MINIMUM_DATA_THRESHOLD: + return (self._total_rel - self._rel_sample[0]) / self._total_rel + else: + return self.DONT_KNOW + + def get_order(self, byte_str): + return -1, 1 + +class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + super(SJISContextAnalysis, self).__init__() + self._charset_name = "SHIFT_JIS" + + @property + def charset_name(self): + return self._charset_name + + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC): + char_len = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self._charset_name = "CP932" + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 202) and (0x9F <= second_char <= 0xF1): + return second_char - 0x9F, char_len + + return -1, char_len + +class EUCJPContextAnalysis(JapaneseContextAnalysis): + def get_order(self, byte_str): + if not byte_str: + return -1, 1 + # find out current char's byte length + first_char = byte_str[0] + if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE): + char_len = 2 + elif first_char == 0x8F: + char_len = 3 + else: + char_len = 1 + + # return its order if it is hiragana + if len(byte_str) > 1: + second_char = byte_str[1] + if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3): + return second_char - 0xA1, char_len + + return -1, char_len + + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 000000000..eb6f19a37 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langbulgarianmodel.py @@ -0,0 +1,228 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +# this table is modified base on win1251BulgarianCharToOrderMap, so +# only number <64 is sure valid + +Latin5_BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 +210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 + 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 + 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 +) + +win1251BulgarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 +110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 +253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 +116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 +206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 +221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 + 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 + 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 + 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 + 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 + 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 + 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 96.9392% +# first 1024 sequences:3.0618% +# rest sequences: 0.2992% +# negative sequences: 0.0020% +BulgarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, +3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, +0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, +0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, +0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, +0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, +0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, +2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, +3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, +3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, +1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, +3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, +1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, +2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, +2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, +3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, +1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, +2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, +2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, +1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, +2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, +2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, +2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, +1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, +2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, +1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, +3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, +1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, +3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, +1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, +2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, +1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, +2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, +1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, +2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, +1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, +2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, +1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, +2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, +1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, +0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, +1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, +1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, +1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, +0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, +1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, +1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, +1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +) + +Latin5BulgarianModel = { + 'char_to_order_map': Latin5_BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Bulgairan', +} + +Win1251BulgarianModel = { + 'char_to_order_map': win1251BulgarianCharToOrderMap, + 'precedence_matrix': BulgarianLangModel, + 'typical_positive_ratio': 0.969392, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Bulgarian', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 000000000..bdbad7038 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langcyrillicmodel.py @@ -0,0 +1,333 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# KOI8-R language model +# Character Mapping Table: +KOI8R_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 +223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 +238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 + 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 + 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 + 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 + 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 +) + +win1251_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +) + +latin5_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +macCyrillic_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, +239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, +) + +IBM855_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 +191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, +206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, + 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, +220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, +230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, + 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, + 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, +250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, +) + +IBM866_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 +155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 +253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 + 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 + 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, + 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, + 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, +191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, +207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, +223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, + 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, +239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 97.6601% +# first 1024 sequences: 2.3389% +# rest sequences: 0.1237% +# negative sequences: 0.0009% +RussianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, +0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, +0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, +1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, +1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, +2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, +1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, +3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, +1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, +2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, +1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, +1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, +1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, +1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, +3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, +1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, +2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, +1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, +2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, +0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, +1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, +1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, +1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, +3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, +3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, +1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, +1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, +0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, +1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, +1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, +0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, +1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, +2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, +1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, +1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, +2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, +1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, +0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, +2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, +1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, +1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, +0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, +0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, +0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, +0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, +2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, +0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +) + +Koi8rModel = { + 'char_to_order_map': KOI8R_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "KOI8-R", + 'language': 'Russian', +} + +Win1251CyrillicModel = { + 'char_to_order_map': win1251_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "windows-1251", + 'language': 'Russian', +} + +Latin5CyrillicModel = { + 'char_to_order_map': latin5_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-5", + 'language': 'Russian', +} + +MacCyrillicModel = { + 'char_to_order_map': macCyrillic_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "MacCyrillic", + 'language': 'Russian', +} + +Ibm866Model = { + 'char_to_order_map': IBM866_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM866", + 'language': 'Russian', +} + +Ibm855Model = { + 'char_to_order_map': IBM855_char_to_order_map, + 'precedence_matrix': RussianLangModel, + 'typical_positive_ratio': 0.976601, + 'keep_english_letter': False, + 'charset_name': "IBM855", + 'language': 'Russian', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 000000000..73541cc56 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langgreekmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin7_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +win1253_char_to_order_map = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 + 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 +253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 + 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 +253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 +253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 +110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 + 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 +124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 + 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.2851% +# first 1024 sequences:1.7001% +# rest sequences: 0.0359% +# negative sequences: 0.0148% +GreekLangModel = ( +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, +2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, +2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, +2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, +0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, +3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, +3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, +2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, +2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, +0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, +0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, +0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, +0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, +0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, +0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, +0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, +0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, +0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, +0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, +0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, +0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, +0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, +0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, +0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, +0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, +0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, +0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, +0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, +0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, +0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, +0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, +0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, +0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, +0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, +0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin7GreekModel = { + 'char_to_order_map': Latin7_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "ISO-8859-7", + 'language': 'Greek', +} + +Win1253GreekModel = { + 'char_to_order_map': win1253_char_to_order_map, + 'precedence_matrix': GreekLangModel, + 'typical_positive_ratio': 0.982851, + 'keep_english_letter': False, + 'charset_name': "windows-1253", + 'language': 'Greek', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 000000000..07029b6b5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhebrewmodel.py @@ -0,0 +1,200 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Simon Montagu +# Portions created by the Initial Developer are Copyright (C) 2005 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Shoshannah Forbes - original C code (?) +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Windows-1255 language model +# Character Mapping Table: +WIN1255_CHAR_TO_ORDER_MAP = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 + 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 +253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 + 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 +124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, +215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, + 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, +106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, + 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, +238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, + 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, + 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 98.4004% +# first 1024 sequences: 1.5981% +# rest sequences: 0.087% +# negative sequences: 0.0015% +HEBREW_LANG_MODEL = ( +0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, +3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, +1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, +1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, +1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, +1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, +0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, +1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, +0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, +0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, +0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, +0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, +0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, +0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, +0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, +3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, +0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, +0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, +0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, +0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, +3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, +0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, +0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, +0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, +0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, +0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, +1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, +0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, +1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, +2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, +2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, +0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, +0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, +) + +Win1255HebrewModel = { + 'char_to_order_map': WIN1255_CHAR_TO_ORDER_MAP, + 'precedence_matrix': HEBREW_LANG_MODEL, + 'typical_positive_ratio': 0.984004, + 'keep_english_letter': False, + 'charset_name': "windows-1255", + 'language': 'Hebrew', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 000000000..6de87b725 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langhungarianmodel.py @@ -0,0 +1,225 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin2_HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, +175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, + 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, + 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, +245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +win1250HungarianCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, + 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, +253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, + 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, +161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, +177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, +191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, + 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, +221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, +232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, + 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, +245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 94.7368% +# first 1024 sequences:5.2623% +# rest sequences: 0.8894% +# negative sequences: 0.0009% +HungarianLangModel = ( +0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, +3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, +3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, +3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, +0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, +3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, +0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, +0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, +3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, +1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, +1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, +3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, +2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, +2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, +2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, +2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, +2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, +1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, +1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, +3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, +1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, +1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, +2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, +2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, +2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, +3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, +2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, +1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, +1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, +2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, +1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, +2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, +1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, +1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, +2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, +2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, +2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, +1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, +1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, +0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, +2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, +1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, +2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, +1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, +1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, +2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, +2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, +2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, +1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, +2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, +0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, +2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +) + +Latin2HungarianModel = { + 'char_to_order_map': Latin2_HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-2", + 'language': 'Hungarian', +} + +Win1250HungarianModel = { + 'char_to_order_map': win1250HungarianCharToOrderMap, + 'precedence_matrix': HungarianLangModel, + 'typical_positive_ratio': 0.947368, + 'keep_english_letter': True, + 'charset_name': "windows-1250", + 'language': 'Hungarian', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 000000000..fdb331357 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langthaimodel.py @@ -0,0 +1,199 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# The following result for thai was collected from a limited sample (1M). + +# Character Mapping Table: +TIS620CharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 +253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 +252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 +253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 +188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 +253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 + 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 +209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, +223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, +236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, + 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, + 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, + 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, + 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, + 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, +) + +# Model Table: +# total sequences: 100% +# first 512 sequences: 92.6386% +# first 1024 sequences:7.3177% +# rest sequences: 1.0230% +# negative sequences: 0.0436% +ThaiLangModel = ( +0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, +0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, +3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, +0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, +3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, +3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, +3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, +3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, +3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, +2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, +3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, +0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, +1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, +3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, +3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, +1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, +0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, +0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, +3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, +2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, +3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, +0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, +3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, +3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, +2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, +2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, +3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, +3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, +3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, +3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, +3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, +1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, +0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, +0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, +3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, +3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, +1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, +3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, +3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, +0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, +0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, +1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, +1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, +3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, +0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, +0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, +3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, +0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, +0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, +0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, +0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, +0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, +0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, +3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, +0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, +0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, +3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, +2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, +0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, +3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, +1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, +1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, +1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, +1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +TIS620ThaiModel = { + 'char_to_order_map': TIS620CharToOrderMap, + 'precedence_matrix': ThaiLangModel, + 'typical_positive_ratio': 0.926386, + 'keep_english_letter': False, + 'charset_name': "TIS-620", + 'language': 'Thai', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 000000000..64ec9bd80 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/langturkishmodel.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Communicator client code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Özgür Baskın - Turkish Language Model +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +# 255: Control characters that usually does not exist in any text +# 254: Carriage/Return +# 253: symbol (punctuation) that does not belong to word +# 252: 0 - 9 + +# Character Mapping Table: +Latin5_TurkishCharToOrderMap = ( +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, +255, 23, 37, 47, 39, 29, 52, 36, 45, 53, 60, 16, 49, 20, 46, 42, + 48, 69, 44, 35, 31, 51, 38, 62, 65, 43, 56,255,255,255,255,255, +255, 1, 21, 28, 12, 2, 18, 27, 25, 3, 24, 10, 5, 13, 4, 15, + 26, 64, 7, 8, 9, 14, 32, 57, 58, 11, 22,255,255,255,255,255, +180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165, +164,163,162,161,160,159,101,158,157,156,155,154,153,152,151,106, +150,149,148,147,146,145,144,100,143,142,141,140,139,138,137,136, + 94, 80, 93,135,105,134,133, 63,132,131,130,129,128,127,126,125, +124,104, 73, 99, 79, 85,123, 54,122, 98, 92,121,120, 91,103,119, + 68,118,117, 97,116,115, 50, 90,114,113,112,111, 55, 41, 40, 86, + 89, 70, 59, 78, 71, 82, 88, 33, 77, 66, 84, 83,110, 75, 61, 96, + 30, 67,109, 74, 87,102, 34, 95, 81,108, 76, 72, 17, 6, 19,107, +) + +TurkishLangModel = ( +3,2,3,3,3,1,3,3,3,3,3,3,3,3,2,1,1,3,3,1,3,3,0,3,3,3,3,3,0,3,1,3, +3,2,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,3,1,0,3,3,1,3,3,0,3,3,3,3,3,0,3,0,3, +3,1,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,1, +3,3,2,3,3,0,3,3,3,3,3,3,3,2,3,1,1,3,3,0,3,3,1,2,3,3,3,3,0,3,0,3, +3,1,1,0,0,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,1, +3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,1,3,3,2,0,3,2,1,2,2,1,3,3,0,0,0,2, +2,2,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1, +3,3,3,2,3,3,1,2,3,3,3,3,3,3,3,1,3,2,1,0,3,2,0,1,2,3,3,2,1,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0, +1,0,1,3,3,1,3,3,3,3,3,3,3,1,2,0,0,2,3,0,2,3,0,0,2,2,2,3,0,3,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,0,3,2,0,2,3,2,3,3,1,0,0,2, +3,2,0,0,1,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,0,2,0,0,1, +3,3,3,2,3,3,2,3,3,3,3,2,3,3,3,0,3,3,0,0,2,1,0,0,2,3,2,2,0,0,0,2, +2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,0,1,3,2,1,1,3,2,3,2,1,0,0,2, +2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, +3,3,3,2,3,3,3,3,3,3,3,2,3,3,3,0,3,2,2,0,2,3,0,0,2,2,2,2,0,0,0,2, +3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,3,3,3,3,2,2,2,2,3,2,3,3,0,3,3,1,1,2,2,0,0,2,2,3,2,0,0,1,3, +0,3,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1, +3,3,3,2,3,3,3,2,1,2,2,3,2,3,3,0,3,2,0,0,1,1,0,1,1,2,1,2,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0, +3,3,3,2,3,3,2,3,2,2,2,3,3,3,3,1,3,1,1,0,3,2,1,1,3,3,2,3,1,0,0,1, +1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,1, +3,2,2,3,3,0,3,3,3,3,3,3,3,2,2,1,0,3,3,1,3,3,0,1,3,3,2,3,0,3,0,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +2,2,2,3,3,0,3,3,3,3,3,3,3,3,3,0,0,3,2,0,3,3,0,3,2,3,3,3,0,3,1,3, +2,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,0,0,0,2,2,0,0,1,0,0,1, +3,3,3,1,2,3,3,1,0,0,1,0,0,3,3,2,3,0,0,2,0,0,2,0,2,0,0,0,2,0,2,0, +0,3,1,0,1,0,0,0,2,2,1,0,1,1,2,1,2,2,2,0,2,1,1,0,0,0,2,0,0,0,0,0, +1,2,1,3,3,0,3,3,3,3,3,2,3,0,0,0,0,2,3,0,2,3,1,0,2,3,1,3,0,3,0,2, +3,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,3,2,2,3,2,2,0,1,2,3,0,1,2,1,0,1,0,0,0,1,0,2,2,0,0,0,1, +1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0, +3,3,3,1,3,3,1,1,3,3,1,1,3,3,1,0,2,1,2,0,2,1,0,0,1,1,2,1,0,0,0,2, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,0,2,1,3,0,0,2,0,0,3,3,0,3,0,0,1,0,1,2,0,0,1,1,2,2,0,1,0, +0,1,2,1,1,0,1,0,1,1,1,1,1,0,1,1,1,2,2,1,2,0,1,0,0,0,0,0,0,1,0,0, +3,3,3,2,3,2,3,3,0,2,2,2,3,3,3,0,3,0,0,0,2,2,0,1,2,1,1,1,0,0,0,1, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +3,3,3,3,3,3,2,1,2,2,3,3,3,3,2,0,2,0,0,0,2,2,0,0,2,1,3,3,0,0,1,1, +1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, +1,1,2,3,3,0,3,3,3,3,3,3,2,2,0,2,0,2,3,2,3,2,2,2,2,2,2,2,1,3,2,3, +2,0,2,1,2,2,2,2,1,1,2,2,1,2,2,1,2,0,0,2,1,1,0,2,1,0,0,1,0,0,0,1, +2,3,3,1,1,1,0,1,1,1,2,3,2,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, +0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,2,2,3,2,3,2,2,1,3,3,3,0,2,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1, +2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,2,0,1,0,0,0, +3,3,3,2,3,3,3,3,3,2,3,1,2,3,3,1,2,0,0,0,0,0,0,0,3,2,1,1,0,0,0,0, +2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +3,3,3,2,2,3,3,2,1,1,1,1,1,3,3,0,3,1,0,0,1,1,0,0,3,1,2,1,0,0,0,0, +0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, +3,3,3,2,2,3,2,2,2,3,2,1,1,3,3,0,3,0,0,0,0,1,0,0,3,1,1,2,0,0,0,1, +1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +1,1,1,3,3,0,3,3,3,3,3,2,2,2,1,2,0,2,1,2,2,1,1,0,1,2,2,2,2,2,2,2, +0,0,2,1,2,1,2,1,0,1,1,3,1,2,1,1,2,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1, +3,3,3,1,3,3,3,0,1,1,0,2,2,3,1,0,3,0,0,0,1,0,0,0,1,0,0,1,0,1,0,0, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,2,2,1,0,0,1,0,0,3,3,1,3,0,0,1,1,0,2,0,3,0,0,0,2,0,1,1, +0,1,2,0,1,2,2,0,2,2,2,2,1,0,2,1,1,0,2,0,2,1,2,0,0,0,0,0,0,0,0,0, +3,3,3,1,3,2,3,2,0,2,2,2,1,3,2,0,2,1,2,0,1,2,0,0,1,0,2,2,0,0,0,2, +1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, +3,3,3,0,3,3,1,1,2,3,1,0,3,2,3,0,3,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0, +1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,3,3,2,3,3,2,2,0,0,0,0,1,2,0,1,3,0,0,0,3,1,1,0,3,0,2, +2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,1,2,2,1,0,3,1,1,1,1,3,3,2,3,0,0,1,0,1,2,0,2,2,0,2,2,0,2,1, +0,2,2,1,1,1,1,0,2,1,1,0,1,1,1,1,2,1,2,1,2,0,1,0,1,0,0,0,0,0,0,0, +3,3,3,0,1,1,3,0,0,1,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,0,0,0,2,0,0,0, +0,3,1,0,1,0,1,0,2,0,0,1,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,0,2,0,1,1,1,0,0,3,3,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,0, +0,2,0,1,2,0,2,0,2,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,0,0,1,1,0,0,0,0, +3,2,3,0,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0, +0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,2,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,0,2,3,0,0,1,0,1,0,2,3,2,3,0,0,1,3,0,2,1,0,0,0,0,2,0,1,0, +0,2,1,0,0,1,1,0,2,1,0,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,0,1,0,0,0,0, +3,2,2,0,0,1,1,0,0,0,0,0,0,3,1,1,1,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0, +0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,3,0,2,3,2,2,1,2,2,1,1,2,0,1,3,2,2,2,0,0,2,2,0,0,0,1,2,1, +3,0,2,1,1,0,1,1,1,0,1,2,2,2,1,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0, +0,1,1,2,3,0,3,3,3,2,2,2,2,1,0,1,0,1,0,1,2,2,0,0,2,2,1,3,1,1,2,1, +0,0,1,1,2,0,1,1,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,0,1,0,1,0,0,0,0, +3,3,2,0,0,3,1,0,0,0,0,0,0,3,2,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,2,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0, +3,3,2,0,0,1,0,0,0,0,1,0,0,3,3,2,2,0,0,1,0,0,2,0,1,0,0,0,2,0,1,0, +0,0,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,0,2,1,2,1,1,1,0,0,1,1,0,0,0,0, +3,3,2,0,0,2,2,0,0,0,1,1,0,2,2,1,3,1,0,1,0,1,2,0,0,0,0,0,1,0,1,0, +0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,2,0,0,0,1,0,0,1,0,0,2,3,1,2,0,0,1,0,0,2,0,0,0,1,0,2,0,2,0, +0,1,1,2,2,1,2,0,2,1,1,0,0,1,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,1,0,0,1,1,0,3,3,1,2,0,0,1,0,0,2,0,2,0,1,1,2,0,0,0, +0,0,1,1,1,1,2,0,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,0,0,0, +3,3,3,0,2,2,3,2,0,0,1,0,0,2,3,1,0,0,0,0,0,0,2,0,2,0,0,0,2,0,0,0, +0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0, +3,2,3,0,0,0,0,0,0,0,1,0,0,2,2,2,2,0,0,1,0,0,2,0,0,0,0,0,2,0,1,0, +0,0,2,1,1,0,1,0,2,1,1,0,0,1,1,2,1,0,2,0,2,0,1,0,0,0,2,0,0,0,0,0, +0,0,0,2,2,0,2,1,1,1,1,2,2,0,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,2,1,0, +0,0,1,0,1,0,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, +2,0,0,2,3,0,2,3,1,2,2,0,2,0,0,2,0,2,1,1,1,2,1,0,0,1,2,1,1,2,1,0, +1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, +3,3,3,0,2,1,2,0,0,0,1,0,0,3,2,0,1,0,0,1,0,0,2,0,0,0,1,2,1,0,1,0, +0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,2,2,0,2,2,1,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,1,0,0,0,1,1,1,1, +0,0,2,1,0,1,1,1,0,1,1,2,1,2,1,1,2,0,1,1,2,1,0,2,0,0,0,0,0,0,0,0, +3,2,2,0,0,2,0,0,0,0,0,0,0,2,2,0,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0, +0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,3,2,0,2,2,0,1,1,0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0, +2,0,1,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0, +2,2,2,0,1,1,0,0,0,1,0,0,0,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,2,0,1,0, +0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,2,1,0,1,1,1,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, +1,1,2,0,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,1, +0,0,1,2,2,0,2,1,2,1,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, +2,2,2,0,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, +0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,2,2,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,1,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +) + +Latin5TurkishModel = { + 'char_to_order_map': Latin5_TurkishCharToOrderMap, + 'precedence_matrix': TurkishLangModel, + 'typical_positive_ratio': 0.970290, + 'keep_english_letter': True, + 'charset_name': "ISO-8859-9", + 'language': 'Turkish', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 000000000..7c37520b7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/latin1prober.py @@ -0,0 +1,145 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState + +FREQ_CAT_NUM = 4 + +UDF = 0 # undefined +OTH = 1 # other +ASC = 2 # ascii capital letter +ASS = 3 # ascii small letter +ACV = 4 # accent capital vowel +ACO = 5 # accent capital other +ASV = 6 # accent small vowel +ASO = 7 # accent small other +CLASS_NUM = 8 # total classes + +Latin1_CharToClass = ( + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F + OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F + ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 + ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F + OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F + ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 + ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F + OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 + OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F + UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 + OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 + OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF + ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 + ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF + ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 + ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF + ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 + ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF + ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 + ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF +) + +# 0 : illegal +# 1 : very unlikely +# 2 : normal +# 3 : very likely +Latin1ClassModel = ( +# UDF OTH ASC ASS ACV ACO ASV ASO + 0, 0, 0, 0, 0, 0, 0, 0, # UDF + 0, 3, 3, 3, 3, 3, 3, 3, # OTH + 0, 3, 3, 3, 3, 3, 3, 3, # ASC + 0, 3, 3, 3, 1, 1, 3, 3, # ASS + 0, 3, 3, 3, 1, 2, 1, 2, # ACV + 0, 3, 3, 3, 3, 3, 3, 3, # ACO + 0, 3, 1, 3, 1, 1, 1, 3, # ASV + 0, 3, 1, 3, 1, 1, 3, 3, # ASO +) + + +class Latin1Prober(CharSetProber): + def __init__(self): + super(Latin1Prober, self).__init__() + self._last_char_class = None + self._freq_counter = None + self.reset() + + def reset(self): + self._last_char_class = OTH + self._freq_counter = [0] * FREQ_CAT_NUM + CharSetProber.reset(self) + + @property + def charset_name(self): + return "ISO-8859-1" + + @property + def language(self): + return "" + + def feed(self, byte_str): + byte_str = self.filter_with_english_letters(byte_str) + for c in byte_str: + char_class = Latin1_CharToClass[c] + freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + + char_class] + if freq == 0: + self._state = ProbingState.NOT_ME + break + self._freq_counter[freq] += 1 + self._last_char_class = char_class + + return self.state + + def get_confidence(self): + if self.state == ProbingState.NOT_ME: + return 0.01 + + total = sum(self._freq_counter) + if total < 0.01: + confidence = 0.0 + else: + confidence = ((self._freq_counter[3] - self._freq_counter[1] * 20.0) + / total) + if confidence < 0.0: + confidence = 0.0 + # lower the confidence of latin1 so that other more accurate + # detector can take priority. + confidence = confidence * 0.73 + return confidence diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 000000000..460915439 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcharsetprober.py @@ -0,0 +1,91 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState + + +class MultiByteCharSetProber(CharSetProber): + """ + MultiByteCharSetProber + """ + + def __init__(self, lang_filter=None): + super(MultiByteCharSetProber, self).__init__(lang_filter=lang_filter) + self.distribution_analyzer = None + self.coding_sm = None + self._last_char = [0, 0] + + def reset(self): + super(MultiByteCharSetProber, self).reset() + if self.coding_sm: + self.coding_sm.reset() + if self.distribution_analyzer: + self.distribution_analyzer.reset() + self._last_char = [0, 0] + + @property + def charset_name(self): + raise NotImplementedError + + @property + def language(self): + raise NotImplementedError + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.distribution_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + return self.distribution_analyzer.get_confidence() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 000000000..4b0492931 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcsgroupprober.py @@ -0,0 +1,54 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# Proofpoint, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .utf8prober import UTF8Prober +from .sjisprober import SJISProber +from .eucjpprober import EUCJPProber +from .gb2312prober import GB2312Prober +from .euckrprober import EUCKRProber +from .cp949prober import CP949Prober +from .big5prober import Big5Prober +from .euctwprober import EUCTWProber + + +class MBCSGroupProber(CharSetGroupProber): + def __init__(self, lang_filter=None): + super(MBCSGroupProber, self).__init__(lang_filter=lang_filter) + self.probers = [ + UTF8Prober(), + SJISProber(), + EUCJPProber(), + GB2312Prober(), + EUCKRProber(), + CP949Prober(), + Big5Prober(), + EUCTWProber() + ] + self.reset() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 000000000..d68f6f6cf --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/mbcssm.py @@ -0,0 +1,572 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .enums import MachineState + +# BIG5 + +BIG5_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 4,4,4,4,4,4,4,4, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 4,3,3,3,3,3,3,3, # a0 - a7 + 3,3,3,3,3,3,3,3, # a8 - af + 3,3,3,3,3,3,3,3, # b0 - b7 + 3,3,3,3,3,3,3,3, # b8 - bf + 3,3,3,3,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +BIG5_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17 +) + +BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0) + +BIG5_SM_MODEL = {'class_table': BIG5_CLS, + 'class_factor': 5, + 'state_table': BIG5_ST, + 'char_len_table': BIG5_CHAR_LEN_TABLE, + 'name': 'Big5'} + +# CP949 + +CP949_CLS = ( + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f + 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f + 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f + 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f + 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f + 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f + 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f + 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f + 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f + 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af + 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf + 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef + 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff +) + +CP949_ST = ( +#cls= 0 1 2 3 4 5 6 7 8 9 # previous state = + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5 + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6 +) + +CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) + +CP949_SM_MODEL = {'class_table': CP949_CLS, + 'class_factor': 10, + 'state_table': CP949_ST, + 'char_len_table': CP949_CHAR_LEN_TABLE, + 'name': 'CP949'} + +# EUC-JP + +EUCJP_CLS = ( + 4,4,4,4,4,4,4,4, # 00 - 07 + 4,4,4,4,4,4,5,5, # 08 - 0f + 4,4,4,4,4,4,4,4, # 10 - 17 + 4,4,4,5,4,4,4,4, # 18 - 1f + 4,4,4,4,4,4,4,4, # 20 - 27 + 4,4,4,4,4,4,4,4, # 28 - 2f + 4,4,4,4,4,4,4,4, # 30 - 37 + 4,4,4,4,4,4,4,4, # 38 - 3f + 4,4,4,4,4,4,4,4, # 40 - 47 + 4,4,4,4,4,4,4,4, # 48 - 4f + 4,4,4,4,4,4,4,4, # 50 - 57 + 4,4,4,4,4,4,4,4, # 58 - 5f + 4,4,4,4,4,4,4,4, # 60 - 67 + 4,4,4,4,4,4,4,4, # 68 - 6f + 4,4,4,4,4,4,4,4, # 70 - 77 + 4,4,4,4,4,4,4,4, # 78 - 7f + 5,5,5,5,5,5,5,5, # 80 - 87 + 5,5,5,5,5,5,1,3, # 88 - 8f + 5,5,5,5,5,5,5,5, # 90 - 97 + 5,5,5,5,5,5,5,5, # 98 - 9f + 5,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,0,5 # f8 - ff +) + +EUCJP_ST = ( + 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f + 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27 +) + +EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0) + +EUCJP_SM_MODEL = {'class_table': EUCJP_CLS, + 'class_factor': 6, + 'state_table': EUCJP_ST, + 'char_len_table': EUCJP_CHAR_LEN_TABLE, + 'name': 'EUC-JP'} + +# EUC-KR + +EUCKR_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,3,3,3, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,3,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 2,2,2,2,2,2,2,2, # e0 - e7 + 2,2,2,2,2,2,2,2, # e8 - ef + 2,2,2,2,2,2,2,2, # f0 - f7 + 2,2,2,2,2,2,2,0 # f8 - ff +) + +EUCKR_ST = ( + MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f +) + +EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0) + +EUCKR_SM_MODEL = {'class_table': EUCKR_CLS, + 'class_factor': 4, + 'state_table': EUCKR_ST, + 'char_len_table': EUCKR_CHAR_LEN_TABLE, + 'name': 'EUC-KR'} + +# EUC-TW + +EUCTW_CLS = ( + 2,2,2,2,2,2,2,2, # 00 - 07 + 2,2,2,2,2,2,0,0, # 08 - 0f + 2,2,2,2,2,2,2,2, # 10 - 17 + 2,2,2,0,2,2,2,2, # 18 - 1f + 2,2,2,2,2,2,2,2, # 20 - 27 + 2,2,2,2,2,2,2,2, # 28 - 2f + 2,2,2,2,2,2,2,2, # 30 - 37 + 2,2,2,2,2,2,2,2, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,2, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,6,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,3,4,4,4,4,4,4, # a0 - a7 + 5,5,1,1,1,1,1,1, # a8 - af + 1,1,1,1,1,1,1,1, # b0 - b7 + 1,1,1,1,1,1,1,1, # b8 - bf + 1,1,3,1,3,3,3,3, # c0 - c7 + 3,3,3,3,3,3,3,3, # c8 - cf + 3,3,3,3,3,3,3,3, # d0 - d7 + 3,3,3,3,3,3,3,3, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,3,3,3, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,3,3,0 # f8 - ff +) + +EUCTW_ST = ( + MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17 + MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27 + MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3) + +EUCTW_SM_MODEL = {'class_table': EUCTW_CLS, + 'class_factor': 7, + 'state_table': EUCTW_ST, + 'char_len_table': EUCTW_CHAR_LEN_TABLE, + 'name': 'x-euc-tw'} + +# GB2312 + +GB2312_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 3,3,3,3,3,3,3,3, # 30 - 37 + 3,3,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,4, # 78 - 7f + 5,6,6,6,6,6,6,6, # 80 - 87 + 6,6,6,6,6,6,6,6, # 88 - 8f + 6,6,6,6,6,6,6,6, # 90 - 97 + 6,6,6,6,6,6,6,6, # 98 - 9f + 6,6,6,6,6,6,6,6, # a0 - a7 + 6,6,6,6,6,6,6,6, # a8 - af + 6,6,6,6,6,6,6,6, # b0 - b7 + 6,6,6,6,6,6,6,6, # b8 - bf + 6,6,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 6,6,6,6,6,6,6,6, # e0 - e7 + 6,6,6,6,6,6,6,6, # e8 - ef + 6,6,6,6,6,6,6,6, # f0 - f7 + 6,6,6,6,6,6,6,0 # f8 - ff +) + +GB2312_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17 + 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27 + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f +) + +# To be accurate, the length of class 6 can be either 2 or 4. +# But it is not necessary to discriminate between the two since +# it is used for frequency analysis only, and we are validating +# each code range there as well. So it is safe to set it to be +# 2 here. +GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2) + +GB2312_SM_MODEL = {'class_table': GB2312_CLS, + 'class_factor': 7, + 'state_table': GB2312_ST, + 'char_len_table': GB2312_CHAR_LEN_TABLE, + 'name': 'GB2312'} + +# Shift_JIS + +SJIS_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 2,2,2,2,2,2,2,2, # 40 - 47 + 2,2,2,2,2,2,2,2, # 48 - 4f + 2,2,2,2,2,2,2,2, # 50 - 57 + 2,2,2,2,2,2,2,2, # 58 - 5f + 2,2,2,2,2,2,2,2, # 60 - 67 + 2,2,2,2,2,2,2,2, # 68 - 6f + 2,2,2,2,2,2,2,2, # 70 - 77 + 2,2,2,2,2,2,2,1, # 78 - 7f + 3,3,3,3,3,2,2,3, # 80 - 87 + 3,3,3,3,3,3,3,3, # 88 - 8f + 3,3,3,3,3,3,3,3, # 90 - 97 + 3,3,3,3,3,3,3,3, # 98 - 9f + #0xa0 is illegal in sjis encoding, but some pages does + #contain such byte. We need to be more error forgiven. + 2,2,2,2,2,2,2,2, # a0 - a7 + 2,2,2,2,2,2,2,2, # a8 - af + 2,2,2,2,2,2,2,2, # b0 - b7 + 2,2,2,2,2,2,2,2, # b8 - bf + 2,2,2,2,2,2,2,2, # c0 - c7 + 2,2,2,2,2,2,2,2, # c8 - cf + 2,2,2,2,2,2,2,2, # d0 - d7 + 2,2,2,2,2,2,2,2, # d8 - df + 3,3,3,3,3,3,3,3, # e0 - e7 + 3,3,3,3,3,4,4,4, # e8 - ef + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff + + +SJIS_ST = ( + MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17 +) + +SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0) + +SJIS_SM_MODEL = {'class_table': SJIS_CLS, + 'class_factor': 6, + 'state_table': SJIS_ST, + 'char_len_table': SJIS_CHAR_LEN_TABLE, + 'name': 'Shift_JIS'} + +# UCS2-BE + +UCS2BE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2BE_ST = ( + 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17 + 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f + 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27 + 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f + 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2) + +UCS2BE_SM_MODEL = {'class_table': UCS2BE_CLS, + 'class_factor': 6, + 'state_table': UCS2BE_ST, + 'char_len_table': UCS2BE_CHAR_LEN_TABLE, + 'name': 'UTF-16BE'} + +# UCS2-LE + +UCS2LE_CLS = ( + 0,0,0,0,0,0,0,0, # 00 - 07 + 0,0,1,0,0,2,0,0, # 08 - 0f + 0,0,0,0,0,0,0,0, # 10 - 17 + 0,0,0,3,0,0,0,0, # 18 - 1f + 0,0,0,0,0,0,0,0, # 20 - 27 + 0,3,3,3,3,3,0,0, # 28 - 2f + 0,0,0,0,0,0,0,0, # 30 - 37 + 0,0,0,0,0,0,0,0, # 38 - 3f + 0,0,0,0,0,0,0,0, # 40 - 47 + 0,0,0,0,0,0,0,0, # 48 - 4f + 0,0,0,0,0,0,0,0, # 50 - 57 + 0,0,0,0,0,0,0,0, # 58 - 5f + 0,0,0,0,0,0,0,0, # 60 - 67 + 0,0,0,0,0,0,0,0, # 68 - 6f + 0,0,0,0,0,0,0,0, # 70 - 77 + 0,0,0,0,0,0,0,0, # 78 - 7f + 0,0,0,0,0,0,0,0, # 80 - 87 + 0,0,0,0,0,0,0,0, # 88 - 8f + 0,0,0,0,0,0,0,0, # 90 - 97 + 0,0,0,0,0,0,0,0, # 98 - 9f + 0,0,0,0,0,0,0,0, # a0 - a7 + 0,0,0,0,0,0,0,0, # a8 - af + 0,0,0,0,0,0,0,0, # b0 - b7 + 0,0,0,0,0,0,0,0, # b8 - bf + 0,0,0,0,0,0,0,0, # c0 - c7 + 0,0,0,0,0,0,0,0, # c8 - cf + 0,0,0,0,0,0,0,0, # d0 - d7 + 0,0,0,0,0,0,0,0, # d8 - df + 0,0,0,0,0,0,0,0, # e0 - e7 + 0,0,0,0,0,0,0,0, # e8 - ef + 0,0,0,0,0,0,0,0, # f0 - f7 + 0,0,0,0,0,0,4,5 # f8 - ff +) + +UCS2LE_ST = ( + 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f + MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17 + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f + 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27 + 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f + 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37 +) + +UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2) + +UCS2LE_SM_MODEL = {'class_table': UCS2LE_CLS, + 'class_factor': 6, + 'state_table': UCS2LE_ST, + 'char_len_table': UCS2LE_CHAR_LEN_TABLE, + 'name': 'UTF-16LE'} + +# UTF-8 + +UTF8_CLS = ( + 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value + 1,1,1,1,1,1,0,0, # 08 - 0f + 1,1,1,1,1,1,1,1, # 10 - 17 + 1,1,1,0,1,1,1,1, # 18 - 1f + 1,1,1,1,1,1,1,1, # 20 - 27 + 1,1,1,1,1,1,1,1, # 28 - 2f + 1,1,1,1,1,1,1,1, # 30 - 37 + 1,1,1,1,1,1,1,1, # 38 - 3f + 1,1,1,1,1,1,1,1, # 40 - 47 + 1,1,1,1,1,1,1,1, # 48 - 4f + 1,1,1,1,1,1,1,1, # 50 - 57 + 1,1,1,1,1,1,1,1, # 58 - 5f + 1,1,1,1,1,1,1,1, # 60 - 67 + 1,1,1,1,1,1,1,1, # 68 - 6f + 1,1,1,1,1,1,1,1, # 70 - 77 + 1,1,1,1,1,1,1,1, # 78 - 7f + 2,2,2,2,3,3,3,3, # 80 - 87 + 4,4,4,4,4,4,4,4, # 88 - 8f + 4,4,4,4,4,4,4,4, # 90 - 97 + 4,4,4,4,4,4,4,4, # 98 - 9f + 5,5,5,5,5,5,5,5, # a0 - a7 + 5,5,5,5,5,5,5,5, # a8 - af + 5,5,5,5,5,5,5,5, # b0 - b7 + 5,5,5,5,5,5,5,5, # b8 - bf + 0,0,6,6,6,6,6,6, # c0 - c7 + 6,6,6,6,6,6,6,6, # c8 - cf + 6,6,6,6,6,6,6,6, # d0 - d7 + 6,6,6,6,6,6,6,6, # d8 - df + 7,8,8,8,8,8,8,8, # e0 - e7 + 8,8,8,8,8,9,8,8, # e8 - ef + 10,11,11,11,11,11,11,11, # f0 - f7 + 12,13,13,13,14,15,0,0 # f8 - ff +) + +UTF8_ST = ( + MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07 + 9, 11, 8, 7, 6, 5, 4, 3,#08-0f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27 + MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f + MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f + MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f + MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f + MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af + MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf + MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7 + MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf +) + +UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) + +UTF8_SM_MODEL = {'class_table': UTF8_CLS, + 'class_factor': 16, + 'state_table': UTF8_ST, + 'char_len_table': UTF8_CHAR_LEN_TABLE, + 'name': 'UTF-8'} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 000000000..66e0dfcc8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcharsetprober.py @@ -0,0 +1,132 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import CharacterCategory, ProbingState, SequenceLikelihood + + +class SingleByteCharSetProber(CharSetProber): + SAMPLE_SIZE = 64 + SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2 + POSITIVE_SHORTCUT_THRESHOLD = 0.95 + NEGATIVE_SHORTCUT_THRESHOLD = 0.05 + + def __init__(self, model, reversed=False, name_prober=None): + super(SingleByteCharSetProber, self).__init__() + self._model = model + # TRUE if we need to reverse every pair in the model lookup + self._reversed = reversed + # Optional auxiliary prober for name decision + self._name_prober = name_prober + self._last_order = None + self._seq_counters = None + self._total_seqs = None + self._total_char = None + self._freq_char = None + self.reset() + + def reset(self): + super(SingleByteCharSetProber, self).reset() + # char order of last character + self._last_order = 255 + self._seq_counters = [0] * SequenceLikelihood.get_num_categories() + self._total_seqs = 0 + self._total_char = 0 + # characters that fall in our sampling range + self._freq_char = 0 + + @property + def charset_name(self): + if self._name_prober: + return self._name_prober.charset_name + else: + return self._model['charset_name'] + + @property + def language(self): + if self._name_prober: + return self._name_prober.language + else: + return self._model.get('language') + + def feed(self, byte_str): + if not self._model['keep_english_letter']: + byte_str = self.filter_international_words(byte_str) + if not byte_str: + return self.state + char_to_order_map = self._model['char_to_order_map'] + for i, c in enumerate(byte_str): + # XXX: Order is in range 1-64, so one would think we want 0-63 here, + # but that leads to 27 more test failures than before. + order = char_to_order_map[c] + # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but + # CharacterCategory.SYMBOL is actually 253, so we use CONTROL + # to make it closer to the original intent. The only difference + # is whether or not we count digits and control characters for + # _total_char purposes. + if order < CharacterCategory.CONTROL: + self._total_char += 1 + if order < self.SAMPLE_SIZE: + self._freq_char += 1 + if self._last_order < self.SAMPLE_SIZE: + self._total_seqs += 1 + if not self._reversed: + i = (self._last_order * self.SAMPLE_SIZE) + order + model = self._model['precedence_matrix'][i] + else: # reverse the order of the letters in the lookup + i = (order * self.SAMPLE_SIZE) + self._last_order + model = self._model['precedence_matrix'][i] + self._seq_counters[model] += 1 + self._last_order = order + + charset_name = self._model['charset_name'] + if self.state == ProbingState.DETECTING: + if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD: + confidence = self.get_confidence() + if confidence > self.POSITIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, we have a winner', + charset_name, confidence) + self._state = ProbingState.FOUND_IT + elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD: + self.logger.debug('%s confidence = %s, below negative ' + 'shortcut threshhold %s', charset_name, + confidence, + self.NEGATIVE_SHORTCUT_THRESHOLD) + self._state = ProbingState.NOT_ME + + return self.state + + def get_confidence(self): + r = 0.01 + if self._total_seqs > 0: + r = ((1.0 * self._seq_counters[SequenceLikelihood.POSITIVE]) / + self._total_seqs / self._model['typical_positive_ratio']) + r = r * self._freq_char / self._total_char + if r >= 1.0: + r = 0.99 + return r diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 000000000..29bcc2add --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sbcsgroupprober.py @@ -0,0 +1,73 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetgroupprober import CharSetGroupProber +from .sbcharsetprober import SingleByteCharSetProber +from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, + Latin5CyrillicModel, MacCyrillicModel, + Ibm866Model, Ibm855Model) +from .langgreekmodel import Latin7GreekModel, Win1253GreekModel +from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel +# from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel +from .langthaimodel import TIS620ThaiModel +from .langhebrewmodel import Win1255HebrewModel +from .hebrewprober import HebrewProber +from .langturkishmodel import Latin5TurkishModel + + +class SBCSGroupProber(CharSetGroupProber): + def __init__(self): + super(SBCSGroupProber, self).__init__() + self.probers = [ + SingleByteCharSetProber(Win1251CyrillicModel), + SingleByteCharSetProber(Koi8rModel), + SingleByteCharSetProber(Latin5CyrillicModel), + SingleByteCharSetProber(MacCyrillicModel), + SingleByteCharSetProber(Ibm866Model), + SingleByteCharSetProber(Ibm855Model), + SingleByteCharSetProber(Latin7GreekModel), + SingleByteCharSetProber(Win1253GreekModel), + SingleByteCharSetProber(Latin5BulgarianModel), + SingleByteCharSetProber(Win1251BulgarianModel), + # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250) + # after we retrain model. + # SingleByteCharSetProber(Latin2HungarianModel), + # SingleByteCharSetProber(Win1250HungarianModel), + SingleByteCharSetProber(TIS620ThaiModel), + SingleByteCharSetProber(Latin5TurkishModel), + ] + hebrew_prober = HebrewProber() + logical_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, + False, hebrew_prober) + visual_hebrew_prober = SingleByteCharSetProber(Win1255HebrewModel, True, + hebrew_prober) + hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober) + self.probers.extend([hebrew_prober, logical_hebrew_prober, + visual_hebrew_prober]) + + self.reset() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 000000000..683add026 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/sjisprober.py @@ -0,0 +1,92 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .mbcharsetprober import MultiByteCharSetProber +from .codingstatemachine import CodingStateMachine +from .chardistribution import SJISDistributionAnalysis +from .jpcntx import SJISContextAnalysis +from .mbcssm import SJIS_SM_MODEL +from .enums import ProbingState, MachineState + + +class SJISProber(MultiByteCharSetProber): + def __init__(self): + super(SJISProber, self).__init__() + self.coding_sm = CodingStateMachine(SJIS_SM_MODEL) + self.distribution_analyzer = SJISDistributionAnalysis() + self.context_analyzer = SJISContextAnalysis() + self.reset() + + def reset(self): + super(SJISProber, self).reset() + self.context_analyzer.reset() + + @property + def charset_name(self): + return self.context_analyzer.charset_name + + @property + def language(self): + return "Japanese" + + def feed(self, byte_str): + for i in range(len(byte_str)): + coding_state = self.coding_sm.next_state(byte_str[i]) + if coding_state == MachineState.ERROR: + self.logger.debug('%s %s prober hit error at byte %s', + self.charset_name, self.language, i) + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + char_len = self.coding_sm.get_current_charlen() + if i == 0: + self._last_char[1] = byte_str[0] + self.context_analyzer.feed(self._last_char[2 - char_len:], + char_len) + self.distribution_analyzer.feed(self._last_char, char_len) + else: + self.context_analyzer.feed(byte_str[i + 1 - char_len:i + 3 + - char_len], char_len) + self.distribution_analyzer.feed(byte_str[i - 1:i + 1], + char_len) + + self._last_char[0] = byte_str[-1] + + if self.state == ProbingState.DETECTING: + if (self.context_analyzer.got_enough_data() and + (self.get_confidence() > self.SHORTCUT_THRESHOLD)): + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + context_conf = self.context_analyzer.get_confidence() + distrib_conf = self.distribution_analyzer.get_confidence() + return max(context_conf, distrib_conf) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 000000000..8a6de3b44 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/universaldetector.py @@ -0,0 +1,286 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is Mozilla Universal charset detector code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 2001 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# Shy Shalom - original C code +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### +""" +Module containing the UniversalDetector detector class, which is the primary +class a user of ``chardet`` should use. + +:author: Mark Pilgrim (initial port to Python) +:author: Shy Shalom (original C code) +:author: Dan Blanchard (major refactoring for 3.0) +:author: Ian Cordasco +""" + + +import codecs +import logging +import re + +from .charsetgroupprober import CharSetGroupProber +from .enums import InputState, LanguageFilter, ProbingState +from .escprober import EscCharSetProber +from .latin1prober import Latin1Prober +from .mbcsgroupprober import MBCSGroupProber +from .sbcsgroupprober import SBCSGroupProber + + +class UniversalDetector(object): + """ + The ``UniversalDetector`` class underlies the ``chardet.detect`` function + and coordinates all of the different charset probers. + + To get a ``dict`` containing an encoding and its confidence, you can simply + run: + + .. code:: + + u = UniversalDetector() + u.feed(some_bytes) + u.close() + detected = u.result + + """ + + MINIMUM_THRESHOLD = 0.20 + HIGH_BYTE_DETECTOR = re.compile(b'[\x80-\xFF]') + ESC_DETECTOR = re.compile(b'(\033|~{)') + WIN_BYTE_DETECTOR = re.compile(b'[\x80-\x9F]') + ISO_WIN_MAP = {'iso-8859-1': 'Windows-1252', + 'iso-8859-2': 'Windows-1250', + 'iso-8859-5': 'Windows-1251', + 'iso-8859-6': 'Windows-1256', + 'iso-8859-7': 'Windows-1253', + 'iso-8859-8': 'Windows-1255', + 'iso-8859-9': 'Windows-1254', + 'iso-8859-13': 'Windows-1257'} + + def __init__(self, lang_filter=LanguageFilter.ALL): + self._esc_charset_prober = None + self._charset_probers = [] + self.result = None + self.done = None + self._got_data = None + self._input_state = None + self._last_char = None + self.lang_filter = lang_filter + self.logger = logging.getLogger(__name__) + self._has_win_bytes = None + self.reset() + + def reset(self): + """ + Reset the UniversalDetector and all of its probers back to their + initial states. This is called by ``__init__``, so you only need to + call this directly in between analyses of different documents. + """ + self.result = {'encoding': None, 'confidence': 0.0, 'language': None} + self.done = False + self._got_data = False + self._has_win_bytes = False + self._input_state = InputState.PURE_ASCII + self._last_char = b'' + if self._esc_charset_prober: + self._esc_charset_prober.reset() + for prober in self._charset_probers: + prober.reset() + + def feed(self, byte_str): + """ + Takes a chunk of a document and feeds it through all of the relevant + charset probers. + + After calling ``feed``, you can check the value of the ``done`` + attribute to see if you need to continue feeding the + ``UniversalDetector`` more data, or if it has made a prediction + (in the ``result`` attribute). + + .. note:: + You should always call ``close`` when you're done feeding in your + document if ``done`` is not already ``True``. + """ + if self.done: + return + + if not len(byte_str): + return + + if not isinstance(byte_str, bytearray): + byte_str = bytearray(byte_str) + + # First check for known BOMs, since these are guaranteed to be correct + if not self._got_data: + # If the data starts with BOM, we know it is UTF + if byte_str.startswith(codecs.BOM_UTF8): + # EF BB BF UTF-8 with BOM + self.result = {'encoding': "UTF-8-SIG", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_UTF32_LE, + codecs.BOM_UTF32_BE)): + # FF FE 00 00 UTF-32, little-endian BOM + # 00 00 FE FF UTF-32, big-endian BOM + self.result = {'encoding': "UTF-32", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\xFE\xFF\x00\x00'): + # FE FF 00 00 UCS-4, unusual octet order BOM (3412) + self.result = {'encoding': "X-ISO-10646-UCS-4-3412", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith(b'\x00\x00\xFF\xFE'): + # 00 00 FF FE UCS-4, unusual octet order BOM (2143) + self.result = {'encoding': "X-ISO-10646-UCS-4-2143", + 'confidence': 1.0, + 'language': ''} + elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)): + # FF FE UTF-16, little endian BOM + # FE FF UTF-16, big endian BOM + self.result = {'encoding': "UTF-16", + 'confidence': 1.0, + 'language': ''} + + self._got_data = True + if self.result['encoding'] is not None: + self.done = True + return + + # If none of those matched and we've only see ASCII so far, check + # for high bytes and escape sequences + if self._input_state == InputState.PURE_ASCII: + if self.HIGH_BYTE_DETECTOR.search(byte_str): + self._input_state = InputState.HIGH_BYTE + elif self._input_state == InputState.PURE_ASCII and \ + self.ESC_DETECTOR.search(self._last_char + byte_str): + self._input_state = InputState.ESC_ASCII + + self._last_char = byte_str[-1:] + + # If we've seen escape sequences, use the EscCharSetProber, which + # uses a simple state machine to check for known escape sequences in + # HZ and ISO-2022 encodings, since those are the only encodings that + # use such sequences. + if self._input_state == InputState.ESC_ASCII: + if not self._esc_charset_prober: + self._esc_charset_prober = EscCharSetProber(self.lang_filter) + if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': + self._esc_charset_prober.charset_name, + 'confidence': + self._esc_charset_prober.get_confidence(), + 'language': + self._esc_charset_prober.language} + self.done = True + # If we've seen high bytes (i.e., those with values greater than 127), + # we need to do more complicated checks using all our multi-byte and + # single-byte probers that are left. The single-byte probers + # use character bigram distributions to determine the encoding, whereas + # the multi-byte probers use a combination of character unigram and + # bigram distributions. + elif self._input_state == InputState.HIGH_BYTE: + if not self._charset_probers: + self._charset_probers = [MBCSGroupProber(self.lang_filter)] + # If we're checking non-CJK encodings, use single-byte prober + if self.lang_filter & LanguageFilter.NON_CJK: + self._charset_probers.append(SBCSGroupProber()) + self._charset_probers.append(Latin1Prober()) + for prober in self._charset_probers: + if prober.feed(byte_str) == ProbingState.FOUND_IT: + self.result = {'encoding': prober.charset_name, + 'confidence': prober.get_confidence(), + 'language': prober.language} + self.done = True + break + if self.WIN_BYTE_DETECTOR.search(byte_str): + self._has_win_bytes = True + + def close(self): + """ + Stop analyzing the current document and come up with a final + prediction. + + :returns: The ``result`` attribute, a ``dict`` with the keys + `encoding`, `confidence`, and `language`. + """ + # Don't bother with checks if we're already done + if self.done: + return self.result + self.done = True + + if not self._got_data: + self.logger.debug('no data received!') + + # Default to ASCII if it is all we've seen so far + elif self._input_state == InputState.PURE_ASCII: + self.result = {'encoding': 'ascii', + 'confidence': 1.0, + 'language': ''} + + # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD + elif self._input_state == InputState.HIGH_BYTE: + prober_confidence = None + max_prober_confidence = 0.0 + max_prober = None + for prober in self._charset_probers: + if not prober: + continue + prober_confidence = prober.get_confidence() + if prober_confidence > max_prober_confidence: + max_prober_confidence = prober_confidence + max_prober = prober + if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD): + charset_name = max_prober.charset_name + lower_charset_name = max_prober.charset_name.lower() + confidence = max_prober.get_confidence() + # Use Windows encoding name instead of ISO-8859 if we saw any + # extra Windows-specific bytes + if lower_charset_name.startswith('iso-8859'): + if self._has_win_bytes: + charset_name = self.ISO_WIN_MAP.get(lower_charset_name, + charset_name) + self.result = {'encoding': charset_name, + 'confidence': confidence, + 'language': max_prober.language} + + # Log all prober confidences if none met MINIMUM_THRESHOLD + if self.logger.getEffectiveLevel() == logging.DEBUG: + if self.result['encoding'] is None: + self.logger.debug('no probers hit minimum threshold') + for group_prober in self._charset_probers: + if not group_prober: + continue + if isinstance(group_prober, CharSetGroupProber): + for prober in group_prober.probers: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + else: + self.logger.debug('%s %s confidence = %s', + prober.charset_name, + prober.language, + prober.get_confidence()) + return self.result diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 000000000..457326798 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/utf8prober.py @@ -0,0 +1,82 @@ +######################## BEGIN LICENSE BLOCK ######################## +# The Original Code is mozilla.org code. +# +# The Initial Developer of the Original Code is +# Netscape Communications Corporation. +# Portions created by the Initial Developer are Copyright (C) 1998 +# the Initial Developer. All Rights Reserved. +# +# Contributor(s): +# Mark Pilgrim - port to Python +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA +# 02110-1301 USA +######################### END LICENSE BLOCK ######################### + +from .charsetprober import CharSetProber +from .enums import ProbingState, MachineState +from .codingstatemachine import CodingStateMachine +from .mbcssm import UTF8_SM_MODEL + + + +class UTF8Prober(CharSetProber): + ONE_CHAR_PROB = 0.5 + + def __init__(self): + super(UTF8Prober, self).__init__() + self.coding_sm = CodingStateMachine(UTF8_SM_MODEL) + self._num_mb_chars = None + self.reset() + + def reset(self): + super(UTF8Prober, self).reset() + self.coding_sm.reset() + self._num_mb_chars = 0 + + @property + def charset_name(self): + return "utf-8" + + @property + def language(self): + return "" + + def feed(self, byte_str): + for c in byte_str: + coding_state = self.coding_sm.next_state(c) + if coding_state == MachineState.ERROR: + self._state = ProbingState.NOT_ME + break + elif coding_state == MachineState.ITS_ME: + self._state = ProbingState.FOUND_IT + break + elif coding_state == MachineState.START: + if self.coding_sm.get_current_charlen() >= 2: + self._num_mb_chars += 1 + + if self.state == ProbingState.DETECTING: + if self.get_confidence() > self.SHORTCUT_THRESHOLD: + self._state = ProbingState.FOUND_IT + + return self.state + + def get_confidence(self): + unlike = 0.99 + if self._num_mb_chars < 6: + unlike *= self.ONE_CHAR_PROB ** self._num_mb_chars + return 1.0 - unlike + else: + return unlike diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py new file mode 100644 index 000000000..f24d042f9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/chardet/version.py @@ -0,0 +1,9 @@ +""" +This module exists only to simplify retrieving the version number of chardet +from within setup.py and from chardet subpackages. + +:author: Dan Blanchard (dan.blanchard@gmail.com) +""" + +__version__ = "3.0.4" +VERSION = __version__.split('.') diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py new file mode 100644 index 000000000..10c372dbf --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__init__.py @@ -0,0 +1,7 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from .initialise import init, deinit, reinit, colorama_text +from .ansi import Fore, Back, Style, Cursor +from .ansitowin32 import AnsiToWin32 + +__version__ = '0.3.9' + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0acac5ac6a6ca17e0df457576c0b3240714f0416 GIT binary patch literal 452 zcmXv~%}xR_5Z+yOm!E}rGrR%^D1t;tj8QZmy+C5p#59#%OtIarvt<?E$XDvslTTpc z$qs}`=KJQa(|j}UbXuOX&GPi=*YP(dM+;nV?Yz8mkb0>vJ>^qh1vF4KT2mnneXIvE zQZbEHoz_)@HdK=~_w|}=se~pj4rx1$7G5v@@!hIkXhV?;W8*YCFdVqE(ozFgoSE#y z;Ml!}%!YHmdbQEQ>||!++bxtDdcI9=@=`4IqsYgj&uBOp4`vU&j&0#e!KElOKm|}k z2oWL&HstOZ#F*C+8VF77B-k<f9Tx(g#U_kZ8I(fjjD2}<f};q3Knf5QHyNookhPYn z8zTzH^M<i$Ims`o^nAsNYBV(K>B|P>*?KaYktHca(HD7XxRiZZO{Qb>#<93}_gkK7 gAjdlp#!wAogJNeJmrAEwnO&i(5(RYquHO#+0nWC2U;qFB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99617b06d0303bf93bf45d635baf0ac067297698 GIT binary patch literal 3350 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 HafbUJ0yc?N literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a55f3f3d1cbd7061aadb59362d17edf244db93c GIT binary patch literal 7063 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 PiKkq8j<Q^9Zt;HrnxcW9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23f1327a27b8a2f704609c453542488b60fb958e GIT binary patch literal 1671 zcma)6OK%%D5GJ_~tyT{|nz*guqJj?r1SC-#*R4}DMIWdSJ?K&)DTD?KMx^CcR=etu zlH)+R)IRjm{s#NlU(@?ud&*zvsWVh0+d&I-7c=CLLvr}dH~gm2h#7vP-qzDUD~$a` z#`5#A^A(D*s1#E?WBo<T``p>0FO*PT=8gTn&(T8$C?QG(B~reusz8P3tRJgQ6{+eu z@7GkUYB*BYeAG~N)i`Hoyx&w!wT7c>YF%w$yRP^Tto_bwJehT0bJT5K*1pb7+AE%< z`QC%W0ZlDGft_zr%zLOT2Kl@Sw=A>#j9-XLhM_Usj(6K0c<52q3P^{Ev8tHbvI^R0 zo5(EtgF%SXPW^2=6G&&$>ds6;=cve(2Gbcs=h-Mp4$OZ3*-U*hNG7ufAK9aW;Rv#i zkM<uv?DRU5baF4vjl~`B!C?Pj&;BfF&`C1WxhkMDD6#_NSa#ApwW-Wfqwh~nA;9xD zQ4FEac*NaEZ{SQEp_XEFxBV46bI)vBHfM7_7enui!?xuL@BIt6V&q95bs$6PBPtPm zs+g?gTQ;&jt-y8OS>Q7(5>Hmh*LnSfURCE6zU39js*TOLtzFb@<B}t?LdFhVulw@u z3CPK#Lzx-f8Wj0amJY0Gouu}-CG*o(VUIPmBn%(*V5)oVX6fN@89$cURDTChK<SxN zQ-+Jg0NvFY8sI8rWHjlZiB`)L*2qQ!v>e}<bSp83FH)PRBG+ZOFv<w@Ff|tE3GudH zR^`+djtON2W1nfTWq>=TlhUW%ub2T?D6I4;Z|`EyY@=dglSe_wLlN`P+u}}pKDI!V z{CBdpaOMqJn?%+`SV~eAcC3e%za(wokN~PwsF7-rs*_sLb<uN?g-TOwdpK_*RK%i? znDjpOSCLT3kb8k*c2O-z^gE{XB_{MS7R?hZ8!RF0{kSS1;qK$MYKzjxWMaOapHO=( z7#BxlN$~{nx1ZBFE*ykN@L0eOj;zALK3i3B3yuE=OcOn?0kcl#e**&!7*{$sfcXHI z4TuNy5u~dMyMxBuhuvj`%{|3`^Irw?;DTQ=*qsL>@d~RCUl&2I%Wd?BEmF5ot)3fm zTud{S5RZt^MALQ%AClkA6+nzCD+_wVTZqCMPJWMK=!%T{_}5)>-Avm*>~?$Y4WRd< zjFH5IdzL<P0F^a~ucs|e==F53;DS|-OAbZ{-UhC9C2^JKviWAKvCQQVD~1vWgqb_` pT9A&7F89$F<3dd{{Uznp(1Hj9jYJ)5!WT}wD2R8WO0ybO{sB_gVI=?n literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc8b98983b9be949e33b35c4673fb1f5051a24c4 GIT binary patch literal 3886 zcmai1&2!Yq6<4=DMl=3kY`_>}z<h0(EZ77>Et^mT{J}?+*QV^*cvn?hDtWrc)}WDw zmd3`e;bf|EOC{%A*kk^g9COe$r@beay^!B)jR&v6iN<=}{oYge>)-q6_Wa05#lX|5 zPyFzYvxf068XP`lbROeP|H%wP7@i@R$M$9g7iPpgj@F8J+w@FkNK^8bb-+9uTpL`+ zbC|JV#Iu$mOVVxfR~03gK|f(a%Mqn_hF2D@ZY$p#e_?U_oq?~*_<G12Y7cwE?GbOJ zJ?f2Oey4THt3ESCMGU<&#E=|5FugHpx5itiy)%%W-D2{LKY`vkw3AwL-kZ|nQ8{+N zwz!<q@(XASdD)xRa;J3>(&@f*x-Y%tUDnbnWS9H0%YE65cSXxaK+npm9Hka(*z!tW z^GaXys&`FmVvSF9ul04W^>wd%H=y$cc5<UHxdDkG&q(8dN$gLu0~T`cS7KO<0KJ=H zRGdOvkw%k=su+96yz^pQoYu%*6lcW*IG4mZF$qphoEKAQuZjy|8tt!zxo*@hh5z~R z;Y0Xuke|r!D>asnEQgyaP<zWsAfy7r-3{YxuOrh2snCOf(C;&}sRbeoOvYCJ4w5rp z5lfSwlevxxcY;jL?F4GBnM9Z}oolPP&6e*!NbkpA?TFtt{LaqZJ6ZF=R!c>{Y2N?( z>$&<|C+yq~<1`DR=(cLye{e5*9S~E${*H`AqUIV&l&GK`%)!KacV|0$x%)5*+M6PH zG)lJNHB<@Y|C+ANtubZO7X$m1b2z~%bo6vJE4MfIlx*hZ^-OgeSy##2Y50xpK;@;E zt1njSOKXGW@RdPxJjR<o0+EKtgn{&7o+-Grnn)*2Ed;HDk&U*5)*<ee?IA^k3x}0O z85mdcsfE>*_0{Die|=$XX=%lu|MuzAr8WP>%G1^T)2X&-CX8nQNF#}7w`X%l?5>CV zGOvo=g|12y^)gArEKK5jX!l8$sc^HK$uxIUwGjf;-TbuJ{U&%5w!7_uL0>n><@8WH zjCTQV`W!^Cp3yQ|1?A|Qx^K3qZ{fwZG%acBYFY-ZXuV2{H-{!DeE7=#)tfiOt^fH~ zs|~3UteUg$bM~DgCo6J|suI(zC!O3{md(s_=94T-+Mc}@Zf$333}VElmCC4j%)NQZ z_ko-5UxH3bdovhk!}wWjlI>qT8SmNthbwT4>-%xgmcE}?e7~KDZbbcI-+$c=qP_$R ziKGFxy|B8vwx~=jm0KI=dX@EWo-8l>YfB4tOw|l!BvN0UgTfJOby(_%Br8#`jg$az znZ+IEFc-fHS0o#_i<Y3zw7aI!$&3TzEz97pjQ3Db4)|N1nLU2MbOzTf{e6DHe<rhq zBu<k^t~ZpF@qD-0l<Gy?Oq7dxa%(e5qMDgI+d(WMnOlu?Gt5hAx6zPkdc<ln7(gH( zgHGrp)Up7alqNA?H9@Vequ(IL;WMy#0-Ov%CipueWAFKo#v;n0w$@x3Y?DKawn`bA z(kDIRhf!?Ppe_CpLHnBbOB7O^7OU}`&)&(|_Ax_$E<fCov3%1}kG5$pn%FY-FCDRd z_F<GXf+&47J5U7-W)Sb?r2>mIcXooPE03Z;8`9MTS@#i%t;018roKdfupv?(U@(IL zwql&uo`e55`L6I9{0HwH`mP2|?Lc*zdW13RRT<$egSH<Eb%oehiCiP1t@>!%)X7e7 zK|R%%1w>ijYq!B`5JL12{PZs1O~*m{7IVZJMOxoRuE@rG(qA9MS6#lz28F0*s#~OB z2PjQxVec_3&z<n;Yg(Cf4Vb9zpshE^B6=tYNu;gYL5D))&%m?CT1>E4ES*LVRrwWD zGZZQ$hlEd3i_6ZWQ6Q~EW@fnRwCuN5&$OuUSuN))gBw26V~%l2k9me-2cOwlxo7uG zjexnLsDl1Pq*hUsk&3`lr-=}txwBqhT>ZALE1Eh(Y|8Wkw)00|`(-h&IR$QR=dijv zfoOHpEFUXcDg1$mr|PrFPJTr8m$P?aK}xm&T7HIE)&y!!g;iOV1L_ChH#G3*&}mDr zMtUBdejHec1D(GI42fyJw|e|XMz!a?B^Y{kX7{Wf#fq6ZJsUZ0zeU?B>7zlTR&zB9 zio!5=Bn~*-Cdk9Ny+~CwpZ1@IQPeM6tKF>A%@%Mh2aQasCq>z^b!OH|1zMIqwVg=D zTiJGQqco{ZBa;us-L}80!Yq^V=X2%crTzqybY-SM9A*_%WzNQ#dIJ9Earzx3A8~q* ze9?%o_sDIH5_%dXC$oT(tx>Xj4xvQ&><2TSm@`PJn={*eNN&wgk)Azr?BANftssf% zh=(vqlqjnGt(h+x1YNpOKrmA)Jm3@_AkfuCB4jyEi<4I`iqIk6l+}vvLFx}gs2t^G zV(MFndQ8k?={|Mx+<%37abhD30kZ~LErB~Iq?Bk>qI5V?JtUY94?C8R9Z9Hqm_>2} zw*)(*-f=rleM}Cm`8Q0a&j-}*=jhj1z4oQLi=Iy5rL{F&3-!HOkpZ5A+tlLna_*r1 zizq4rcXZ&TC8ZLT54~u25|!zJE@Apu&=@NEhfK%58q)Lm#VtbD5IXd8_mxz!jPBj_ zhEd4ZGx1y>&E5zd=7VA3GB;3L+Bna7{$yowc_}X`9L>1q>nfzr56_xkU0qhQw61nG zCAzvti(mM}DMu3R_oPN%P?Y~(^%!s)>M5~H%P$u;*6V9UL|rF!N)V0Z5$ts|=sSe_ zu(($}B32rMSg1n0pJP>In1z0oPjZJ>$6a3GE`Amp?ze|y;u4=jpR>{a2y+ca&@_>` Rrt7%oaLKhQ<8H;R{1*z1c?AFf literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f29c16c5e9ddd9a50ed660fe5ee2f292874238d GIT binary patch literal 4575 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py new file mode 100644 index 000000000..8530fd01a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansi.py @@ -0,0 +1,102 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +''' +This module generates ANSI character codes to printing colors to terminals. +See: http://en.wikipedia.org/wiki/ANSI_escape_code +''' + +CSI = '\033[' +OSC = '\033]' +BEL = '\007' + + +def code_to_chars(code): + return CSI + str(code) + 'm' + +def set_title(title): + return OSC + '2;' + title + BEL + +def clear_screen(mode=2): + return CSI + str(mode) + 'J' + +def clear_line(mode=2): + return CSI + str(mode) + 'K' + + +class AnsiCodes(object): + def __init__(self): + # the subclasses declare class attributes which are numbers. + # Upon instantiation we define instance attributes, which are the same + # as the class attributes but wrapped with the ANSI escape sequence + for name in dir(self): + if not name.startswith('_'): + value = getattr(self, name) + setattr(self, name, code_to_chars(value)) + + +class AnsiCursor(object): + def UP(self, n=1): + return CSI + str(n) + 'A' + def DOWN(self, n=1): + return CSI + str(n) + 'B' + def FORWARD(self, n=1): + return CSI + str(n) + 'C' + def BACK(self, n=1): + return CSI + str(n) + 'D' + def POS(self, x=1, y=1): + return CSI + str(y) + ';' + str(x) + 'H' + + +class AnsiFore(AnsiCodes): + BLACK = 30 + RED = 31 + GREEN = 32 + YELLOW = 33 + BLUE = 34 + MAGENTA = 35 + CYAN = 36 + WHITE = 37 + RESET = 39 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 90 + LIGHTRED_EX = 91 + LIGHTGREEN_EX = 92 + LIGHTYELLOW_EX = 93 + LIGHTBLUE_EX = 94 + LIGHTMAGENTA_EX = 95 + LIGHTCYAN_EX = 96 + LIGHTWHITE_EX = 97 + + +class AnsiBack(AnsiCodes): + BLACK = 40 + RED = 41 + GREEN = 42 + YELLOW = 43 + BLUE = 44 + MAGENTA = 45 + CYAN = 46 + WHITE = 47 + RESET = 49 + + # These are fairly well supported, but not part of the standard. + LIGHTBLACK_EX = 100 + LIGHTRED_EX = 101 + LIGHTGREEN_EX = 102 + LIGHTYELLOW_EX = 103 + LIGHTBLUE_EX = 104 + LIGHTMAGENTA_EX = 105 + LIGHTCYAN_EX = 106 + LIGHTWHITE_EX = 107 + + +class AnsiStyle(AnsiCodes): + BRIGHT = 1 + DIM = 2 + NORMAL = 22 + RESET_ALL = 0 + +Fore = AnsiFore() +Back = AnsiBack() +Style = AnsiStyle() +Cursor = AnsiCursor() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 000000000..0cb9efcfc --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,236 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import re +import sys +import os + +from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style +from .winterm import WinTerm, WinColor, WinStyle +from .win32 import windll, winapi_test + + +winterm = None +if windll is not None: + winterm = WinTerm() + + +def is_stream_closed(stream): + return not hasattr(stream, 'closed') or stream.closed + + +def is_a_tty(stream): + return hasattr(stream, 'isatty') and stream.isatty() + + +class StreamWrapper(object): + ''' + Wraps a stream (such as stdout), acting as a transparent proxy for all + attribute access apart from method 'write()', which is delegated to our + Converter instance. + ''' + def __init__(self, wrapped, converter): + # double-underscore everything to prevent clashes with names of + # attributes on the wrapped stream object. + self.__wrapped = wrapped + self.__convertor = converter + + def __getattr__(self, name): + return getattr(self.__wrapped, name) + + def write(self, text): + self.__convertor.write(text) + + +class AnsiToWin32(object): + ''' + Implements a 'write()' method which, on Windows, will strip ANSI character + sequences from the text, and if outputting to a tty, will convert them into + win32 function calls. + ''' + ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer + ANSI_OSC_RE = re.compile('\001?\033\\]((?:.|;)*?)(\x07)\002?') # Operating System Command + + def __init__(self, wrapped, convert=None, strip=None, autoreset=False): + # The wrapped stream (normally sys.stdout or sys.stderr) + self.wrapped = wrapped + + # should we reset colors to defaults after every .write() + self.autoreset = autoreset + + # create the proxy wrapping our output stream + self.stream = StreamWrapper(wrapped, self) + + on_windows = os.name == 'nt' + # We test if the WinAPI works, because even if we are on Windows + # we may be using a terminal that doesn't support the WinAPI + # (e.g. Cygwin Terminal). In this case it's up to the terminal + # to support the ANSI codes. + conversion_supported = on_windows and winapi_test() + + # should we strip ANSI sequences from our output? + if strip is None: + strip = conversion_supported or (not is_stream_closed(wrapped) and not is_a_tty(wrapped)) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not is_stream_closed(wrapped) and is_a_tty(wrapped) + self.convert = convert + + # dict of ansi codes to win32 functions and parameters + self.win32_calls = self.get_win32_calls() + + # are we wrapping stderr? + self.on_stderr = self.wrapped is sys.stderr + + def should_wrap(self): + ''' + True if this class is actually needed. If false, then the output + stream will not be affected, nor will win32 calls be issued, so + wrapping stdout is not actually required. This will generally be + False on non-Windows platforms, unless optional functionality like + autoreset has been requested using kwargs to init() + ''' + return self.convert or self.strip or self.autoreset + + def get_win32_calls(self): + if self.convert and winterm: + return { + AnsiStyle.RESET_ALL: (winterm.reset_all, ), + AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT), + AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL), + AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL), + AnsiFore.BLACK: (winterm.fore, WinColor.BLACK), + AnsiFore.RED: (winterm.fore, WinColor.RED), + AnsiFore.GREEN: (winterm.fore, WinColor.GREEN), + AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW), + AnsiFore.BLUE: (winterm.fore, WinColor.BLUE), + AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA), + AnsiFore.CYAN: (winterm.fore, WinColor.CYAN), + AnsiFore.WHITE: (winterm.fore, WinColor.GREY), + AnsiFore.RESET: (winterm.fore, ), + AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True), + AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True), + AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True), + AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True), + AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True), + AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True), + AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True), + AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True), + AnsiBack.BLACK: (winterm.back, WinColor.BLACK), + AnsiBack.RED: (winterm.back, WinColor.RED), + AnsiBack.GREEN: (winterm.back, WinColor.GREEN), + AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW), + AnsiBack.BLUE: (winterm.back, WinColor.BLUE), + AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA), + AnsiBack.CYAN: (winterm.back, WinColor.CYAN), + AnsiBack.WHITE: (winterm.back, WinColor.GREY), + AnsiBack.RESET: (winterm.back, ), + AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True), + AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True), + AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True), + AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True), + AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True), + AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True), + AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True), + AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True), + } + return dict() + + def write(self, text): + if self.strip or self.convert: + self.write_and_convert(text) + else: + self.wrapped.write(text) + self.wrapped.flush() + if self.autoreset: + self.reset_all() + + + def reset_all(self): + if self.convert: + self.call_win32('m', (0,)) + elif not self.strip and not is_stream_closed(self.wrapped): + self.wrapped.write(Style.RESET_ALL) + + + def write_and_convert(self, text): + ''' + Write the given text to our wrapped stream, stripping any ANSI + sequences from the text, and optionally converting them into win32 + calls. + ''' + cursor = 0 + text = self.convert_osc(text) + for match in self.ANSI_CSI_RE.finditer(text): + start, end = match.span() + self.write_plain_text(text, cursor, start) + self.convert_ansi(*match.groups()) + cursor = end + self.write_plain_text(text, cursor, len(text)) + + + def write_plain_text(self, text, start, end): + if start < end: + self.wrapped.write(text[start:end]) + self.wrapped.flush() + + + def convert_ansi(self, paramstring, command): + if self.convert: + params = self.extract_params(command, paramstring) + self.call_win32(command, params) + + + def extract_params(self, command, paramstring): + if command in 'Hf': + params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';')) + while len(params) < 2: + # defaults: + params = params + (1,) + else: + params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0) + if len(params) == 0: + # defaults: + if command in 'JKm': + params = (0,) + elif command in 'ABCD': + params = (1,) + + return params + + + def call_win32(self, command, params): + if command == 'm': + for param in params: + if param in self.win32_calls: + func_args = self.win32_calls[param] + func = func_args[0] + args = func_args[1:] + kwargs = dict(on_stderr=self.on_stderr) + func(*args, **kwargs) + elif command in 'J': + winterm.erase_screen(params[0], on_stderr=self.on_stderr) + elif command in 'K': + winterm.erase_line(params[0], on_stderr=self.on_stderr) + elif command in 'Hf': # cursor position - absolute + winterm.set_cursor_position(params, on_stderr=self.on_stderr) + elif command in 'ABCD': # cursor position - relative + n = params[0] + # A - up, B - down, C - forward, D - back + x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command] + winterm.cursor_adjust(x, y, on_stderr=self.on_stderr) + + + def convert_osc(self, text): + for match in self.ANSI_OSC_RE.finditer(text): + start, end = match.span() + text = text[:start] + text[end:] + paramstring, command = match.groups() + if command in '\x07': # \x07 = BEL + params = paramstring.split(";") + # 0 - change title and icon (we will only change title) + # 1 - change icon (we don't support this) + # 2 - change title + if params[0] in '02': + winterm.set_title(params[1]) + return text diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py new file mode 100644 index 000000000..7f0315665 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/initialise.py @@ -0,0 +1,82 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +import atexit +import contextlib +import sys + +from .ansitowin32 import AnsiToWin32 + + +orig_stdout = None +orig_stderr = None + +wrapped_stdout = None +wrapped_stderr = None + +atexit_done = False + + +def reset_all(): + if AnsiToWin32 is not None: # Issue #74: objects might become None at exit + AnsiToWin32(orig_stdout).reset_all() + + +def init(autoreset=False, convert=None, strip=None, wrap=True): + + if not wrap and any([autoreset, convert, strip]): + raise ValueError('wrap=False conflicts with any other arg=True') + + global wrapped_stdout, wrapped_stderr + global orig_stdout, orig_stderr + + orig_stdout = sys.stdout + orig_stderr = sys.stderr + + if sys.stdout is None: + wrapped_stdout = None + else: + sys.stdout = wrapped_stdout = \ + wrap_stream(orig_stdout, convert, strip, autoreset, wrap) + if sys.stderr is None: + wrapped_stderr = None + else: + sys.stderr = wrapped_stderr = \ + wrap_stream(orig_stderr, convert, strip, autoreset, wrap) + + global atexit_done + if not atexit_done: + atexit.register(reset_all) + atexit_done = True + + +def deinit(): + if orig_stdout is not None: + sys.stdout = orig_stdout + if orig_stderr is not None: + sys.stderr = orig_stderr + + +@contextlib.contextmanager +def colorama_text(*args, **kwargs): + init(*args, **kwargs) + try: + yield + finally: + deinit() + + +def reinit(): + if wrapped_stdout is not None: + sys.stdout = wrapped_stdout + if wrapped_stderr is not None: + sys.stderr = wrapped_stderr + + +def wrap_stream(stream, convert, strip, autoreset, wrap): + if wrap: + wrapper = AnsiToWin32(stream, + convert=convert, strip=strip, autoreset=autoreset) + if wrapper.should_wrap(): + stream = wrapper.stream + return stream + + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py new file mode 100644 index 000000000..1485e69f4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/win32.py @@ -0,0 +1,156 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. + +# from winbase.h +STDOUT = -11 +STDERR = -12 + +try: + import ctypes + from ctypes import LibraryLoader + windll = LibraryLoader(ctypes.WinDLL) + from ctypes import wintypes +except (AttributeError, ImportError): + windll = None + SetConsoleTextAttribute = lambda *_: None + winapi_test = lambda *_: None +else: + from ctypes import byref, Structure, c_char, POINTER + + COORD = wintypes._COORD + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", wintypes.WORD), + ("srWindow", wintypes.SMALL_RECT), + ("dwMaximumWindowSize", COORD), + ] + def __str__(self): + return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % ( + self.dwSize.Y, self.dwSize.X + , self.dwCursorPosition.Y, self.dwCursorPosition.X + , self.wAttributes + , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right + , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X + ) + + _GetStdHandle = windll.kernel32.GetStdHandle + _GetStdHandle.argtypes = [ + wintypes.DWORD, + ] + _GetStdHandle.restype = wintypes.HANDLE + + _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + _GetConsoleScreenBufferInfo.argtypes = [ + wintypes.HANDLE, + POINTER(CONSOLE_SCREEN_BUFFER_INFO), + ] + _GetConsoleScreenBufferInfo.restype = wintypes.BOOL + + _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + _SetConsoleTextAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + ] + _SetConsoleTextAttribute.restype = wintypes.BOOL + + _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition + _SetConsoleCursorPosition.argtypes = [ + wintypes.HANDLE, + COORD, + ] + _SetConsoleCursorPosition.restype = wintypes.BOOL + + _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA + _FillConsoleOutputCharacterA.argtypes = [ + wintypes.HANDLE, + c_char, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputCharacterA.restype = wintypes.BOOL + + _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute + _FillConsoleOutputAttribute.argtypes = [ + wintypes.HANDLE, + wintypes.WORD, + wintypes.DWORD, + COORD, + POINTER(wintypes.DWORD), + ] + _FillConsoleOutputAttribute.restype = wintypes.BOOL + + _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW + _SetConsoleTitleW.argtypes = [ + wintypes.LPCWSTR + ] + _SetConsoleTitleW.restype = wintypes.BOOL + + handles = { + STDOUT: _GetStdHandle(STDOUT), + STDERR: _GetStdHandle(STDERR), + } + + def _winapi_test(handle): + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return bool(success) + + def winapi_test(): + return any(_winapi_test(h) for h in handles.values()) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = handles[stream_id] + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = handles[stream_id] + return _SetConsoleTextAttribute(handle, attrs) + + def SetConsoleCursorPosition(stream_id, position, adjust=True): + position = COORD(*position) + # If the position is out of range, do nothing. + if position.Y <= 0 or position.X <= 0: + return + # Adjust for Windows' SetConsoleCursorPosition: + # 1. being 0-based, while ANSI is 1-based. + # 2. expecting (x,y), while ANSI uses (y,x). + adjusted_position = COORD(position.Y - 1, position.X - 1) + if adjust: + # Adjust for viewport's scroll position + sr = GetConsoleScreenBufferInfo(STDOUT).srWindow + adjusted_position.Y += sr.Top + adjusted_position.X += sr.Left + # Resume normal processing + handle = handles[stream_id] + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = handles[stream_id] + char = c_char(char.encode()) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + success = _FillConsoleOutputCharacterA( + handle, char, length, start, byref(num_written)) + return num_written.value + + def FillConsoleOutputAttribute(stream_id, attr, length, start): + ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )''' + handle = handles[stream_id] + attribute = wintypes.WORD(attr) + length = wintypes.DWORD(length) + num_written = wintypes.DWORD(0) + # Note that this is hard-coded for ANSI (vs wide) bytes. + return _FillConsoleOutputAttribute( + handle, attribute, length, start, byref(num_written)) + + def SetConsoleTitle(title): + return _SetConsoleTitleW(title) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py new file mode 100644 index 000000000..385862e19 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/colorama/winterm.py @@ -0,0 +1,162 @@ +# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file. +from . import win32 + + +# from wincon.h +class WinColor(object): + BLACK = 0 + BLUE = 1 + GREEN = 2 + CYAN = 3 + RED = 4 + MAGENTA = 5 + YELLOW = 6 + GREY = 7 + +# from wincon.h +class WinStyle(object): + NORMAL = 0x00 # dim text, dim background + BRIGHT = 0x08 # bright text, dim background + BRIGHT_BACKGROUND = 0x80 # dim text, bright background + +class WinTerm(object): + + def __init__(self): + self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes + self.set_attrs(self._default) + self._default_fore = self._fore + self._default_back = self._back + self._default_style = self._style + # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style. + # So that LIGHT_EX colors and BRIGHT style do not clobber each other, + # we track them separately, since LIGHT_EX is overwritten by Fore/Back + # and BRIGHT is overwritten by Style codes. + self._light = 0 + + def get_attrs(self): + return self._fore + self._back * 16 + (self._style | self._light) + + def set_attrs(self, value): + self._fore = value & 7 + self._back = (value >> 4) & 7 + self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND) + + def reset_all(self, on_stderr=None): + self.set_attrs(self._default) + self.set_console(attrs=self._default) + + def fore(self, fore=None, light=False, on_stderr=False): + if fore is None: + fore = self._default_fore + self._fore = fore + # Emulate LIGHT_EX with BRIGHT Style + if light: + self._light |= WinStyle.BRIGHT + else: + self._light &= ~WinStyle.BRIGHT + self.set_console(on_stderr=on_stderr) + + def back(self, back=None, light=False, on_stderr=False): + if back is None: + back = self._default_back + self._back = back + # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style + if light: + self._light |= WinStyle.BRIGHT_BACKGROUND + else: + self._light &= ~WinStyle.BRIGHT_BACKGROUND + self.set_console(on_stderr=on_stderr) + + def style(self, style=None, on_stderr=False): + if style is None: + style = self._default_style + self._style = style + self.set_console(on_stderr=on_stderr) + + def set_console(self, attrs=None, on_stderr=False): + if attrs is None: + attrs = self.get_attrs() + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleTextAttribute(handle, attrs) + + def get_position(self, handle): + position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition + # Because Windows coordinates are 0-based, + # and win32.SetConsoleCursorPosition expects 1-based. + position.X += 1 + position.Y += 1 + return position + + def set_cursor_position(self, position=None, on_stderr=False): + if position is None: + # I'm not currently tracking the position, so there is no default. + # position = self.get_position() + return + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + win32.SetConsoleCursorPosition(handle, position) + + def cursor_adjust(self, x, y, on_stderr=False): + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + position = self.get_position(handle) + adjusted_position = (position.Y + y, position.X + x) + win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False) + + def erase_screen(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the screen. + # 1 should clear from the cursor to the beginning of the screen. + # 2 should clear the entire screen, and move cursor to (1,1) + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + # get the number of character cells in the current buffer + cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y + # get number of character cells before current cursor position + cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = cells_in_screen - cells_before_cursor + if mode == 1: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_before_cursor + elif mode == 2: + from_coord = win32.COORD(0, 0) + cells_to_erase = cells_in_screen + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + if mode == 2: + # put the cursor where needed + win32.SetConsoleCursorPosition(handle, (1, 1)) + + def erase_line(self, mode=0, on_stderr=False): + # 0 should clear from the cursor to the end of the line. + # 1 should clear from the cursor to the beginning of the line. + # 2 should clear the entire line. + handle = win32.STDOUT + if on_stderr: + handle = win32.STDERR + csbi = win32.GetConsoleScreenBufferInfo(handle) + if mode == 0: + from_coord = csbi.dwCursorPosition + cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X + if mode == 1: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwCursorPosition.X + elif mode == 2: + from_coord = win32.COORD(0, csbi.dwCursorPosition.Y) + cells_to_erase = csbi.dwSize.X + # fill the entire screen with blanks + win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord) + # now set the buffer's attributes accordingly + win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord) + + def set_title(self, title): + win32.SetConsoleTitle(title) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py new file mode 100644 index 000000000..94307188b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__init__.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import logging + +__version__ = '0.2.7' + +class DistlibException(Exception): + pass + +try: + from logging import NullHandler +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): + def handle(self, record): pass + def emit(self, record): pass + def createLock(self): self.lock = None + +logger = logging.getLogger(__name__) +logger.addHandler(NullHandler()) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d3bc43fdd742924d1d76cd9477958893a907b7c GIT binary patch literal 1050 zcma)5&2G~`5T11$Cvn;;6jbp52+4=WrBJn%5UPL*kg6P@5@3N=u6GlhZtQgIMzrGA zK1h4ymG;VsSK!2q-8KbrU{*Vx-Tmfgza2kcT=aotyub4KlLPRB7uV7zV~1vuky4<9 zfe4fniC3T+$~_0=YUivGHBNeT+B7h6BUiwC$R4_&n}<HW6~Ke=o@x=krD5!mhx-vS z=L2ZCXzBK)h&sA+;cNE{E`^{x?;vRZq?|A~ZLam#`<n?bu0@csL$g>Qr6CduBBye4 zZ0}`SlqNmc{hH`$ndaFbXxO%tSv=8FT3^aZu8s}c3sN2($EH5{4(L&|O8q(tr<l&- zQirn`!(nce#v+_xcrcc7tJugkXX;5Jr?d67a=0}bqj@yk*xnBJ!)ZEQO|znmjakKH zW9xBw6!T^^<xFQP$57QJhEk?kT1wfUo*+>VUA_|=ZBeZQVY`E4V_wIZG8+HjfMGj~ ze?V%^fpX3vYSfPtxvHr=S~pdT2}OR+gdJJ<%S67QS-7MW5J(Iv1_H;rg*HR$p-ysC zb8fIjQ0slEN?K-LnsB;&tImFX_`jL3LjjPR@b4_Ho}}enI;eB>Zs*{mgzIPFFW;xS z3rAA$4dnHWh(_1s$zdSsR5$Nj-^EW*(^Kye;vTuyxmIrHnga%bhYbQD6NXJz{AkFH zh)b;I!7Gc|s(8OcM!{Qc!K2y>y0&HV(J0MEwkxSSu%L#e&g|TDZ`B7C*mmDcra6|o zh&kHURZrN?NSAvQLt|B#^*EqL>&Hr6Vg6N<Z9lF5gJ)b}(c{7#*XcDJ(GyGJe$yAf E0sD90W&i*H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..611a5df5e869e2b521b7cf40da7eb8d761c66c97 GIT binary patch literal 32060 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8dfec9bdfbc19ed34ff07b622be15ffcb296e70e GIT binary patch literal 42533 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 Hg+2cpjCg4d literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08f8b796e184393ab10e810a46928ee7ad835319 GIT binary patch literal 17346 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7a985d6013d1c756d5c9e3a17c9ba0d9eb976c3 GIT binary patch literal 38653 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 LV9y&_qmcSv7?+kW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a49e126e59021dc17089d348180b714a44f3275 GIT binary patch literal 10298 zcmb_iOKjXodgiN1_Cu}5c;v@8UXEwHQX6t>p1U5e*E1el-u136JCb&sXf@NKnrx{h zHrc9TTT+L;2u9vVfFzjQa!Mp1ha`t!&x@RM53mRVVh;gwnmy(cz^8nF@zHI`9_%3! zSS%K+epdbeU*G?z{&Z}tB;jv+W%_gHdy@3u^pO1(Q27KG{|6L~v?@8Wqj>VFEbhvx zBJS#{D(>2<ChmpRf}=W`r+181LzYl4cxI=#S`>BND|O1NWz>yLd9~syM`LdFSY91> zwWA5gbhYitV`X(pJQe8)*K40jXglK;wqJJ?r}T5>ytF#~1IZ~n#xu}y&mO9)=Nx5O zs#W^E(jCv{++uE*x!m=`w!dkGTdw7`d1wVKtJU^gZnb^Owj4CE_C_yk2Y$U&TG;Ki zpV}VASYaSu;*H1aG=fIYS?G%K`xwuIj%#&Uu;IBKUN3zO21$!w%P4DdJaHGjz4pe! ze$(v|akQB&?zqjsaZ#@{1OKVZ!baB)w_@|5?YCPl5Br6+wY{sQ{={4Ls~^vP{QXib zD&h8a?P~>eoAin7PetVuT)dCMl^_v`qyb6%5%K<+3|SN${h0(=7><d%?i8I8?uK*8 zsW@ZkVLDZ394$p>!kNUq<V-oQ;a+yW<-G1pqesQDoU_h3)W)1Qo%7BG)T+)K&PDVZ z7yQ1=bWEWCv)d=wyU}ZVp|x>f1-|9(cfEjRVi4><;Gx^GY~LYigf4R(^etKVv%6jI zfcieQSv%-)3oJqhpOZ-Tw(QW_b1?`bAyeko#h}F|F^K-?PBXfLi{C;KO55_0B1$!q zyVId`q#aAg^06FAjY1@C7w}F$E8)p-sLc$EhxAl(WayL9cf=QHYWMwi*tVevE@ln| z;-T#~F@wCrjjqk?j<sQP_lC6sm7^N;h`G%$U<b5<gcq*W^BtEZlPA)PwQ{TkJl2Fl z81@EFG{X;AN7VF9H*D@Xu|_0gmAl<ohkipBW7GCL!BlDv<ASKylvv}g*J5Mf!9Pjt z3~tYN=erCF9=h{j?tCloFb6*0Ve=c?jmCBUq5s{d&Iip#_vw4@gstnF+su2n_2EY! z&9BUN+udto!Jc=GH9x%mez<E>qqrJRUEc}VJnbeZ{d^}?=X&=bHXDsL*w$!VC4rbI zB>j?Hm36s4nW=p}>(iv|Lw{9VggruvzeYviiqw$@az_~`9d)3}(x#-5oV0;PQXCYb z!lpdXBYj&R7$}W_xgSP4`{&3wlm>;+JSs+oV|h^AUyX`)rO%fJrO@0i9hIX(R614$ zW%Q7uGI~^^%64Ti7Rk}rq0Ig=(vFO9EGi#DXJl!2DN;oHQl!$IFGVK3qc=~a-Rn<) zchDQH-?>Lh3fZK9BP1?>NN5G=KE!3MuV><0Und12q=NVZuNS(xVv!2?b_cMN<5w#H z!Jz^%fjnw#EH~~iFD?8asocH4lvExp{&=xgg-V2W$j*YH>>L&6shFUG)Ff8B0n`dR z5b|UstJomeg95W6J!#uP+m8(%HafsDrlGA?Wv}7(GMcf*f&lu6Z#H+>8-hT$$G75w zSW2wX4Y1hrJgTt^qKBYN+A36*y-tk=?RT*0BRufSC?xHSQi2YNe}&2to~tUgneqhw z`xCi#rGsC9h+Mfo0I^7h-~kiIGQSuq+v<@}s7QuV01&oyh@V<bv<MYQfuWy^=e7eu z3o&OB%(uWPaA*Vg5^%_bN@HxtsRJ?E+-d?^He6UQ&koy9-HagV%uw2kwPIWXUs=fa z+Tj)($0~%tgq+wVdL)UmDHO2^>a2`fO%cM1HJU`iU%_c&GOM9j!NmzaCA~sStmI4t ziJXCCdr0<TcV0wge>#$}qpAZXlE6wu>=PY3AwkezoM6<8hB(#vZ{`?(k!8Xdq&$O- z|3jH3i$&JdgbM}Y0%rtFCwKu!b({ufbnpdUa$2jTmqrmQdw(xy3TYH^j+nz+D1IsZ zQf>(c>6!T#FhjqRx8*|_ERxxeLJ5$h?q7-&ux)yv{Yr||RP(fB`A`9v%sv4lBlVFq zP=rC3!a`!uY0M!gQ3;?i`qy*zF1cZk`EX5G2!kr@0QosX0~9c9+q`=|cUmA_w3GRd zPzW&!T@PVAVHU9$Wb6~HLETZ=y-?dO9O<+l)&R!?HBua9$KW?Z<4YN9!OUq5j)eKC zi~R}W7A8Sjj(J_-Fiz5QdA?=}dBnOGY;L+NE;#N+Z!=L`LZ1Y53cTyJ!?=2zb9hYf zr4|?qSWSyHkmRxKz!2IDK3gm|K-fq>mcY_by}t{B9<8r}LXt~z1=j@1zLhI^!npcP zFKF5xzg163<z|VT3*yr<E=~ZtiM4({F_6i<*oI{PTKXGhS6fc>33`^VLTpLQPN~1M zTB42L2zy=6J)w8cOE+n6G=om}7Ws8N@n-sOy>f=b{--9%i2z|LrZ|;M@d#5qmOqoA zUWyQoy!gT--$id=#C6;fAQ9}#dHB3|bJO+V!LVC@M#K|#^e?}9c3JnD&L)W{!O@T@ zu>lDRBcLaouN8#UR?R)zC#%C_9WH#&3)%Y^7|SieFU*jHnFv@w*G)Wb;^IVKDpbvq ztdUKSr(q4?X^fwkVa_WunzRamWHgvICVUE+1lxe(3lH$Z9nZC)y)fm?!1LhDWxK0R z{2Q)}ENM+1(Y%~>aiK{x2I!E$iDJtAYCbLTGT)A*HMtM_40Fu3<C;dBZJ@!|!Q6Hf zc5naNkqQX81iuF=80m<P)W1>ykIE6EfJmopyK6m>zLNbL7*oI)fB%9QGbP5LPcmj; z?5>D@Q|PCo-_a@BhM*k@+Ga{SdLsG%g%L%J__zK4I6+yA0Ofx{uiv0o3B8{0|6262 zvN=bZQ^uTsE9h1tJ<^U<%=)(&^9zg_+flxf+1vYlG3rb<>txix_)6X_q30TURz=ST z#0h6SDiGDLWd7%Z?gV^4@WTH9{U$}f5dE}M{if1>6~OIlkunXC{Swrm2WRZ35Je82 zk6F-k5oS^lN&Y?A>b<RYbIWpJkzE0HX_S}%af=0=liprVZGByIT3?^D0tVyX37%## z<_n|KUZ-P@d=iPF%pb{rK$J>TO&tur74$rWTW%5pw-902VLlNGM)E%bB6uMPaV>H) zh7mE=@$mNI{d)_`EA_U&zMj~c8$)L&Cqb31Fznu#pLc>LM@SHEA=VDqrU(~Ad_B*D z9&5T3KGe6uj`tS6+kt<~^I644+i!Y3$6Z12tRw2$3RwSwAEY);_`(*J(cGfQ@d}F# zcVG1HS2w+2!}buoi06C#_g_5<QQg5F1(k`>9Hs_xDjC&DNW8~5WS$YmwkId7f9)H{ zClNp*8VU!mu>J_4ly+R$WOgfD>|3Ce^=(5LPA{_1Wj){Re}Ik%1)oy1>>XqiLgb#t zoi82SpKSX`b+qBQLU$3QUtu*po<Kr^ahHsBqS9zdIY+4qio@AFmKhs+HuJ%2yiezy zzb6L>mYsZwxHu%FC*O(9ln$^R+XU~Cc4)J-F*dSFK`i%#eT*klRUS_8OMHgkMInt( z6-+>WRXzi31@xy+x?B;@XY}N)E>{sM;5{6=2?`hRB<`9b_b=p#eCk6vIve;FIRV0E z08&Kwa11vsl;QRuGX{*C1Ii#r<)}Lb)!{-ZjwW0v(LO*%Op^v0t^)8(1>WjxKOJxE zNNhb+9Wzo>^bvU*P?VhlWxmMq8)*K|Fs_Vo|C)}gVBFtg+*md))M(6k>Rmvl2e}_S z8!ynf0UG0=@%#MSD*GL1OuU4K?pN?;GJAvQS3~5ix8Uy7ruu)M@72#ptB_+DMaE&| zlBP&<y?6;+3AF@)kwHv2wl}QXmT;RW3Qp8%E>925QRED=bENl~G7b@hk(p0|WRrbD z^-odc8#`6<{Q1=z{UuwLkt#4!LP2@4rv2exV5Cm{x34hD3}Mf4>t?zI-o2Gq-@9ei z>-F4gp{3+*D7hHI4Xu!m7a=ehbwOoDaY^da#o8VMfD?O)QBeJRT$!_ZE#Ctt!C>eZ z58X~A$VM<MW8+9u%E_+@7W!95*9kcdm-zp`TJ{)UeA#0EXSi4}CYN3R&5_C376-b) z?%f>Grd$2Vp1<P<dq^GUpjlw#HODHl#<7kR8DbPhYfTt$B+lS{>QW%?b4KwM`!N*{ zP$1blRM(TUT|kF_$HnU?BmmesgTM@zQjrzpJkHURs8!@)y{cA}{`psmaivK*L4Pke znk#5<02PU|NwFs!F)eY@5Z#&V+jyfKBY4=KB^OJ$ok+ADsgZFkvpTs`M+K@=ntxE( zts{ah030;?=g`(=mmFt{jH<uMtyxOW_d525cOZ<oND0*};Uvva;!-5t`3!dTh<74P zyfu^VkeNBlwtnKb_pkBrK=>%0)3ljm&63ftWzaC<EIrP0$p{!>UqcHCe;^g*+&EHD zmW^|P4&t&7!by>m7O!SnzWDG=j&Vp*^*rQwXRgkOB=*e5Ggjh%fU19uV<#g~Y&Ex# z4@R`W_#Avgax5;VuP*1Lkn-sw)kALBHOHmQ8@_$R;yA<DqU1TP?|T$?1pZvoid7?b zxPhcv)+r};_tEnF6XeQ*J^nq>ON=8j5ACM)XnBMc_gmIX;z-R{m_x{Vt~E=HaNL%S zkgFyD)fWs%`JJv1y*mLLCMOe-idkR23J32poJE96iL5TSf<Uy<$q8|s8s;}_MvZmk z)LZ%FN2k+5{O#hnC4konu*bZR<r$Jav5q7WF4n<&I6r8+PCEO*AJs2tA5v!IA_{kQ zCLNd0V748S>Org071sn4A(N3Yi3&mY1P!>1p>R5pXW4MWJ=gVfa+r08x@FA3a!1$L z-b8jET85DzL76{F@#UjQKyBV&?xwq+i)e00fs`Oyfkpb9(i7^DQ_1%V2^q&?y$-&J zm;mm77N?|p5<2FGHj?#VkBtxnpQTvD&Pk<B8{4#xuU#YmG-S39B@_-M=sSTAp^*|L zebKbt!=W3+5ja8{o}|#+dmJ;d`L#Aq&+>01D1jFlP6+N{vPtR)6CYy3$gni=wL(hV z&QAD<CnvJx_ZC;+<xVxSdApgTkR-up0D-a25vVt}l3WEPMN?;%Jw%<|rh+{E*vy2( z7U_|)I^-WiVC-$`Bx3(O0l@B|4cM9HC@yO9gj$00Nm-~0vJ|6ueZu2@Ib0LHm%;V^ z9DF%x8=mM1fVQX=sqF-y6#z8y0s^2_JH*76M9`Tt{u=>WgrNyGC;L1XV6JZ?(s=}p zVAxVP8*>Q^g|?EGWS9%^gRUnLS|*X%8o~Pp;^3hlxPmbvdHjNffR+J|+b!&R+DkxF z9Lia*Qi*(~scPiUBKv;(@qOAT-QI@RZi>Xb=LLI~Ti>k1K|=`1DOLg^E#G-)@!kfE zH?Up22EY%uei!I$Z_-vuVp|b9XD7`=uk_vuQeHoSBx8-%mFV1O^o+z8<p5r;d+Z6i z2(@E>LNz+)JgIL#L|cvYjn2}f3iJ*Cr*-W_^p@)yogR>DdIuN(N6?8hc9Hzc5b0@l zj&drLOI$|FvJ~Rne@A0C;2;znWdDzlQ$lJOPQZZ9;$*f>Z>aykO#Awgd1TOe9CJ`J zNh`S@7Qd8z4bFoJ`lYbET{#+q)>a+$81x23L@U}(5!s-Ypdz#1h%c&mR}x=9&C$Z~ zsB|coC5n{>W&c+8W>AjG={Nrqwd9+>qi;rKj42$-C~=a9(m0gQrQ<P+i9v-*%AVod zRY%7&tysp>2aXXHae7QMEhA<#&q^)K^{g~7{dXcWr)!>|YdScMjEYe?s^I+4Xz9~5 z;(A11_`96?vy?ih;_U^eB*vsv9gSAlLX;@@rA8*nqgJ-xfVfstWTr5TZ@D<O_1Zha zgeERhX3~MEc8<>k+da=7o)A#37nvjI{K$4rcNT5n4A>LA7v_A_XpvJfmv1l(@Q1z| zZ8Pj1*b-RioQ{}IVmxL6<n3^VGHi)4sO6LZ7s9S2VPR%Qtl7lA!G}wRjT)@l5Jlkh z|1q>$L|*JWRJ(>^@wvR#SJu{^%U|@B`qh5*3Qzv)SLxo@lc(BbTxugWfG2^of1J37 zELNBs8|f0_@y6pnUHRdo#l~j~OUw5kEym>rd83UmfMtk_K*12dA_#moi;u=8e2e4= z?>&0dUEZ|2?l46@a+J43Go{U38%u(U7wwV21aa7k0EAW*t8|Jh@PRh->X_T<h6fqE zt`-yLhs+fbJqaHKO5Z2=pfFh~YJiTCq9O2@R;X^u7w|NVHp;48Kn~@cd=c4{icD{D zcBovWJC0_Nkx?!v{Wpf;$SLESr&cH~p-X@cokHNp8g%xAQ!_dp8;CP9kzl#xAQA4U zl#Cc?A>s}syOHiVR&l;YKLaZC|MwL;fP|5`cLLxurKbS=mCBy!AT%|1l4t`66@%X2 zZMRxv*(iR=)ijG6>iLRc)Dm|OKVzZT!3mJqBd<7hmQM!`!$4s+$u5&ulLri<f2-Xb z(Qfur@U5?{;jeG3z5CNIuJF(MQ?s)l-+Xgztu{;TwX3zYI{Y9bjcej!KEXuughDhx z2m0OHNKa)F|3~N(y+?{w=<2C_!UoALH#|nkfDWh{G^Q%|&kVI-xG8Elg_7^p)Ro22 zVuF4;LQ!F(5tkbDg9Aids8<?|-JUIeF@Ptd(Lh?c(O}c~DkJ|*94WFns?o6!`<RMH zR8TZ6+%QJAQJ7sulO0k0p}R)sFIRAJ3x%m_N@?7D!z`J_(zIDHADQzwLY&3*8m{lu z&a(jB*cJ->WCEv|u>1)tQ!XBG0Wu;p5bJ~$_#Fo2aAJ*8;38Q-i@_NaR#n80eIAH2 zQAS6WBIU}~ski)ab+U2i(SrxKA1^O79^YPBSy)<(<>l3Jv_5>eu(+~txAEZq;zC@( z@5>0dk-vp|Wz%3i5Wc(k#n#If9h)~3Hs30tJExO<l3V%@R~7%Nu9Q^dSdFUke?t|e A;Q#;t literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b08ace851143220f592f4a6ce7907de72e434eb2 GIT binary patch literal 4484 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 T_zG)rn>&?O$N7oPIQahoTIdtm literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70f3940a8534ded339ad3f0814cf8d78970cb454 GIT binary patch literal 27693 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Μ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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87250971392da91d09e6e401ac527879ec3597b3 GIT binary patch literal 10894 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..151f72d993a544e4335c5de309f5b0d29f2ad6e3 GIT binary patch literal 11070 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 Zl=mLk{_vmtBZf<6ZW>9{vzD1D{V#{sUMv6r literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ab02de2108b0e8183761d456937fc267bc32003 GIT binary patch literal 47891 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 QA08ThV0hE;M~27#KZT->%K!iX literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d079ab971325b4dc0cf46acdc594156d795f0ca GIT binary patch literal 20434 zcmc(H`;%N(e%F2VV|re#(OZ_KYg@9WB~5E2%WGSaWoh;B1AA6$$?|42a=WL`ol(#9 zbhpmEBTKzK&Tiz*14!5e*eWPfj35bY2uUiCDhfyl5GW{qh97PfKT$=Y|A5jDET7N! zKDv7}Bg;-GTDs?+bI<F0Uf=hbZ;y@^4E&a^@4EHYCx-Dqm`Hvjh@8jcFIa}5j9EjO z%4(Riro63LOWDe4*elMgV;YEO8kv>sY!>mX%Bj2>QUx`vM%3tHem3Ws>v?bJp*dT4 z+fZX_<O@TMc*76u*%742RT1f;H;VKa(%aMo(i4&%_pJ4z+K!sr)DE@t3uAV|o0#2> zQoB?ZrLx`_YVA<F)gI*S#P_`_hwnLW9N%|I?R^hT_1uCb@%@NDAIA^$eLsk}8-ITR z@fYLxOMUS}h#!u>zl`{iI6jGZDUKgS{MdrEP?+5<{T)X->3ga#UPe4=tH0e7QJICz z>>jB<jgjwFC)Fv8Zl8KZoyPk)$$8bYmi9liW}jEz!oSz>ysj+#d*jR8>;ZK~{Txaj z#C)7pdCW&%=E+6+O*Mq{kj&2u($cxOr5Dv(>O5+_q%Np$<9!IFFRB7c7o_%Kq%Wyq zq=%*U%Sc~VSCGCUYjwms;%)bKdCxtt5j*I;px##Rd|^oHkoU5;?}4q}{nDPD^d{AN zdkutt<*cFJSEJ~wq^xU3>4VPag?Crl4R6J32GyY6YPzijx9To5ynFTehUeb(w2!a# z=A!G@Zljpn)~&mBB_CGX?UoMQg_d@&UcNeY`t<big6{>Z?V#0a_*1pkN*ismnQBwH zzPD0s2K8EBo8`hI?*5raCc=^#j`)E_%a!1M+w+m$)~;&bt7z}eYF!JA;kKEUUa2<f z9Z%heVC(<%K{WuBIvjo9TddaZCne%!k~@Aa1|`W)KO`k~f7JA&(WTv7*1Dy`!lD;c zqM4`>^yJ3@oX6uA5qJg;t$_n;&e}4~wjRdk&cW-q>%NQs)uy}J>mZqs@=VDI^OZ`o zy5dzTVWCo4X{pr)<0F;Ioz-e1&dF6Os#U90ero7#Xjg*A?GtTXzgrEw6L+in#6qi~ zFg+($^ojYUO67I`)#ht=)#+NLefQLKu<-igl5U(_c=e4pPFz3HuD7S^O+TnM8dJLV z>g%rrcdGm-Pvx%HR4si%)%~DRpFa_Ah;sYBjA<{&>>$XSjyW(RHa?zb?mYy(8BrEC zpG{PTx1%ydDzh0PFub!wVtD6>$negqQ8kA5P=vB(3lXZC9ah`b4tyU`JJl|{M`Ls} z=8Xd#?ZXi;XN&4NZ1DYIE?(psu&VqB7@v!H{PPI9=DP9FaEz`|G1ttlv2JzEho+?M zH7jtsR*-pM`NxCoFPcHFYdru)UUvMmOe+JOSTkBSa6Zg%1GmFmCECbgMmBJmt>7K_ zVWIBJL^o?*n87(|c;VOu-}f|6UbMmNhSx0Fq2qgvh0ye+g~0Evvz`FN+$Hs9J*ZR; zau9h0hB;;y@pOvuc*{wVbl{u-J~D7pn*b!{fte1Xa{vHUeb22Y7{RSK-Ky)a&es}M zp9gaLOe;w7g{K7MlBM^fG5tJ)bUzB5dKbPO#^cN6o1M`FIGL9L$he6FvO|ajSd0fI zLcq6dYd64@cad7KcHw&u;ytx$v)Kw<K{eWQ4{Jd+hjqyc9b%Di=sLoFIKxaU0E*ZE zX}GNd#8F$W^pMsh;U-iDCbqLTf&7Vb1Ea7}Tt>l>V=DpXho*_xlG!zv%w-~7a|Tn! zQR>|YlIeSi9|orn`=;XEsZ@?5D~6<CcE(ajBy;obxx7jDBiy6t)YM#xujsD{bTiHV z;uY)bjai%bw#8uMexH4?4eaPwwi+xmzq<SO1cr^derP7cw)7D+`7C2!L=UfRK6Ykp z-uVtxNM^d%d9uvU+BLEKna#Uq);H;z`}dhfjrQN%yz51FP1MF8-zoYa8_PqwgaaCn zHFR!Q{oB!=HY1d<VLJnBu}GzI0kxA2)`zd6%z+Nm^F*{q9I(WbWGq?41nAhB>EsXl zlSdBwM@m4OLx7j4s#4LTsGxTuz`hs!^dvCaYwJqo(&oTKnFGLZ2IO#O5g{naxq3=B zpw*xSmCD<Fy^Qxxu;dMNl1}kv82aGVO)zwVpFO{fvAXDJiy@EJ{YqPV+LK1!OChp4 zI}?ZoO3akDMbkKjqI#SG>5X9Z2!Roy=$9GDMwcyDV)7^h;w@cfZ~{S?2kY1dt-G&@ zVES;KtPB@eZ%1$dkG~H=-ppt7cHY51hISg-Qm%#~>2C<J^LYHfi=fACkpEIP7-mPp zjD%SUa}wqy9Fnjg;qaGv@FftVz*l4-I*sF<RYkQ8@0^!c6KcEg7eldlRDfW#8+pTO zkJ^j(h}x%~!+TWiSI^@;rVglsc#kU{6gSMpJmyS|dz(ML(^V%eC#74CHkZs2Hnw>; zG;5*R?whrU5jfkZuFR|Ix$CIs<1sqLxPx+%^%WgCvWw%6G|{g<&EQoAgNH_c3*SD% zBRy^2E*W4MfYly*av;yp{*ABM{?~>7<EOWuE<i-8pM74w_y4HfpMQG0Pt5n%osXMO zZ$F(6`)lr#xuo4v{;_%Xv3agzoqe-oox}6yn;rX21lH$xUU+kWx(%F!hyzT}ESa%{ zec6oLWPX*svJC?~TXGVf5F^tbb0|n`E@=I~AwsmSjODzZAkRr&6XJmtiwCxd2M)Q5 zHLGj+XHW*hLd27Ht)&b^2s}%f_3T5mRLLzGYc{^;^?$n8<ol9wOU+qp4%#u-fps35 z`nS4{a+Y)Ym(W(G>%?tAuu$0_S$m;av5d9MT2@$$40*|BF=01UKF+h(3tgw1>1G$u zqG{au^kX9!?%EGPDJvr)q72P+4#c#>Z+o@+!hN@z$epf`%+4ryd-pCxYjp;EbjK<m zEm^WuSfS2KN6JT!xMZ~<CAL2Epu2(84|coOg5;>H^=9Bd`aeJW+0U+DDUF7scO%g} zBF16iMzygTG2xo*l8|N1)e0Sov|)x#>d;>H?uWyDErxjrpZ;g{;C7g;w%bT(3Y-y- zk?V;ap{ZvxwFX4g&}y}3t-H-I3qrS0zqb*Ak$x#WK1r2f7R)?krUGQw5yVFD&RRwJ z>X><Z!Wwak<_^eI$wqoYrsDp|;F0~)L4-RtFdtZY2UbZ0$u;xdr`QuV*8avE1j;pg z%|Y5(&vY&9qYP?fq{fv1tK5aCxt8f>{CRLY7Ru$8^5k{avcXU{EBi6iHM@4#d0_kd zsa?3U|6`~FaYmfZe=fN3?;?d6x4z&))`?X%ShILp+!axi_>$Q--Q_}B{|t^ybtS2A z#=VYalG;HlYQU{7V%_}!%}}jD4FUw)a<2^vU`eer?lsZvxY#ylWW$~LG-f(J-K1`3 zFZLF<TPlktTh707y;RV9Fx8rbQ<H0!4FQD-*^6q>(tc<|PZQ=4RD(e4DV7n2&_%2i z?VK<d4=Bth^}<4LHuNPF4b6qnUhx+<Y@;wEGx$T45KhI&6|iY0uz~n?ObeTe+bIu; zH`zK;Bjxmnp;Amos;Z1N%Dci)L%m?>Q;aKO06z9|w(pC%7p1%8C!870W+MGVbX<v9 zfhC{g=RN^5%xceHZ3G*KGV0x{)&i(`MA7#X)Qa>8mSeiqC+tiHFi<W<pzNI|Sq=dC zIu4>Iy8HV%3=w^8eLS$9QH-aGOu2{slC57roBAw+7ZD`r|0RCdz?>Yyx4(xc7M1t+ z5rAhD+Sx;bT>FLgmWxr~FfUn&0B=Y9?>U0eH_3W4xX2_w?7>A5KAF=<z8{!OZfcp# zZzRGCGydD`j0*!A*w>ZF?<POv$9LKlk#e&6<P9Cy?pV69^)ck?-bgnUr-ax4DGDb2 z_MyygCe~#k)<KVh9nd?yTgzD@X8hjf{r}}iaw5b0L0=E!y+sr$u2kG8ED375%-Q1! ziDah_7(2<}I}EsIMM#gNs6mOTZ-e(lq*JKDsy@XoXkDGGnf|k~=12x&()0P9BRLVA zL~PQm(^>xH?pu>{>eve<c}>ohktiK4O-@$3^W9ok*GkMTF}pn3ZuvofT6uSS$zzi@ zt5cl|Q?qmG)-jasOO@V21BX&PN4<B-U;RsLIv%fw#+ng;tLhq{e?SiYi-AqVknle1 z4oX1j8p&>5OF4Uu^{fK-a|x*Bfw^Yin}i}3{0%rKM>o5+%92w8)?_^9oYw3+?|f{a zc5biXf39+CPIDy4M`^SHwJwcj<gq|+EgH`xo<$tepTwc;Rb$A{cQa}nt^c_yu4S4# zkV2biD?`X0Kr4wBvQpxIqC^%YV3Ly(*|bEqn`4O|o4SB9Ih4u8WpZhmTsKeN6J^RM zlW)Ec{&DEuxo$og{jKS>LbtF!^w2<=S>*tRg7jZ#=2fm+03?O(5V*kt`M@8Wcg}$m z%yfq^UO@X})Bi~~i|{wQIn@76wGE?j)C8f&*LAfWd?s@I-&H%-a^NU!@|0abwU7m^ z**VkMO&$@9Be}#LWk2kv>rJdfv_b*V--V!S+!_<ghIP9EtaHZ_ew6CS&<58CMXgny zj>N)2eExXo?4sB7?zQ!~KV@rd+JO<J()QXF*qSQf79r!dYSo5+uAG(?dKjAJM_@*O zCUo%;Pv0Z%!bfD+9#L2DhzhJnM6r*^7eJ3RBc~1Em{m<-8t|DN1{DOEg?h8vC=Cny z8g7HNivZlX{Nc5CzcW+$@UoU;&CMQW7j<j3?F*v{dqBHU4<cH8mASdPuj-5Vbb(zA zi_$zaS9Fz`PIGky8h@|ds@)E4FtDM+V;I^veB_ZaQcdj$KEs^QhaE%}Fw#FU{{qE) z4#NNwlJK|t&3$Ik%7e!p0dvBCP_ZDjBMu7^XXuzkr(lkuY*F$?EPMlY0e@^dwr-%^ z8XHf3oZRzxe6li6s$XUu4@ZT@9vXTUGceC&y<BAMK|HU9vAsrg29>Mt0!dtO!N$QP zQf(xgEM`sLZne~zl)*e%K9%sh?n^F>gxHucWV+x`Uqohk`o;dT<>~%Z^<;ml{7UuI zV0wN-er-d#d^#<E{X3VwbH-h$HyRNu+*%DHPWs!`erQuzT|m16`_0PgiW_{^a<T05 zV87D#0D3hk{E{21>)eKS*K4>dt6;cqSMPc_hDi<#NcC!?zk2zVc}b?61*ewJMLa&a zDUf+$QcLhK<ypIHuiL=8PT<ht;0ptCsSUh~g-h@*q)A{$ELCRa8y$GfBLEKWyLfGO z;`N8fn85lcXZ`3C#@@1s@>?ByeT^OD!tqKowGtCe=ug?BoKYUMNQj(A3?<`9q^P>; zd!<ZIs?;+qs~AYFLG&bA&;o%aD#0<!P?$Vm5=U;ZP)9&(DnvqaUbJhWrE9v559vgr zC1Iomds4g!j9)eupo73#<bMTBbVU0w`}UKwPpzHrA^^JGLz1e&ttw-$fr`d*Hb%S@ z7%V}F#J<B<KfL_m<@YPsFT8y%UX;)b22{tyE3zniInEdXpL%k916t!v76(|>t~T#S zoN^!km~<xnP<Ys#^kZ0^gJ03lOlfE%!&M}_q&lGuKLmY;$&(D&b|1c!m6T3-CjK`b zk$LjlAoUMVSm~+ZTJVumLk>6+Zos`nrw2R>G_|mQQnw4v1{43#^p8?153m3{UnmjD zZ#*~7%=IhL9<>2s0Cxh&%rFd7!y!b1n%;Y%c|SCpec%$(aI_*4Bo+A3YwYJlak#|q z{O1Uk&zqV`h#E7JU#c2!;!A>?JsV1HY%Ln%6TGa3p!&{`5rVop8>_%`u?jpNtH6gM z1vpIck$2E=to|N})!(DB`g=_6$AF*Lqzo{wMzHsctFY8WpBh0LUF=0+7*7f;_M+aM zuozdX>Uj{+s=l9=YkH+T6^fb`JpDR?P4tb>HIf<NkAN{QYkLEcuC4b_=dzq@?SQB! zayNL!UC`S}e8gxS?|tt&dWK@{Iz(FN@q|YOA7!kAXNtJmuC);1%E#t0;VAkfbw`du zqz5A&5-mn48{wXJ_~AVUmk`VjW24mDm5BUrqV~kjsH!E9g{a84xHD+5F|a3gWOpH) zz~1OTPO0G1UvFSyQc^((B8eEvDEpxe<s~;YrzxWk$hNnZz)UL(6Cq9=U5AKD6k9gR zL7gRr*vw3{^HY2mVG{#VCg7z2x=7?TlJJVZVcmfuJL1Vqy^8!4N7XkRjmL$vRQ+*t zog?=kh$?GzPV^8+I^ty0^&zRWZpqPKpdZb15;{w*dQ%S5=F1X}4H6FUYYR_k8@p)f z5+Nd^X<!|APP5b~KKB&ZzV=F(|9@6O{|JNHuon84@a?<Lv<QpAS1p46Wp+S>w)q<9 zUt#{QGT1<y*YNHAuQ~CHK|1lo3+WNqhr|{~fCN<>E4Xj4efHy}2aoSY$UaAr>x7Jb za7#RGD|lZUqRiKa=obLT_nr}=#U4bQpLCAONNh4kw(kn6fW@O(2tXa-JcW2SGEw0` z%XyOpj`^+)lQ)BQH_qS>@NJIpMts)<j#R+{g4_B?d3OfpF{S9FpAjWT2$ff&+>7ze zGp*+j(S{;4#AndAy}0GUPDxe@%)k_qMS02;!e{{XMLdNgVAKC%llY71ZE@oyjy!D= zo4utc=}eb?VRN`iA*>iLF%FjivPB@KpcY_`94K#WC~w|@m;v*=s9V5^tV5NfauhyN zDgtvGsR%Z9p6nCnIU=W|9DiYQvLzDhB#R14^4gY*+T&<8MP`{EMTwLE-x#BPAA@ZX zB$CR6lz^PrQ2F5>NXkpk0OU+*d?U}yg^Y|Sml=~2NxG$pLp9NrCWg>IVDLi*+&h}^ z^qtHeN6pP~gn%AGg!)Mf=8)b$XeY<={L!r=k5s;sy;(jsb?Z=Qbn>6vEZ>3>vea>= z%X23?8KkFfbqb%%O-{lbIafN=vG95OCwC_!b4BT`Isd3=Es=4mGyaL5gr2hZF^BfP zf9m*}Fx{Q;x%tUzW1-ruwr^KUbMs-Q+CZ$c2j9U~Pf4nam_$&ZGlWDrDl{}VIS+FZ zU<e&X0M*SipO-5D{aB}P^Z3yhOOrR}Zr$qSZ+?E}Sj7e0_FVZ;XO!Tj%GPwh<}o{* zDq%loF<(6U4<SN81UK*P4=k7qcYxc1xv*=2sRS?e5WLr&38*wp|CEB_G@uEQoEC6_ z{~o>|1?A)KcO9CaX*OEV(Zswax)+?O4A0bB=H5Q4E^+>{IF(;?GcZKM5DC>>1IofA z$AV$nL`wy<l#3Lj&DWK^J`AO4hHdej@_Ten2g~k;xe_IEkqI09v))itFFDuUtSExB zR6Xhg_YMRj81b%w5oa-C<lb>GW-2I;b~9^c^MERJv&*dYx*BdmSqoKVrkmT1GU(R~ zMk#oq^bM$dfiHnKMms+cZOC<fpQ<5$b#c*y7Ny#ANry3eMJ(Dqqd4u`pWUw4ZcEil zT&Z8Nkk~_Ot<{EV9uY58&s}Z16z5>Tx(~Z(b1|}qb~4jt{1f3@He<RGh|e56&%_5` zMZuU4-V$;BE)O4D1>%}Y;ZD5o6GPu-=;{$E<DhcknIY@r(6@x_4||Y(v*ABWCx6uI zL=-HK%_;qW(>50Q9=wS-M5YffUw!|=#mgUDp1FPvviRyeR6#QzeQ^21cQ00;7`gK9 z_xkij^QaTy?+dJL(-DD~Jls*a_R$rT9c*q0`Vh=F_D3lnxkZzYfrL;ELI>8UMx<1_ z#E)5jbpi4`6&6o8ckSJB^?t%Zo<V&hGXf)R5j>Cs{S!hcZzu4D|3=IS>$uPcD0%HM zq+lpQF0Is#ss9dYr^~=~CQ7=9$6rG0_eUaK2hE_@ut5WJxu9JW8hq3Ed8284j|dBX zF+^6%>_b*2kQGHmBCBa26d)-D(GZ9V-ZPQ{neR&hjr65pk?Bi86%nQ2Edzywc*~f) z6CemFYHd6zBW=S^udhCQ_4-mf271EHfxf)m11Wg&_2t2zuP?QKpv~vifxf(h3j8j| zDYFMOWEvkE&3)1A0bzkr<Ua+ANIZu`PcKye7mn+-6e~4T{b8d0hKEiIe)+&%bmv&C z<4#7JMeP8wjG(D^7u@@;)kHs>AgHJa>Q>=T;S*D(>h;Nb*(<v}&f!KxSEVu4@}zL1 zzKlBoL5ZC=rTvxq;_bklhYp&TdjJ+3EqJM=PX#{-^eIr6q^-2W1f~Vug7TY=BMYm| z8kPO=5af;wy9R!a6yv;-<cl8&JVGMXs#pi$ztTS;(I}6*^SHvGq*LBznul^6w_?yf zn~8h(-P)?wuoN`z^NIuXzAo~w-oN^8*?n7Px9Y0Zl{TtKL&0rMe*(H%<&2~FMN~R9 zJ^jXU_w=dPUt{~2p_Rx!G3B0m<>V=M^3_+$Z@hB26no4(G0{RRU@vfMx2w%XPkM7B z0>Y)Pt_CfrEO2Qmrau^ml$mm0IsMvcck=a<<>}LD^Ph2nR&mE<F`C+5C3nTcAXKzV z&PUEYzWaU5*_wNy>DKiV3zY0D8Y0eX-0IRz-@VY=Imv7!(~k9?X*Ip$bUI2YqVfVy z!_>j~jXi@(<8Uj>M!c4&#F5NQk)zTrARkb-zlK+wqyIYN@%J|4r=<)U5R07tt5MRK z0;87X<)>oROp==~Z}^a#g5DKdH!dLbA=1lQ`V;m-VqCHwn{LuXw%p&JuCNgM?l|c9 z&@990jsrU#;s~cZyI>-puic_m{pQ@%oUpaWz`r_kC&8%hi@(vT9!1~MVwFdU3^-r% zvNy}0-+C)*r8HN5i=1y{G$C!DAu~G-z7hue$+uo0%RJ14bc#l@bBkwBo}2FML(NI_ zGNro+=gOK*NiCEq^V6x$*i_^J5ZU(+btZ1YHDKx%tFe;T5TFp7?u?<YD7S?4q0acE zOiMSK&eEZ1PIj;l-JR-A^>>#m)0m0=_Qo)EVF&Hbclygn7Uq&n_}#kqS$8USN&vJq z4C&OlPOcq;AGdcB?p!Ne4q9KeQ1={ZY_;aW$l~cA^YdK<(9b-N7e4x-)6(@t{S#&l zYL3F^Qkt9K8c!uW)1Q;-(hOj1vqY6Q26~#e$FfCG*Rjl)GiHz31-M`!j#&IJJ2o_y zL)@}JdFfoJ|2|siOo$J~tz%uRS{HLVb*m&BxRaGBoqBAZ$H*2@G|a`bp?@7IEysYS zBbn?$W|Cx_kC1W7ZjmW(&4eR?b?-K~bVvXo)^lR+gIgI$>TS48IFJP1ySKk<K_0hM z2F?^&NbiVK9)V;~{@9S*g*cb47Kq2W?}I;w{ue}_Qp7G0eXsy>FC^dNCT&1NSyTAj zdx!ue^PUQ5H4#pNR>oT&!Xjy}!#4xIkq~|W&<^V4p(3zI^BtIDmQ8&LssmGBZ#wXX z9YNP(qg=D#0|8GC2mw$~uftL);OwBl1nwcrl!yblnb4e$-2~ovM6M?^k9M+0W!_;u z98C@TS1){cT?_Lk`>L2`#N4C4!pfNrO}~*v-|q2yn>o;jL%csq>%D&w$2b<|p{K{z za7@=6fyJHvsGS3qhTLEsbaF^5>)%Gl3CN-i>Et5#r^5Vn{KJOlz6amgY72B?_l%E$ z{wcB|3+JnhZ8!$Qef@u%knTbu*qTNifiDlmCD=<mW2XK+<kXm*{J7NT@%S!+#Nrg~ z#97;eS(%qVVfW7{sw=ZPhhnMC4W0EoBe^({h7JWq)5^|3BSh26<GcZIvHsm6z-$Nl zxa|Wsfg?+7%JmY^^th0nRuHT2O~cs_V(qP$X&uMqPv|T)cNy-I;J6@$-Dl_#1uyQa z#+?!FFF;2FNB^o^$3)XJu+LRhu#g?WE}G5Hm_Io4VygU<0~kZ50Z$AncOtt%=efbb z447SKFp+d+(X1C;*5R6ch5eILKgZrU4X`8Hn=d4(ZnBUx9eNoryOhHc=9CFX4(qJp z<s*M~7zV-L!+<!f=rfelTtd+niMRjQC&b=8bqKrVkE#%2hl_apPZ0oBQE505Syq>T zC7?6}Qi;_ar-&u!dyi9YgQJH3Gn5q>C@bKR1%(4VsNpet1Ii8fjp6La_BnWsCCbFy z%$3fCi@ocktAQ6?BaLpXi=jwV0tusY*muP%wdW!X2i5C6iC!>DDIXTVwZb8z2G4>> zgrw9OW*aSN9dwxctg3mPKJxg<>c~MzRN$MM{~}Rwvz<;29CvwgG=V@U2WDln(6tA* zRu4uSW`p^wr?i}b*Ug4a!yO^|z|c|kS|GlI`Z7O$$#LXZxenIppYqd|T0pM)GJ&I# z9=jI``n*-JIy18VU_yk5$FIpLIuK4zy^%T-A`Z10oD;#TfT!6iv*%|B%G|Tmv(JdG zJd7<g7M#PcUH$+LTZyw4Tn{#z)W3zQze>3A0DWktQ*=Q~dWtTZNF>xX5|v4={QW=~ zz-_oT0*VOnIKJvGZi$&hUxsS{j$G=1BY#9~A8;$%bO==W2Nte%<lwLuU+EABJUaLf z&7@e8U=Vu=HKnn;YsjsYBJN1TK-)ZoG#o(K;W}t1PK}NGC6R&FrV37c6C(R`q*7-~ z=}0+x9!F{ZMMT6nyN~)bYVGtsywUtavkAB(Q!OU+w@?tcnJ7g6<0$@J#y24_Vki9D z$wWg_^(r+c^7kPIN#06z*{jG^`OP#|=xv@o@K#7n*k-d;$b8KpqHPD5JBVS!La)tV zCj{Is;znUj*s#aF@Rg7ZOcPf^rfCNvPqSfPMLyt_8Tk?78^Dqo`Lb_Dwt}N)?AE`A zW*(c}M_ei)KJb?2j*WQXDq`@Fk!}9Z`BgFCSKeP(!e6t<Ks4hEimBS|h}X=_uhtuC z18iW4`d8=I2xSrNVAcvGO>{unZyhl8zrwf8DTs@lgn~SU72pv|H#xd_8Y{rgzKRw2 zhslJ371()g@Xvm1U<Qan*rSjjy4;WrP`GLlU%-$nHhtGE^dGZ-^9iS>Xzs+jXc{Gc zCxyW3JiifwzXS@-8T$w9gB$S)3eG{D$0N&?%zxzk1B7B}?)@1!y=@=@Y&0?o_0EpO zWLT{9Pm*Ef&CM75TPT!t2wx&FO<(ZOp+wAq6IuDd0Yc#?-bRtv5!eZUg$raiB0bbK z`I|E{HI9uxzR_{CMr3b*HH`|S4}`oFWmF(4parmswp>{Vb3({Lc!y$T2$Zt1VV9De z{u2g&%Ahw=8RS8H`$G<rtcf8$_MKe=U_JR4Hf)q6<&!OR3X%J`1xDTlT0ux3;4Urb z1NT55XhEBLJk|z6&WW{w#K$&_oB&?nB1<Y~86SEaudt4T(1u0qB=O2lWYs?==#kqA z<<3N`7#zUHO6kcP7zlUqeg0Vm%=U(1P$_(L>tR^YFesUSjS<8v_9y)#NG|Gi4s0=k zxKcU-?h@`6Sqiemgdd_LE^7)?V0C(a#2-OnD6AeXsMkDS^k;qxf9nWJv#P2F_<Klo zuc3Mlx}9-o2UqUPU+QruaZL$m;Lp&<Q?OCEC!Opb16iT((SP7L39jLEUfyDK8>*zE z<T~+@QIggP&f@jeA}*9!%|fzj<V~V;Vajg*%H_z#$K}5eI__y+mdw)6BKcbZ(b+7= z<#^=s8_@{Qkp4Fe{*1xDW$^D9^mcC#tNd$Z`~iC-dV$k=M$E)n&F|@eIZwoCGGMN+ z$X;gRyx(_9dR@qICOZ1BY#nby?y<wyve47<fI%05dp4g?I{oiaGR!G&p^9sBDa~i^ z>6G(OcEM}n{_YOm7f$Z5kRjYlM1;Rjv3s?-+-!Z;O#XltZ@lt`Eu3QWm1`H@feq@K z{y8*+O>`EozR3~Dd5HfzA&(Fd?-iDgYLeeDN1=kk#FtEEBfeg)MTX95P;W$cZ1E>3 zaA_BRMT*LY_eBhe7V7ue8+#TU6J}fUOCC7>?fgRQrT>V*rwkelRu~AcL3u@7JN4gS z>~Avo4F)tSiGC|I-_^gv#6My{sa?eUNF4lUObVky8m@)faMfk4^?ziHqwbrDben|v zv(aD0I>%am7l8w%NuF04AT0AA1P!~GDV{7U?4dUuyLc!+T>O|`68-<kw-lY^OVKXa n`Ep)UOV|4c7lnPr@#0=;`4Hb(94b1+L%aq7&7WDYN9_L#VW9&M literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45a69abf3add1f7f33cf61716d8489b4fd620283 GIT binary patch literal 25084 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 I*>?E<0M~Dzs{jB1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 000000000..e6143f1f0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__init__.py @@ -0,0 +1,6 @@ +"""Modules copied from Python 3 standard libraries, for internal use only. + +Individual classes and functions are found in d2._backport.misc. Intended +usage is to always import things missing from 3.1 from that module: the +built-in/stdlib objects will be used if found. +""" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2d44e62d42b5b4694ab302aec2a159d5d3128676 GIT binary patch literal 492 zcmX|8%}yLK49;?B(IBo>kG>+639wytsZfQuaVSD6r%F|nNiw_MW|ATH3|jF-eI>4a zi=Oc8s#vmRJO24T=jQmhQX-p&55GRnl=?db|3zYTElP)Cy!xs9?1wrzut)OnJ^LXB z0+)LX9@>&SxZm<RCzu1VP2Ls{5u0KQ2KoeTE`W(cNjAbj0dk7lx~guI#}WM?Sr;vl z%#>zmhvXP@lBfh}9wdhe{6%dV>wfpSaNQxf8sJu@CLeq?kX;2p0?uILlid<vH&p_! zF|7!sfyCLPo!94khu4;&+wu7-m7!_|jC_ho6MJC*x!DBA1Wy<vG+{z7VA?&Zy1F}= zy}UQZXJ^bGRSx7>JM-^Z_XS7GL65fRHb)-{>8|KzW6Y8k>C5OpJJXLBXWTAVn-b64 z#pR`b&^`9DU(OigX>p6?oFDC!+^HFbZZ6s*vB1-B2hql0LN=!Ew=aiRdrIHlO+P5A FUIC~Qoh$$V literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..612279726a1a0490de1e1340182e9771fc891291 GIT binary patch literal 1089 zcmZ8fOKTKC5bo}o*`1wzkbuTRL<T`|!DM^|69}RS9t7Eo3+jLjv)w)GZ02Qm@0ty( z2a_L?Tm->i)K^d5J$bTvcEv{zRa0GE&#&sB+w~Bf$#CP%4-27h=JNZvAUp<=Ux6_c zB8C~saER+a2??{9&783nTJtr~H8MMQLI<OlsJLb$-Z=8abBxT#I?QF(84jJ-s35P< z+~v)%33j)@&IP-VD?7|uSu6KK4}3gkpP{h1^6)sGw8J*|Tm_#F_<UaZw3!2T?WG+f zFHpaG5*)<zs49h$eo_iQEm%5B*)-04n#EFb>Bj~0lW9R!S{8EqJG6)fdY#7fEsqjW z=8-I?f^zNBILqQu22vt<K}*K_SP(EDQp3#w<dBgMf#fA%3oKlQE02*6WPujs3WBPv zfyPwh@(YMzvzkXq3Q--#N7J#k_^}dAaIM+T_dzAnS*&<4i$#!>8RJ3*xd=v+DB6`f z#lsnUK%;7Q?~Y1##}kp=O?LM7f?-gl)mB<a1yyeey0d#<y^D>qrf9|sR*Hb7Qf28V zh(;@zf;^RUyPDUHt(!J%U<h|`A8Yq;1p&oI3CH|R({;mUgA`gIg-;Fmc+e->OJ!X| zLAhwdJ4CU{(d18u!gvW2V-rZ$NaBCun*!?i`yl*|FM11rvc8d1B5p3wxuxuL=K@_| z&^H)X%>_Ee6L$mnC(I1+WN@;{k1I}<Kbk9;J#2(j;<jIu%D*A|EzyA#+NmG41y8!M zoHShKQePf(Wo8Ak;(7g&7GvES&MW>@h*D@<fvDXmD&m|+k-^M3nA`s?o3^e4Ns|*{ z58FUJVgt~_epff6h?O*oG%2MpgD@I^A2e2)SM_{!`&n*wyUtx>s9OU_wXCI0%PfOl z&0g2o3zJg!o+u^K(NrzX{wk~9Ix`OK?&l?&X8chDZqf&46BoP0vj|?pJ-p@+?83i8 JdNwg-<6jV;2<ZR- literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aee030d9563f715981de2cd5de94d6f0f0da0a64 GIT binary patch literal 21405 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 O#+lDMiCU5uRQ%s`a2ziH literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5ca5398c31c89af91655316b492985f90d67ce6 GIT binary patch literal 15870 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ad7a3023995cc94cad1c97d2567648908c334ac GIT binary patch literal 62735 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%0D>qwh^@T7BRSU+%N{WOjHmX^XWIjX-N!?ka|hO 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 b<}BrhD-Tdx#wYq;ovQ0tt#U`OB%l2s`%hAc literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 000000000..6eb7b8624 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/misc.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Backports for individual classes and functions.""" + +import os +import sys + +__all__ = ['cache_from_source', 'callable', 'fsencode'] + + +try: + from imp import cache_from_source +except ImportError: + def cache_from_source(py_file, debug=__debug__): + ext = debug and 'c' or 'o' + return py_file + ext + + +try: + callable = callable +except NameError: + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode +except AttributeError: + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, str): + return filename.encode(sys.getfilesystemencoding()) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 000000000..becbfd74e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/shutil.py @@ -0,0 +1,761 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Utility functions for copying and archiving files and directory trees. + +XXX The functions here don't copy the resource fork or other metadata on Mac. + +""" + +import os +import sys +import stat +from os.path import abspath +import fnmatch +import collections +import errno +from . import tarfile + +try: + import bz2 + _BZ2_SUPPORTED = True +except ImportError: + _BZ2_SUPPORTED = False + +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +__all__ = ["copyfileobj", "copyfile", "copymode", "copystat", "copy", "copy2", + "copytree", "move", "rmtree", "Error", "SpecialFileError", + "ExecError", "make_archive", "get_archive_formats", + "register_archive_format", "unregister_archive_format", + "get_unpack_formats", "register_unpack_format", + "unregister_unpack_format", "unpack_archive", "ignore_patterns"] + +class Error(EnvironmentError): + pass + +class SpecialFileError(EnvironmentError): + """Raised when trying to do a kind of operation (e.g. copying) which is + not supported on a special file (e.g. a named pipe)""" + +class ExecError(EnvironmentError): + """Raised when a command could not be executed""" + +class ReadError(EnvironmentError): + """Raised when an archive cannot be read""" + +class RegistryError(Exception): + """Raised when a registry operation with the archiving + and unpacking registries fails""" + + +try: + WindowsError +except NameError: + WindowsError = None + +def copyfileobj(fsrc, fdst, length=16*1024): + """copy data from file-like object fsrc to file-like object fdst""" + while 1: + buf = fsrc.read(length) + if not buf: + break + fdst.write(buf) + +def _samefile(src, dst): + # Macintosh, Unix. + if hasattr(os.path, 'samefile'): + try: + return os.path.samefile(src, dst) + except OSError: + return False + + # All other platforms: check for same pathname. + return (os.path.normcase(os.path.abspath(src)) == + os.path.normcase(os.path.abspath(dst))) + +def copyfile(src, dst): + """Copy data from src to dst""" + if _samefile(src, dst): + raise Error("`%s` and `%s` are the same file" % (src, dst)) + + for fn in [src, dst]: + try: + st = os.stat(fn) + except OSError: + # File most likely does not exist + pass + else: + # XXX What about other special files? (sockets, devices...) + if stat.S_ISFIFO(st.st_mode): + raise SpecialFileError("`%s` is a named pipe" % fn) + + with open(src, 'rb') as fsrc: + with open(dst, 'wb') as fdst: + copyfileobj(fsrc, fdst) + +def copymode(src, dst): + """Copy mode bits from src to dst""" + if hasattr(os, 'chmod'): + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + os.chmod(dst, mode) + +def copystat(src, dst): + """Copy all stat info (mode bits, atime, mtime, flags) from src to dst""" + st = os.stat(src) + mode = stat.S_IMODE(st.st_mode) + if hasattr(os, 'utime'): + os.utime(dst, (st.st_atime, st.st_mtime)) + if hasattr(os, 'chmod'): + os.chmod(dst, mode) + if hasattr(os, 'chflags') and hasattr(st, 'st_flags'): + try: + os.chflags(dst, st.st_flags) + except OSError as why: + if (not hasattr(errno, 'EOPNOTSUPP') or + why.errno != errno.EOPNOTSUPP): + raise + +def copy(src, dst): + """Copy data and mode bits ("cp src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copymode(src, dst) + +def copy2(src, dst): + """Copy data and all stat info ("cp -p src dst"). + + The destination may be a directory. + + """ + if os.path.isdir(dst): + dst = os.path.join(dst, os.path.basename(src)) + copyfile(src, dst) + copystat(src, dst) + +def ignore_patterns(*patterns): + """Function that can be used as copytree() ignore parameter. + + Patterns is a sequence of glob-style patterns + that are used to exclude files""" + def _ignore_patterns(path, names): + ignored_names = [] + for pattern in patterns: + ignored_names.extend(fnmatch.filter(names, pattern)) + return set(ignored_names) + return _ignore_patterns + +def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, + ignore_dangling_symlinks=False): + """Recursively copy a directory tree. + + The destination directory must not already exist. + If exception(s) occur, an Error is raised with a list of reasons. + + If the optional symlinks flag is true, symbolic links in the + source tree result in symbolic links in the destination tree; if + it is false, the contents of the files pointed to by symbolic + links are copied. If the file pointed by the symlink doesn't + exist, an exception will be added in the list of errors raised in + an Error exception at the end of the copy process. + + You can set the optional ignore_dangling_symlinks flag to true if you + want to silence this exception. Notice that this has no effect on + platforms that don't support os.symlink. + + The optional ignore argument is a callable. If given, it + is called with the `src` parameter, which is the directory + being visited by copytree(), and `names` which is the list of + `src` contents, as returned by os.listdir(): + + callable(src, names) -> ignored_names + + Since copytree() is called recursively, the callable will be + called once for each directory that is copied. It returns a + list of names relative to the `src` directory that should + not be copied. + + The optional copy_function argument is a callable that will be used + to copy each file. It will be called with the source path and the + destination path as arguments. By default, copy2() is used, but any + function that supports the same signature (like copy()) can be used. + + """ + names = os.listdir(src) + if ignore is not None: + ignored_names = ignore(src, names) + else: + ignored_names = set() + + os.makedirs(dst) + errors = [] + for name in names: + if name in ignored_names: + continue + srcname = os.path.join(src, name) + dstname = os.path.join(dst, name) + try: + if os.path.islink(srcname): + linkto = os.readlink(srcname) + if symlinks: + os.symlink(linkto, dstname) + else: + # ignore dangling symlink if the flag is on + if not os.path.exists(linkto) and ignore_dangling_symlinks: + continue + # otherwise let the copy occurs. copy2 will raise an error + copy_function(srcname, dstname) + elif os.path.isdir(srcname): + copytree(srcname, dstname, symlinks, ignore, copy_function) + else: + # Will raise a SpecialFileError for unsupported file types + copy_function(srcname, dstname) + # catch the Error from the recursive copytree so that we can + # continue with other files + except Error as err: + errors.extend(err.args[0]) + except EnvironmentError as why: + errors.append((srcname, dstname, str(why))) + try: + copystat(src, dst) + except OSError as why: + if WindowsError is not None and isinstance(why, WindowsError): + # Copying file access times may fail on Windows + pass + else: + errors.extend((src, dst, str(why))) + if errors: + raise Error(errors) + +def rmtree(path, ignore_errors=False, onerror=None): + """Recursively delete a directory tree. + + If ignore_errors is set, errors are ignored; otherwise, if onerror + is set, it is called to handle the error with arguments (func, + path, exc_info) where func is os.listdir, os.remove, or os.rmdir; + path is the argument to that function that caused it to fail; and + exc_info is a tuple returned by sys.exc_info(). If ignore_errors + is false and onerror is None, an exception is raised. + + """ + if ignore_errors: + def onerror(*args): + pass + elif onerror is None: + def onerror(*args): + raise + try: + if os.path.islink(path): + # symlinks to directories are forbidden, see bug #1669 + raise OSError("Cannot call rmtree on a symbolic link") + except OSError: + onerror(os.path.islink, path, sys.exc_info()) + # can't continue even if onerror hook returns + return + names = [] + try: + names = os.listdir(path) + except os.error: + onerror(os.listdir, path, sys.exc_info()) + for name in names: + fullname = os.path.join(path, name) + try: + mode = os.lstat(fullname).st_mode + except os.error: + mode = 0 + if stat.S_ISDIR(mode): + rmtree(fullname, ignore_errors, onerror) + else: + try: + os.remove(fullname) + except os.error: + onerror(os.remove, fullname, sys.exc_info()) + try: + os.rmdir(path) + except os.error: + onerror(os.rmdir, path, sys.exc_info()) + + +def _basename(path): + # A basename() variant which first strips the trailing slash, if present. + # Thus we always get the last component of the path, even for directories. + return os.path.basename(path.rstrip(os.path.sep)) + +def move(src, dst): + """Recursively move a file or directory to another location. This is + similar to the Unix "mv" command. + + If the destination is a directory or a symlink to a directory, the source + is moved inside the directory. The destination path must not already + exist. + + If the destination already exists but is not a directory, it may be + overwritten depending on os.rename() semantics. + + If the destination is on our current filesystem, then rename() is used. + Otherwise, src is copied to the destination and then removed. + A lot more could be done here... A look at a mv.c shows a lot of + the issues this implementation glosses over. + + """ + real_dst = dst + if os.path.isdir(dst): + if _samefile(src, dst): + # We might be on a case insensitive filesystem, + # perform the rename anyway. + os.rename(src, dst) + return + + real_dst = os.path.join(dst, _basename(src)) + if os.path.exists(real_dst): + raise Error("Destination path '%s' already exists" % real_dst) + try: + os.rename(src, real_dst) + except OSError: + if os.path.isdir(src): + if _destinsrc(src, dst): + raise Error("Cannot move a directory '%s' into itself '%s'." % (src, dst)) + copytree(src, real_dst, symlinks=True) + rmtree(src) + else: + copy2(src, real_dst) + os.unlink(src) + +def _destinsrc(src, dst): + src = abspath(src) + dst = abspath(dst) + if not src.endswith(os.path.sep): + src += os.path.sep + if not dst.endswith(os.path.sep): + dst += os.path.sep + return dst.startswith(src) + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _make_tarball(base_name, base_dir, compress="gzip", verbose=0, dry_run=0, + owner=None, group=None, logger=None): + """Create a (possibly compressed) tar file from all the files under + 'base_dir'. + + 'compress' must be "gzip" (the default), "bzip2", or None. + + 'owner' and 'group' can be used to define an owner and a group for the + archive that is being built. If not provided, the current owner and group + will be used. + + The output tar file will be named 'base_name' + ".tar", possibly plus + the appropriate compression extension (".gz", or ".bz2"). + + Returns the output filename. + """ + tar_compression = {'gzip': 'gz', None: ''} + compress_ext = {'gzip': '.gz'} + + if _BZ2_SUPPORTED: + tar_compression['bzip2'] = 'bz2' + compress_ext['bzip2'] = '.bz2' + + # flags for compression program, each element of list will be an argument + if compress is not None and compress not in compress_ext: + raise ValueError("bad value for 'compress', or compression format not " + "supported : {0}".format(compress)) + + archive_name = base_name + '.tar' + compress_ext.get(compress, '') + archive_dir = os.path.dirname(archive_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # creating the tarball + if logger is not None: + logger.info('Creating tar archive') + + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + + if not dry_run: + tar = tarfile.open(archive_name, 'w|%s' % tar_compression[compress]) + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() + + return archive_name + +def _call_external_zip(base_dir, zip_filename, verbose=False, dry_run=False): + # XXX see if we want to keep an external call here + if verbose: + zipoptions = "-r" + else: + zipoptions = "-rq" + from distutils.errors import DistutilsExecError + from distutils.spawn import spawn + try: + spawn(["zip", zipoptions, zip_filename, base_dir], dry_run=dry_run) + except DistutilsExecError: + # XXX really should distinguish between "couldn't find + # external 'zip' command" and "zip failed". + raise ExecError("unable to create zip file '%s': " + "could neither import the 'zipfile' module nor " + "find a standalone zip utility") % zip_filename + +def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): + """Create a zip file from all the files under 'base_dir'. + + The output zip file will be named 'base_name' + ".zip". Uses either the + "zipfile" Python module (if available) or the InfoZIP "zip" utility + (if installed and found on the default search path). If neither tool is + available, raises ExecError. Returns the name of the output zip + file. + """ + zip_filename = base_name + ".zip" + archive_dir = os.path.dirname(base_name) + + if not os.path.exists(archive_dir): + if logger is not None: + logger.info("creating %s", archive_dir) + if not dry_run: + os.makedirs(archive_dir) + + # If zipfile module is not available, try spawning an external 'zip' + # command. + try: + import zipfile + except ImportError: + zipfile = None + + if zipfile is None: + _call_external_zip(base_dir, zip_filename, verbose, dry_run) + else: + if logger is not None: + logger.info("creating '%s' and adding '%s' to it", + zip_filename, base_dir) + + if not dry_run: + zip = zipfile.ZipFile(zip_filename, "w", + compression=zipfile.ZIP_DEFLATED) + + for dirpath, dirnames, filenames in os.walk(base_dir): + for name in filenames: + path = os.path.normpath(os.path.join(dirpath, name)) + if os.path.isfile(path): + zip.write(path, path) + if logger is not None: + logger.info("adding '%s'", path) + zip.close() + + return zip_filename + +_ARCHIVE_FORMATS = { + 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), + 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), + 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), + 'zip': (_make_zipfile, [], "ZIP file"), + } + +if _BZ2_SUPPORTED: + _ARCHIVE_FORMATS['bztar'] = (_make_tarball, [('compress', 'bzip2')], + "bzip2'ed tar-file") + +def get_archive_formats(): + """Returns a list of supported formats for archiving and unarchiving. + + Each element of the returned sequence is a tuple (name, description) + """ + formats = [(name, registry[2]) for name, registry in + _ARCHIVE_FORMATS.items()] + formats.sort() + return formats + +def register_archive_format(name, function, extra_args=None, description=''): + """Registers an archive format. + + name is the name of the format. function is the callable that will be + used to create archives. If provided, extra_args is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_archive_formats() function. + """ + if extra_args is None: + extra_args = [] + if not isinstance(function, collections.Callable): + raise TypeError('The %s object is not callable' % function) + if not isinstance(extra_args, (tuple, list)): + raise TypeError('extra_args needs to be a sequence') + for element in extra_args: + if not isinstance(element, (tuple, list)) or len(element) !=2: + raise TypeError('extra_args elements are : (arg_name, value)') + + _ARCHIVE_FORMATS[name] = (function, extra_args, description) + +def unregister_archive_format(name): + del _ARCHIVE_FORMATS[name] + +def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, + dry_run=0, owner=None, group=None, logger=None): + """Create an archive file (eg. zip or tar). + + 'base_name' is the name of the file to create, minus any format-specific + extension; 'format' is the archive format: one of "zip", "tar", "bztar" + or "gztar". + + 'root_dir' is a directory that will be the root directory of the + archive; ie. we typically chdir into 'root_dir' before creating the + archive. 'base_dir' is the directory where we start archiving from; + ie. 'base_dir' will be the common prefix of all files and + directories in the archive. 'root_dir' and 'base_dir' both default + to the current directory. Returns the name of the archive file. + + 'owner' and 'group' are used when creating a tar archive. By default, + uses the current owner and group. + """ + save_cwd = os.getcwd() + if root_dir is not None: + if logger is not None: + logger.debug("changing into '%s'", root_dir) + base_name = os.path.abspath(base_name) + if not dry_run: + os.chdir(root_dir) + + if base_dir is None: + base_dir = os.curdir + + kwargs = {'dry_run': dry_run, 'logger': logger} + + try: + format_info = _ARCHIVE_FORMATS[format] + except KeyError: + raise ValueError("unknown archive format '%s'" % format) + + func = format_info[0] + for arg, val in format_info[1]: + kwargs[arg] = val + + if format != 'zip': + kwargs['owner'] = owner + kwargs['group'] = group + + try: + filename = func(base_name, base_dir, **kwargs) + finally: + if root_dir is not None: + if logger is not None: + logger.debug("changing back to '%s'", save_cwd) + os.chdir(save_cwd) + + return filename + + +def get_unpack_formats(): + """Returns a list of supported formats for unpacking. + + Each element of the returned sequence is a tuple + (name, extensions, description) + """ + formats = [(name, info[0], info[3]) for name, info in + _UNPACK_FORMATS.items()] + formats.sort() + return formats + +def _check_unpack_options(extensions, function, extra_args): + """Checks what gets registered as an unpacker.""" + # first make sure no other unpacker is registered for this extension + existing_extensions = {} + for name, info in _UNPACK_FORMATS.items(): + for ext in info[0]: + existing_extensions[ext] = name + + for extension in extensions: + if extension in existing_extensions: + msg = '%s is already registered for "%s"' + raise RegistryError(msg % (extension, + existing_extensions[extension])) + + if not isinstance(function, collections.Callable): + raise TypeError('The registered function must be a callable') + + +def register_unpack_format(name, extensions, function, extra_args=None, + description=''): + """Registers an unpack format. + + `name` is the name of the format. `extensions` is a list of extensions + corresponding to the format. + + `function` is the callable that will be + used to unpack archives. The callable will receive archives to unpack. + If it's unable to handle an archive, it needs to raise a ReadError + exception. + + If provided, `extra_args` is a sequence of + (name, value) tuples that will be passed as arguments to the callable. + description can be provided to describe the format, and will be returned + by the get_unpack_formats() function. + """ + if extra_args is None: + extra_args = [] + _check_unpack_options(extensions, function, extra_args) + _UNPACK_FORMATS[name] = extensions, function, extra_args, description + +def unregister_unpack_format(name): + """Removes the pack format from the registry.""" + del _UNPACK_FORMATS[name] + +def _ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + if not os.path.isdir(dirname): + os.makedirs(dirname) + +def _unpack_zipfile(filename, extract_dir): + """Unpack zip `filename` to `extract_dir` + """ + try: + import zipfile + except ImportError: + raise ReadError('zlib not supported, cannot unpack this archive.') + + if not zipfile.is_zipfile(filename): + raise ReadError("%s is not a zip file" % filename) + + zip = zipfile.ZipFile(filename) + try: + for info in zip.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name: + continue + + target = os.path.join(extract_dir, *name.split('/')) + if not target: + continue + + _ensure_directory(target) + if not name.endswith('/'): + # file + data = zip.read(info.filename) + f = open(target, 'wb') + try: + f.write(data) + finally: + f.close() + del data + finally: + zip.close() + +def _unpack_tarfile(filename, extract_dir): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise ReadError( + "%s is not a compressed or uncompressed tar file" % filename) + try: + tarobj.extractall(extract_dir) + finally: + tarobj.close() + +_UNPACK_FORMATS = { + 'gztar': (['.tar.gz', '.tgz'], _unpack_tarfile, [], "gzip'ed tar-file"), + 'tar': (['.tar'], _unpack_tarfile, [], "uncompressed tar file"), + 'zip': (['.zip'], _unpack_zipfile, [], "ZIP file") + } + +if _BZ2_SUPPORTED: + _UNPACK_FORMATS['bztar'] = (['.bz2'], _unpack_tarfile, [], + "bzip2'ed tar-file") + +def _find_unpack_format(filename): + for name, info in _UNPACK_FORMATS.items(): + for extension in info[0]: + if filename.endswith(extension): + return name + return None + +def unpack_archive(filename, extract_dir=None, format=None): + """Unpack an archive. + + `filename` is the name of the archive. + + `extract_dir` is the name of the target directory, where the archive + is unpacked. If not provided, the current working directory is used. + + `format` is the archive format: one of "zip", "tar", or "gztar". Or any + other registered format. If not provided, unpack_archive will use the + filename extension and see if an unpacker was registered for that + extension. + + In case none is found, a ValueError is raised. + """ + if extract_dir is None: + extract_dir = os.getcwd() + + if format is not None: + try: + format_info = _UNPACK_FORMATS[format] + except KeyError: + raise ValueError("Unknown unpack format '{0}'".format(format)) + + func = format_info[1] + func(filename, extract_dir, **dict(format_info[2])) + else: + # we need to look at the registered unpackers supported extensions + format = _find_unpack_format(filename) + if format is None: + raise ReadError("Unknown archive format '{0}'".format(filename)) + + func = _UNPACK_FORMATS[format][1] + kwargs = dict(_UNPACK_FORMATS[format][2]) + func(filename, extract_dir, **kwargs) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 000000000..c92cd481b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg @@ -0,0 +1,84 @@ +[posix_prefix] +# Configuration directories. Some of these come straight out of the +# configure script. They are for implementing the other variables, not to +# be used directly in [resource_locations]. +confdir = /etc +datadir = /usr/share +libdir = /usr/lib +statedir = /var +# User resource directory +local = ~/.local/{distribution.name} + +stdlib = {base}/lib/python{py_version_short} +platstdlib = {platbase}/lib/python{py_version_short} +purelib = {base}/lib/python{py_version_short}/site-packages +platlib = {platbase}/lib/python{py_version_short}/site-packages +include = {base}/include/python{py_version_short}{abiflags} +platinclude = {platbase}/include/python{py_version_short}{abiflags} +data = {base} + +[posix_home] +stdlib = {base}/lib/python +platstdlib = {base}/lib/python +purelib = {base}/lib/python +platlib = {base}/lib/python +include = {base}/include/python +platinclude = {base}/include/python +scripts = {base}/bin +data = {base} + +[nt] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2] +stdlib = {base}/Lib +platstdlib = {base}/Lib +purelib = {base}/Lib/site-packages +platlib = {base}/Lib/site-packages +include = {base}/Include +platinclude = {base}/Include +scripts = {base}/Scripts +data = {base} + +[os2_home] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[nt_user] +stdlib = {userbase}/Python{py_version_nodot} +platstdlib = {userbase}/Python{py_version_nodot} +purelib = {userbase}/Python{py_version_nodot}/site-packages +platlib = {userbase}/Python{py_version_nodot}/site-packages +include = {userbase}/Python{py_version_nodot}/Include +scripts = {userbase}/Scripts +data = {userbase} + +[posix_user] +stdlib = {userbase}/lib/python{py_version_short} +platstdlib = {userbase}/lib/python{py_version_short} +purelib = {userbase}/lib/python{py_version_short}/site-packages +platlib = {userbase}/lib/python{py_version_short}/site-packages +include = {userbase}/include/python{py_version_short} +scripts = {userbase}/bin +data = {userbase} + +[osx_framework_user] +stdlib = {userbase}/lib/python +platstdlib = {userbase}/lib/python +purelib = {userbase}/lib/python/site-packages +platlib = {userbase}/lib/python/site-packages +include = {userbase}/include +scripts = {userbase}/bin +data = {userbase} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 000000000..b243da36c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/sysconfig.py @@ -0,0 +1,788 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Access to Python's configuration information.""" + +import codecs +import os +import re +import sys +from os.path import pardir, realpath +try: + import configparser +except ImportError: + import ConfigParser as configparser + + +__all__ = [ + 'get_config_h_filename', + 'get_config_var', + 'get_config_vars', + 'get_makefile_filename', + 'get_path', + 'get_path_names', + 'get_paths', + 'get_platform', + 'get_python_version', + 'get_scheme_names', + 'parse_config_h', +] + + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + + +if sys.executable: + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) +else: + # sys.executable can be empty if argv[0] has been changed and Python is + # unable to retrieve the real program name + _PROJECT_BASE = _safe_realpath(os.getcwd()) + +if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) +# PC/VS7.1 +if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) +# PC/AMD64 +if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + + +def is_python_build(): + for fn in ("Setup.dist", "Setup.local"): + if os.path.isfile(os.path.join(_PROJECT_BASE, "Modules", fn)): + return True + return False + +_PYTHON_BUILD = is_python_build() + +_cfg_read = False + +def _ensure_cfg_read(): + global _cfg_read + if not _cfg_read: + from ..resources import finder + backport_package = __name__.rsplit('.', 1)[0] + _finder = finder(backport_package) + _cfgfile = _finder.find('sysconfig.cfg') + assert _cfgfile, 'sysconfig.cfg exists' + with _cfgfile.as_stream() as s: + _SCHEMES.readfp(s) + if _PYTHON_BUILD: + for scheme in ('posix_prefix', 'posix_home'): + _SCHEMES.set(scheme, 'include', '{srcdir}/Include') + _SCHEMES.set(scheme, 'platinclude', '{projectbase}/.') + + _cfg_read = True + + +_SCHEMES = configparser.RawConfigParser() +_VAR_REPL = re.compile(r'\{([^{]*?)\}') + +def _expand_globals(config): + _ensure_cfg_read() + if config.has_section('globals'): + globals = config.items('globals') + else: + globals = tuple() + + sections = config.sections() + for section in sections: + if section == 'globals': + continue + for option, value in globals: + if config.has_option(section, option): + continue + config.set(section, option, value) + config.remove_section('globals') + + # now expanding local variables defined in the cfg file + # + for section in config.sections(): + variables = dict(config.items(section)) + + def _replacer(matchobj): + name = matchobj.group(1) + if name in variables: + return variables[name] + return matchobj.group(0) + + for option, value in config.items(section): + config.set(section, option, _VAR_REPL.sub(_replacer, value)) + +#_expand_globals(_SCHEMES) + + # FIXME don't rely on sys.version here, its format is an implementation detail + # of CPython, use sys.version_info or sys.hexversion +_PY_VERSION = sys.version.split()[0] +_PY_VERSION_SHORT = sys.version[:3] +_PY_VERSION_SHORT_NO_DOT = _PY_VERSION[0] + _PY_VERSION[2] +_PREFIX = os.path.normpath(sys.prefix) +_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) +_CONFIG_VARS = None +_USER_BASE = None + + +def _subst_vars(path, local_vars): + """In the string `path`, replace tokens like {some.thing} with the + corresponding value from the map `local_vars`. + + If there is no corresponding value, leave the token unchanged. + """ + def _replacer(matchobj): + name = matchobj.group(1) + if name in local_vars: + return local_vars[name] + elif name in os.environ: + return os.environ[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, path) + + +def _extend_dict(target_dict, other_dict): + target_keys = target_dict.keys() + for key, value in other_dict.items(): + if key in target_keys: + continue + target_dict[key] = value + + +def _expand_vars(scheme, vars): + res = {} + if vars is None: + vars = {} + _extend_dict(vars, get_config_vars()) + + for key, value in _SCHEMES.items(scheme): + if os.name in ('posix', 'nt'): + value = os.path.expanduser(value) + res[key] = os.path.normpath(_subst_vars(value, vars)) + return res + + +def format_value(value, vars): + def _replacer(matchobj): + name = matchobj.group(1) + if name in vars: + return vars[name] + return matchobj.group(0) + return _VAR_REPL.sub(_replacer, value) + + +def _get_default_scheme(): + if os.name == 'posix': + # the default scheme for posix is posix_prefix + return 'posix_prefix' + return os.name + + +def _getuserbase(): + env_base = os.environ.get("PYTHONUSERBASE", None) + + def joinuser(*args): + return os.path.expanduser(os.path.join(*args)) + + # what about 'os2emx', 'riscos' ? + if os.name == "nt": + base = os.environ.get("APPDATA") or "~" + if env_base: + return env_base + else: + return joinuser(base, "Python") + + if sys.platform == "darwin": + framework = get_config_var("PYTHONFRAMEWORK") + if framework: + if env_base: + return env_base + else: + return joinuser("~", "Library", framework, "%d.%d" % + sys.version_info[:2]) + + if env_base: + return env_base + else: + return joinuser("~", ".local") + + +def _parse_makefile(filename, vars=None): + """Parse a Makefile-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + # Regexes needed for parsing Makefile (and similar syntaxes, + # like old-style Setup files). + _variable_rx = re.compile(r"([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)") + _findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)") + _findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}") + + if vars is None: + vars = {} + done = {} + notdone = {} + + with codecs.open(filename, encoding='utf-8', errors="surrogateescape") as f: + lines = f.readlines() + + for line in lines: + if line.startswith('#') or line.strip() == '': + continue + m = _variable_rx.match(line) + if m: + n, v = m.group(1, 2) + v = v.strip() + # `$$' is a literal `$' in make + tmpv = v.replace('$$', '') + + if "$" in tmpv: + notdone[n] = v + else: + try: + v = int(v) + except ValueError: + # insert literal `$' + done[n] = v.replace('$$', '$') + else: + done[n] = v + + # do variable interpolation here + variables = list(notdone.keys()) + + # Variables with a 'PY_' prefix in the makefile. These need to + # be made available without that prefix through sysconfig. + # Special care is needed to ensure that variable expansion works, even + # if the expansion uses the name without a prefix. + renamed_variables = ('CFLAGS', 'LDFLAGS', 'CPPFLAGS') + + while len(variables) > 0: + for name in tuple(variables): + value = notdone[name] + m = _findvar1_rx.search(value) or _findvar2_rx.search(value) + if m is not None: + n = m.group(1) + found = True + if n in done: + item = str(done[n]) + elif n in notdone: + # get it on a subsequent round + found = False + elif n in os.environ: + # do it like make: fall back to environment + item = os.environ[n] + + elif n in renamed_variables: + if (name.startswith('PY_') and + name[3:] in renamed_variables): + item = "" + + elif 'PY_' + n in notdone: + found = False + + else: + item = str(done['PY_' + n]) + + else: + done[n] = item = "" + + if found: + after = value[m.end():] + value = value[:m.start()] + item + after + if "$" in after: + notdone[name] = value + else: + try: + value = int(value) + except ValueError: + done[name] = value.strip() + else: + done[name] = value + variables.remove(name) + + if (name.startswith('PY_') and + name[3:] in renamed_variables): + + name = name[3:] + if name not in done: + done[name] = value + + else: + # bogus variable reference (e.g. "prefix=$/opt/python"); + # just drop it since we can't deal + done[name] = value + variables.remove(name) + + # strip spurious spaces + for k, v in done.items(): + if isinstance(v, str): + done[k] = v.strip() + + # save the results in the global dictionary + vars.update(done) + return vars + + +def get_makefile_filename(): + """Return the path of the Makefile.""" + if _PYTHON_BUILD: + return os.path.join(_PROJECT_BASE, "Makefile") + if hasattr(sys, 'abiflags'): + config_dir_name = 'config-%s%s' % (_PY_VERSION_SHORT, sys.abiflags) + else: + config_dir_name = 'config' + return os.path.join(get_path('stdlib'), config_dir_name, 'Makefile') + + +def _init_posix(vars): + """Initialize the module as appropriate for POSIX systems.""" + # load the installed Makefile: + makefile = get_makefile_filename() + try: + _parse_makefile(makefile, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % makefile + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # load the installed pyconfig.h: + config_h = get_config_h_filename() + try: + with open(config_h) as f: + parse_config_h(f, vars) + except IOError as e: + msg = "invalid Python installation: unable to open %s" % config_h + if hasattr(e, "strerror"): + msg = msg + " (%s)" % e.strerror + raise IOError(msg) + # On AIX, there are wrong paths to the linker scripts in the Makefile + # -- these paths are relative to the Python source, but when installed + # the scripts are in another directory. + if _PYTHON_BUILD: + vars['LDSHARED'] = vars['BLDSHARED'] + + +def _init_non_posix(vars): + """Initialize the module as appropriate for NT""" + # set basic install directories + vars['LIBDEST'] = get_path('stdlib') + vars['BINLIBDEST'] = get_path('platstdlib') + vars['INCLUDEPY'] = get_path('include') + vars['SO'] = '.pyd' + vars['EXE'] = '.exe' + vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) + +# +# public APIs +# + + +def parse_config_h(fp, vars=None): + """Parse a config.h-style file. + + A dictionary containing name/value pairs is returned. If an + optional dictionary is passed in as the second argument, it is + used instead of a new dictionary. + """ + if vars is None: + vars = {} + define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n") + undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n") + + while True: + line = fp.readline() + if not line: + break + m = define_rx.match(line) + if m: + n, v = m.group(1, 2) + try: + v = int(v) + except ValueError: + pass + vars[n] = v + else: + m = undef_rx.match(line) + if m: + vars[m.group(1)] = 0 + return vars + + +def get_config_h_filename(): + """Return the path of pyconfig.h.""" + if _PYTHON_BUILD: + if os.name == "nt": + inc_dir = os.path.join(_PROJECT_BASE, "PC") + else: + inc_dir = _PROJECT_BASE + else: + inc_dir = get_path('platinclude') + return os.path.join(inc_dir, 'pyconfig.h') + + +def get_scheme_names(): + """Return a tuple containing the schemes names.""" + return tuple(sorted(_SCHEMES.sections())) + + +def get_path_names(): + """Return a tuple containing the paths names.""" + # xxx see if we want a static list + return _SCHEMES.options('posix_prefix') + + +def get_paths(scheme=_get_default_scheme(), vars=None, expand=True): + """Return a mapping containing an install scheme. + + ``scheme`` is the install scheme name. If not provided, it will + return the default scheme for the current platform. + """ + _ensure_cfg_read() + if expand: + return _expand_vars(scheme, vars) + else: + return dict(_SCHEMES.items(scheme)) + + +def get_path(name, scheme=_get_default_scheme(), vars=None, expand=True): + """Return a path corresponding to the scheme. + + ``scheme`` is the install scheme name. + """ + return get_paths(scheme, vars, expand)[name] + + +def get_config_vars(*args): + """With no arguments, return a dictionary of all configuration + variables relevant for the current platform. + + On Unix, this means every variable defined in Python's installed Makefile; + On Windows and Mac OS it's a much smaller set. + + With arguments, return a list of values that result from looking up + each argument in the configuration variable dictionary. + """ + global _CONFIG_VARS + if _CONFIG_VARS is None: + _CONFIG_VARS = {} + # Normalized versions of prefix and exec_prefix are handy to have; + # in fact, these are the standard versions used most places in the + # distutils2 module. + _CONFIG_VARS['prefix'] = _PREFIX + _CONFIG_VARS['exec_prefix'] = _EXEC_PREFIX + _CONFIG_VARS['py_version'] = _PY_VERSION + _CONFIG_VARS['py_version_short'] = _PY_VERSION_SHORT + _CONFIG_VARS['py_version_nodot'] = _PY_VERSION[0] + _PY_VERSION[2] + _CONFIG_VARS['base'] = _PREFIX + _CONFIG_VARS['platbase'] = _EXEC_PREFIX + _CONFIG_VARS['projectbase'] = _PROJECT_BASE + try: + _CONFIG_VARS['abiflags'] = sys.abiflags + except AttributeError: + # sys.abiflags may not be defined on all platforms. + _CONFIG_VARS['abiflags'] = '' + + if os.name in ('nt', 'os2'): + _init_non_posix(_CONFIG_VARS) + if os.name == 'posix': + _init_posix(_CONFIG_VARS) + # Setting 'userbase' is done below the call to the + # init function to enable using 'get_config_var' in + # the init-function. + if sys.version >= '2.6': + _CONFIG_VARS['userbase'] = _getuserbase() + + if 'srcdir' not in _CONFIG_VARS: + _CONFIG_VARS['srcdir'] = _PROJECT_BASE + else: + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) + + # Convert srcdir into an absolute path if it appears necessary. + # Normally it is relative to the build directory. However, during + # testing, for example, we might be running a non-installed python + # from a different directory. + if _PYTHON_BUILD and os.name == "posix": + base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None + if (not os.path.isabs(_CONFIG_VARS['srcdir']) and + base != cwd): + # srcdir is relative and we are not in the same directory + # as the executable. Assume executable is in the build + # directory and make srcdir absolute. + srcdir = os.path.join(base, _CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = os.path.normpath(srcdir) + + if sys.platform == 'darwin': + kernel_version = os.uname()[2] # Kernel version (8.4.3) + major_version = int(kernel_version.split('.')[0]) + + if major_version < 8: + # On Mac OS X before 10.4, check if -arch and -isysroot + # are in CFLAGS or LDFLAGS and remove them if they are. + # This is needed when building extensions on a 10.3 system + # using a universal build of python. + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = re.sub('-isysroot [^ \t]*', ' ', flags) + _CONFIG_VARS[key] = flags + else: + # Allow the user to override the architecture flags using + # an environment variable. + # NOTE: This name was introduced by Apple in OSX 10.5 and + # is used by several scripting languages distributed with + # that OS release. + if 'ARCHFLAGS' in os.environ: + arch = os.environ['ARCHFLAGS'] + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-arch\s+\w+\s', ' ', flags) + flags = flags + ' ' + arch + _CONFIG_VARS[key] = flags + + # If we're on OSX 10.5 or later and the user tries to + # compiles an extension using an SDK that is not present + # on the current machine it is better to not use an SDK + # than to fail. + # + # The major usecase for this is users using a Python.org + # binary installer on OSX 10.6: that installer uses + # the 10.4u SDK, but that SDK is not installed by default + # when you install Xcode. + # + CFLAGS = _CONFIG_VARS.get('CFLAGS', '') + m = re.search(r'-isysroot\s+(\S+)', CFLAGS) + if m is not None: + sdk = m.group(1) + if not os.path.exists(sdk): + for key in ('LDFLAGS', 'BASECFLAGS', + # a number of derived variables. These need to be + # patched up as well. + 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'): + + flags = _CONFIG_VARS[key] + flags = re.sub(r'-isysroot\s+\S+(\s|$)', ' ', flags) + _CONFIG_VARS[key] = flags + + if args: + vals = [] + for name in args: + vals.append(_CONFIG_VARS.get(name)) + return vals + else: + return _CONFIG_VARS + + +def get_config_var(name): + """Return the value of a single variable using the dictionary returned by + 'get_config_vars()'. + + Equivalent to get_config_vars().get(name) + """ + return get_config_vars().get(name) + + +def get_platform(): + """Return a string that identifies the current platform. + + This is used mainly to distinguish platform-specific build directories and + platform-specific built distributions. Typically includes the OS name + and version and the architecture (as supplied by 'os.uname()'), + although the exact information included depends on the OS; eg. for IRIX + the architecture isn't particularly important (IRIX only runs on SGI + hardware), but for Linux the kernel version isn't particularly + important. + + Examples of returned values: + linux-i586 + linux-alpha (?) + solaris-2.6-sun4u + irix-5.3 + irix64-6.2 + + Windows will return one of: + win-amd64 (64bit Windows on AMD64 (aka x86_64, Intel64, EM64T, etc) + win-ia64 (64bit Windows on Itanium) + win32 (all others - specifically, sys.platform is returned) + + For other non-POSIX platforms, currently just returns 'sys.platform'. + """ + if os.name == 'nt': + # sniff sys.version for architecture. + prefix = " bit (" + i = sys.version.find(prefix) + if i == -1: + return sys.platform + j = sys.version.find(")", i) + look = sys.version[i+len(prefix):j].lower() + if look == 'amd64': + return 'win-amd64' + if look == 'itanium': + return 'win-ia64' + return sys.platform + + if os.name != "posix" or not hasattr(os, 'uname'): + # XXX what about the architecture? NT is Intel or Alpha, + # Mac OS is M68k or PPC, etc. + return sys.platform + + # Try to distinguish various flavours of Unix + osname, host, release, version, machine = os.uname() + + # Convert the OS name to lowercase, remove '/' characters + # (to accommodate BSD/OS), and translate spaces (for "Power Macintosh") + osname = osname.lower().replace('/', '') + machine = machine.replace(' ', '_') + machine = machine.replace('/', '-') + + if osname[:5] == "linux": + # At least on Linux/Intel, 'machine' is the processor -- + # i386, etc. + # XXX what about Alpha, SPARC, etc? + return "%s-%s" % (osname, machine) + elif osname[:5] == "sunos": + if release[0] >= "5": # SunOS 5 == Solaris 2 + osname = "solaris" + release = "%d.%s" % (int(release[0]) - 3, release[2:]) + # fall through to standard osname-release-machine representation + elif osname[:4] == "irix": # could be "irix64"! + return "%s-%s" % (osname, release) + elif osname[:3] == "aix": + return "%s-%s.%s" % (osname, version, release) + elif osname[:6] == "cygwin": + osname = "cygwin" + rel_re = re.compile(r'[\d.]+') + m = rel_re.match(release) + if m: + release = m.group() + elif osname[:6] == "darwin": + # + # For our purposes, we'll assume that the system version from + # distutils' perspective is what MACOSX_DEPLOYMENT_TARGET is set + # to. This makes the compatibility story a bit more sane because the + # machine is going to compile and link as if it were + # MACOSX_DEPLOYMENT_TARGET. + cfgvars = get_config_vars() + macver = cfgvars.get('MACOSX_DEPLOYMENT_TARGET') + + if True: + # Always calculate the release of the running machine, + # needed to determine if we can build fat binaries or not. + + macrelease = macver + # Get the system version. Reading this plist is a documented + # way to get the system version (see the documentation for + # the Gestalt Manager) + try: + f = open('/System/Library/CoreServices/SystemVersion.plist') + except IOError: + # We're on a plain darwin box, fall back to the default + # behaviour. + pass + else: + try: + m = re.search(r'<key>ProductUserVisibleVersion</key>\s*' + r'<string>(.*?)</string>', f.read()) + finally: + f.close() + if m is not None: + macrelease = '.'.join(m.group(1).split('.')[:2]) + # else: fall back to the default behaviour + + if not macver: + macver = macrelease + + if macver: + release = macver + osname = "macosx" + + if ((macrelease + '.') >= '10.4.' and + '-arch' in get_config_vars().get('CFLAGS', '').strip()): + # The universal build will build fat binaries, but not on + # systems before 10.4 + # + # Try to detect 4-way universal builds, those have machine-type + # 'universal' instead of 'fat'. + + machine = 'fat' + cflags = get_config_vars().get('CFLAGS') + + archs = re.findall(r'-arch\s+(\S+)', cflags) + archs = tuple(sorted(set(archs))) + + if len(archs) == 1: + machine = archs[0] + elif archs == ('i386', 'ppc'): + machine = 'fat' + elif archs == ('i386', 'x86_64'): + machine = 'intel' + elif archs == ('i386', 'ppc', 'x86_64'): + machine = 'fat3' + elif archs == ('ppc64', 'x86_64'): + machine = 'fat64' + elif archs == ('i386', 'ppc', 'ppc64', 'x86_64'): + machine = 'universal' + else: + raise ValueError( + "Don't know machine value for archs=%r" % (archs,)) + + elif machine == 'i386': + # On OSX the machine type returned by uname is always the + # 32-bit variant, even if the executable architecture is + # the 64-bit variant + if sys.maxsize >= 2**32: + machine = 'x86_64' + + elif machine in ('PowerPC', 'Power_Macintosh'): + # Pick a sane name for the PPC architecture. + # See 'i386' case + if sys.maxsize >= 2**32: + machine = 'ppc64' + else: + machine = 'ppc' + + return "%s-%s-%s" % (osname, release, machine) + + +def get_python_version(): + return _PY_VERSION_SHORT + + +def _print_dict(title, data): + for index, (key, value) in enumerate(sorted(data.items())): + if index == 0: + print('%s: ' % (title)) + print('\t%s = "%s"' % (key, value)) + + +def _main(): + """Display all information sysconfig detains.""" + print('Platform: "%s"' % get_platform()) + print('Python version: "%s"' % get_python_version()) + print('Current installation scheme: "%s"' % _get_default_scheme()) + print() + _print_dict('Paths', get_paths()) + print() + _print_dict('Variables', get_config_vars()) + + +if __name__ == '__main__': + _main() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 000000000..b0599bc29 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/_backport/tarfile.py @@ -0,0 +1,2607 @@ +#------------------------------------------------------------------- +# tarfile.py +#------------------------------------------------------------------- +# Copyright (C) 2002 Lars Gustaebel <lars@gustaebel.de> +# All rights reserved. +# +# 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. +# +from __future__ import print_function + +"""Read from and write to tar format archives. +""" + +__version__ = "$Revision$" + +version = "0.9.0" +__author__ = "Lars Gust\u00e4bel (lars@gustaebel.de)" +__date__ = "$Date: 2011-02-25 17:42:01 +0200 (Fri, 25 Feb 2011) $" +__cvsid__ = "$Id: tarfile.py 88586 2011-02-25 15:42:01Z marc-andre.lemburg $" +__credits__ = "Gustavo Niemeyer, Niels Gust\u00e4bel, Richard Townsend." + +#--------- +# Imports +#--------- +import sys +import os +import stat +import errno +import time +import struct +import copy +import re + +try: + import grp, pwd +except ImportError: + grp = pwd = None + +# os.symlink on Windows prior to 6.0 raises NotImplementedError +symlink_exception = (AttributeError, NotImplementedError) +try: + # WindowsError (1314) will be raised if the caller does not hold the + # SeCreateSymbolicLinkPrivilege privilege + symlink_exception += (WindowsError,) +except NameError: + pass + +# from tarfile import * +__all__ = ["TarFile", "TarInfo", "is_tarfile", "TarError"] + +if sys.version_info[0] < 3: + import __builtin__ as builtins +else: + import builtins + +_open = builtins.open # Since 'open' is TarFile.open + +#--------------------------------------------------------- +# tar constants +#--------------------------------------------------------- +NUL = b"\0" # the null character +BLOCKSIZE = 512 # length of processing blocks +RECORDSIZE = BLOCKSIZE * 20 # length of records +GNU_MAGIC = b"ustar \0" # magic gnu tar string +POSIX_MAGIC = b"ustar\x0000" # magic posix tar string + +LENGTH_NAME = 100 # maximum length of a filename +LENGTH_LINK = 100 # maximum length of a linkname +LENGTH_PREFIX = 155 # maximum length of the prefix field + +REGTYPE = b"0" # regular file +AREGTYPE = b"\0" # regular file +LNKTYPE = b"1" # link (inside tarfile) +SYMTYPE = b"2" # symbolic link +CHRTYPE = b"3" # character special device +BLKTYPE = b"4" # block special device +DIRTYPE = b"5" # directory +FIFOTYPE = b"6" # fifo special device +CONTTYPE = b"7" # contiguous file + +GNUTYPE_LONGNAME = b"L" # GNU tar longname +GNUTYPE_LONGLINK = b"K" # GNU tar longlink +GNUTYPE_SPARSE = b"S" # GNU tar sparse file + +XHDTYPE = b"x" # POSIX.1-2001 extended header +XGLTYPE = b"g" # POSIX.1-2001 global header +SOLARIS_XHDTYPE = b"X" # Solaris extended header + +USTAR_FORMAT = 0 # POSIX.1-1988 (ustar) format +GNU_FORMAT = 1 # GNU tar format +PAX_FORMAT = 2 # POSIX.1-2001 (pax) format +DEFAULT_FORMAT = GNU_FORMAT + +#--------------------------------------------------------- +# tarfile constants +#--------------------------------------------------------- +# File types that tarfile supports: +SUPPORTED_TYPES = (REGTYPE, AREGTYPE, LNKTYPE, + SYMTYPE, DIRTYPE, FIFOTYPE, + CONTTYPE, CHRTYPE, BLKTYPE, + GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# File types that will be treated as a regular file. +REGULAR_TYPES = (REGTYPE, AREGTYPE, + CONTTYPE, GNUTYPE_SPARSE) + +# File types that are part of the GNU tar format. +GNU_TYPES = (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK, + GNUTYPE_SPARSE) + +# Fields from a pax header that override a TarInfo attribute. +PAX_FIELDS = ("path", "linkpath", "size", "mtime", + "uid", "gid", "uname", "gname") + +# Fields from a pax header that are affected by hdrcharset. +PAX_NAME_FIELDS = set(("path", "linkpath", "uname", "gname")) + +# Fields in a pax header that are numbers, all other fields +# are treated as strings. +PAX_NUMBER_FIELDS = { + "atime": float, + "ctime": float, + "mtime": float, + "uid": int, + "gid": int, + "size": int +} + +#--------------------------------------------------------- +# Bits used in the mode field, values in octal. +#--------------------------------------------------------- +S_IFLNK = 0o120000 # symbolic link +S_IFREG = 0o100000 # regular file +S_IFBLK = 0o060000 # block device +S_IFDIR = 0o040000 # directory +S_IFCHR = 0o020000 # character device +S_IFIFO = 0o010000 # fifo + +TSUID = 0o4000 # set UID on execution +TSGID = 0o2000 # set GID on execution +TSVTX = 0o1000 # reserved + +TUREAD = 0o400 # read by owner +TUWRITE = 0o200 # write by owner +TUEXEC = 0o100 # execute/search by owner +TGREAD = 0o040 # read by group +TGWRITE = 0o020 # write by group +TGEXEC = 0o010 # execute/search by group +TOREAD = 0o004 # read by other +TOWRITE = 0o002 # write by other +TOEXEC = 0o001 # execute/search by other + +#--------------------------------------------------------- +# initialization +#--------------------------------------------------------- +if os.name in ("nt", "ce"): + ENCODING = "utf-8" +else: + ENCODING = sys.getfilesystemencoding() + +#--------------------------------------------------------- +# Some useful functions +#--------------------------------------------------------- + +def stn(s, length, encoding, errors): + """Convert a string to a null-terminated bytes object. + """ + s = s.encode(encoding, errors) + return s[:length] + (length - len(s)) * NUL + +def nts(s, encoding, errors): + """Convert a null-terminated bytes object to a string. + """ + p = s.find(b"\0") + if p != -1: + s = s[:p] + return s.decode(encoding, errors) + +def nti(s): + """Convert a number field to a python number. + """ + # There are two possible encodings for a number field, see + # itn() below. + if s[0] != chr(0o200): + try: + n = int(nts(s, "ascii", "strict") or "0", 8) + except ValueError: + raise InvalidHeaderError("invalid header") + else: + n = 0 + for i in range(len(s) - 1): + n <<= 8 + n += ord(s[i + 1]) + return n + +def itn(n, digits=8, format=DEFAULT_FORMAT): + """Convert a python number to a number field. + """ + # POSIX 1003.1-1988 requires numbers to be encoded as a string of + # octal digits followed by a null-byte, this allows values up to + # (8**(digits-1))-1. GNU tar allows storing numbers greater than + # that if necessary. A leading 0o200 byte indicates this particular + # encoding, the following digits-1 bytes are a big-endian + # representation. This allows values up to (256**(digits-1))-1. + if 0 <= n < 8 ** (digits - 1): + s = ("%0*o" % (digits - 1, n)).encode("ascii") + NUL + else: + if format != GNU_FORMAT or n >= 256 ** (digits - 1): + raise ValueError("overflow in number field") + + if n < 0: + # XXX We mimic GNU tar's behaviour with negative numbers, + # this could raise OverflowError. + n = struct.unpack("L", struct.pack("l", n))[0] + + s = bytearray() + for i in range(digits - 1): + s.insert(0, n & 0o377) + n >>= 8 + s.insert(0, 0o200) + return s + +def calc_chksums(buf): + """Calculate the checksum for a member's header by summing up all + characters except for the chksum field which is treated as if + it was filled with spaces. According to the GNU tar sources, + some tars (Sun and NeXT) calculate chksum with signed char, + which will be different if there are chars in the buffer with + the high bit set. So we calculate two checksums, unsigned and + signed. + """ + unsigned_chksum = 256 + sum(struct.unpack("148B", buf[:148]) + struct.unpack("356B", buf[156:512])) + signed_chksum = 256 + sum(struct.unpack("148b", buf[:148]) + struct.unpack("356b", buf[156:512])) + return unsigned_chksum, signed_chksum + +def copyfileobj(src, dst, length=None): + """Copy length bytes from fileobj src to fileobj dst. + If length is None, copy the entire content. + """ + if length == 0: + return + if length is None: + while True: + buf = src.read(16*1024) + if not buf: + break + dst.write(buf) + return + + BUFSIZE = 16 * 1024 + blocks, remainder = divmod(length, BUFSIZE) + for b in range(blocks): + buf = src.read(BUFSIZE) + if len(buf) < BUFSIZE: + raise IOError("end of file reached") + dst.write(buf) + + if remainder != 0: + buf = src.read(remainder) + if len(buf) < remainder: + raise IOError("end of file reached") + dst.write(buf) + return + +filemode_table = ( + ((S_IFLNK, "l"), + (S_IFREG, "-"), + (S_IFBLK, "b"), + (S_IFDIR, "d"), + (S_IFCHR, "c"), + (S_IFIFO, "p")), + + ((TUREAD, "r"),), + ((TUWRITE, "w"),), + ((TUEXEC|TSUID, "s"), + (TSUID, "S"), + (TUEXEC, "x")), + + ((TGREAD, "r"),), + ((TGWRITE, "w"),), + ((TGEXEC|TSGID, "s"), + (TSGID, "S"), + (TGEXEC, "x")), + + ((TOREAD, "r"),), + ((TOWRITE, "w"),), + ((TOEXEC|TSVTX, "t"), + (TSVTX, "T"), + (TOEXEC, "x")) +) + +def filemode(mode): + """Convert a file's mode to a string of the form + -rwxrwxrwx. + Used by TarFile.list() + """ + perm = [] + for table in filemode_table: + for bit, char in table: + if mode & bit == bit: + perm.append(char) + break + else: + perm.append("-") + return "".join(perm) + +class TarError(Exception): + """Base exception.""" + pass +class ExtractError(TarError): + """General exception for extract errors.""" + pass +class ReadError(TarError): + """Exception for unreadable tar archives.""" + pass +class CompressionError(TarError): + """Exception for unavailable compression methods.""" + pass +class StreamError(TarError): + """Exception for unsupported operations on stream-like TarFiles.""" + pass +class HeaderError(TarError): + """Base exception for header errors.""" + pass +class EmptyHeaderError(HeaderError): + """Exception for empty headers.""" + pass +class TruncatedHeaderError(HeaderError): + """Exception for truncated headers.""" + pass +class EOFHeaderError(HeaderError): + """Exception for end of file headers.""" + pass +class InvalidHeaderError(HeaderError): + """Exception for invalid headers.""" + pass +class SubsequentHeaderError(HeaderError): + """Exception for missing and invalid extended headers.""" + pass + +#--------------------------- +# internal stream interface +#--------------------------- +class _LowLevelFile(object): + """Low-level file object. Supports reading and writing. + It is used instead of a regular file object for streaming + access. + """ + + def __init__(self, name, mode): + mode = { + "r": os.O_RDONLY, + "w": os.O_WRONLY | os.O_CREAT | os.O_TRUNC, + }[mode] + if hasattr(os, "O_BINARY"): + mode |= os.O_BINARY + self.fd = os.open(name, mode, 0o666) + + def close(self): + os.close(self.fd) + + def read(self, size): + return os.read(self.fd, size) + + def write(self, s): + os.write(self.fd, s) + +class _Stream(object): + """Class that serves as an adapter between TarFile and + a stream-like object. The stream-like object only + needs to have a read() or write() method and is accessed + blockwise. Use of gzip or bzip2 compression is possible. + A stream-like object could be for example: sys.stdin, + sys.stdout, a socket, a tape device etc. + + _Stream is intended to be used only internally. + """ + + def __init__(self, name, mode, comptype, fileobj, bufsize): + """Construct a _Stream object. + """ + self._extfileobj = True + if fileobj is None: + fileobj = _LowLevelFile(name, mode) + self._extfileobj = False + + if comptype == '*': + # Enable transparent compression detection for the + # stream interface + fileobj = _StreamProxy(fileobj) + comptype = fileobj.getcomptype() + + self.name = name or "" + self.mode = mode + self.comptype = comptype + self.fileobj = fileobj + self.bufsize = bufsize + self.buf = b"" + self.pos = 0 + self.closed = False + + try: + if comptype == "gz": + try: + import zlib + except ImportError: + raise CompressionError("zlib module is not available") + self.zlib = zlib + self.crc = zlib.crc32(b"") + if mode == "r": + self._init_read_gz() + else: + self._init_write_gz() + + if comptype == "bz2": + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + if mode == "r": + self.dbuf = b"" + self.cmp = bz2.BZ2Decompressor() + else: + self.cmp = bz2.BZ2Compressor() + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + def __del__(self): + if hasattr(self, "closed") and not self.closed: + self.close() + + def _init_write_gz(self): + """Initialize for writing with gzip compression. + """ + self.cmp = self.zlib.compressobj(9, self.zlib.DEFLATED, + -self.zlib.MAX_WBITS, + self.zlib.DEF_MEM_LEVEL, + 0) + timestamp = struct.pack("<L", int(time.time())) + self.__write(b"\037\213\010\010" + timestamp + b"\002\377") + if self.name.endswith(".gz"): + self.name = self.name[:-3] + # RFC1952 says we must use ISO-8859-1 for the FNAME field. + self.__write(self.name.encode("iso-8859-1", "replace") + NUL) + + def write(self, s): + """Write string s to the stream. + """ + if self.comptype == "gz": + self.crc = self.zlib.crc32(s, self.crc) + self.pos += len(s) + if self.comptype != "tar": + s = self.cmp.compress(s) + self.__write(s) + + def __write(self, s): + """Write string s to the stream if a whole new block + is ready to be written. + """ + self.buf += s + while len(self.buf) > self.bufsize: + self.fileobj.write(self.buf[:self.bufsize]) + self.buf = self.buf[self.bufsize:] + + def close(self): + """Close the _Stream object. No operation should be + done on it afterwards. + """ + if self.closed: + return + + if self.mode == "w" and self.comptype != "tar": + self.buf += self.cmp.flush() + + if self.mode == "w" and self.buf: + self.fileobj.write(self.buf) + self.buf = b"" + if self.comptype == "gz": + # The native zlib crc is an unsigned 32-bit integer, but + # the Python wrapper implicitly casts that to a signed C + # long. So, on a 32-bit box self.crc may "look negative", + # while the same crc on a 64-bit box may "look positive". + # To avoid irksome warnings from the `struct` module, force + # it to look positive on all boxes. + self.fileobj.write(struct.pack("<L", self.crc & 0xffffffff)) + self.fileobj.write(struct.pack("<L", self.pos & 0xffffFFFF)) + + if not self._extfileobj: + self.fileobj.close() + + self.closed = True + + def _init_read_gz(self): + """Initialize for reading a gzip compressed fileobj. + """ + self.cmp = self.zlib.decompressobj(-self.zlib.MAX_WBITS) + self.dbuf = b"" + + # taken from gzip.GzipFile with some alterations + if self.__read(2) != b"\037\213": + raise ReadError("not a gzip file") + if self.__read(1) != b"\010": + raise CompressionError("unsupported compression method") + + flag = ord(self.__read(1)) + self.__read(6) + + if flag & 4: + xlen = ord(self.__read(1)) + 256 * ord(self.__read(1)) + self.read(xlen) + if flag & 8: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 16: + while True: + s = self.__read(1) + if not s or s == NUL: + break + if flag & 2: + self.__read(2) + + def tell(self): + """Return the stream's file pointer position. + """ + return self.pos + + def seek(self, pos=0): + """Set the stream's file pointer to pos. Negative seeking + is forbidden. + """ + if pos - self.pos >= 0: + blocks, remainder = divmod(pos - self.pos, self.bufsize) + for i in range(blocks): + self.read(self.bufsize) + self.read(remainder) + else: + raise StreamError("seeking backwards is not allowed") + return self.pos + + def read(self, size=None): + """Return the next size number of bytes from the stream. + If size is not defined, return all bytes of the stream + up to EOF. + """ + if size is None: + t = [] + while True: + buf = self._read(self.bufsize) + if not buf: + break + t.append(buf) + buf = "".join(t) + else: + buf = self._read(size) + self.pos += len(buf) + return buf + + def _read(self, size): + """Return size bytes from the stream. + """ + if self.comptype == "tar": + return self.__read(size) + + c = len(self.dbuf) + while c < size: + buf = self.__read(self.bufsize) + if not buf: + break + try: + buf = self.cmp.decompress(buf) + except IOError: + raise ReadError("invalid compressed data") + self.dbuf += buf + c += len(buf) + buf = self.dbuf[:size] + self.dbuf = self.dbuf[size:] + return buf + + def __read(self, size): + """Return size bytes from stream. If internal buffer is empty, + read another block from the stream. + """ + c = len(self.buf) + while c < size: + buf = self.fileobj.read(self.bufsize) + if not buf: + break + self.buf += buf + c += len(buf) + buf = self.buf[:size] + self.buf = self.buf[size:] + return buf +# class _Stream + +class _StreamProxy(object): + """Small proxy class that enables transparent compression + detection for the Stream interface (mode 'r|*'). + """ + + def __init__(self, fileobj): + self.fileobj = fileobj + self.buf = self.fileobj.read(BLOCKSIZE) + + def read(self, size): + self.read = self.fileobj.read + return self.buf + + def getcomptype(self): + if self.buf.startswith(b"\037\213\010"): + return "gz" + if self.buf.startswith(b"BZh91"): + return "bz2" + return "tar" + + def close(self): + self.fileobj.close() +# class StreamProxy + +class _BZ2Proxy(object): + """Small proxy class that enables external file object + support for "r:bz2" and "w:bz2" modes. This is actually + a workaround for a limitation in bz2 module's BZ2File + class which (unlike gzip.GzipFile) has no support for + a file object argument. + """ + + blocksize = 16 * 1024 + + def __init__(self, fileobj, mode): + self.fileobj = fileobj + self.mode = mode + self.name = getattr(self.fileobj, "name", None) + self.init() + + def init(self): + import bz2 + self.pos = 0 + if self.mode == "r": + self.bz2obj = bz2.BZ2Decompressor() + self.fileobj.seek(0) + self.buf = b"" + else: + self.bz2obj = bz2.BZ2Compressor() + + def read(self, size): + x = len(self.buf) + while x < size: + raw = self.fileobj.read(self.blocksize) + if not raw: + break + data = self.bz2obj.decompress(raw) + self.buf += data + x += len(data) + + buf = self.buf[:size] + self.buf = self.buf[size:] + self.pos += len(buf) + return buf + + def seek(self, pos): + if pos < self.pos: + self.init() + self.read(pos - self.pos) + + def tell(self): + return self.pos + + def write(self, data): + self.pos += len(data) + raw = self.bz2obj.compress(data) + self.fileobj.write(raw) + + def close(self): + if self.mode == "w": + raw = self.bz2obj.flush() + self.fileobj.write(raw) +# class _BZ2Proxy + +#------------------------ +# Extraction file object +#------------------------ +class _FileInFile(object): + """A thin wrapper around an existing file object that + provides a part of its data as an individual file + object. + """ + + def __init__(self, fileobj, offset, size, blockinfo=None): + self.fileobj = fileobj + self.offset = offset + self.size = size + self.position = 0 + + if blockinfo is None: + blockinfo = [(0, size)] + + # Construct a map with data and zero blocks. + self.map_index = 0 + self.map = [] + lastpos = 0 + realpos = self.offset + for offset, size in blockinfo: + if offset > lastpos: + self.map.append((False, lastpos, offset, None)) + self.map.append((True, offset, offset + size, realpos)) + realpos += size + lastpos = offset + size + if lastpos < self.size: + self.map.append((False, lastpos, self.size, None)) + + def seekable(self): + if not hasattr(self.fileobj, "seekable"): + # XXX gzip.GzipFile and bz2.BZ2File + return True + return self.fileobj.seekable() + + def tell(self): + """Return the current file position. + """ + return self.position + + def seek(self, position): + """Seek to a position in the file. + """ + self.position = position + + def read(self, size=None): + """Read data from the file. + """ + if size is None: + size = self.size - self.position + else: + size = min(size, self.size - self.position) + + buf = b"" + while size > 0: + while True: + data, start, stop, offset = self.map[self.map_index] + if start <= self.position < stop: + break + else: + self.map_index += 1 + if self.map_index == len(self.map): + self.map_index = 0 + length = min(size, stop - self.position) + if data: + self.fileobj.seek(offset + (self.position - start)) + buf += self.fileobj.read(length) + else: + buf += NUL * length + size -= length + self.position += length + return buf +#class _FileInFile + + +class ExFileObject(object): + """File-like object for reading an archive member. + Is returned by TarFile.extractfile(). + """ + blocksize = 1024 + + def __init__(self, tarfile, tarinfo): + self.fileobj = _FileInFile(tarfile.fileobj, + tarinfo.offset_data, + tarinfo.size, + tarinfo.sparse) + self.name = tarinfo.name + self.mode = "r" + self.closed = False + self.size = tarinfo.size + + self.position = 0 + self.buffer = b"" + + def readable(self): + return True + + def writable(self): + return False + + def seekable(self): + return self.fileobj.seekable() + + def read(self, size=None): + """Read at most size bytes from the file. If size is not + present or None, read all data until EOF is reached. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + buf = b"" + if self.buffer: + if size is None: + buf = self.buffer + self.buffer = b"" + else: + buf = self.buffer[:size] + self.buffer = self.buffer[size:] + + if size is None: + buf += self.fileobj.read() + else: + buf += self.fileobj.read(size - len(buf)) + + self.position += len(buf) + return buf + + # XXX TextIOWrapper uses the read1() method. + read1 = read + + def readline(self, size=-1): + """Read one entire line from the file. If size is present + and non-negative, return a string with at most that + size, which may be an incomplete line. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + while True: + buf = self.fileobj.read(self.blocksize) + self.buffer += buf + if not buf or b"\n" in buf: + pos = self.buffer.find(b"\n") + 1 + if pos == 0: + # no newline found. + pos = len(self.buffer) + break + + if size != -1: + pos = min(size, pos) + + buf = self.buffer[:pos] + self.buffer = self.buffer[pos:] + self.position += len(buf) + return buf + + def readlines(self): + """Return a list with all remaining lines. + """ + result = [] + while True: + line = self.readline() + if not line: break + result.append(line) + return result + + def tell(self): + """Return the current file position. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + return self.position + + def seek(self, pos, whence=os.SEEK_SET): + """Seek to a position in the file. + """ + if self.closed: + raise ValueError("I/O operation on closed file") + + if whence == os.SEEK_SET: + self.position = min(max(pos, 0), self.size) + elif whence == os.SEEK_CUR: + if pos < 0: + self.position = max(self.position + pos, 0) + else: + self.position = min(self.position + pos, self.size) + elif whence == os.SEEK_END: + self.position = max(min(self.size + pos, self.size), 0) + else: + raise ValueError("Invalid argument") + + self.buffer = b"" + self.fileobj.seek(self.position) + + def close(self): + """Close the file object. + """ + self.closed = True + + def __iter__(self): + """Get an iterator over the file's lines. + """ + while True: + line = self.readline() + if not line: + break + yield line +#class ExFileObject + +#------------------ +# Exported Classes +#------------------ +class TarInfo(object): + """Informational class which holds the details about an + archive member given by a tar header block. + TarInfo objects are returned by TarFile.getmember(), + TarFile.getmembers() and TarFile.gettarinfo() and are + usually created internally. + """ + + __slots__ = ("name", "mode", "uid", "gid", "size", "mtime", + "chksum", "type", "linkname", "uname", "gname", + "devmajor", "devminor", + "offset", "offset_data", "pax_headers", "sparse", + "tarfile", "_sparse_structs", "_link_target") + + def __init__(self, name=""): + """Construct a TarInfo object. name is the optional name + of the member. + """ + self.name = name # member name + self.mode = 0o644 # file permissions + self.uid = 0 # user id + self.gid = 0 # group id + self.size = 0 # file size + self.mtime = 0 # modification time + self.chksum = 0 # header checksum + self.type = REGTYPE # member type + self.linkname = "" # link name + self.uname = "" # user name + self.gname = "" # group name + self.devmajor = 0 # device major number + self.devminor = 0 # device minor number + + self.offset = 0 # the tar header starts here + self.offset_data = 0 # the file's data starts here + + self.sparse = None # sparse member information + self.pax_headers = {} # pax header information + + # In pax headers the "name" and "linkname" field are called + # "path" and "linkpath". + def _getpath(self): + return self.name + def _setpath(self, name): + self.name = name + path = property(_getpath, _setpath) + + def _getlinkpath(self): + return self.linkname + def _setlinkpath(self, linkname): + self.linkname = linkname + linkpath = property(_getlinkpath, _setlinkpath) + + def __repr__(self): + return "<%s %r at %#x>" % (self.__class__.__name__,self.name,id(self)) + + def get_info(self): + """Return the TarInfo's attributes as a dictionary. + """ + info = { + "name": self.name, + "mode": self.mode & 0o7777, + "uid": self.uid, + "gid": self.gid, + "size": self.size, + "mtime": self.mtime, + "chksum": self.chksum, + "type": self.type, + "linkname": self.linkname, + "uname": self.uname, + "gname": self.gname, + "devmajor": self.devmajor, + "devminor": self.devminor + } + + if info["type"] == DIRTYPE and not info["name"].endswith("/"): + info["name"] += "/" + + return info + + def tobuf(self, format=DEFAULT_FORMAT, encoding=ENCODING, errors="surrogateescape"): + """Return a tar header as a string of 512 byte blocks. + """ + info = self.get_info() + + if format == USTAR_FORMAT: + return self.create_ustar_header(info, encoding, errors) + elif format == GNU_FORMAT: + return self.create_gnu_header(info, encoding, errors) + elif format == PAX_FORMAT: + return self.create_pax_header(info, encoding) + else: + raise ValueError("invalid format") + + def create_ustar_header(self, info, encoding, errors): + """Return the object as a ustar header block. + """ + info["magic"] = POSIX_MAGIC + + if len(info["linkname"]) > LENGTH_LINK: + raise ValueError("linkname is too long") + + if len(info["name"]) > LENGTH_NAME: + info["prefix"], info["name"] = self._posix_split_name(info["name"]) + + return self._create_header(info, USTAR_FORMAT, encoding, errors) + + def create_gnu_header(self, info, encoding, errors): + """Return the object as a GNU header block sequence. + """ + info["magic"] = GNU_MAGIC + + buf = b"" + if len(info["linkname"]) > LENGTH_LINK: + buf += self._create_gnu_long_header(info["linkname"], GNUTYPE_LONGLINK, encoding, errors) + + if len(info["name"]) > LENGTH_NAME: + buf += self._create_gnu_long_header(info["name"], GNUTYPE_LONGNAME, encoding, errors) + + return buf + self._create_header(info, GNU_FORMAT, encoding, errors) + + def create_pax_header(self, info, encoding): + """Return the object as a ustar header block. If it cannot be + represented this way, prepend a pax extended header sequence + with supplement information. + """ + info["magic"] = POSIX_MAGIC + pax_headers = self.pax_headers.copy() + + # Test string fields for values that exceed the field length or cannot + # be represented in ASCII encoding. + for name, hname, length in ( + ("name", "path", LENGTH_NAME), ("linkname", "linkpath", LENGTH_LINK), + ("uname", "uname", 32), ("gname", "gname", 32)): + + if hname in pax_headers: + # The pax header has priority. + continue + + # Try to encode the string as ASCII. + try: + info[name].encode("ascii", "strict") + except UnicodeEncodeError: + pax_headers[hname] = info[name] + continue + + if len(info[name]) > length: + pax_headers[hname] = info[name] + + # Test number fields for values that exceed the field limit or values + # that like to be stored as float. + for name, digits in (("uid", 8), ("gid", 8), ("size", 12), ("mtime", 12)): + if name in pax_headers: + # The pax header has priority. Avoid overflow. + info[name] = 0 + continue + + val = info[name] + if not 0 <= val < 8 ** (digits - 1) or isinstance(val, float): + pax_headers[name] = str(val) + info[name] = 0 + + # Create a pax extended header if necessary. + if pax_headers: + buf = self._create_pax_generic_header(pax_headers, XHDTYPE, encoding) + else: + buf = b"" + + return buf + self._create_header(info, USTAR_FORMAT, "ascii", "replace") + + @classmethod + def create_pax_global_header(cls, pax_headers): + """Return the object as a pax global header block sequence. + """ + return cls._create_pax_generic_header(pax_headers, XGLTYPE, "utf8") + + def _posix_split_name(self, name): + """Split a name longer than 100 chars into a prefix + and a name part. + """ + prefix = name[:LENGTH_PREFIX + 1] + while prefix and prefix[-1] != "/": + prefix = prefix[:-1] + + name = name[len(prefix):] + prefix = prefix[:-1] + + if not prefix or len(name) > LENGTH_NAME: + raise ValueError("name is too long") + return prefix, name + + @staticmethod + def _create_header(info, format, encoding, errors): + """Return a header block. info is a dictionary with file + information, format must be one of the *_FORMAT constants. + """ + parts = [ + stn(info.get("name", ""), 100, encoding, errors), + itn(info.get("mode", 0) & 0o7777, 8, format), + itn(info.get("uid", 0), 8, format), + itn(info.get("gid", 0), 8, format), + itn(info.get("size", 0), 12, format), + itn(info.get("mtime", 0), 12, format), + b" ", # checksum field + info.get("type", REGTYPE), + stn(info.get("linkname", ""), 100, encoding, errors), + info.get("magic", POSIX_MAGIC), + stn(info.get("uname", ""), 32, encoding, errors), + stn(info.get("gname", ""), 32, encoding, errors), + itn(info.get("devmajor", 0), 8, format), + itn(info.get("devminor", 0), 8, format), + stn(info.get("prefix", ""), 155, encoding, errors) + ] + + buf = struct.pack("%ds" % BLOCKSIZE, b"".join(parts)) + chksum = calc_chksums(buf[-BLOCKSIZE:])[0] + buf = buf[:-364] + ("%06o\0" % chksum).encode("ascii") + buf[-357:] + return buf + + @staticmethod + def _create_payload(payload): + """Return the string payload filled with zero bytes + up to the next 512 byte border. + """ + blocks, remainder = divmod(len(payload), BLOCKSIZE) + if remainder > 0: + payload += (BLOCKSIZE - remainder) * NUL + return payload + + @classmethod + def _create_gnu_long_header(cls, name, type, encoding, errors): + """Return a GNUTYPE_LONGNAME or GNUTYPE_LONGLINK sequence + for name. + """ + name = name.encode(encoding, errors) + NUL + + info = {} + info["name"] = "././@LongLink" + info["type"] = type + info["size"] = len(name) + info["magic"] = GNU_MAGIC + + # create extended header + name blocks. + return cls._create_header(info, USTAR_FORMAT, encoding, errors) + \ + cls._create_payload(name) + + @classmethod + def _create_pax_generic_header(cls, pax_headers, type, encoding): + """Return a POSIX.1-2008 extended or global header sequence + that contains a list of keyword, value pairs. The values + must be strings. + """ + # Check if one of the fields contains surrogate characters and thereby + # forces hdrcharset=BINARY, see _proc_pax() for more information. + binary = False + for keyword, value in pax_headers.items(): + try: + value.encode("utf8", "strict") + except UnicodeEncodeError: + binary = True + break + + records = b"" + if binary: + # Put the hdrcharset field at the beginning of the header. + records += b"21 hdrcharset=BINARY\n" + + for keyword, value in pax_headers.items(): + keyword = keyword.encode("utf8") + if binary: + # Try to restore the original byte representation of `value'. + # Needless to say, that the encoding must match the string. + value = value.encode(encoding, "surrogateescape") + else: + value = value.encode("utf8") + + l = len(keyword) + len(value) + 3 # ' ' + '=' + '\n' + n = p = 0 + while True: + n = l + len(str(p)) + if n == p: + break + p = n + records += bytes(str(p), "ascii") + b" " + keyword + b"=" + value + b"\n" + + # We use a hardcoded "././@PaxHeader" name like star does + # instead of the one that POSIX recommends. + info = {} + info["name"] = "././@PaxHeader" + info["type"] = type + info["size"] = len(records) + info["magic"] = POSIX_MAGIC + + # Create pax header + record blocks. + return cls._create_header(info, USTAR_FORMAT, "ascii", "replace") + \ + cls._create_payload(records) + + @classmethod + def frombuf(cls, buf, encoding, errors): + """Construct a TarInfo object from a 512 byte bytes object. + """ + if len(buf) == 0: + raise EmptyHeaderError("empty header") + if len(buf) != BLOCKSIZE: + raise TruncatedHeaderError("truncated header") + if buf.count(NUL) == BLOCKSIZE: + raise EOFHeaderError("end of file header") + + chksum = nti(buf[148:156]) + if chksum not in calc_chksums(buf): + raise InvalidHeaderError("bad checksum") + + obj = cls() + obj.name = nts(buf[0:100], encoding, errors) + obj.mode = nti(buf[100:108]) + obj.uid = nti(buf[108:116]) + obj.gid = nti(buf[116:124]) + obj.size = nti(buf[124:136]) + obj.mtime = nti(buf[136:148]) + obj.chksum = chksum + obj.type = buf[156:157] + obj.linkname = nts(buf[157:257], encoding, errors) + obj.uname = nts(buf[265:297], encoding, errors) + obj.gname = nts(buf[297:329], encoding, errors) + obj.devmajor = nti(buf[329:337]) + obj.devminor = nti(buf[337:345]) + prefix = nts(buf[345:500], encoding, errors) + + # Old V7 tar format represents a directory as a regular + # file with a trailing slash. + if obj.type == AREGTYPE and obj.name.endswith("/"): + obj.type = DIRTYPE + + # The old GNU sparse format occupies some of the unused + # space in the buffer for up to 4 sparse structures. + # Save the them for later processing in _proc_sparse(). + if obj.type == GNUTYPE_SPARSE: + pos = 386 + structs = [] + for i in range(4): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[482]) + origsize = nti(buf[483:495]) + obj._sparse_structs = (structs, isextended, origsize) + + # Remove redundant slashes from directories. + if obj.isdir(): + obj.name = obj.name.rstrip("/") + + # Reconstruct a ustar longname. + if prefix and obj.type not in GNU_TYPES: + obj.name = prefix + "/" + obj.name + return obj + + @classmethod + def fromtarfile(cls, tarfile): + """Return the next TarInfo object from TarFile object + tarfile. + """ + buf = tarfile.fileobj.read(BLOCKSIZE) + obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) + obj.offset = tarfile.fileobj.tell() - BLOCKSIZE + return obj._proc_member(tarfile) + + #-------------------------------------------------------------------------- + # The following are methods that are called depending on the type of a + # member. The entry point is _proc_member() which can be overridden in a + # subclass to add custom _proc_*() methods. A _proc_*() method MUST + # implement the following + # operations: + # 1. Set self.offset_data to the position where the data blocks begin, + # if there is data that follows. + # 2. Set tarfile.offset to the position where the next member's header will + # begin. + # 3. Return self or another valid TarInfo object. + def _proc_member(self, tarfile): + """Choose the right processing method depending on + the type and call it. + """ + if self.type in (GNUTYPE_LONGNAME, GNUTYPE_LONGLINK): + return self._proc_gnulong(tarfile) + elif self.type == GNUTYPE_SPARSE: + return self._proc_sparse(tarfile) + elif self.type in (XHDTYPE, XGLTYPE, SOLARIS_XHDTYPE): + return self._proc_pax(tarfile) + else: + return self._proc_builtin(tarfile) + + def _proc_builtin(self, tarfile): + """Process a builtin type or an unknown type which + will be treated as a regular file. + """ + self.offset_data = tarfile.fileobj.tell() + offset = self.offset_data + if self.isreg() or self.type not in SUPPORTED_TYPES: + # Skip the following data blocks. + offset += self._block(self.size) + tarfile.offset = offset + + # Patch the TarInfo object with saved global + # header information. + self._apply_pax_info(tarfile.pax_headers, tarfile.encoding, tarfile.errors) + + return self + + def _proc_gnulong(self, tarfile): + """Process the blocks that hold a GNU longname + or longlink member. + """ + buf = tarfile.fileobj.read(self._block(self.size)) + + # Fetch the next header and process it. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Patch the TarInfo object from the next header with + # the longname information. + next.offset = self.offset + if self.type == GNUTYPE_LONGNAME: + next.name = nts(buf, tarfile.encoding, tarfile.errors) + elif self.type == GNUTYPE_LONGLINK: + next.linkname = nts(buf, tarfile.encoding, tarfile.errors) + + return next + + def _proc_sparse(self, tarfile): + """Process a GNU sparse header plus extra headers. + """ + # We already collected some sparse structures in frombuf(). + structs, isextended, origsize = self._sparse_structs + del self._sparse_structs + + # Collect sparse structures from extended header blocks. + while isextended: + buf = tarfile.fileobj.read(BLOCKSIZE) + pos = 0 + for i in range(21): + try: + offset = nti(buf[pos:pos + 12]) + numbytes = nti(buf[pos + 12:pos + 24]) + except ValueError: + break + if offset and numbytes: + structs.append((offset, numbytes)) + pos += 24 + isextended = bool(buf[504]) + self.sparse = structs + + self.offset_data = tarfile.fileobj.tell() + tarfile.offset = self.offset_data + self._block(self.size) + self.size = origsize + return self + + def _proc_pax(self, tarfile): + """Process an extended or global header as described in + POSIX.1-2008. + """ + # Read the header information. + buf = tarfile.fileobj.read(self._block(self.size)) + + # A pax header stores supplemental information for either + # the following file (extended) or all following files + # (global). + if self.type == XGLTYPE: + pax_headers = tarfile.pax_headers + else: + pax_headers = tarfile.pax_headers.copy() + + # Check if the pax header contains a hdrcharset field. This tells us + # the encoding of the path, linkpath, uname and gname fields. Normally, + # these fields are UTF-8 encoded but since POSIX.1-2008 tar + # implementations are allowed to store them as raw binary strings if + # the translation to UTF-8 fails. + match = re.search(br"\d+ hdrcharset=([^\n]+)\n", buf) + if match is not None: + pax_headers["hdrcharset"] = match.group(1).decode("utf8") + + # For the time being, we don't care about anything other than "BINARY". + # The only other value that is currently allowed by the standard is + # "ISO-IR 10646 2000 UTF-8" in other words UTF-8. + hdrcharset = pax_headers.get("hdrcharset") + if hdrcharset == "BINARY": + encoding = tarfile.encoding + else: + encoding = "utf8" + + # Parse pax header information. A record looks like that: + # "%d %s=%s\n" % (length, keyword, value). length is the size + # of the complete record including the length field itself and + # the newline. keyword and value are both UTF-8 encoded strings. + regex = re.compile(br"(\d+) ([^=]+)=") + pos = 0 + while True: + match = regex.match(buf, pos) + if not match: + break + + length, keyword = match.groups() + length = int(length) + value = buf[match.end(2) + 1:match.start(1) + length - 1] + + # Normally, we could just use "utf8" as the encoding and "strict" + # as the error handler, but we better not take the risk. For + # example, GNU tar <= 1.23 is known to store filenames it cannot + # translate to UTF-8 as raw strings (unfortunately without a + # hdrcharset=BINARY header). + # We first try the strict standard encoding, and if that fails we + # fall back on the user's encoding and error handler. + keyword = self._decode_pax_field(keyword, "utf8", "utf8", + tarfile.errors) + if keyword in PAX_NAME_FIELDS: + value = self._decode_pax_field(value, encoding, tarfile.encoding, + tarfile.errors) + else: + value = self._decode_pax_field(value, "utf8", "utf8", + tarfile.errors) + + pax_headers[keyword] = value + pos += length + + # Fetch the next header. + try: + next = self.fromtarfile(tarfile) + except HeaderError: + raise SubsequentHeaderError("missing or bad subsequent header") + + # Process GNU sparse information. + if "GNU.sparse.map" in pax_headers: + # GNU extended sparse format version 0.1. + self._proc_gnusparse_01(next, pax_headers) + + elif "GNU.sparse.size" in pax_headers: + # GNU extended sparse format version 0.0. + self._proc_gnusparse_00(next, pax_headers, buf) + + elif pax_headers.get("GNU.sparse.major") == "1" and pax_headers.get("GNU.sparse.minor") == "0": + # GNU extended sparse format version 1.0. + self._proc_gnusparse_10(next, pax_headers, tarfile) + + if self.type in (XHDTYPE, SOLARIS_XHDTYPE): + # Patch the TarInfo object with the extended header info. + next._apply_pax_info(pax_headers, tarfile.encoding, tarfile.errors) + next.offset = self.offset + + if "size" in pax_headers: + # If the extended header replaces the size field, + # we need to recalculate the offset where the next + # header starts. + offset = next.offset_data + if next.isreg() or next.type not in SUPPORTED_TYPES: + offset += next._block(next.size) + tarfile.offset = offset + + return next + + def _proc_gnusparse_00(self, next, pax_headers, buf): + """Process a GNU tar extended sparse header, version 0.0. + """ + offsets = [] + for match in re.finditer(br"\d+ GNU.sparse.offset=(\d+)\n", buf): + offsets.append(int(match.group(1))) + numbytes = [] + for match in re.finditer(br"\d+ GNU.sparse.numbytes=(\d+)\n", buf): + numbytes.append(int(match.group(1))) + next.sparse = list(zip(offsets, numbytes)) + + def _proc_gnusparse_01(self, next, pax_headers): + """Process a GNU tar extended sparse header, version 0.1. + """ + sparse = [int(x) for x in pax_headers["GNU.sparse.map"].split(",")] + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _proc_gnusparse_10(self, next, pax_headers, tarfile): + """Process a GNU tar extended sparse header, version 1.0. + """ + fields = None + sparse = [] + buf = tarfile.fileobj.read(BLOCKSIZE) + fields, buf = buf.split(b"\n", 1) + fields = int(fields) + while len(sparse) < fields * 2: + if b"\n" not in buf: + buf += tarfile.fileobj.read(BLOCKSIZE) + number, buf = buf.split(b"\n", 1) + sparse.append(int(number)) + next.offset_data = tarfile.fileobj.tell() + next.sparse = list(zip(sparse[::2], sparse[1::2])) + + def _apply_pax_info(self, pax_headers, encoding, errors): + """Replace fields with supplemental information from a previous + pax extended or global header. + """ + for keyword, value in pax_headers.items(): + if keyword == "GNU.sparse.name": + setattr(self, "path", value) + elif keyword == "GNU.sparse.size": + setattr(self, "size", int(value)) + elif keyword == "GNU.sparse.realsize": + setattr(self, "size", int(value)) + elif keyword in PAX_FIELDS: + if keyword in PAX_NUMBER_FIELDS: + try: + value = PAX_NUMBER_FIELDS[keyword](value) + except ValueError: + value = 0 + if keyword == "path": + value = value.rstrip("/") + setattr(self, keyword, value) + + self.pax_headers = pax_headers.copy() + + def _decode_pax_field(self, value, encoding, fallback_encoding, fallback_errors): + """Decode a single field from a pax record. + """ + try: + return value.decode(encoding, "strict") + except UnicodeDecodeError: + return value.decode(fallback_encoding, fallback_errors) + + def _block(self, count): + """Round up a byte count by BLOCKSIZE and return it, + e.g. _block(834) => 1024. + """ + blocks, remainder = divmod(count, BLOCKSIZE) + if remainder: + blocks += 1 + return blocks * BLOCKSIZE + + def isreg(self): + return self.type in REGULAR_TYPES + def isfile(self): + return self.isreg() + def isdir(self): + return self.type == DIRTYPE + def issym(self): + return self.type == SYMTYPE + def islnk(self): + return self.type == LNKTYPE + def ischr(self): + return self.type == CHRTYPE + def isblk(self): + return self.type == BLKTYPE + def isfifo(self): + return self.type == FIFOTYPE + def issparse(self): + return self.sparse is not None + def isdev(self): + return self.type in (CHRTYPE, BLKTYPE, FIFOTYPE) +# class TarInfo + +class TarFile(object): + """The TarFile Class provides an interface to tar archives. + """ + + debug = 0 # May be set from 0 (no msgs) to 3 (all msgs) + + dereference = False # If true, add content of linked file to the + # tar file, else the link. + + ignore_zeros = False # If true, skips empty or invalid blocks and + # continues processing. + + errorlevel = 1 # If 0, fatal errors only appear in debug + # messages (if debug >= 0). If > 0, errors + # are passed to the caller as exceptions. + + format = DEFAULT_FORMAT # The format to use when creating an archive. + + encoding = ENCODING # Encoding for 8-bit character strings. + + errors = None # Error handler for unicode conversion. + + tarinfo = TarInfo # The default TarInfo class to use. + + fileobject = ExFileObject # The default ExFileObject class to use. + + def __init__(self, name=None, mode="r", fileobj=None, format=None, + tarinfo=None, dereference=None, ignore_zeros=None, encoding=None, + errors="surrogateescape", pax_headers=None, debug=None, errorlevel=None): + """Open an (uncompressed) tar archive `name'. `mode' is either 'r' to + read from an existing archive, 'a' to append data to an existing + file or 'w' to create a new file overwriting an existing one. `mode' + defaults to 'r'. + If `fileobj' is given, it is used for reading or writing data. If it + can be determined, `mode' is overridden by `fileobj's mode. + `fileobj' is not closed, when TarFile is closed. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + self.mode = mode + self._mode = {"r": "rb", "a": "r+b", "w": "wb"}[mode] + + if not fileobj: + if self.mode == "a" and not os.path.exists(name): + # Create nonexistent files in append mode. + self.mode = "w" + self._mode = "wb" + fileobj = bltn_open(name, self._mode) + self._extfileobj = False + else: + if name is None and hasattr(fileobj, "name"): + name = fileobj.name + if hasattr(fileobj, "mode"): + self._mode = fileobj.mode + self._extfileobj = True + self.name = os.path.abspath(name) if name else None + self.fileobj = fileobj + + # Init attributes. + if format is not None: + self.format = format + if tarinfo is not None: + self.tarinfo = tarinfo + if dereference is not None: + self.dereference = dereference + if ignore_zeros is not None: + self.ignore_zeros = ignore_zeros + if encoding is not None: + self.encoding = encoding + self.errors = errors + + if pax_headers is not None and self.format == PAX_FORMAT: + self.pax_headers = pax_headers + else: + self.pax_headers = {} + + if debug is not None: + self.debug = debug + if errorlevel is not None: + self.errorlevel = errorlevel + + # Init datastructures. + self.closed = False + self.members = [] # list of members as TarInfo objects + self._loaded = False # flag if all members have been read + self.offset = self.fileobj.tell() + # current position in the archive file + self.inodes = {} # dictionary caching the inodes of + # archive members already added + + try: + if self.mode == "r": + self.firstmember = None + self.firstmember = self.next() + + if self.mode == "a": + # Move to the end of the archive, + # before the first empty block. + while True: + self.fileobj.seek(self.offset) + try: + tarinfo = self.tarinfo.fromtarfile(self) + self.members.append(tarinfo) + except EOFHeaderError: + self.fileobj.seek(self.offset) + break + except HeaderError as e: + raise ReadError(str(e)) + + if self.mode in "aw": + self._loaded = True + + if self.pax_headers: + buf = self.tarinfo.create_pax_global_header(self.pax_headers.copy()) + self.fileobj.write(buf) + self.offset += len(buf) + except: + if not self._extfileobj: + self.fileobj.close() + self.closed = True + raise + + #-------------------------------------------------------------------------- + # Below are the classmethods which act as alternate constructors to the + # TarFile class. The open() method is the only one that is needed for + # public use; it is the "super"-constructor and is able to select an + # adequate "sub"-constructor for a particular compression using the mapping + # from OPEN_METH. + # + # This concept allows one to subclass TarFile without losing the comfort of + # the super-constructor. A sub-constructor is registered and made available + # by adding it to the mapping in OPEN_METH. + + @classmethod + def open(cls, name=None, mode="r", fileobj=None, bufsize=RECORDSIZE, **kwargs): + """Open a tar archive for reading, writing or appending. Return + an appropriate TarFile class. + + mode: + 'r' or 'r:*' open for reading with transparent compression + 'r:' open for reading exclusively uncompressed + 'r:gz' open for reading with gzip compression + 'r:bz2' open for reading with bzip2 compression + 'a' or 'a:' open for appending, creating the file if necessary + 'w' or 'w:' open for writing without compression + 'w:gz' open for writing with gzip compression + 'w:bz2' open for writing with bzip2 compression + + 'r|*' open a stream of tar blocks with transparent compression + 'r|' open an uncompressed stream of tar blocks for reading + 'r|gz' open a gzip compressed stream of tar blocks + 'r|bz2' open a bzip2 compressed stream of tar blocks + 'w|' open an uncompressed stream for writing + 'w|gz' open a gzip compressed stream for writing + 'w|bz2' open a bzip2 compressed stream for writing + """ + + if not name and not fileobj: + raise ValueError("nothing to open") + + if mode in ("r", "r:*"): + # Find out which *open() is appropriate for opening the file. + for comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + if fileobj is not None: + saved_pos = fileobj.tell() + try: + return func(name, "r", fileobj, **kwargs) + except (ReadError, CompressionError) as e: + if fileobj is not None: + fileobj.seek(saved_pos) + continue + raise ReadError("file could not be opened successfully") + + elif ":" in mode: + filemode, comptype = mode.split(":", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + # Select the *open() function according to + # given compression. + if comptype in cls.OPEN_METH: + func = getattr(cls, cls.OPEN_METH[comptype]) + else: + raise CompressionError("unknown compression type %r" % comptype) + return func(name, filemode, fileobj, **kwargs) + + elif "|" in mode: + filemode, comptype = mode.split("|", 1) + filemode = filemode or "r" + comptype = comptype or "tar" + + if filemode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + stream = _Stream(name, filemode, comptype, fileobj, bufsize) + try: + t = cls(name, filemode, stream, **kwargs) + except: + stream.close() + raise + t._extfileobj = False + return t + + elif mode in "aw": + return cls.taropen(name, mode, fileobj, **kwargs) + + raise ValueError("undiscernible mode") + + @classmethod + def taropen(cls, name, mode="r", fileobj=None, **kwargs): + """Open uncompressed tar archive name for reading or writing. + """ + if len(mode) > 1 or mode not in "raw": + raise ValueError("mode must be 'r', 'a' or 'w'") + return cls(name, mode, fileobj, **kwargs) + + @classmethod + def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open gzip compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'") + + try: + import gzip + gzip.GzipFile + except (ImportError, AttributeError): + raise CompressionError("gzip module is not available") + + extfileobj = fileobj is not None + try: + fileobj = gzip.GzipFile(name, mode + "b", compresslevel, fileobj) + t = cls.taropen(name, mode, fileobj, **kwargs) + except IOError: + if not extfileobj and fileobj is not None: + fileobj.close() + if fileobj is None: + raise + raise ReadError("not a gzip file") + except: + if not extfileobj and fileobj is not None: + fileobj.close() + raise + t._extfileobj = extfileobj + return t + + @classmethod + def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs): + """Open bzip2 compressed tar archive name for reading or writing. + Appending is not allowed. + """ + if len(mode) > 1 or mode not in "rw": + raise ValueError("mode must be 'r' or 'w'.") + + try: + import bz2 + except ImportError: + raise CompressionError("bz2 module is not available") + + if fileobj is not None: + fileobj = _BZ2Proxy(fileobj, mode) + else: + fileobj = bz2.BZ2File(name, mode, compresslevel=compresslevel) + + try: + t = cls.taropen(name, mode, fileobj, **kwargs) + except (IOError, EOFError): + fileobj.close() + raise ReadError("not a bzip2 file") + t._extfileobj = False + return t + + # All *open() methods are registered here. + OPEN_METH = { + "tar": "taropen", # uncompressed tar + "gz": "gzopen", # gzip compressed tar + "bz2": "bz2open" # bzip2 compressed tar + } + + #-------------------------------------------------------------------------- + # The public methods which TarFile provides: + + def close(self): + """Close the TarFile. In write-mode, two finishing zero blocks are + appended to the archive. + """ + if self.closed: + return + + if self.mode in "aw": + self.fileobj.write(NUL * (BLOCKSIZE * 2)) + self.offset += (BLOCKSIZE * 2) + # fill up the end with zero-blocks + # (like option -b20 for tar does) + blocks, remainder = divmod(self.offset, RECORDSIZE) + if remainder > 0: + self.fileobj.write(NUL * (RECORDSIZE - remainder)) + + if not self._extfileobj: + self.fileobj.close() + self.closed = True + + def getmember(self, name): + """Return a TarInfo object for member `name'. If `name' can not be + found in the archive, KeyError is raised. If a member occurs more + than once in the archive, its last occurrence is assumed to be the + most up-to-date version. + """ + tarinfo = self._getmember(name) + if tarinfo is None: + raise KeyError("filename %r not found" % name) + return tarinfo + + def getmembers(self): + """Return the members of the archive as a list of TarInfo objects. The + list has the same order as the members in the archive. + """ + self._check() + if not self._loaded: # if we want to obtain a list of + self._load() # all members, we first have to + # scan the whole archive. + return self.members + + def getnames(self): + """Return the members of the archive as a list of their names. It has + the same order as the list returned by getmembers(). + """ + return [tarinfo.name for tarinfo in self.getmembers()] + + def gettarinfo(self, name=None, arcname=None, fileobj=None): + """Create a TarInfo object for either the file `name' or the file + object `fileobj' (using os.fstat on its file descriptor). You can + modify some of the TarInfo's attributes before you add it using + addfile(). If given, `arcname' specifies an alternative name for the + file in the archive. + """ + self._check("aw") + + # When fileobj is given, replace name by + # fileobj's real name. + if fileobj is not None: + name = fileobj.name + + # Building the name of the member in the archive. + # Backward slashes are converted to forward slashes, + # Absolute paths are turned to relative paths. + if arcname is None: + arcname = name + drv, arcname = os.path.splitdrive(arcname) + arcname = arcname.replace(os.sep, "/") + arcname = arcname.lstrip("/") + + # Now, fill the TarInfo object with + # information specific for the file. + tarinfo = self.tarinfo() + tarinfo.tarfile = self + + # Use os.stat or os.lstat, depending on platform + # and if symlinks shall be resolved. + if fileobj is None: + if hasattr(os, "lstat") and not self.dereference: + statres = os.lstat(name) + else: + statres = os.stat(name) + else: + statres = os.fstat(fileobj.fileno()) + linkname = "" + + stmd = statres.st_mode + if stat.S_ISREG(stmd): + inode = (statres.st_ino, statres.st_dev) + if not self.dereference and statres.st_nlink > 1 and \ + inode in self.inodes and arcname != self.inodes[inode]: + # Is it a hardlink to an already + # archived file? + type = LNKTYPE + linkname = self.inodes[inode] + else: + # The inode is added only if its valid. + # For win32 it is always 0. + type = REGTYPE + if inode[0]: + self.inodes[inode] = arcname + elif stat.S_ISDIR(stmd): + type = DIRTYPE + elif stat.S_ISFIFO(stmd): + type = FIFOTYPE + elif stat.S_ISLNK(stmd): + type = SYMTYPE + linkname = os.readlink(name) + elif stat.S_ISCHR(stmd): + type = CHRTYPE + elif stat.S_ISBLK(stmd): + type = BLKTYPE + else: + return None + + # Fill the TarInfo object with all + # information we can get. + tarinfo.name = arcname + tarinfo.mode = stmd + tarinfo.uid = statres.st_uid + tarinfo.gid = statres.st_gid + if type == REGTYPE: + tarinfo.size = statres.st_size + else: + tarinfo.size = 0 + tarinfo.mtime = statres.st_mtime + tarinfo.type = type + tarinfo.linkname = linkname + if pwd: + try: + tarinfo.uname = pwd.getpwuid(tarinfo.uid)[0] + except KeyError: + pass + if grp: + try: + tarinfo.gname = grp.getgrgid(tarinfo.gid)[0] + except KeyError: + pass + + if type in (CHRTYPE, BLKTYPE): + if hasattr(os, "major") and hasattr(os, "minor"): + tarinfo.devmajor = os.major(statres.st_rdev) + tarinfo.devminor = os.minor(statres.st_rdev) + return tarinfo + + def list(self, verbose=True): + """Print a table of contents to sys.stdout. If `verbose' is False, only + the names of the members are printed. If it is True, an `ls -l'-like + output is produced. + """ + self._check() + + for tarinfo in self: + if verbose: + print(filemode(tarinfo.mode), end=' ') + print("%s/%s" % (tarinfo.uname or tarinfo.uid, + tarinfo.gname or tarinfo.gid), end=' ') + if tarinfo.ischr() or tarinfo.isblk(): + print("%10s" % ("%d,%d" \ + % (tarinfo.devmajor, tarinfo.devminor)), end=' ') + else: + print("%10d" % tarinfo.size, end=' ') + print("%d-%02d-%02d %02d:%02d:%02d" \ + % time.localtime(tarinfo.mtime)[:6], end=' ') + + print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ') + + if verbose: + if tarinfo.issym(): + print("->", tarinfo.linkname, end=' ') + if tarinfo.islnk(): + print("link to", tarinfo.linkname, end=' ') + print() + + def add(self, name, arcname=None, recursive=True, exclude=None, filter=None): + """Add the file `name' to the archive. `name' may be any type of file + (directory, fifo, symbolic link, etc.). If given, `arcname' + specifies an alternative name for the file in the archive. + Directories are added recursively by default. This can be avoided by + setting `recursive' to False. `exclude' is a function that should + return True for each filename to be excluded. `filter' is a function + that expects a TarInfo object argument and returns the changed + TarInfo object, if it returns None the TarInfo object will be + excluded from the archive. + """ + self._check("aw") + + if arcname is None: + arcname = name + + # Exclude pathnames. + if exclude is not None: + import warnings + warnings.warn("use the filter argument instead", + DeprecationWarning, 2) + if exclude(name): + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Skip if somebody tries to archive the archive... + if self.name is not None and os.path.abspath(name) == self.name: + self._dbg(2, "tarfile: Skipped %r" % name) + return + + self._dbg(1, name) + + # Create a TarInfo object from the file. + tarinfo = self.gettarinfo(name, arcname) + + if tarinfo is None: + self._dbg(1, "tarfile: Unsupported type %r" % name) + return + + # Change or exclude the TarInfo object. + if filter is not None: + tarinfo = filter(tarinfo) + if tarinfo is None: + self._dbg(2, "tarfile: Excluded %r" % name) + return + + # Append the tar header and data to the archive. + if tarinfo.isreg(): + f = bltn_open(name, "rb") + self.addfile(tarinfo, f) + f.close() + + elif tarinfo.isdir(): + self.addfile(tarinfo) + if recursive: + for f in os.listdir(name): + self.add(os.path.join(name, f), os.path.join(arcname, f), + recursive, exclude, filter=filter) + + else: + self.addfile(tarinfo) + + def addfile(self, tarinfo, fileobj=None): + """Add the TarInfo object `tarinfo' to the archive. If `fileobj' is + given, tarinfo.size bytes are read from it and added to the archive. + You can create TarInfo objects using gettarinfo(). + On Windows platforms, `fileobj' should always be opened with mode + 'rb' to avoid irritation about the file size. + """ + self._check("aw") + + tarinfo = copy.copy(tarinfo) + + buf = tarinfo.tobuf(self.format, self.encoding, self.errors) + self.fileobj.write(buf) + self.offset += len(buf) + + # If there's data to follow, append it. + if fileobj is not None: + copyfileobj(fileobj, self.fileobj, tarinfo.size) + blocks, remainder = divmod(tarinfo.size, BLOCKSIZE) + if remainder > 0: + self.fileobj.write(NUL * (BLOCKSIZE - remainder)) + blocks += 1 + self.offset += blocks * BLOCKSIZE + + self.members.append(tarinfo) + + def extractall(self, path=".", members=None): + """Extract all members from the archive to the current working + directory and set owner, modification time and permissions on + directories afterwards. `path' specifies a different directory + to extract to. `members' is optional and must be a subset of the + list returned by getmembers(). + """ + directories = [] + + if members is None: + members = self + + for tarinfo in members: + if tarinfo.isdir(): + # Extract directories with a safe mode. + directories.append(tarinfo) + tarinfo = copy.copy(tarinfo) + tarinfo.mode = 0o700 + # Do not set_attrs directories, as we will do that further down + self.extract(tarinfo, path, set_attrs=not tarinfo.isdir()) + + # Reverse sort directories. + directories.sort(key=lambda a: a.name) + directories.reverse() + + # Set correct owner, mtime and filemode on directories. + for tarinfo in directories: + dirpath = os.path.join(path, tarinfo.name) + try: + self.chown(tarinfo, dirpath) + self.utime(tarinfo, dirpath) + self.chmod(tarinfo, dirpath) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extract(self, member, path="", set_attrs=True): + """Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately + as possible. `member' may be a filename or a TarInfo object. You can + specify a different directory using `path'. File attributes (owner, + mtime, mode) are set unless `set_attrs' is False. + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + # Prepare the link target for makelink(). + if tarinfo.islnk(): + tarinfo._link_target = os.path.join(path, tarinfo.linkname) + + try: + self._extract_member(tarinfo, os.path.join(path, tarinfo.name), + set_attrs=set_attrs) + except EnvironmentError as e: + if self.errorlevel > 0: + raise + else: + if e.filename is None: + self._dbg(1, "tarfile: %s" % e.strerror) + else: + self._dbg(1, "tarfile: %s %r" % (e.strerror, e.filename)) + except ExtractError as e: + if self.errorlevel > 1: + raise + else: + self._dbg(1, "tarfile: %s" % e) + + def extractfile(self, member): + """Extract a member from the archive as a file object. `member' may be + a filename or a TarInfo object. If `member' is a regular file, a + file-like object is returned. If `member' is a link, a file-like + object is constructed from the link's target. If `member' is none of + the above, None is returned. + The file-like object is read-only and provides the following + methods: read(), readline(), readlines(), seek() and tell() + """ + self._check("r") + + if isinstance(member, str): + tarinfo = self.getmember(member) + else: + tarinfo = member + + if tarinfo.isreg(): + return self.fileobject(self, tarinfo) + + elif tarinfo.type not in SUPPORTED_TYPES: + # If a member's type is unknown, it is treated as a + # regular file. + return self.fileobject(self, tarinfo) + + elif tarinfo.islnk() or tarinfo.issym(): + if isinstance(self.fileobj, _Stream): + # A small but ugly workaround for the case that someone tries + # to extract a (sym)link as a file-object from a non-seekable + # stream of tar blocks. + raise StreamError("cannot extract (sym)link as file object") + else: + # A (sym)link's file object is its target's file object. + return self.extractfile(self._find_link_target(tarinfo)) + else: + # If there's no data associated with the member (directory, chrdev, + # blkdev, etc.), return None instead of a file object. + return None + + def _extract_member(self, tarinfo, targetpath, set_attrs=True): + """Extract the TarInfo object tarinfo to a physical + file called targetpath. + """ + # Fetch the TarInfo object for the given name + # and build the destination pathname, replacing + # forward slashes to platform specific separators. + targetpath = targetpath.rstrip("/") + targetpath = targetpath.replace("/", os.sep) + + # Create all upper directories. + upperdirs = os.path.dirname(targetpath) + if upperdirs and not os.path.exists(upperdirs): + # Create directories that are not part of the archive with + # default permissions. + os.makedirs(upperdirs) + + if tarinfo.islnk() or tarinfo.issym(): + self._dbg(1, "%s -> %s" % (tarinfo.name, tarinfo.linkname)) + else: + self._dbg(1, tarinfo.name) + + if tarinfo.isreg(): + self.makefile(tarinfo, targetpath) + elif tarinfo.isdir(): + self.makedir(tarinfo, targetpath) + elif tarinfo.isfifo(): + self.makefifo(tarinfo, targetpath) + elif tarinfo.ischr() or tarinfo.isblk(): + self.makedev(tarinfo, targetpath) + elif tarinfo.islnk() or tarinfo.issym(): + self.makelink(tarinfo, targetpath) + elif tarinfo.type not in SUPPORTED_TYPES: + self.makeunknown(tarinfo, targetpath) + else: + self.makefile(tarinfo, targetpath) + + if set_attrs: + self.chown(tarinfo, targetpath) + if not tarinfo.issym(): + self.chmod(tarinfo, targetpath) + self.utime(tarinfo, targetpath) + + #-------------------------------------------------------------------------- + # Below are the different file methods. They are called via + # _extract_member() when extract() is called. They can be replaced in a + # subclass to implement other functionality. + + def makedir(self, tarinfo, targetpath): + """Make a directory called targetpath. + """ + try: + # Use a safe mode for the directory, the real mode is set + # later in _extract_member(). + os.mkdir(targetpath, 0o700) + except EnvironmentError as e: + if e.errno != errno.EEXIST: + raise + + def makefile(self, tarinfo, targetpath): + """Make a file called targetpath. + """ + source = self.fileobj + source.seek(tarinfo.offset_data) + target = bltn_open(targetpath, "wb") + if tarinfo.sparse is not None: + for offset, size in tarinfo.sparse: + target.seek(offset) + copyfileobj(source, target, size) + else: + copyfileobj(source, target, tarinfo.size) + target.seek(tarinfo.size) + target.truncate() + target.close() + + def makeunknown(self, tarinfo, targetpath): + """Make a file from a TarInfo object with an unknown type + at targetpath. + """ + self.makefile(tarinfo, targetpath) + self._dbg(1, "tarfile: Unknown file type %r, " \ + "extracted as regular file." % tarinfo.type) + + def makefifo(self, tarinfo, targetpath): + """Make a fifo called targetpath. + """ + if hasattr(os, "mkfifo"): + os.mkfifo(targetpath) + else: + raise ExtractError("fifo not supported by system") + + def makedev(self, tarinfo, targetpath): + """Make a character or block device called targetpath. + """ + if not hasattr(os, "mknod") or not hasattr(os, "makedev"): + raise ExtractError("special devices not supported by system") + + mode = tarinfo.mode + if tarinfo.isblk(): + mode |= stat.S_IFBLK + else: + mode |= stat.S_IFCHR + + os.mknod(targetpath, mode, + os.makedev(tarinfo.devmajor, tarinfo.devminor)) + + def makelink(self, tarinfo, targetpath): + """Make a (symbolic) link called targetpath. If it cannot be created + (platform limitation), we try to make a copy of the referenced file + instead of a link. + """ + try: + # For systems that support symbolic and hard links. + if tarinfo.issym(): + os.symlink(tarinfo.linkname, targetpath) + else: + # See extract(). + if os.path.exists(tarinfo._link_target): + os.link(tarinfo._link_target, targetpath) + else: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except symlink_exception: + if tarinfo.issym(): + linkpath = os.path.join(os.path.dirname(tarinfo.name), + tarinfo.linkname) + else: + linkpath = tarinfo.linkname + else: + try: + self._extract_member(self._find_link_target(tarinfo), + targetpath) + except KeyError: + raise ExtractError("unable to resolve link inside archive") + + def chown(self, tarinfo, targetpath): + """Set owner of targetpath according to tarinfo. + """ + if pwd and hasattr(os, "geteuid") and os.geteuid() == 0: + # We have to be root to do so. + try: + g = grp.getgrnam(tarinfo.gname)[2] + except KeyError: + g = tarinfo.gid + try: + u = pwd.getpwnam(tarinfo.uname)[2] + except KeyError: + u = tarinfo.uid + try: + if tarinfo.issym() and hasattr(os, "lchown"): + os.lchown(targetpath, u, g) + else: + if sys.platform != "os2emx": + os.chown(targetpath, u, g) + except EnvironmentError as e: + raise ExtractError("could not change owner") + + def chmod(self, tarinfo, targetpath): + """Set file permissions of targetpath according to tarinfo. + """ + if hasattr(os, 'chmod'): + try: + os.chmod(targetpath, tarinfo.mode) + except EnvironmentError as e: + raise ExtractError("could not change mode") + + def utime(self, tarinfo, targetpath): + """Set modification time of targetpath according to tarinfo. + """ + if not hasattr(os, 'utime'): + return + try: + os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime)) + except EnvironmentError as e: + raise ExtractError("could not change modification time") + + #-------------------------------------------------------------------------- + def next(self): + """Return the next member of the archive as a TarInfo object, when + TarFile is opened for reading. Return None if there is no more + available. + """ + self._check("ra") + if self.firstmember is not None: + m = self.firstmember + self.firstmember = None + return m + + # Read the next block. + self.fileobj.seek(self.offset) + tarinfo = None + while True: + try: + tarinfo = self.tarinfo.fromtarfile(self) + except EOFHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + except InvalidHeaderError as e: + if self.ignore_zeros: + self._dbg(2, "0x%X: %s" % (self.offset, e)) + self.offset += BLOCKSIZE + continue + elif self.offset == 0: + raise ReadError(str(e)) + except EmptyHeaderError: + if self.offset == 0: + raise ReadError("empty file") + except TruncatedHeaderError as e: + if self.offset == 0: + raise ReadError(str(e)) + except SubsequentHeaderError as e: + raise ReadError(str(e)) + break + + if tarinfo is not None: + self.members.append(tarinfo) + else: + self._loaded = True + + return tarinfo + + #-------------------------------------------------------------------------- + # Little helper methods: + + def _getmember(self, name, tarinfo=None, normalize=False): + """Find an archive member by name from bottom to top. + If tarinfo is given, it is used as the starting point. + """ + # Ensure that all members have been loaded. + members = self.getmembers() + + # Limit the member search list up to tarinfo. + if tarinfo is not None: + members = members[:members.index(tarinfo)] + + if normalize: + name = os.path.normpath(name) + + for member in reversed(members): + if normalize: + member_name = os.path.normpath(member.name) + else: + member_name = member.name + + if name == member_name: + return member + + def _load(self): + """Read through the entire archive file and look for readable + members. + """ + while True: + tarinfo = self.next() + if tarinfo is None: + break + self._loaded = True + + def _check(self, mode=None): + """Check if TarFile is still open, and if the operation's mode + corresponds to TarFile's mode. + """ + if self.closed: + raise IOError("%s is closed" % self.__class__.__name__) + if mode is not None and self.mode not in mode: + raise IOError("bad operation for mode %r" % self.mode) + + def _find_link_target(self, tarinfo): + """Find the target member of a symlink or hardlink member in the + archive. + """ + if tarinfo.issym(): + # Always search the entire archive. + linkname = os.path.dirname(tarinfo.name) + "/" + tarinfo.linkname + limit = None + else: + # Search the archive before the link, because a hard link is + # just a reference to an already archived file. + linkname = tarinfo.linkname + limit = tarinfo + + member = self._getmember(linkname, tarinfo=limit, normalize=True) + if member is None: + raise KeyError("linkname %r not found" % linkname) + return member + + def __iter__(self): + """Provide an iterator object. + """ + if self._loaded: + return iter(self.members) + else: + return TarIter(self) + + def _dbg(self, level, msg): + """Write debugging output to sys.stderr. + """ + if level <= self.debug: + print(msg, file=sys.stderr) + + def __enter__(self): + self._check() + return self + + def __exit__(self, type, value, traceback): + if type is None: + self.close() + else: + # An exception occurred. We must not call close() because + # it would try to write end-of-archive blocks and padding. + if not self._extfileobj: + self.fileobj.close() + self.closed = True +# class TarFile + +class TarIter(object): + """Iterator Class. + + for tarinfo in TarFile(...): + suite... + """ + + def __init__(self, tarfile): + """Construct a TarIter object. + """ + self.tarfile = tarfile + self.index = 0 + def __iter__(self): + """Return iterator object. + """ + return self + + def __next__(self): + """Return the next item using TarFile's next() method. + When all members have been read, set TarFile as _loaded. + """ + # Fix for SF #1100429: Under rare circumstances it can + # happen that getmembers() is called during iteration, + # which will cause TarIter to stop prematurely. + if not self.tarfile._loaded: + tarinfo = self.tarfile.next() + if not tarinfo: + self.tarfile._loaded = True + raise StopIteration + else: + try: + tarinfo = self.tarfile.members[self.index] + except IndexError: + raise StopIteration + self.index += 1 + return tarinfo + + next = __next__ # for Python 2.x + +#-------------------- +# exported functions +#-------------------- +def is_tarfile(name): + """Return True if name points to a tar archive that we + are able to handle, else return False. + """ + try: + t = open(name) + t.close() + return True + except TarError: + return False + +bltn_open = open +open = TarFile.open diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py new file mode 100644 index 000000000..09929b0e1 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/compat.py @@ -0,0 +1,1120 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import absolute_import + +import os +import re +import sys + +try: + import ssl +except ImportError: # pragma: no cover + ssl = None + +if sys.version_info[0] < 3: # pragma: no cover + from StringIO import StringIO + string_types = basestring, + text_type = unicode + from types import FileType as file_type + import __builtin__ as builtins + import ConfigParser as configparser + from ._backport import shutil + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urlunsplit + from urllib import (urlretrieve, quote as _quote, unquote, url2pathname, + pathname2url, ContentTooShortError, splittype) + + def quote(s): + if isinstance(s, unicode): + s = s.encode('utf-8') + return _quote(s) + + import urllib2 + from urllib2 import (Request, urlopen, URLError, HTTPError, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib2 import HTTPSHandler + import httplib + import xmlrpclib + import Queue as queue + from HTMLParser import HTMLParser + import htmlentitydefs + raw_input = raw_input + from itertools import ifilter as filter + from itertools import ifilterfalse as filterfalse + + _userprog = None + def splituser(host): + """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + global _userprog + if _userprog is None: + import re + _userprog = re.compile('^(.*)@(.*)$') + + match = _userprog.match(host) + if match: return match.group(1, 2) + return None, host + +else: # pragma: no cover + from io import StringIO + string_types = str, + text_type = str + from io import TextIOWrapper as file_type + import builtins + import configparser + import shutil + from urllib.parse import (urlparse, urlunparse, urljoin, splituser, quote, + unquote, urlsplit, urlunsplit, splittype) + from urllib.request import (urlopen, urlretrieve, Request, url2pathname, + pathname2url, + HTTPBasicAuthHandler, HTTPPasswordMgr, + HTTPHandler, HTTPRedirectHandler, + build_opener) + if ssl: + from urllib.request import HTTPSHandler + from urllib.error import HTTPError, URLError, ContentTooShortError + import http.client as httplib + import urllib.request as urllib2 + import xmlrpc.client as xmlrpclib + import queue + from html.parser import HTMLParser + import html.entities as htmlentitydefs + raw_input = input + from itertools import filterfalse + filter = filter + +try: + from ssl import match_hostname, CertificateError +except ImportError: # pragma: no cover + class CertificateError(ValueError): + pass + + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + parts = dn.split('.') + leftmost, remainder = parts[0], parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +try: + from types import SimpleNamespace as Container +except ImportError: # pragma: no cover + class Container(object): + """ + A generic container for when multiple values need to be returned + """ + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + +try: + from shutil import which +except ImportError: # pragma: no cover + # Implementation from Python 3.3 + def which(cmd, mode=os.F_OK | os.X_OK, path=None): + """Given a command, mode, and a PATH string, return the path which + conforms to the given mode on the PATH, or None if there is no such + file. + + `mode` defaults to os.F_OK | os.X_OK. `path` defaults to the result + of os.environ.get("PATH"), or can be overridden with a custom search + path. + + """ + # Check that a given file can be accessed with the correct mode. + # Additionally check that `file` is not a directory, as on Windows + # directories pass the os.access check. + def _access_check(fn, mode): + return (os.path.exists(fn) and os.access(fn, mode) + and not os.path.isdir(fn)) + + # If we're given a path with a directory part, look it up directly rather + # than referring to PATH directories. This includes checking relative to the + # current directory, e.g. ./script + if os.path.dirname(cmd): + if _access_check(cmd, mode): + return cmd + return None + + if path is None: + path = os.environ.get("PATH", os.defpath) + if not path: + return None + path = path.split(os.pathsep) + + if sys.platform == "win32": + # The current directory takes precedence on Windows. + if not os.curdir in path: + path.insert(0, os.curdir) + + # PATHEXT is necessary to check on Windows. + pathext = os.environ.get("PATHEXT", "").split(os.pathsep) + # See if the given file matches any of the expected path extensions. + # This will allow us to short circuit when given "python.exe". + # If it does match, only test that one, otherwise we have to try + # others. + if any(cmd.lower().endswith(ext.lower()) for ext in pathext): + files = [cmd] + else: + files = [cmd + ext for ext in pathext] + else: + # On other platforms you don't have things like PATHEXT to tell you + # what file suffixes are executable, so just pass on cmd as-is. + files = [cmd] + + seen = set() + for dir in path: + normdir = os.path.normcase(dir) + if not normdir in seen: + seen.add(normdir) + for thefile in files: + name = os.path.join(dir, thefile) + if _access_check(name, mode): + return name + return None + + +# ZipFile is a context manager in 2.7, but not in 2.6 + +from zipfile import ZipFile as BaseZipFile + +if hasattr(BaseZipFile, '__enter__'): # pragma: no cover + ZipFile = BaseZipFile +else: # pragma: no cover + from zipfile import ZipExtFile as BaseZipExtFile + + class ZipExtFile(BaseZipExtFile): + def __init__(self, base): + self.__dict__.update(base.__dict__) + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + class ZipFile(BaseZipFile): + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.close() + # return None, so if an exception occurred, it will propagate + + def open(self, *args, **kwargs): + base = BaseZipFile.open(self, *args, **kwargs) + return ZipExtFile(base) + +try: + from platform import python_implementation +except ImportError: # pragma: no cover + def python_implementation(): + """Return a string identifying the Python implementation.""" + if 'PyPy' in sys.version: + return 'PyPy' + if os.name == 'java': + return 'Jython' + if sys.version.startswith('IronPython'): + return 'IronPython' + return 'CPython' + +try: + import sysconfig +except ImportError: # pragma: no cover + from ._backport import sysconfig + +try: + callable = callable +except NameError: # pragma: no cover + from collections import Callable + + def callable(obj): + return isinstance(obj, Callable) + + +try: + fsencode = os.fsencode + fsdecode = os.fsdecode +except AttributeError: # pragma: no cover + # Issue #99: on some systems (e.g. containerised), + # sys.getfilesystemencoding() returns None, and we need a real value, + # so fall back to utf-8. From the CPython 2.7 docs relating to Unix and + # sys.getfilesystemencoding(): the return value is "the user’s preference + # according to the result of nl_langinfo(CODESET), or None if the + # nl_langinfo(CODESET) failed." + _fsencoding = sys.getfilesystemencoding() or 'utf-8' + if _fsencoding == 'mbcs': + _fserrors = 'strict' + else: + _fserrors = 'surrogateescape' + + def fsencode(filename): + if isinstance(filename, bytes): + return filename + elif isinstance(filename, text_type): + return filename.encode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + + def fsdecode(filename): + if isinstance(filename, text_type): + return filename + elif isinstance(filename, bytes): + return filename.decode(_fsencoding, _fserrors) + else: + raise TypeError("expect bytes or str, not %s" % + type(filename).__name__) + +try: + from tokenize import detect_encoding +except ImportError: # pragma: no cover + from codecs import BOM_UTF8, lookup + import re + + cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") + + def _get_normal_name(orig_enc): + """Imitates get_normal_name in tokenizer.c.""" + # Only care about the first 12 characters. + enc = orig_enc[:12].lower().replace("_", "-") + if enc == "utf-8" or enc.startswith("utf-8-"): + return "utf-8" + if enc in ("latin-1", "iso-8859-1", "iso-latin-1") or \ + enc.startswith(("latin-1-", "iso-8859-1-", "iso-latin-1-")): + return "iso-8859-1" + return orig_enc + + def detect_encoding(readline): + """ + The detect_encoding() function is used to detect the encoding that should + be used to decode a Python source file. It requires one argument, readline, + in the same way as the tokenize() generator. + + It will call readline a maximum of twice, and return the encoding used + (as a string) and a list of any lines (left as bytes) it has read in. + + It detects the encoding from the presence of a utf-8 bom or an encoding + cookie as specified in pep-0263. If both a bom and a cookie are present, + but disagree, a SyntaxError will be raised. If the encoding cookie is an + invalid charset, raise a SyntaxError. Note that if a utf-8 bom is found, + 'utf-8-sig' is returned. + + If no encoding is specified, then the default of 'utf-8' will be returned. + """ + try: + filename = readline.__self__.name + except AttributeError: + filename = None + bom_found = False + encoding = None + default = 'utf-8' + def read_or_stop(): + try: + return readline() + except StopIteration: + return b'' + + def find_cookie(line): + try: + # Decode as UTF-8. Either the line is an encoding declaration, + # in which case it should be pure ASCII, or it must be UTF-8 + # per default encoding. + line_string = line.decode('utf-8') + except UnicodeDecodeError: + msg = "invalid or missing encoding declaration" + if filename is not None: + msg = '{} for {!r}'.format(msg, filename) + raise SyntaxError(msg) + + matches = cookie_re.findall(line_string) + if not matches: + return None + encoding = _get_normal_name(matches[0]) + try: + codec = lookup(encoding) + except LookupError: + # This behaviour mimics the Python interpreter + if filename is None: + msg = "unknown encoding: " + encoding + else: + msg = "unknown encoding for {!r}: {}".format(filename, + encoding) + raise SyntaxError(msg) + + if bom_found: + if codec.name != 'utf-8': + # This behaviour mimics the Python interpreter + if filename is None: + msg = 'encoding problem: utf-8' + else: + msg = 'encoding problem for {!r}: utf-8'.format(filename) + raise SyntaxError(msg) + encoding += '-sig' + return encoding + + first = read_or_stop() + if first.startswith(BOM_UTF8): + bom_found = True + first = first[3:] + default = 'utf-8-sig' + if not first: + return default, [] + + encoding = find_cookie(first) + if encoding: + return encoding, [first] + + second = read_or_stop() + if not second: + return default, [first] + + encoding = find_cookie(second) + if encoding: + return encoding, [first, second] + + return default, [first, second] + +# For converting & <-> & etc. +try: + from html import escape +except ImportError: + from cgi import escape +if sys.version_info[:2] < (3, 4): + unescape = HTMLParser().unescape +else: + from html import unescape + +try: + from collections import ChainMap +except ImportError: # pragma: no cover + from collections import MutableMapping + + try: + from reprlib import recursive_repr as _recursive_repr + except ImportError: + def _recursive_repr(fillvalue='...'): + ''' + Decorator to make a repr function return fillvalue for a recursive + call + ''' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + def __bool__(self): + return any(self.maps) + + @_recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + +try: + from importlib.util import cache_from_source # Python >= 3.4 +except ImportError: # pragma: no cover + try: + from imp import cache_from_source + except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): + assert path.endswith('.py') + if debug_override is None: + debug_override = __debug__ + if debug_override: + suffix = 'c' + else: + suffix = 'o' + return path + suffix + +try: + from collections import OrderedDict +except ImportError: # pragma: no cover +## {{{ http://code.activestate.com/recipes/576693/ (r9) +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. + try: + from thread import get_ident as _get_ident + except ImportError: + from dummy_thread import get_ident as _get_ident + + try: + from _abcoll import KeysView, ValuesView, ItemsView + except ImportError: + pass + + + class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running=None): + 'od.__repr__() <==> repr(od)' + if not _repr_running: _repr_running = {} + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) + +try: + from logging.config import BaseConfigurator, valid_ident +except ImportError: # pragma: no cover + IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) + + + def valid_ident(s): + m = IDENTIFIER.match(s) + if not m: + raise ValueError('Not a valid Python identifier: %r' % s) + return True + + + # The ConvertingXXX classes are wrappers around standard Python containers, + # and they serve to convert any suitable values in the container. The + # conversion converts base dicts, lists and tuples to their wrapped + # equivalents, whereas strings which match a conversion format are converted + # appropriately. + # + # Each wrapper should have a configurator attribute holding the actual + # configurator to use for conversion. + + class ConvertingDict(dict): + """A converting dictionary wrapper.""" + + def __getitem__(self, key): + value = dict.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def get(self, key, default=None): + value = dict.get(self, key, default) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, key, default=None): + value = dict.pop(self, key, default) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class ConvertingList(list): + """A converting list wrapper.""" + def __getitem__(self, key): + value = list.__getitem__(self, key) + result = self.configurator.convert(value) + #If the converted value is different, save for next time + if value is not result: + self[key] = result + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + def pop(self, idx=-1): + value = list.pop(self, idx) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + return result + + class ConvertingTuple(tuple): + """A converting tuple wrapper.""" + def __getitem__(self, key): + value = tuple.__getitem__(self, key) + result = self.configurator.convert(value) + if value is not result: + if type(result) in (ConvertingDict, ConvertingList, + ConvertingTuple): + result.parent = self + result.key = key + return result + + class BaseConfigurator(object): + """ + The configurator base class which defines some useful defaults. + """ + + CONVERT_PATTERN = re.compile(r'^(?P<prefix>[a-z]+)://(?P<suffix>.*)$') + + WORD_PATTERN = re.compile(r'^\s*(\w+)\s*') + DOT_PATTERN = re.compile(r'^\.\s*(\w+)\s*') + INDEX_PATTERN = re.compile(r'^\[\s*(\w+)\s*\]\s*') + DIGIT_PATTERN = re.compile(r'^\d+$') + + value_converters = { + 'ext' : 'ext_convert', + 'cfg' : 'cfg_convert', + } + + # We might want to use a different one, e.g. importlib + importer = staticmethod(__import__) + + def __init__(self, config): + self.config = ConvertingDict(config) + self.config.configurator = self + + def resolve(self, s): + """ + Resolve strings to objects using standard import and attribute + syntax. + """ + name = s.split('.') + used = name.pop(0) + try: + found = self.importer(used) + for frag in name: + used += '.' + frag + try: + found = getattr(found, frag) + except AttributeError: + self.importer(used) + found = getattr(found, frag) + return found + except ImportError: + e, tb = sys.exc_info()[1:] + v = ValueError('Cannot resolve %r: %s' % (s, e)) + v.__cause__, v.__traceback__ = e, tb + raise v + + def ext_convert(self, value): + """Default converter for the ext:// protocol.""" + return self.resolve(value) + + def cfg_convert(self, value): + """Default converter for the cfg:// protocol.""" + rest = value + m = self.WORD_PATTERN.match(rest) + if m is None: + raise ValueError("Unable to convert %r" % value) + else: + rest = rest[m.end():] + d = self.config[m.groups()[0]] + #print d, rest + while rest: + m = self.DOT_PATTERN.match(rest) + if m: + d = d[m.groups()[0]] + else: + m = self.INDEX_PATTERN.match(rest) + if m: + idx = m.groups()[0] + if not self.DIGIT_PATTERN.match(idx): + d = d[idx] + else: + try: + n = int(idx) # try as number first (most likely) + d = d[n] + except TypeError: + d = d[idx] + if m: + rest = rest[m.end():] + else: + raise ValueError('Unable to convert ' + '%r at %r' % (value, rest)) + #rest should be empty + return d + + def convert(self, value): + """ + Convert values to an appropriate type. dicts, lists and tuples are + replaced by their converting alternatives. Strings are checked to + see if they have a conversion format and are converted if they do. + """ + if not isinstance(value, ConvertingDict) and isinstance(value, dict): + value = ConvertingDict(value) + value.configurator = self + elif not isinstance(value, ConvertingList) and isinstance(value, list): + value = ConvertingList(value) + value.configurator = self + elif not isinstance(value, ConvertingTuple) and\ + isinstance(value, tuple): + value = ConvertingTuple(value) + value.configurator = self + elif isinstance(value, string_types): + m = self.CONVERT_PATTERN.match(value) + if m: + d = m.groupdict() + prefix = d['prefix'] + converter = self.value_converters.get(prefix, None) + if converter: + suffix = d['suffix'] + converter = getattr(self, converter) + value = converter(suffix) + return value + + def configure_custom(self, config): + """Configure an object with a user-supplied factory.""" + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + kwargs = dict([(k, config[k]) for k in config if valid_ident(k)]) + result = c(**kwargs) + if props: + for name, value in props.items(): + setattr(result, name, value) + return result + + def as_tuple(self, value): + """Utility function which converts lists to tuples.""" + if isinstance(value, list): + value = tuple(value) + return value diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py new file mode 100644 index 000000000..54483e1e2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/database.py @@ -0,0 +1,1336 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""PEP 376 implementation.""" + +from __future__ import unicode_literals + +import base64 +import codecs +import contextlib +import hashlib +import logging +import os +import posixpath +import sys +import zipimport + +from . import DistlibException, resources +from .compat import StringIO +from .version import get_scheme, UnsupportedVersionError +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (parse_requirement, cached_property, parse_name_and_version, + read_exports, write_exports, CSVReader, CSVWriter) + + +__all__ = ['Distribution', 'BaseInstalledDistribution', + 'InstalledDistribution', 'EggInfoDistribution', + 'DistributionPath'] + + +logger = logging.getLogger(__name__) + +EXPORTS_FILENAME = 'pydist-exports.json' +COMMANDS_FILENAME = 'pydist-commands.json' + +DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED', + 'RESOURCES', EXPORTS_FILENAME, 'SHARED') + +DISTINFO_EXT = '.dist-info' + + +class _Cache(object): + """ + A simple cache mapping names and .dist-info paths to distributions + """ + def __init__(self): + """ + Initialise an instance. There is normally one for each DistributionPath. + """ + self.name = {} + self.path = {} + self.generated = False + + def clear(self): + """ + Clear the cache, setting it to its initial state. + """ + self.name.clear() + self.path.clear() + self.generated = False + + def add(self, dist): + """ + Add a distribution to the cache. + :param dist: The distribution to add. + """ + if dist.path not in self.path: + self.path[dist.path] = dist + self.name.setdefault(dist.key, []).append(dist) + + +class DistributionPath(object): + """ + Represents a set of distributions installed on a path (typically sys.path). + """ + def __init__(self, path=None, include_egg=False): + """ + Create an instance from a path, optionally including legacy (distutils/ + setuptools/distribute) distributions. + :param path: The path to use, as a list of directories. If not specified, + sys.path is used. + :param include_egg: If True, this instance will look for and return legacy + distributions as well as those based on PEP 376. + """ + if path is None: + path = sys.path + self.path = path + self._include_dist = True + self._include_egg = include_egg + + self._cache = _Cache() + self._cache_egg = _Cache() + self._cache_enabled = True + self._scheme = get_scheme('default') + + def _get_cache_enabled(self): + return self._cache_enabled + + def _set_cache_enabled(self, value): + self._cache_enabled = value + + cache_enabled = property(_get_cache_enabled, _set_cache_enabled) + + def clear_cache(self): + """ + Clears the internal cache. + """ + self._cache.clear() + self._cache_egg.clear() + + + def _yield_distributions(self): + """ + Yield .dist-info and/or .egg(-info) distributions. + """ + # We need to check if we've seen some resources already, because on + # some Linux systems (e.g. some Debian/Ubuntu variants) there are + # symlinks which alias other files in the environment. + seen = set() + for path in self.path: + finder = resources.finder_for_path(path) + if finder is None: + continue + r = finder.find('') + if not r or not r.is_container: + continue + rset = sorted(r.resources) + for entry in rset: + r = finder.find(entry) + if not r or r.path in seen: + continue + if self._include_dist and entry.endswith(DISTINFO_EXT): + possible_filenames = [METADATA_FILENAME, WHEEL_METADATA_FILENAME] + for metadata_filename in possible_filenames: + metadata_path = posixpath.join(entry, metadata_filename) + pydist = finder.find(metadata_path) + if pydist: + break + else: + continue + + with contextlib.closing(pydist.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + logger.debug('Found %s', r.path) + seen.add(r.path) + yield new_dist_class(r.path, metadata=metadata, + env=self) + elif self._include_egg and entry.endswith(('.egg-info', + '.egg')): + logger.debug('Found %s', r.path) + seen.add(r.path) + yield old_dist_class(r.path, self) + + def _generate_cache(self): + """ + Scan the path for distributions and populate the cache with + those that are found. + """ + gen_dist = not self._cache.generated + gen_egg = self._include_egg and not self._cache_egg.generated + if gen_dist or gen_egg: + for dist in self._yield_distributions(): + if isinstance(dist, InstalledDistribution): + self._cache.add(dist) + else: + self._cache_egg.add(dist) + + if gen_dist: + self._cache.generated = True + if gen_egg: + self._cache_egg.generated = True + + @classmethod + def distinfo_dirname(cls, name, version): + """ + The *name* and *version* parameters are converted into their + filename-escaped form, i.e. any ``'-'`` characters are replaced + with ``'_'`` other than the one in ``'dist-info'`` and the one + separating the name from the version number. + + :parameter name: is converted to a standard distribution name by replacing + any runs of non- alphanumeric characters with a single + ``'-'``. + :type name: string + :parameter version: is converted to a standard version string. Spaces + become dots, and all other non-alphanumeric characters + (except dots) become dashes, with runs of multiple + dashes condensed to a single dash. + :type version: string + :returns: directory name + :rtype: string""" + name = name.replace('-', '_') + return '-'.join([name, version]) + DISTINFO_EXT + + def get_distributions(self): + """ + Provides an iterator that looks for distributions and returns + :class:`InstalledDistribution` or + :class:`EggInfoDistribution` instances for each one of them. + + :rtype: iterator of :class:`InstalledDistribution` and + :class:`EggInfoDistribution` instances + """ + if not self._cache_enabled: + for dist in self._yield_distributions(): + yield dist + else: + self._generate_cache() + + for dist in self._cache.path.values(): + yield dist + + if self._include_egg: + for dist in self._cache_egg.path.values(): + yield dist + + def get_distribution(self, name): + """ + Looks for a named distribution on the path. + + This function only returns the first result found, as no more than one + value is expected. If nothing is found, ``None`` is returned. + + :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution` + or ``None`` + """ + result = None + name = name.lower() + if not self._cache_enabled: + for dist in self._yield_distributions(): + if dist.key == name: + result = dist + break + else: + self._generate_cache() + + if name in self._cache.name: + result = self._cache.name[name][0] + elif self._include_egg and name in self._cache_egg.name: + result = self._cache_egg.name[name][0] + return result + + def provides_distribution(self, name, version=None): + """ + Iterates over all distributions to find which distributions provide *name*. + If a *version* is provided, it will be used to filter the results. + + This function only returns the first result found, since no more than + one values are expected. If the directory is not found, returns ``None``. + + :parameter version: a version specifier that indicates the version + required, conforming to the format in ``PEP-345`` + + :type name: string + :type version: string + """ + matcher = None + if version is not None: + try: + matcher = self._scheme.matcher('%s (%s)' % (name, version)) + except ValueError: + raise DistlibException('invalid name or version: %r, %r' % + (name, version)) + + for dist in self.get_distributions(): + # We hit a problem on Travis where enum34 was installed and doesn't + # have a provides attribute ... + if not hasattr(dist, 'provides'): + logger.debug('No "provides": %s', dist) + else: + provided = dist.provides + + for p in provided: + p_name, p_ver = parse_name_and_version(p) + if matcher is None: + if p_name == name: + yield dist + break + else: + if p_name == name and matcher.match(p_ver): + yield dist + break + + def get_file_path(self, name, relative_path): + """ + Return the path to a resource file. + """ + dist = self.get_distribution(name) + if dist is None: + raise LookupError('no distribution named %r found' % name) + return dist.get_resource_path(relative_path) + + def get_exported_entries(self, category, name=None): + """ + Return all of the exported entries in a particular category. + + :param category: The category to search for entries. + :param name: If specified, only entries with that name are returned. + """ + for dist in self.get_distributions(): + r = dist.exports + if category in r: + d = r[category] + if name is not None: + if name in d: + yield d[name] + else: + for v in d.values(): + yield v + + +class Distribution(object): + """ + A base class for distributions, whether installed or from indexes. + Either way, it must have some metadata, so that's all that's needed + for construction. + """ + + build_time_dependency = False + """ + Set to True if it's known to be only a build-time dependency (i.e. + not needed after installation). + """ + + requested = False + """A boolean that indicates whether the ``REQUESTED`` metadata file is + present (in other words, whether the package was installed by user + request or it was installed as a dependency).""" + + def __init__(self, metadata): + """ + Initialise an instance. + :param metadata: The instance of :class:`Metadata` describing this + distribution. + """ + self.metadata = metadata + self.name = metadata.name + self.key = self.name.lower() # for case-insensitive comparisons + self.version = metadata.version + self.locator = None + self.digest = None + self.extras = None # additional features requested + self.context = None # environment marker overrides + self.download_urls = set() + self.digests = {} + + @property + def source_url(self): + """ + The source archive download URL for this distribution. + """ + return self.metadata.source_url + + download_url = source_url # Backward compatibility + + @property + def name_and_version(self): + """ + A utility property which displays the name and version in parentheses. + """ + return '%s (%s)' % (self.name, self.version) + + @property + def provides(self): + """ + A set of distribution names and versions provided by this distribution. + :return: A set of "name (version)" strings. + """ + plist = self.metadata.provides + s = '%s (%s)' % (self.name, self.version) + if s not in plist: + plist.append(s) + return plist + + def _get_requirements(self, req_attr): + md = self.metadata + logger.debug('Getting requirements from metadata %r', md.todict()) + reqts = getattr(md, req_attr) + return set(md.get_requirements(reqts, extras=self.extras, + env=self.context)) + + @property + def run_requires(self): + return self._get_requirements('run_requires') + + @property + def meta_requires(self): + return self._get_requirements('meta_requires') + + @property + def build_requires(self): + return self._get_requirements('build_requires') + + @property + def test_requires(self): + return self._get_requirements('test_requires') + + @property + def dev_requires(self): + return self._get_requirements('dev_requires') + + def matches_requirement(self, req): + """ + Say if this instance matches (fulfills) a requirement. + :param req: The requirement to match. + :rtype req: str + :return: True if it matches, else False. + """ + # Requirement may contain extras - parse to lose those + # from what's passed to the matcher + r = parse_requirement(req) + scheme = get_scheme(self.metadata.scheme) + try: + matcher = scheme.matcher(r.requirement) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + result = False + for p in self.provides: + p_name, p_ver = parse_name_and_version(p) + if p_name != name: + continue + try: + result = matcher.match(p_ver) + break + except UnsupportedVersionError: + pass + return result + + def __repr__(self): + """ + Return a textual representation of this instance, + """ + if self.source_url: + suffix = ' [%s]' % self.source_url + else: + suffix = '' + return '<Distribution %s (%s)%s>' % (self.name, self.version, suffix) + + def __eq__(self, other): + """ + See if this distribution is the same as another. + :param other: The distribution to compare with. To be equal to one + another. distributions must have the same type, name, + version and source_url. + :return: True if it is the same, else False. + """ + if type(other) is not type(self): + result = False + else: + result = (self.name == other.name and + self.version == other.version and + self.source_url == other.source_url) + return result + + def __hash__(self): + """ + Compute hash in a way which matches the equality test. + """ + return hash(self.name) + hash(self.version) + hash(self.source_url) + + +class BaseInstalledDistribution(Distribution): + """ + This is the base class for installed distributions (whether PEP 376 or + legacy). + """ + + hasher = None + + def __init__(self, metadata, path, env=None): + """ + Initialise an instance. + :param metadata: An instance of :class:`Metadata` which describes the + distribution. This will normally have been initialised + from a metadata file in the ``path``. + :param path: The path of the ``.dist-info`` or ``.egg-info`` + directory for the distribution. + :param env: This is normally the :class:`DistributionPath` + instance where this distribution was found. + """ + super(BaseInstalledDistribution, self).__init__(metadata) + self.path = path + self.dist_path = env + + def get_hash(self, data, hasher=None): + """ + Get the hash of some data, using a particular hash algorithm, if + specified. + + :param data: The data to be hashed. + :type data: bytes + :param hasher: The name of a hash implementation, supported by hashlib, + or ``None``. Examples of valid values are ``'sha1'``, + ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and + ``'sha512'``. If no hasher is specified, the ``hasher`` + attribute of the :class:`InstalledDistribution` instance + is used. If the hasher is determined to be ``None``, MD5 + is used as the hashing algorithm. + :returns: The hash of the data. If a hasher was explicitly specified, + the returned hash will be prefixed with the specified hasher + followed by '='. + :rtype: str + """ + if hasher is None: + hasher = self.hasher + if hasher is None: + hasher = hashlib.md5 + prefix = '' + else: + hasher = getattr(hashlib, hasher) + prefix = '%s=' % self.hasher + digest = hasher(data).digest() + digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii') + return '%s%s' % (prefix, digest) + + +class InstalledDistribution(BaseInstalledDistribution): + """ + Created with the *path* of the ``.dist-info`` directory provided to the + constructor. It reads the metadata contained in ``pydist.json`` when it is + instantiated., or uses a passed in Metadata instance (useful for when + dry-run mode is being used). + """ + + hasher = 'sha256' + + def __init__(self, path, metadata=None, env=None): + self.modules = [] + self.finder = finder = resources.finder_for_path(path) + if finder is None: + raise ValueError('finder unavailable for %s' % path) + if env and env._cache_enabled and path in env._cache.path: + metadata = env._cache.path[path].metadata + elif metadata is None: + r = finder.find(METADATA_FILENAME) + # Temporary - for Wheel 0.23 support + if r is None: + r = finder.find(WHEEL_METADATA_FILENAME) + # Temporary - for legacy support + if r is None: + r = finder.find('METADATA') + if r is None: + raise ValueError('no %s found in %s' % (METADATA_FILENAME, + path)) + with contextlib.closing(r.as_stream()) as stream: + metadata = Metadata(fileobj=stream, scheme='legacy') + + super(InstalledDistribution, self).__init__(metadata, path, env) + + if env and env._cache_enabled: + env._cache.add(self) + + r = finder.find('REQUESTED') + self.requested = r is not None + p = os.path.join(path, 'top_level.txt') + if os.path.exists(p): + with open(p, 'rb') as f: + data = f.read() + self.modules = data.splitlines() + + def __repr__(self): + return '<InstalledDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def _get_records(self): + """ + Get the list of installed files for the distribution + :return: A list of tuples of path, hash and size. Note that hash and + size might be ``None`` for some entries. The path is exactly + as stored in the file (which is as in PEP 376). + """ + results = [] + r = self.get_distinfo_resource('RECORD') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as record_reader: + # Base location is parent dir of .dist-info dir + #base_location = os.path.dirname(self.path) + #base_location = os.path.abspath(base_location) + for row in record_reader: + missing = [None for i in range(len(row), 3)] + path, checksum, size = row + missing + #if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) + results.append((path, checksum, size)) + return results + + @cached_property + def exports(self): + """ + Return the information exported by this distribution. + :return: A dictionary of exports, mapping an export category to a dict + of :class:`ExportEntry` instances describing the individual + export entries, and keyed by name. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + result = self.read_exports() + return result + + def read_exports(self): + """ + Read exports data from a file in .ini format. + + :return: A dictionary of exports, mapping an export category to a list + of :class:`ExportEntry` instances describing the individual + export entries. + """ + result = {} + r = self.get_distinfo_resource(EXPORTS_FILENAME) + if r: + with contextlib.closing(r.as_stream()) as stream: + result = read_exports(stream) + return result + + def write_exports(self, exports): + """ + Write a dictionary of exports to a file in .ini format. + :param exports: A dictionary of exports, mapping an export category to + a list of :class:`ExportEntry` instances describing the + individual export entries. + """ + rf = self.get_distinfo_file(EXPORTS_FILENAME) + with open(rf, 'w') as f: + write_exports(exports, f) + + def get_resource_path(self, relative_path): + """ + NOTE: This API may change in the future. + + Return the absolute path to a resource file with the given relative + path. + + :param relative_path: The path, relative to .dist-info, of the resource + of interest. + :return: The absolute path where the resource is to be found. + """ + r = self.get_distinfo_resource('RESOURCES') + with contextlib.closing(r.as_stream()) as stream: + with CSVReader(stream=stream) as resources_reader: + for relative, destination in resources_reader: + if relative == relative_path: + return destination + raise KeyError('no resource file with relative path %r ' + 'is installed' % relative_path) + + def list_installed_files(self): + """ + Iterates over the ``RECORD`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: iterator of (path, hash, size) + """ + for result in self._get_records(): + yield result + + def write_installed_files(self, paths, prefix, dry_run=False): + """ + Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any + existing ``RECORD`` file is silently overwritten. + + prefix is used to determine when to write absolute paths. + """ + prefix = os.path.join(prefix, '') + base = os.path.dirname(self.path) + base_under_prefix = base.startswith(prefix) + base = os.path.join(base, '') + record_path = self.get_distinfo_file('RECORD') + logger.info('creating %s', record_path) + if dry_run: + return None + with CSVWriter(record_path) as writer: + for path in paths: + if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')): + # do not put size and hash, as in PEP-376 + hash_value = size = '' + else: + size = '%d' % os.path.getsize(path) + with open(path, 'rb') as fp: + hash_value = self.get_hash(fp.read()) + if path.startswith(base) or (base_under_prefix and + path.startswith(prefix)): + path = os.path.relpath(path, base) + writer.writerow((path, hash_value, size)) + + # add the RECORD file itself + if record_path.startswith(base): + record_path = os.path.relpath(record_path, base) + writer.writerow((record_path, '', '')) + return record_path + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + base = os.path.dirname(self.path) + record_path = self.get_distinfo_file('RECORD') + for path, hash_value, size in self.list_installed_files(): + if not os.path.isabs(path): + path = os.path.join(base, path) + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + elif os.path.isfile(path): + actual_size = str(os.path.getsize(path)) + if size and actual_size != size: + mismatches.append((path, 'size', size, actual_size)) + elif hash_value: + if '=' in hash_value: + hasher = hash_value.split('=', 1)[0] + else: + hasher = None + + with open(path, 'rb') as f: + actual_hash = self.get_hash(f.read(), hasher) + if actual_hash != hash_value: + mismatches.append((path, 'hash', hash_value, actual_hash)) + return mismatches + + @cached_property + def shared_locations(self): + """ + A dictionary of shared locations whose keys are in the set 'prefix', + 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'. + The corresponding value is the absolute path of that category for + this distribution, and takes into account any paths selected by the + user at installation time (e.g. via command-line arguments). In the + case of the 'namespace' key, this would be a list of absolute paths + for the roots of namespace packages in this distribution. + + The first time this property is accessed, the relevant information is + read from the SHARED file in the .dist-info directory. + """ + result = {} + shared_path = os.path.join(self.path, 'SHARED') + if os.path.isfile(shared_path): + with codecs.open(shared_path, 'r', encoding='utf-8') as f: + lines = f.read().splitlines() + for line in lines: + key, value = line.split('=', 1) + if key == 'namespace': + result.setdefault(key, []).append(value) + else: + result[key] = value + return result + + def write_shared_locations(self, paths, dry_run=False): + """ + Write shared location information to the SHARED file in .dist-info. + :param paths: A dictionary as described in the documentation for + :meth:`shared_locations`. + :param dry_run: If True, the action is logged but no file is actually + written. + :return: The path of the file written to. + """ + shared_path = os.path.join(self.path, 'SHARED') + logger.info('creating %s', shared_path) + if dry_run: + return None + lines = [] + for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): + path = paths[key] + if os.path.isdir(paths[key]): + lines.append('%s=%s' % (key, path)) + for ns in paths.get('namespace', ()): + lines.append('namespace=%s' % ns) + + with codecs.open(shared_path, 'w', encoding='utf-8') as f: + f.write('\n'.join(lines)) + return shared_path + + def get_distinfo_resource(self, path): + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + finder = resources.finder_for_path(self.path) + if finder is None: + raise DistlibException('Unable to get a finder for %s' % self.path) + return finder.find(path) + + def get_distinfo_file(self, path): + """ + Returns a path located under the ``.dist-info`` directory. Returns a + string representing the path. + + :parameter path: a ``'/'``-separated path relative to the + ``.dist-info`` directory or an absolute path; + If *path* is an absolute path and doesn't start + with the ``.dist-info`` directory path, + a :class:`DistlibException` is raised + :type path: str + :rtype: str + """ + # Check if it is an absolute path # XXX use relpath, add tests + if path.find(os.sep) >= 0: + # it's an absolute path? + distinfo_dirname, path = path.split(os.sep)[-2:] + if distinfo_dirname != self.path.split(os.sep)[-1]: + raise DistlibException( + 'dist-info file %r does not belong to the %r %s ' + 'distribution' % (path, self.name, self.version)) + + # The file must be relative + if path not in DIST_FILES: + raise DistlibException('invalid path for a dist-info file: ' + '%r at %r' % (path, self.path)) + + return os.path.join(self.path, path) + + def list_distinfo_files(self): + """ + Iterates over the ``RECORD`` entries and returns paths for each line if + the path is pointing to a file located in the ``.dist-info`` directory + or one of its subdirectories. + + :returns: iterator of paths + """ + base = os.path.dirname(self.path) + for path, checksum, size in self._get_records(): + # XXX add separator or use real relpath algo + if not os.path.isabs(path): + path = os.path.join(base, path) + if path.startswith(self.path): + yield path + + def __eq__(self, other): + return (isinstance(other, InstalledDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + + +class EggInfoDistribution(BaseInstalledDistribution): + """Created with the *path* of the ``.egg-info`` directory or file provided + to the constructor. It reads the metadata contained in the file itself, or + if the given path happens to be a directory, the metadata is read from the + file ``PKG-INFO`` under that directory.""" + + requested = True # as we have no way of knowing, assume it was + shared_locations = {} + + def __init__(self, path, env=None): + def set_name_and_version(s, n, v): + s.name = n + s.key = n.lower() # for case-insensitive comparisons + s.version = v + + self.path = path + self.dist_path = env + if env and env._cache_enabled and path in env._cache_egg.path: + metadata = env._cache_egg.path[path].metadata + set_name_and_version(self, metadata.name, metadata.version) + else: + metadata = self._get_metadata(path) + + # Need to be set before caching + set_name_and_version(self, metadata.name, metadata.version) + + if env and env._cache_enabled: + env._cache_egg.add(self) + super(EggInfoDistribution, self).__init__(metadata, path, env) + + def _get_metadata(self, path): + requires = None + + def parse_requires_data(data): + """Create a list of dependencies from a requires.txt file. + + *data*: the contents of a setuptools-produced requires.txt file. + """ + reqs = [] + lines = data.splitlines() + for line in lines: + line = line.strip() + if line.startswith('['): + logger.warning('Unexpected line: quitting requirement scan: %r', + line) + break + r = parse_requirement(line) + if not r: + logger.warning('Not recognised as a requirement: %r', line) + continue + if r.extras: + logger.warning('extra requirements in requires.txt are ' + 'not supported') + if not r.constraints: + reqs.append(r.name) + else: + cons = ', '.join('%s%s' % c for c in r.constraints) + reqs.append('%s (%s)' % (r.name, cons)) + return reqs + + def parse_requires_path(req_path): + """Create a list of dependencies from a requires.txt file. + + *req_path*: the path to a setuptools-produced requires.txt file. + """ + + reqs = [] + try: + with codecs.open(req_path, 'r', 'utf-8') as fp: + reqs = parse_requires_data(fp.read()) + except IOError: + pass + return reqs + + tl_path = tl_data = None + if path.endswith('.egg'): + if os.path.isdir(path): + p = os.path.join(path, 'EGG-INFO') + meta_path = os.path.join(p, 'PKG-INFO') + metadata = Metadata(path=meta_path, scheme='legacy') + req_path = os.path.join(p, 'requires.txt') + tl_path = os.path.join(p, 'top_level.txt') + requires = parse_requires_path(req_path) + else: + # FIXME handle the case where zipfile is not available + zipf = zipimport.zipimporter(path) + fileobj = StringIO( + zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8')) + metadata = Metadata(fileobj=fileobj, scheme='legacy') + try: + data = zipf.get_data('EGG-INFO/requires.txt') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + requires = parse_requires_data(data.decode('utf-8')) + except IOError: + requires = None + elif path.endswith('.egg-info'): + if os.path.isdir(path): + req_path = os.path.join(path, 'requires.txt') + requires = parse_requires_path(req_path) + path = os.path.join(path, 'PKG-INFO') + tl_path = os.path.join(path, 'top_level.txt') + metadata = Metadata(path=path, scheme='legacy') + else: + raise DistlibException('path must end with .egg-info or .egg, ' + 'got %r' % path) + + if requires: + metadata.add_requirements(requires) + # look for top-level modules in top_level.txt, if present + if tl_data is None: + if tl_path is not None and os.path.exists(tl_path): + with open(tl_path, 'rb') as f: + tl_data = f.read().decode('utf-8') + if not tl_data: + tl_data = [] + else: + tl_data = tl_data.splitlines() + self.modules = tl_data + return metadata + + def __repr__(self): + return '<EggInfoDistribution %r %s at %r>' % ( + self.name, self.version, self.path) + + def __str__(self): + return "%s %s" % (self.name, self.version) + + def check_installed_files(self): + """ + Checks that the hashes and sizes of the files in ``RECORD`` are + matched by the files themselves. Returns a (possibly empty) list of + mismatches. Each entry in the mismatch list will be a tuple consisting + of the path, 'exists', 'size' or 'hash' according to what didn't match + (existence is checked first, then size, then hash), the expected + value and the actual value. + """ + mismatches = [] + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + for path, _, _ in self.list_installed_files(): + if path == record_path: + continue + if not os.path.exists(path): + mismatches.append((path, 'exists', True, False)) + return mismatches + + def list_installed_files(self): + """ + Iterates over the ``installed-files.txt`` entries and returns a tuple + ``(path, hash, size)`` for each line. + + :returns: a list of (path, hash, size) + """ + + def _md5(path): + f = open(path, 'rb') + try: + content = f.read() + finally: + f.close() + return hashlib.md5(content).hexdigest() + + def _size(path): + return os.stat(path).st_size + + record_path = os.path.join(self.path, 'installed-files.txt') + result = [] + if os.path.exists(record_path): + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + p = os.path.normpath(os.path.join(self.path, line)) + # "./" is present as a marker between installed files + # and installation metadata files + if not os.path.exists(p): + logger.warning('Non-existent file: %s', p) + if p.endswith(('.pyc', '.pyo')): + continue + #otherwise fall through and fail + if not os.path.isdir(p): + result.append((p, _md5(p), _size(p))) + result.append((record_path, None, None)) + return result + + def list_distinfo_files(self, absolute=False): + """ + Iterates over the ``installed-files.txt`` entries and returns paths for + each line if the path is pointing to a file located in the + ``.egg-info`` directory or one of its subdirectories. + + :parameter absolute: If *absolute* is ``True``, each returned path is + transformed into a local absolute path. Otherwise the + raw value from ``installed-files.txt`` is returned. + :type absolute: boolean + :returns: iterator of paths + """ + record_path = os.path.join(self.path, 'installed-files.txt') + if os.path.exists(record_path): + skip = True + with codecs.open(record_path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + if line == './': + skip = False + continue + if not skip: + p = os.path.normpath(os.path.join(self.path, line)) + if p.startswith(self.path): + if absolute: + yield p + else: + yield line + + def __eq__(self, other): + return (isinstance(other, EggInfoDistribution) and + self.path == other.path) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + __hash__ = object.__hash__ + +new_dist_class = InstalledDistribution +old_dist_class = EggInfoDistribution + + +class DependencyGraph(object): + """ + Represents a dependency graph between distributions. + + The dependency relationships are stored in an ``adjacency_list`` that maps + distributions to a list of ``(other, label)`` tuples where ``other`` + is a distribution and the edge is labeled with ``label`` (i.e. the version + specifier, if such was provided). Also, for more efficient traversal, for + every distribution ``x``, a list of predecessors is kept in + ``reverse_list[x]``. An edge from distribution ``a`` to + distribution ``b`` means that ``a`` depends on ``b``. If any missing + dependencies are found, they are stored in ``missing``, which is a + dictionary that maps distributions to a list of requirements that were not + provided by any other distributions. + """ + + def __init__(self): + self.adjacency_list = {} + self.reverse_list = {} + self.missing = {} + + def add_distribution(self, distribution): + """Add the *distribution* to the graph. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + """ + self.adjacency_list[distribution] = [] + self.reverse_list[distribution] = [] + #self.missing[distribution] = [] + + def add_edge(self, x, y, label=None): + """Add an edge from distribution *x* to distribution *y* with the given + *label*. + + :type x: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type y: :class:`distutils2.database.InstalledDistribution` or + :class:`distutils2.database.EggInfoDistribution` + :type label: ``str`` or ``None`` + """ + self.adjacency_list[x].append((y, label)) + # multiple edges are allowed, so be careful + if x not in self.reverse_list[y]: + self.reverse_list[y].append(x) + + def add_missing(self, distribution, requirement): + """ + Add a missing *requirement* for the given *distribution*. + + :type distribution: :class:`distutils2.database.InstalledDistribution` + or :class:`distutils2.database.EggInfoDistribution` + :type requirement: ``str`` + """ + logger.debug('%s missing %r', distribution, requirement) + self.missing.setdefault(distribution, []).append(requirement) + + def _repr_dist(self, dist): + return '%s %s' % (dist.name, dist.version) + + def repr_node(self, dist, level=1): + """Prints only a subgraph""" + output = [self._repr_dist(dist)] + for other, label in self.adjacency_list[dist]: + dist = self._repr_dist(other) + if label is not None: + dist = '%s [%s]' % (dist, label) + output.append(' ' * level + str(dist)) + suboutput = self.repr_node(other, level + 1) + subs = suboutput.split('\n') + output.extend(subs[1:]) + return '\n'.join(output) + + def to_dot(self, f, skip_disconnected=True): + """Writes a DOT output for the graph to the provided file *f*. + + If *skip_disconnected* is set to ``True``, then all distributions + that are not dependent on any other distribution are skipped. + + :type f: has to support ``file``-like operations + :type skip_disconnected: ``bool`` + """ + disconnected = [] + + f.write("digraph dependencies {\n") + for dist, adjs in self.adjacency_list.items(): + if len(adjs) == 0 and not skip_disconnected: + disconnected.append(dist) + for other, label in adjs: + if not label is None: + f.write('"%s" -> "%s" [label="%s"]\n' % + (dist.name, other.name, label)) + else: + f.write('"%s" -> "%s"\n' % (dist.name, other.name)) + if not skip_disconnected and len(disconnected) > 0: + f.write('subgraph disconnected {\n') + f.write('label = "Disconnected"\n') + f.write('bgcolor = red\n') + + for dist in disconnected: + f.write('"%s"' % dist.name) + f.write('\n') + f.write('}\n') + f.write('}\n') + + def topological_sort(self): + """ + Perform a topological sort of the graph. + :return: A tuple, the first element of which is a topologically sorted + list of distributions, and the second element of which is a + list of distributions that cannot be sorted because they have + circular dependencies and so form a cycle. + """ + result = [] + # Make a shallow copy of the adjacency list + alist = {} + for k, v in self.adjacency_list.items(): + alist[k] = v[:] + while True: + # See what we can remove in this run + to_remove = [] + for k, v in list(alist.items())[:]: + if not v: + to_remove.append(k) + del alist[k] + if not to_remove: + # What's left in alist (if anything) is a cycle. + break + # Remove from the adjacency list of others + for k, v in alist.items(): + alist[k] = [(d, r) for d, r in v if d not in to_remove] + logger.debug('Moving to result: %s', + ['%s (%s)' % (d.name, d.version) for d in to_remove]) + result.extend(to_remove) + return result, list(alist.keys()) + + def __repr__(self): + """Representation of the graph""" + output = [] + for dist, adjs in self.adjacency_list.items(): + output.append(self.repr_node(dist)) + return '\n'.join(output) + + +def make_graph(dists, scheme='default'): + """Makes a dependency graph from the given distributions. + + :parameter dists: a list of distributions + :type dists: list of :class:`distutils2.database.InstalledDistribution` and + :class:`distutils2.database.EggInfoDistribution` instances + :rtype: a :class:`DependencyGraph` instance + """ + scheme = get_scheme(scheme) + graph = DependencyGraph() + provided = {} # maps names to lists of (version, dist) tuples + + # first, build the graph and find out what's provided + for dist in dists: + graph.add_distribution(dist) + + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + provided.setdefault(name, []).append((version, dist)) + + # now make the edges + for dist in dists: + requires = (dist.run_requires | dist.meta_requires | + dist.build_requires | dist.dev_requires) + for req in requires: + try: + matcher = scheme.matcher(req) + except UnsupportedVersionError: + # XXX compat-mode if cannot read the version + logger.warning('could not read version %r - using name only', + req) + name = req.split()[0] + matcher = scheme.matcher(name) + + name = matcher.key # case-insensitive + + matched = False + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + graph.add_edge(dist, provider, req) + matched = True + break + if not matched: + graph.add_missing(dist, req) + return graph + + +def get_dependent_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + dependent on *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + dep = [dist] # dependent distributions + todo = graph.reverse_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop() + dep.append(d) + for succ in graph.reverse_list[d]: + if succ not in dep: + todo.append(succ) + + dep.pop(0) # remove dist from dep, was there to prevent infinite loops + return dep + + +def get_required_dists(dists, dist): + """Recursively generate a list of distributions from *dists* that are + required by *dist*. + + :param dists: a list of distributions + :param dist: a distribution, member of *dists* for which we are interested + """ + if dist not in dists: + raise DistlibException('given distribution %r is not a member ' + 'of the list' % dist.name) + graph = make_graph(dists) + + req = [] # required distributions + todo = graph.adjacency_list[dist] # list of nodes we should inspect + + while todo: + d = todo.pop()[0] + req.append(d) + for pred in graph.adjacency_list[d]: + if pred not in req: + todo.append(pred) + + return req + + +def make_dist(name, version, **kwargs): + """ + A convenience method for making a dist given just a name and version. + """ + summary = kwargs.pop('summary', 'Placeholder for summary') + md = Metadata(**kwargs) + md.name = name + md.version = version + md.summary = summary or 'Placeholder for summary' + return Distribution(md) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py new file mode 100644 index 000000000..7197238f0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/index.py @@ -0,0 +1,516 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import hashlib +import logging +import os +import shutil +import subprocess +import tempfile +try: + from threading import Thread +except ImportError: + from dummy_threading import Thread + +from . import DistlibException +from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr, + urlparse, build_opener, string_types) +from .util import cached_property, zip_dir, ServerProxy + +logger = logging.getLogger(__name__) + +DEFAULT_INDEX = 'https://pypi.python.org/pypi' +DEFAULT_REALM = 'pypi' + +class PackageIndex(object): + """ + This class represents a package index compatible with PyPI, the Python + Package Index. + """ + + boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$' + + def __init__(self, url=None): + """ + Initialise an instance. + + :param url: The URL of the index. If not specified, the URL for PyPI is + used. + """ + self.url = url or DEFAULT_INDEX + self.read_configuration() + scheme, netloc, path, params, query, frag = urlparse(self.url) + if params or query or frag or scheme not in ('http', 'https'): + raise DistlibException('invalid repository: %s' % self.url) + self.password_handler = None + self.ssl_verifier = None + self.gpg = None + self.gpg_home = None + with open(os.devnull, 'w') as sink: + # Use gpg by default rather than gpg2, as gpg2 insists on + # prompting for passwords + for s in ('gpg', 'gpg2'): + try: + rc = subprocess.check_call([s, '--version'], stdout=sink, + stderr=sink) + if rc == 0: + self.gpg = s + break + except OSError: + pass + + def _get_pypirc_command(self): + """ + Get the distutils command for interacting with PyPI configurations. + :return: the command. + """ + from distutils.core import Distribution + from distutils.config import PyPIRCCommand + d = Distribution() + return PyPIRCCommand(d) + + def read_configuration(self): + """ + Read the PyPI access configuration as supported by distutils, getting + PyPI to do the actual work. This populates ``username``, ``password``, + ``realm`` and ``url`` attributes from the configuration. + """ + # get distutils to do the work + c = self._get_pypirc_command() + c.repository = self.url + cfg = c._read_pypirc() + self.username = cfg.get('username') + self.password = cfg.get('password') + self.realm = cfg.get('realm', 'pypi') + self.url = cfg.get('repository', self.url) + + def save_configuration(self): + """ + Save the PyPI access configuration. You must have set ``username`` and + ``password`` attributes before calling this method. + + Again, distutils is used to do the actual work. + """ + self.check_credentials() + # get distutils to do the work + c = self._get_pypirc_command() + c._store_pypirc(self.username, self.password) + + def check_credentials(self): + """ + Check that ``username`` and ``password`` have been set, and raise an + exception if not. + """ + if self.username is None or self.password is None: + raise DistlibException('username and password must be set') + pm = HTTPPasswordMgr() + _, netloc, _, _, _, _ = urlparse(self.url) + pm.add_password(self.realm, netloc, self.username, self.password) + self.password_handler = HTTPBasicAuthHandler(pm) + + def register(self, metadata): + """ + Register a distribution on PyPI, using the provided metadata. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the distribution to be + registered. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + metadata.validate() + d = metadata.todict() + d[':action'] = 'verify' + request = self.encode_request(d.items(), []) + response = self.send_request(request) + d[':action'] = 'submit' + request = self.encode_request(d.items(), []) + return self.send_request(request) + + def _reader(self, name, stream, outbuf): + """ + Thread runner for reading lines of from a subprocess into a buffer. + + :param name: The logical name of the stream (used for logging only). + :param stream: The stream to read from. This will typically a pipe + connected to the output stream of a subprocess. + :param outbuf: The list to append the read lines to. + """ + while True: + s = stream.readline() + if not s: + break + s = s.decode('utf-8').rstrip() + outbuf.append(s) + logger.debug('%s: %s' % (name, s)) + stream.close() + + def get_sign_command(self, filename, signer, sign_password, + keystore=None): + """ + Return a suitable command for signing a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The signing command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + if sign_password is not None: + cmd.extend(['--batch', '--passphrase-fd', '0']) + td = tempfile.mkdtemp() + sf = os.path.join(td, os.path.basename(filename) + '.asc') + cmd.extend(['--detach-sign', '--armor', '--local-user', + signer, '--output', sf, filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd, sf + + def run_command(self, cmd, input_data=None): + """ + Run a command in a child process , passing it any input data specified. + + :param cmd: The command to run. + :param input_data: If specified, this must be a byte string containing + data to be sent to the child process. + :return: A tuple consisting of the subprocess' exit code, a list of + lines read from the subprocess' ``stdout``, and a list of + lines read from the subprocess' ``stderr``. + """ + kwargs = { + 'stdout': subprocess.PIPE, + 'stderr': subprocess.PIPE, + } + if input_data is not None: + kwargs['stdin'] = subprocess.PIPE + stdout = [] + stderr = [] + p = subprocess.Popen(cmd, **kwargs) + # We don't use communicate() here because we may need to + # get clever with interacting with the command + t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout)) + t1.start() + t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr)) + t2.start() + if input_data is not None: + p.stdin.write(input_data) + p.stdin.close() + + p.wait() + t1.join() + t2.join() + return p.returncode, stdout, stderr + + def sign_file(self, filename, signer, sign_password, keystore=None): + """ + Sign a file. + + :param filename: The pathname to the file to be signed. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The absolute pathname of the file where the signature is + stored. + """ + cmd, sig_file = self.get_sign_command(filename, signer, sign_password, + keystore) + rc, stdout, stderr = self.run_command(cmd, + sign_password.encode('utf-8')) + if rc != 0: + raise DistlibException('sign command failed with error ' + 'code %s' % rc) + return sig_file + + def upload_file(self, metadata, filename, signer=None, sign_password=None, + filetype='sdist', pyversion='source', keystore=None): + """ + Upload a release file to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the file to be uploaded. + :param filename: The pathname of the file to be uploaded. + :param signer: The identifier of the signer of the file. + :param sign_password: The passphrase for the signer's + private key used for signing. + :param filetype: The type of the file being uploaded. This is the + distutils command which produced that file, e.g. + ``sdist`` or ``bdist_wheel``. + :param pyversion: The version of Python which the release relates + to. For code compatible with any Python, this would + be ``source``, otherwise it would be e.g. ``3.2``. + :param keystore: The path to a directory which contains the keys + used in signing. If not specified, the instance's + ``gpg_home`` attribute is used instead. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.exists(filename): + raise DistlibException('not found: %s' % filename) + metadata.validate() + d = metadata.todict() + sig_file = None + if signer: + if not self.gpg: + logger.warning('no signing program available - not signed') + else: + sig_file = self.sign_file(filename, signer, sign_password, + keystore) + with open(filename, 'rb') as f: + file_data = f.read() + md5_digest = hashlib.md5(file_data).hexdigest() + sha256_digest = hashlib.sha256(file_data).hexdigest() + d.update({ + ':action': 'file_upload', + 'protocol_version': '1', + 'filetype': filetype, + 'pyversion': pyversion, + 'md5_digest': md5_digest, + 'sha256_digest': sha256_digest, + }) + files = [('content', os.path.basename(filename), file_data)] + if sig_file: + with open(sig_file, 'rb') as f: + sig_data = f.read() + files.append(('gpg_signature', os.path.basename(sig_file), + sig_data)) + shutil.rmtree(os.path.dirname(sig_file)) + request = self.encode_request(d.items(), files) + return self.send_request(request) + + def upload_documentation(self, metadata, doc_dir): + """ + Upload documentation to the index. + + :param metadata: A :class:`Metadata` instance defining at least a name + and version number for the documentation to be + uploaded. + :param doc_dir: The pathname of the directory which contains the + documentation. This should be the directory that + contains the ``index.html`` for the documentation. + :return: The HTTP response received from PyPI upon submission of the + request. + """ + self.check_credentials() + if not os.path.isdir(doc_dir): + raise DistlibException('not a directory: %r' % doc_dir) + fn = os.path.join(doc_dir, 'index.html') + if not os.path.exists(fn): + raise DistlibException('not found: %r' % fn) + metadata.validate() + name, version = metadata.name, metadata.version + zip_data = zip_dir(doc_dir).getvalue() + fields = [(':action', 'doc_upload'), + ('name', name), ('version', version)] + files = [('content', name, zip_data)] + request = self.encode_request(fields, files) + return self.send_request(request) + + def get_verify_command(self, signature_filename, data_filename, + keystore=None): + """ + Return a suitable command for verifying a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: The verifying command as a list suitable to be + passed to :class:`subprocess.Popen`. + """ + cmd = [self.gpg, '--status-fd', '2', '--no-tty'] + if keystore is None: + keystore = self.gpg_home + if keystore: + cmd.extend(['--homedir', keystore]) + cmd.extend(['--verify', signature_filename, data_filename]) + logger.debug('invoking: %s', ' '.join(cmd)) + return cmd + + def verify_signature(self, signature_filename, data_filename, + keystore=None): + """ + Verify a signature for a file. + + :param signature_filename: The pathname to the file containing the + signature. + :param data_filename: The pathname to the file containing the + signed data. + :param keystore: The path to a directory which contains the keys + used in verification. If not specified, the + instance's ``gpg_home`` attribute is used instead. + :return: True if the signature was verified, else False. + """ + if not self.gpg: + raise DistlibException('verification unavailable because gpg ' + 'unavailable') + cmd = self.get_verify_command(signature_filename, data_filename, + keystore) + rc, stdout, stderr = self.run_command(cmd) + if rc not in (0, 1): + raise DistlibException('verify command failed with error ' + 'code %s' % rc) + return rc == 0 + + def download_file(self, url, destfile, digest=None, reporthook=None): + """ + This is a convenience method for downloading a file from an URL. + Normally, this will be a file from the index, though currently + no check is made for this (i.e. a file can be downloaded from + anywhere). + + The method is just like the :func:`urlretrieve` function in the + standard library, except that it allows digest computation to be + done during download and checking that the downloaded data + matched any expected value. + + :param url: The URL of the file to be downloaded (assumed to be + available via an HTTP GET request). + :param destfile: The pathname where the downloaded file is to be + saved. + :param digest: If specified, this must be a (hasher, value) + tuple, where hasher is the algorithm used (e.g. + ``'md5'``) and ``value`` is the expected value. + :param reporthook: The same as for :func:`urlretrieve` in the + standard library. + """ + if digest is None: + digester = None + logger.debug('No digest specified') + else: + if isinstance(digest, (list, tuple)): + hasher, digest = digest + else: + hasher = 'md5' + digester = getattr(hashlib, hasher)() + logger.debug('Digest specified: %s' % digest) + # The following code is equivalent to urlretrieve. + # We need to do it this way so that we can compute the + # digest of the file as we go. + with open(destfile, 'wb') as dfp: + # addinfourl is not a context manager on 2.x + # so we have to use try/finally + sfp = self.send_request(Request(url)) + try: + headers = sfp.info() + blocksize = 8192 + size = -1 + read = 0 + blocknum = 0 + if "content-length" in headers: + size = int(headers["Content-Length"]) + if reporthook: + reporthook(blocknum, blocksize, size) + while True: + block = sfp.read(blocksize) + if not block: + break + read += len(block) + dfp.write(block) + if digester: + digester.update(block) + blocknum += 1 + if reporthook: + reporthook(blocknum, blocksize, size) + finally: + sfp.close() + + # check that we got the whole file, if we can + if size >= 0 and read < size: + raise DistlibException( + 'retrieval incomplete: got only %d out of %d bytes' + % (read, size)) + # if we have a digest, it must match. + if digester: + actual = digester.hexdigest() + if digest != actual: + raise DistlibException('%s digest mismatch for %s: expected ' + '%s, got %s' % (hasher, destfile, + digest, actual)) + logger.debug('Digest verified: %s', digest) + + def send_request(self, req): + """ + Send a standard library :class:`Request` to PyPI and return its + response. + + :param req: The request to send. + :return: The HTTP response from PyPI (a standard library HTTPResponse). + """ + handlers = [] + if self.password_handler: + handlers.append(self.password_handler) + if self.ssl_verifier: + handlers.append(self.ssl_verifier) + opener = build_opener(*handlers) + return opener.open(req) + + def encode_request(self, fields, files): + """ + Encode fields and files for posting to an HTTP server. + + :param fields: The fields to send as a list of (fieldname, value) + tuples. + :param files: The files to send as a list of (fieldname, filename, + file_bytes) tuple. + """ + # Adapted from packaging, which in turn was adapted from + # http://code.activestate.com/recipes/146306 + + parts = [] + boundary = self.boundary + for k, values in fields: + if not isinstance(values, (list, tuple)): + values = [values] + + for v in values: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"' % + k).encode('utf-8'), + b'', + v.encode('utf-8'))) + for key, filename, value in files: + parts.extend(( + b'--' + boundary, + ('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)).encode('utf-8'), + b'', + value)) + + parts.extend((b'--' + boundary + b'--', b'')) + + body = b'\r\n'.join(parts) + ct = b'multipart/form-data; boundary=' + boundary + headers = { + 'Content-type': ct, + 'Content-length': str(len(body)) + } + return Request(self.url, body, headers) + + def search(self, terms, operator=None): + if isinstance(terms, string_types): + terms = {'name': terms} + rpc_proxy = ServerProxy(self.url, timeout=3.0) + try: + return rpc_proxy.search(terms, operator or 'and') + finally: + rpc_proxy('close')() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py new file mode 100644 index 000000000..9131b7716 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/locators.py @@ -0,0 +1,1292 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# + +import gzip +from io import BytesIO +import json +import logging +import os +import posixpath +import re +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import zlib + +from . import DistlibException +from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url, + queue, quote, unescape, string_types, build_opener, + HTTPRedirectHandler as BaseRedirectHandler, text_type, + Request, HTTPError, URLError) +from .database import Distribution, DistributionPath, make_dist +from .metadata import Metadata, MetadataInvalidError +from .util import (cached_property, parse_credentials, ensure_slash, + split_filename, get_project_data, parse_requirement, + parse_name_and_version, ServerProxy, normalize_name) +from .version import get_scheme, UnsupportedVersionError +from .wheel import Wheel, is_compatible + +logger = logging.getLogger(__name__) + +HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)') +CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I) +HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') +DEFAULT_INDEX = 'https://pypi.python.org/pypi' + +def get_all_distribution_names(url=None): + """ + Return all distribution names known by an index. + :param url: The URL of the index. + :return: A list of all known distribution names. + """ + if url is None: + url = DEFAULT_INDEX + client = ServerProxy(url, timeout=3.0) + try: + return client.list_packages() + finally: + client('close')() + +class RedirectHandler(BaseRedirectHandler): + """ + A class to work around a bug in some Python 3.2.x releases. + """ + # There's a bug in the base version for some 3.2.x + # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header + # returns e.g. /abc, it bails because it says the scheme '' + # is bogus, when actually it should use the request's + # URL for the scheme. See Python issue #13696. + def http_error_302(self, req, fp, code, msg, headers): + # Some servers (incorrectly) return multiple Location headers + # (so probably same goes for URI). Use first header. + newurl = None + for key in ('location', 'uri'): + if key in headers: + newurl = headers[key] + break + if newurl is None: # pragma: no cover + return + urlparts = urlparse(newurl) + if urlparts.scheme == '': + newurl = urljoin(req.get_full_url(), newurl) + if hasattr(headers, 'replace_header'): + headers.replace_header(key, newurl) + else: + headers[key] = newurl + return BaseRedirectHandler.http_error_302(self, req, fp, code, msg, + headers) + + http_error_301 = http_error_303 = http_error_307 = http_error_302 + +class Locator(object): + """ + A base class for locators - things that locate distributions. + """ + source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz') + binary_extensions = ('.egg', '.exe', '.whl') + excluded_extensions = ('.pdf',) + + # A list of tags indicating which wheels you want to match. The default + # value of None matches against the tags compatible with the running + # Python. If you want to match other values, set wheel_tags on a locator + # instance to a list of tuples (pyver, abi, arch) which you want to match. + wheel_tags = None + + downloadable_extensions = source_extensions + ('.whl',) + + def __init__(self, scheme='default'): + """ + Initialise an instance. + :param scheme: Because locators look for most recent versions, they + need to know the version scheme to use. This specifies + the current PEP-recommended scheme - use ``'legacy'`` + if you need to support existing distributions on PyPI. + """ + self._cache = {} + self.scheme = scheme + # Because of bugs in some of the handlers on some of the platforms, + # we use our own opener rather than just using urlopen. + self.opener = build_opener(RedirectHandler()) + # If get_project() is called from locate(), the matcher instance + # is set from the requirement passed to locate(). See issue #18 for + # why this can be useful to know. + self.matcher = None + self.errors = queue.Queue() + + def get_errors(self): + """ + Return any errors which have occurred. + """ + result = [] + while not self.errors.empty(): # pragma: no cover + try: + e = self.errors.get(False) + result.append(e) + except self.errors.Empty: + continue + self.errors.task_done() + return result + + def clear_errors(self): + """ + Clear any errors which may have been logged. + """ + # Just get the errors and throw them away + self.get_errors() + + def clear_cache(self): + self._cache.clear() + + def _get_scheme(self): + return self._scheme + + def _set_scheme(self, value): + self._scheme = value + + scheme = property(_get_scheme, _set_scheme) + + def _get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This should be implemented in subclasses. + + If called from a locate() request, self.matcher will be set to a + matcher for the requirement to satisfy, otherwise it will be None. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Please implement in the subclass') + + def get_project(self, name): + """ + For a given project, get a dictionary mapping available versions to Distribution + instances. + + This calls _get_project to do all the work, and just implements a caching layer on top. + """ + if self._cache is None: # pragma: no cover + result = self._get_project(name) + elif name in self._cache: + result = self._cache[name] + else: + self.clear_errors() + result = self._get_project(name) + self._cache[name] = result + return result + + def score_url(self, url): + """ + Give an url a score which can be used to choose preferred URLs + for a given project release. + """ + t = urlparse(url) + basename = posixpath.basename(t.path) + compatible = True + is_wheel = basename.endswith('.whl') + is_downloadable = basename.endswith(self.downloadable_extensions) + if is_wheel: + compatible = is_compatible(Wheel(basename), self.wheel_tags) + return (t.scheme == 'https', 'pypi.python.org' in t.netloc, + is_downloadable, is_wheel, compatible, basename) + + def prefer_url(self, url1, url2): + """ + Choose one of two URLs where both are candidates for distribution + archives for the same version of a distribution (for example, + .tar.gz vs. zip). + + The current implementation favours https:// URLs over http://, archives + from PyPI over those from other locations, wheel compatibility (if a + wheel) and then the archive name. + """ + result = url2 + if url1: + s1 = self.score_url(url1) + s2 = self.score_url(url2) + if s1 > s2: + result = url1 + if result != url2: + logger.debug('Not replacing %r with %r', url1, url2) + else: + logger.debug('Replacing %r with %r', url1, url2) + return result + + def split_filename(self, filename, project_name): + """ + Attempt to split a filename in project name, version and Python version. + """ + return split_filename(filename, project_name) + + def convert_url_to_download_info(self, url, project_name): + """ + See if a URL is a candidate for a download URL for a project (the URL + has typically been scraped from an HTML page). + + If it is, a dictionary is returned with keys "name", "version", + "filename" and "url"; otherwise, None is returned. + """ + def same_project(name1, name2): + return normalize_name(name1) == normalize_name(name2) + + result = None + scheme, netloc, path, params, query, frag = urlparse(url) + if frag.lower().startswith('egg='): # pragma: no cover + logger.debug('%s: version hint in fragment: %r', + project_name, frag) + m = HASHER_HASH.match(frag) + if m: + algo, digest = m.groups() + else: + algo, digest = None, None + origpath = path + if path and path[-1] == '/': # pragma: no cover + path = path[:-1] + if path.endswith('.whl'): + try: + wheel = Wheel(path) + if is_compatible(wheel, self.wheel_tags): + if project_name is None: + include = True + else: + include = same_project(wheel.name, project_name) + if include: + result = { + 'name': wheel.name, + 'version': wheel.version, + 'filename': wheel.filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + 'python-version': ', '.join( + ['.'.join(list(v[2:])) for v in wheel.pyver]), + } + except Exception as e: # pragma: no cover + logger.warning('invalid path for wheel: %s', path) + elif not path.endswith(self.downloadable_extensions): # pragma: no cover + logger.debug('Not downloadable: %s', path) + else: # downloadable extension + path = filename = posixpath.basename(path) + for ext in self.downloadable_extensions: + if path.endswith(ext): + path = path[:-len(ext)] + t = self.split_filename(path, project_name) + if not t: # pragma: no cover + logger.debug('No match for project/version: %s', path) + else: + name, version, pyver = t + if not project_name or same_project(project_name, name): + result = { + 'name': name, + 'version': version, + 'filename': filename, + 'url': urlunparse((scheme, netloc, origpath, + params, query, '')), + #'packagetype': 'sdist', + } + if pyver: # pragma: no cover + result['python-version'] = pyver + break + if result and algo: + result['%s_digest' % algo] = digest + return result + + def _get_digest(self, info): + """ + Get a digest from a dictionary by looking at keys of the form + 'algo_digest'. + + Returns a 2-tuple (algo, digest) if found, else None. Currently + looks only for SHA256, then MD5. + """ + result = None + for algo in ('sha256', 'md5'): + key = '%s_digest' % algo + if key in info: + result = (algo, info[key]) + break + return result + + def _update_version_data(self, result, info): + """ + Update a result dictionary (the final result from _get_project) with a + dictionary for a specific version, which typically holds information + gleaned from a filename or URL for an archive for the distribution. + """ + name = info.pop('name') + version = info.pop('version') + if version in result: + dist = result[version] + md = dist.metadata + else: + dist = make_dist(name, version, scheme=self.scheme) + md = dist.metadata + dist.digest = digest = self._get_digest(info) + url = info['url'] + result['digests'][url] = digest + if md.source_url != info['url']: + md.source_url = self.prefer_url(md.source_url, url) + result['urls'].setdefault(version, set()).add(url) + dist.locator = self + result[version] = dist + + def locate(self, requirement, prereleases=False): + """ + Find the most recent distribution which matches the given + requirement. + + :param requirement: A requirement of the form 'foo (1.0)' or perhaps + 'foo (>= 1.0, < 2.0, != 1.3)' + :param prereleases: If ``True``, allow pre-release versions + to be located. Otherwise, pre-release versions + are not returned. + :return: A :class:`Distribution` instance, or ``None`` if no such + distribution could be located. + """ + result = None + r = parse_requirement(requirement) + if r is None: # pragma: no cover + raise DistlibException('Not a valid requirement: %r' % requirement) + scheme = get_scheme(self.scheme) + self.matcher = matcher = scheme.matcher(r.requirement) + logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__) + versions = self.get_project(r.name) + if len(versions) > 2: # urls and digests keys are present + # sometimes, versions are invalid + slist = [] + vcls = matcher.version_class + for k in versions: + if k in ('urls', 'digests'): + continue + try: + if not matcher.match(k): + logger.debug('%s did not match %r', matcher, k) + else: + if prereleases or not vcls(k).is_prerelease: + slist.append(k) + else: + logger.debug('skipping pre-release ' + 'version %s of %s', k, matcher.name) + except Exception: # pragma: no cover + logger.warning('error matching %s with %r', matcher, k) + pass # slist.append(k) + if len(slist) > 1: + slist = sorted(slist, key=scheme.key) + if slist: + logger.debug('sorted list: %s', slist) + version = slist[-1] + result = versions[version] + if result: + if r.extras: + result.extras = r.extras + result.download_urls = versions.get('urls', {}).get(version, set()) + d = {} + sd = versions.get('digests', {}) + for url in result.download_urls: + if url in sd: # pragma: no cover + d[url] = sd[url] + result.digests = d + self.matcher = None + return result + + +class PyPIRPCLocator(Locator): + """ + This locator uses XML-RPC to locate distributions. It therefore + cannot be used with simple mirrors (that only mirror file content). + """ + def __init__(self, url, **kwargs): + """ + Initialise an instance. + + :param url: The URL to use for XML-RPC. + :param kwargs: Passed to the superclass constructor. + """ + super(PyPIRPCLocator, self).__init__(**kwargs) + self.base_url = url + self.client = ServerProxy(url, timeout=3.0) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + return set(self.client.list_packages()) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + versions = self.client.package_releases(name, True) + for v in versions: + urls = self.client.release_urls(name, v) + data = self.client.release_data(name, v) + metadata = Metadata(scheme=self.scheme) + metadata.name = data['name'] + metadata.version = data['version'] + metadata.license = data.get('license') + metadata.keywords = data.get('keywords', []) + metadata.summary = data.get('summary') + dist = Distribution(metadata) + if urls: + info = urls[0] + metadata.source_url = info['url'] + dist.digest = self._get_digest(info) + dist.locator = self + result[v] = dist + for info in urls: + url = info['url'] + digest = self._get_digest(info) + result['urls'].setdefault(v, set()).add(url) + result['digests'][url] = digest + return result + +class PyPIJSONLocator(Locator): + """ + This locator uses PyPI's JSON interface. It's very limited in functionality + and probably not worth using. + """ + def __init__(self, url, **kwargs): + super(PyPIJSONLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + url = urljoin(self.base_url, '%s/json' % quote(name)) + try: + resp = self.opener.open(url) + data = resp.read().decode() # for now + d = json.loads(data) + md = Metadata(scheme=self.scheme) + data = d['info'] + md.name = data['name'] + md.version = data['version'] + md.license = data.get('license') + md.keywords = data.get('keywords', []) + md.summary = data.get('summary') + dist = Distribution(md) + dist.locator = self + urls = d['urls'] + result[md.version] = dist + for info in d['urls']: + url = info['url'] + dist.download_urls.add(url) + dist.digests[url] = self._get_digest(info) + result['urls'].setdefault(md.version, set()).add(url) + result['digests'][url] = self._get_digest(info) + # Now get other releases + for version, infos in d['releases'].items(): + if version == md.version: + continue # already done + omd = Metadata(scheme=self.scheme) + omd.name = md.name + omd.version = version + odist = Distribution(omd) + odist.locator = self + result[version] = odist + for info in infos: + url = info['url'] + odist.download_urls.add(url) + odist.digests[url] = self._get_digest(info) + result['urls'].setdefault(version, set()).add(url) + result['digests'][url] = self._get_digest(info) +# for info in urls: +# md.source_url = info['url'] +# dist.digest = self._get_digest(info) +# dist.locator = self +# for info in urls: +# url = info['url'] +# result['urls'].setdefault(md.version, set()).add(url) +# result['digests'][url] = self._get_digest(info) + except Exception as e: + self.errors.put(text_type(e)) + logger.exception('JSON fetch failed: %s', e) + return result + + +class Page(object): + """ + This class represents a scraped HTML page. + """ + # The following slightly hairy-looking regex just looks for the contents of + # an anchor link, which has an attribute "href" either immediately preceded + # or immediately followed by a "rel" attribute. The attribute values can be + # declared with double quotes, single quotes or no quotes - which leads to + # the length of the expression. + _href = re.compile(""" +(rel\\s*=\\s*(?:"(?P<rel1>[^"]*)"|'(?P<rel2>[^']*)'|(?P<rel3>[^>\\s\n]*))\\s+)? +href\\s*=\\s*(?:"(?P<url1>[^"]*)"|'(?P<url2>[^']*)'|(?P<url3>[^>\\s\n]*)) +(\\s+rel\\s*=\\s*(?:"(?P<rel4>[^"]*)"|'(?P<rel5>[^']*)'|(?P<rel6>[^>\\s\n]*)))? +""", re.I | re.S | re.X) + _base = re.compile(r"""<base\s+href\s*=\s*['"]?([^'">]+)""", re.I | re.S) + + def __init__(self, data, url): + """ + Initialise an instance with the Unicode page contents and the URL they + came from. + """ + self.data = data + self.base_url = self.url = url + m = self._base.search(self.data) + if m: + self.base_url = m.group(1) + + _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + @cached_property + def links(self): + """ + Return the URLs of all the links on a page together with information + about their "rel" attribute, for determining which ones to treat as + downloads and which ones to queue for further scraping. + """ + def clean(url): + "Tidy up an URL." + scheme, netloc, path, params, query, frag = urlparse(url) + return urlunparse((scheme, netloc, quote(path), + params, query, frag)) + + result = set() + for match in self._href.finditer(self.data): + d = match.groupdict('') + rel = (d['rel1'] or d['rel2'] or d['rel3'] or + d['rel4'] or d['rel5'] or d['rel6']) + url = d['url1'] or d['url2'] or d['url3'] + url = urljoin(self.base_url, url) + url = unescape(url) + url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url) + result.add((url, rel)) + # We sort the result, hoping to bring the most recent versions + # to the front + result = sorted(result, key=lambda t: t[0], reverse=True) + return result + + +class SimpleScrapingLocator(Locator): + """ + A locator which scrapes HTML pages to locate downloads for a distribution. + This runs multiple threads to do the I/O; performance is at least as good + as pip's PackageFinder, which works in an analogous fashion. + """ + + # These are used to deal with various Content-Encoding schemes. + decoders = { + 'deflate': zlib.decompress, + 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(d)).read(), + 'none': lambda b: b, + } + + def __init__(self, url, timeout=None, num_workers=10, **kwargs): + """ + Initialise an instance. + :param url: The root URL to use for scraping. + :param timeout: The timeout, in seconds, to be applied to requests. + This defaults to ``None`` (no timeout specified). + :param num_workers: The number of worker threads you want to do I/O, + This defaults to 10. + :param kwargs: Passed to the superclass. + """ + super(SimpleScrapingLocator, self).__init__(**kwargs) + self.base_url = ensure_slash(url) + self.timeout = timeout + self._page_cache = {} + self._seen = set() + self._to_fetch = queue.Queue() + self._bad_hosts = set() + self.skip_externals = False + self.num_workers = num_workers + self._lock = threading.RLock() + # See issue #45: we need to be resilient when the locator is used + # in a thread, e.g. with concurrent.futures. We can't use self._lock + # as it is for coordinating our internal threads - the ones created + # in _prepare_threads. + self._gplock = threading.RLock() + + def _prepare_threads(self): + """ + Threads are created only when get_project is called, and terminate + before it returns. They are there primarily to parallelise I/O (i.e. + fetching web pages). + """ + self._threads = [] + for i in range(self.num_workers): + t = threading.Thread(target=self._fetch) + t.setDaemon(True) + t.start() + self._threads.append(t) + + def _wait_threads(self): + """ + Tell all the threads to terminate (by sending a sentinel value) and + wait for them to do so. + """ + # Note that you need two loops, since you can't say which + # thread will get each sentinel + for t in self._threads: + self._to_fetch.put(None) # sentinel + for t in self._threads: + t.join() + self._threads = [] + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + with self._gplock: + self.result = result + self.project_name = name + url = urljoin(self.base_url, '%s/' % quote(name)) + self._seen.clear() + self._page_cache.clear() + self._prepare_threads() + try: + logger.debug('Queueing %s', url) + self._to_fetch.put(url) + self._to_fetch.join() + finally: + self._wait_threads() + del self.result + return result + + platform_dependent = re.compile(r'\b(linux-(i\d86|x86_64|arm\w+)|' + r'win(32|-amd64)|macosx-?\d+)\b', re.I) + + def _is_platform_dependent(self, url): + """ + Does an URL refer to a platform-specific download? + """ + return self.platform_dependent.search(url) + + def _process_download(self, url): + """ + See if an URL is a suitable download for a project. + + If it is, register information in the result dictionary (for + _get_project) about the specific version it's for. + + Note that the return value isn't actually used other than as a boolean + value. + """ + if self._is_platform_dependent(url): + info = None + else: + info = self.convert_url_to_download_info(url, self.project_name) + logger.debug('process_download: %s -> %s', url, info) + if info: + with self._lock: # needed because self.result is shared + self._update_version_data(self.result, info) + return info + + def _should_queue(self, link, referrer, rel): + """ + Determine whether a link URL from a referring page and with a + particular "rel" attribute should be queued for scraping. + """ + scheme, netloc, path, _, _, _ = urlparse(link) + if path.endswith(self.source_extensions + self.binary_extensions + + self.excluded_extensions): + result = False + elif self.skip_externals and not link.startswith(self.base_url): + result = False + elif not referrer.startswith(self.base_url): + result = False + elif rel not in ('homepage', 'download'): + result = False + elif scheme not in ('http', 'https', 'ftp'): + result = False + elif self._is_platform_dependent(link): + result = False + else: + host = netloc.split(':', 1)[0] + if host.lower() == 'localhost': + result = False + else: + result = True + logger.debug('should_queue: %s (%s) from %s -> %s', link, rel, + referrer, result) + return result + + def _fetch(self): + """ + Get a URL to fetch from the work queue, get the HTML page, examine its + links for download candidates and candidates for further scraping. + + This is a handy method to run in a thread. + """ + while True: + url = self._to_fetch.get() + try: + if url: + page = self.get_page(url) + if page is None: # e.g. after an error + continue + for link, rel in page.links: + if link not in self._seen: + try: + self._seen.add(link) + if (not self._process_download(link) and + self._should_queue(link, url, rel)): + logger.debug('Queueing %s from %s', link, url) + self._to_fetch.put(link) + except MetadataInvalidError: # e.g. invalid versions + pass + except Exception as e: # pragma: no cover + self.errors.put(text_type(e)) + finally: + # always do this, to avoid hangs :-) + self._to_fetch.task_done() + if not url: + #logger.debug('Sentinel seen, quitting.') + break + + def get_page(self, url): + """ + Get the HTML for an URL, possibly from an in-memory cache. + + XXX TODO Note: this cache is never actually cleared. It's assumed that + the data won't get stale over the lifetime of a locator instance (not + necessarily true for the default_locator). + """ + # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api + scheme, netloc, path, _, _, _ = urlparse(url) + if scheme == 'file' and os.path.isdir(url2pathname(path)): + url = urljoin(ensure_slash(url), 'index.html') + + if url in self._page_cache: + result = self._page_cache[url] + logger.debug('Returning %s from cache: %s', url, result) + else: + host = netloc.split(':', 1)[0] + result = None + if host in self._bad_hosts: + logger.debug('Skipping %s due to bad host %s', url, host) + else: + req = Request(url, headers={'Accept-encoding': 'identity'}) + try: + logger.debug('Fetching %s', url) + resp = self.opener.open(req, timeout=self.timeout) + logger.debug('Fetched %s', url) + headers = resp.info() + content_type = headers.get('Content-Type', '') + if HTML_CONTENT_TYPE.match(content_type): + final_url = resp.geturl() + data = resp.read() + encoding = headers.get('Content-Encoding') + if encoding: + decoder = self.decoders[encoding] # fail if not found + data = decoder(data) + encoding = 'utf-8' + m = CHARSET.search(content_type) + if m: + encoding = m.group(1) + try: + data = data.decode(encoding) + except UnicodeError: # pragma: no cover + data = data.decode('latin-1') # fallback + result = Page(data, final_url) + self._page_cache[final_url] = result + except HTTPError as e: + if e.code != 404: + logger.exception('Fetch failed: %s: %s', url, e) + except URLError as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + with self._lock: + self._bad_hosts.add(host) + except Exception as e: # pragma: no cover + logger.exception('Fetch failed: %s: %s', url, e) + finally: + self._page_cache[url] = result # even if None (failure) + return result + + _distname_re = re.compile('<a href=[^>]*>([^<]+)<') + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + page = self.get_page(self.base_url) + if not page: + raise DistlibException('Unable to get %s' % self.base_url) + for match in self._distname_re.finditer(page.data): + result.add(match.group(1)) + return result + +class DirectoryLocator(Locator): + """ + This class locates distributions in a directory tree. + """ + + def __init__(self, path, **kwargs): + """ + Initialise an instance. + :param path: The root of the directory tree to search. + :param kwargs: Passed to the superclass constructor, + except for: + * recursive - if True (the default), subdirectories are + recursed into. If False, only the top-level directory + is searched, + """ + self.recursive = kwargs.pop('recursive', True) + super(DirectoryLocator, self).__init__(**kwargs) + path = os.path.abspath(path) + if not os.path.isdir(path): # pragma: no cover + raise DistlibException('Not a directory: %r' % path) + self.base_dir = path + + def should_include(self, filename, parent): + """ + Should a filename be considered as a candidate for a distribution + archive? As well as the filename, the directory which contains it + is provided, though not used by the current implementation. + """ + return filename.endswith(self.downloadable_extensions) + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, name) + if info: + self._update_version_data(result, info) + if not self.recursive: + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for root, dirs, files in os.walk(self.base_dir): + for fn in files: + if self.should_include(fn, root): + fn = os.path.join(root, fn) + url = urlunparse(('file', '', + pathname2url(os.path.abspath(fn)), + '', '', '')) + info = self.convert_url_to_download_info(url, None) + if info: + result.add(info['name']) + if not self.recursive: + break + return result + +class JSONLocator(Locator): + """ + This locator uses special extended metadata (not available on PyPI) and is + the basis of performant dependency resolution in distlib. Other locators + require archive downloads before dependencies can be determined! As you + might imagine, that can be slow. + """ + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + raise NotImplementedError('Not available from this locator') + + def _get_project(self, name): + result = {'urls': {}, 'digests': {}} + data = get_project_data(name) + if data: + for info in data.get('files', []): + if info['ptype'] != 'sdist' or info['pyversion'] != 'source': + continue + # We don't store summary in project metadata as it makes + # the data bigger for no benefit during dependency + # resolution + dist = make_dist(data['name'], info['version'], + summary=data.get('summary', + 'Placeholder for summary'), + scheme=self.scheme) + md = dist.metadata + md.source_url = info['url'] + # TODO SHA256 digest + if 'digest' in info and info['digest']: + dist.digest = ('md5', info['digest']) + md.dependencies = info.get('requirements', {}) + dist.exports = info.get('exports', {}) + result[dist.version] = dist + result['urls'].setdefault(dist.version, set()).add(info['url']) + return result + +class DistPathLocator(Locator): + """ + This locator finds installed distributions in a path. It can be useful for + adding to an :class:`AggregatingLocator`. + """ + def __init__(self, distpath, **kwargs): + """ + Initialise an instance. + + :param distpath: A :class:`DistributionPath` instance to search. + """ + super(DistPathLocator, self).__init__(**kwargs) + assert isinstance(distpath, DistributionPath) + self.distpath = distpath + + def _get_project(self, name): + dist = self.distpath.get_distribution(name) + if dist is None: + result = {'urls': {}, 'digests': {}} + else: + result = { + dist.version: dist, + 'urls': {dist.version: set([dist.source_url])}, + 'digests': {dist.version: set([None])} + } + return result + + +class AggregatingLocator(Locator): + """ + This class allows you to chain and/or merge a list of locators. + """ + def __init__(self, *locators, **kwargs): + """ + Initialise an instance. + + :param locators: The list of locators to search. + :param kwargs: Passed to the superclass constructor, + except for: + * merge - if False (the default), the first successful + search from any of the locators is returned. If True, + the results from all locators are merged (this can be + slow). + """ + self.merge = kwargs.pop('merge', False) + self.locators = locators + super(AggregatingLocator, self).__init__(**kwargs) + + def clear_cache(self): + super(AggregatingLocator, self).clear_cache() + for locator in self.locators: + locator.clear_cache() + + def _set_scheme(self, value): + self._scheme = value + for locator in self.locators: + locator.scheme = value + + scheme = property(Locator.scheme.fget, _set_scheme) + + def _get_project(self, name): + result = {} + for locator in self.locators: + d = locator.get_project(name) + if d: + if self.merge: + files = result.get('urls', {}) + digests = result.get('digests', {}) + # next line could overwrite result['urls'], result['digests'] + result.update(d) + df = result.get('urls') + if files and df: + for k, v in files.items(): + if k in df: + df[k] |= v + else: + df[k] = v + dd = result.get('digests') + if digests and dd: + dd.update(digests) + else: + # See issue #18. If any dists are found and we're looking + # for specific constraints, we only return something if + # a match is found. For example, if a DirectoryLocator + # returns just foo (1.0) while we're looking for + # foo (>= 2.0), we'll pretend there was nothing there so + # that subsequent locators can be queried. Otherwise we + # would just return foo (1.0) which would then lead to a + # failure to find foo (>= 2.0), because other locators + # weren't searched. Note that this only matters when + # merge=False. + if self.matcher is None: + found = True + else: + found = False + for k in d: + if self.matcher.match(k): + found = True + break + if found: + result = d + break + return result + + def get_distribution_names(self): + """ + Return all the distribution names known to this locator. + """ + result = set() + for locator in self.locators: + try: + result |= locator.get_distribution_names() + except NotImplementedError: + pass + return result + + +# We use a legacy scheme simply because most of the dists on PyPI use legacy +# versions which don't conform to PEP 426 / PEP 440. +default_locator = AggregatingLocator( + JSONLocator(), + SimpleScrapingLocator('https://pypi.python.org/simple/', + timeout=3.0), + scheme='legacy') + +locate = default_locator.locate + +NAME_VERSION_RE = re.compile(r'(?P<name>[\w-]+)\s*' + r'\(\s*(==\s*)?(?P<ver>[^)]+)\)$') + +class DependencyFinder(object): + """ + Locate dependencies for distributions. + """ + + def __init__(self, locator=None): + """ + Initialise an instance, using the specified locator + to locate distributions. + """ + self.locator = locator or default_locator + self.scheme = get_scheme(self.locator.scheme) + + def add_distribution(self, dist): + """ + Add a distribution to the finder. This will update internal information + about who provides what. + :param dist: The distribution to add. + """ + logger.debug('adding distribution %s', dist) + name = dist.key + self.dists_by_name[name] = dist + self.dists[(name, dist.version)] = dist + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Add to provided: %s, %s, %s', name, version, dist) + self.provided.setdefault(name, set()).add((version, dist)) + + def remove_distribution(self, dist): + """ + Remove a distribution from the finder. This will update internal + information about who provides what. + :param dist: The distribution to remove. + """ + logger.debug('removing distribution %s', dist) + name = dist.key + del self.dists_by_name[name] + del self.dists[(name, dist.version)] + for p in dist.provides: + name, version = parse_name_and_version(p) + logger.debug('Remove from provided: %s, %s, %s', name, version, dist) + s = self.provided[name] + s.remove((version, dist)) + if not s: + del self.provided[name] + + def get_matcher(self, reqt): + """ + Get a version matcher for a requirement. + :param reqt: The requirement + :type reqt: str + :return: A version matcher (an instance of + :class:`distlib.version.Matcher`). + """ + try: + matcher = self.scheme.matcher(reqt) + except UnsupportedVersionError: # pragma: no cover + # XXX compat-mode if cannot read the version + name = reqt.split()[0] + matcher = self.scheme.matcher(name) + return matcher + + def find_providers(self, reqt): + """ + Find the distributions which can fulfill a requirement. + + :param reqt: The requirement. + :type reqt: str + :return: A set of distribution which can fulfill the requirement. + """ + matcher = self.get_matcher(reqt) + name = matcher.key # case-insensitive + result = set() + provided = self.provided + if name in provided: + for version, provider in provided[name]: + try: + match = matcher.match(version) + except UnsupportedVersionError: + match = False + + if match: + result.add(provider) + break + return result + + def try_to_replace(self, provider, other, problems): + """ + Attempt to replace one provider with another. This is typically used + when resolving dependencies from multiple sources, e.g. A requires + (B >= 1.0) while C requires (B >= 1.1). + + For successful replacement, ``provider`` must meet all the requirements + which ``other`` fulfills. + + :param provider: The provider we are trying to replace with. + :param other: The provider we're trying to replace. + :param problems: If False is returned, this will contain what + problems prevented replacement. This is currently + a tuple of the literal string 'cantreplace', + ``provider``, ``other`` and the set of requirements + that ``provider`` couldn't fulfill. + :return: True if we can replace ``other`` with ``provider``, else + False. + """ + rlist = self.reqts[other] + unmatched = set() + for s in rlist: + matcher = self.get_matcher(s) + if not matcher.match(provider.version): + unmatched.add(s) + if unmatched: + # can't replace other with provider + problems.add(('cantreplace', provider, other, + frozenset(unmatched))) + result = False + else: + # can replace other with provider + self.remove_distribution(other) + del self.reqts[other] + for s in rlist: + self.reqts.setdefault(provider, set()).add(s) + self.add_distribution(provider) + result = True + return result + + def find(self, requirement, meta_extras=None, prereleases=False): + """ + Find a distribution and all distributions it depends on. + + :param requirement: The requirement specifying the distribution to + find, or a Distribution instance. + :param meta_extras: A list of meta extras such as :test:, :build: and + so on. + :param prereleases: If ``True``, allow pre-release versions to be + returned - otherwise, don't return prereleases + unless they're all that's available. + + Return a set of :class:`Distribution` instances and a set of + problems. + + The distributions returned should be such that they have the + :attr:`required` attribute set to ``True`` if they were + from the ``requirement`` passed to ``find()``, and they have the + :attr:`build_time_dependency` attribute set to ``True`` unless they + are post-installation dependencies of the ``requirement``. + + The problems should be a tuple consisting of the string + ``'unsatisfied'`` and the requirement which couldn't be satisfied + by any distribution known to the locator. + """ + + self.provided = {} + self.dists = {} + self.dists_by_name = {} + self.reqts = {} + + meta_extras = set(meta_extras or []) + if ':*:' in meta_extras: + meta_extras.remove(':*:') + # :meta: and :run: are implicitly included + meta_extras |= set([':test:', ':build:', ':dev:']) + + if isinstance(requirement, Distribution): + dist = odist = requirement + logger.debug('passed %s as requirement', odist) + else: + dist = odist = self.locator.locate(requirement, + prereleases=prereleases) + if dist is None: + raise DistlibException('Unable to locate %r' % requirement) + logger.debug('located %s', odist) + dist.requested = True + problems = set() + todo = set([dist]) + install_dists = set([odist]) + while todo: + dist = todo.pop() + name = dist.key # case-insensitive + if name not in self.dists_by_name: + self.add_distribution(dist) + else: + #import pdb; pdb.set_trace() + other = self.dists_by_name[name] + if other != dist: + self.try_to_replace(dist, other, problems) + + ireqts = dist.run_requires | dist.meta_requires + sreqts = dist.build_requires + ereqts = set() + if meta_extras and dist in install_dists: + for key in ('test', 'build', 'dev'): + e = ':%s:' % key + if e in meta_extras: + ereqts |= getattr(dist, '%s_requires' % key) + all_reqts = ireqts | sreqts | ereqts + for r in all_reqts: + providers = self.find_providers(r) + if not providers: + logger.debug('No providers found for %r', r) + provider = self.locator.locate(r, prereleases=prereleases) + # If no provider is found and we didn't consider + # prereleases, consider them now. + if provider is None and not prereleases: + provider = self.locator.locate(r, prereleases=True) + if provider is None: + logger.debug('Cannot satisfy %r', r) + problems.add(('unsatisfied', r)) + else: + n, v = provider.key, provider.version + if (n, v) not in self.dists: + todo.add(provider) + providers.add(provider) + if r in ireqts and dist in install_dists: + install_dists.add(provider) + logger.debug('Adding %s to install_dists', + provider.name_and_version) + for p in providers: + name = p.key + if name not in self.dists_by_name: + self.reqts.setdefault(p, set()).add(r) + else: + other = self.dists_by_name[name] + if other != p: + # see if other can be replaced by p + self.try_to_replace(p, other, problems) + + dists = set(self.dists.values()) + for dist in dists: + dist.build_time_dependency = dist not in install_dists + if dist.build_time_dependency: + logger.debug('%s is a build-time dependency only.', + dist.name_and_version) + logger.debug('find done for %s', odist) + return dists, problems diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py new file mode 100644 index 000000000..92688d0ce --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/manifest.py @@ -0,0 +1,393 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2013 Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Class representing the list of files in a distribution. + +Equivalent to distutils.filelist, but fixes some problems. +""" +import fnmatch +import logging +import os +import re +import sys + +from . import DistlibException +from .compat import fsdecode +from .util import convert_path + + +__all__ = ['Manifest'] + +logger = logging.getLogger(__name__) + +# a \ followed by some spaces + EOL +_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M) +_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S) + +# +# Due to the different results returned by fnmatch.translate, we need +# to do slightly different processing for Python 2.7 and 3.2 ... this needed +# to be brought in for Python 3.6 onwards. +# +_PYTHON_VERSION = sys.version_info[:2] + +class Manifest(object): + """A list of files built by on exploring the filesystem and filtered by + applying various patterns to what we find there. + """ + + def __init__(self, base=None): + """ + Initialise an instance. + + :param base: The base directory to explore under. + """ + self.base = os.path.abspath(os.path.normpath(base or os.getcwd())) + self.prefix = self.base + os.sep + self.allfiles = None + self.files = set() + + # + # Public API + # + + def findall(self): + """Find all files under the base and set ``allfiles`` to the absolute + pathnames of files found. + """ + from stat import S_ISREG, S_ISDIR, S_ISLNK + + self.allfiles = allfiles = [] + root = self.base + stack = [root] + pop = stack.pop + push = stack.append + + while stack: + root = pop() + names = os.listdir(root) + + for name in names: + fullname = os.path.join(root, name) + + # Avoid excess stat calls -- just one will do, thank you! + stat = os.stat(fullname) + mode = stat.st_mode + if S_ISREG(mode): + allfiles.append(fsdecode(fullname)) + elif S_ISDIR(mode) and not S_ISLNK(mode): + push(fullname) + + def add(self, item): + """ + Add a file to the manifest. + + :param item: The pathname to add. This can be relative to the base. + """ + if not item.startswith(self.prefix): + item = os.path.join(self.base, item) + self.files.add(os.path.normpath(item)) + + def add_many(self, items): + """ + Add a list of files to the manifest. + + :param items: The pathnames to add. These can be relative to the base. + """ + for item in items: + self.add(item) + + def sorted(self, wantdirs=False): + """ + Return sorted files in directory order + """ + + def add_dir(dirs, d): + dirs.add(d) + logger.debug('add_dir added %s', d) + if d != self.base: + parent, _ = os.path.split(d) + assert parent not in ('', '/') + add_dir(dirs, parent) + + result = set(self.files) # make a copy! + if wantdirs: + dirs = set() + for f in result: + add_dir(dirs, os.path.dirname(f)) + result |= dirs + return [os.path.join(*path_tuple) for path_tuple in + sorted(os.path.split(path) for path in result)] + + def clear(self): + """Clear all collected files.""" + self.files = set() + self.allfiles = [] + + def process_directive(self, directive): + """ + Process a directive which either adds some files from ``allfiles`` to + ``files``, or removes some files from ``files``. + + :param directive: The directive to process. This should be in a format + compatible with distutils ``MANIFEST.in`` files: + + http://docs.python.org/distutils/sourcedist.html#commands + """ + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dirpattern). + action, patterns, thedir, dirpattern = self._parse_directive(directive) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=True): + logger.warning('no files found matching %r', pattern) + + elif action == 'exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=True) + #if not found: + # logger.warning('no previously-included files ' + # 'found matching %r', pattern) + + elif action == 'global-include': + for pattern in patterns: + if not self._include_pattern(pattern, anchor=False): + logger.warning('no files found matching %r ' + 'anywhere in distribution', pattern) + + elif action == 'global-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, anchor=False) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found anywhere in ' + # 'distribution', pattern) + + elif action == 'recursive-include': + for pattern in patterns: + if not self._include_pattern(pattern, prefix=thedir): + logger.warning('no files found matching %r ' + 'under directory %r', pattern, thedir) + + elif action == 'recursive-exclude': + for pattern in patterns: + found = self._exclude_pattern(pattern, prefix=thedir) + #if not found: + # logger.warning('no previously-included files ' + # 'matching %r found under directory %r', + # pattern, thedir) + + elif action == 'graft': + if not self._include_pattern(None, prefix=dirpattern): + logger.warning('no directories found matching %r', + dirpattern) + + elif action == 'prune': + if not self._exclude_pattern(None, prefix=dirpattern): + logger.warning('no previously-included directories found ' + 'matching %r', dirpattern) + else: # pragma: no cover + # This should never happen, as it should be caught in + # _parse_template_line + raise DistlibException( + 'invalid action %r' % action) + + # + # Private API + # + + def _parse_directive(self, directive): + """ + Validate a directive. + :param directive: The directive to validate. + :return: A tuple of action, patterns, thedir, dir_patterns + """ + words = directive.split() + if len(words) == 1 and words[0] not in ('include', 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', 'prune'): + # no action given, let's use the default 'include' + words.insert(0, 'include') + + action = words[0] + patterns = thedir = dir_pattern = None + + if action in ('include', 'exclude', + 'global-include', 'global-exclude'): + if len(words) < 2: + raise DistlibException( + '%r expects <pattern1> <pattern2> ...' % action) + + patterns = [convert_path(word) for word in words[1:]] + + elif action in ('recursive-include', 'recursive-exclude'): + if len(words) < 3: + raise DistlibException( + '%r expects <dir> <pattern1> <pattern2> ...' % action) + + thedir = convert_path(words[1]) + patterns = [convert_path(word) for word in words[2:]] + + elif action in ('graft', 'prune'): + if len(words) != 2: + raise DistlibException( + '%r expects a single <dir_pattern>' % action) + + dir_pattern = convert_path(words[1]) + + else: + raise DistlibException('unknown action %r' % action) + + return action, patterns, thedir, dir_pattern + + def _include_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Select strings (presumably filenames) from 'self.files' that + match 'pattern', a Unix-style wildcard (glob) pattern. + + Patterns are not quite the same as implemented by the 'fnmatch' + module: '*' and '?' match non-special characters, where "special" + is platform-dependent: slash on Unix; colon, slash, and backslash on + DOS/Windows; and colon on Mac OS. + + If 'anchor' is true (the default), then the pattern match is more + stringent: "*.py" will match "foo.py" but not "foo/bar.py". If + 'anchor' is false, both of these will match. + + If 'prefix' is supplied, then only filenames starting with 'prefix' + (itself a pattern) and ending with 'pattern', with anything in between + them, will match. 'anchor' is ignored in this case. + + If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and + 'pattern' is assumed to be either a string containing a regex or a + regex object -- no translation is done, the regex is just compiled + and used as-is. + + Selected strings will be added to self.files. + + Return True if files are found. + """ + # XXX docstring lying about what the special chars are? + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + + # delayed loading of allfiles list + if self.allfiles is None: + self.findall() + + for name in self.allfiles: + if pattern_re.search(name): + self.files.add(name) + found = True + return found + + def _exclude_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Remove strings (presumably filenames) from 'files' that match + 'pattern'. + + Other parameters are the same as for 'include_pattern()', above. + The list 'self.files' is modified in place. Return True if files are + found. + + This API is public to allow e.g. exclusion of SCM subdirs, e.g. when + packaging source distributions + """ + found = False + pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex) + for f in list(self.files): + if pattern_re.search(f): + self.files.remove(f) + found = True + return found + + def _translate_pattern(self, pattern, anchor=True, prefix=None, + is_regex=False): + """Translate a shell-like wildcard pattern to a compiled regular + expression. + + Return the compiled regex. If 'is_regex' true, + then 'pattern' is directly compiled to a regex (if it's a string) + or just returned as-is (assumes it's a regex object). + """ + if is_regex: + if isinstance(pattern, str): + return re.compile(pattern) + else: + return pattern + + if _PYTHON_VERSION > (3, 2): + # ditch start and end characters + start, _, end = self._glob_to_re('_').partition('_') + + if pattern: + pattern_re = self._glob_to_re(pattern) + if _PYTHON_VERSION > (3, 2): + assert pattern_re.startswith(start) and pattern_re.endswith(end) + else: + pattern_re = '' + + base = re.escape(os.path.join(self.base, '')) + if prefix is not None: + # ditch end of pattern character + if _PYTHON_VERSION <= (3, 2): + empty_pattern = self._glob_to_re('') + prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)] + else: + prefix_re = self._glob_to_re(prefix) + assert prefix_re.startswith(start) and prefix_re.endswith(end) + prefix_re = prefix_re[len(start): len(prefix_re) - len(end)] + sep = os.sep + if os.sep == '\\': + sep = r'\\' + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + sep.join((prefix_re, + '.*' + pattern_re)) + else: + pattern_re = pattern_re[len(start): len(pattern_re) - len(end)] + pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep, + pattern_re, end) + else: # no prefix -- respect anchor flag + if anchor: + if _PYTHON_VERSION <= (3, 2): + pattern_re = '^' + base + pattern_re + else: + pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):]) + + return re.compile(pattern_re) + + def _glob_to_re(self, pattern): + """Translate a shell-like glob pattern to a regular expression. + + Return a string containing the regex. Differs from + 'fnmatch.translate()' in that '*' does not match "special characters" + (which are platform-specific). + """ + pattern_re = fnmatch.translate(pattern) + + # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which + # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, + # and by extension they shouldn't match such "special characters" under + # any OS. So change all non-escaped dots in the RE to match any + # character except the special characters (currently: just os.sep). + sep = os.sep + if os.sep == '\\': + # we're using a regex to manipulate a regex, so we need + # to escape the backslash twice + sep = r'\\\\' + escaped = r'\1[^%s]' % sep + pattern_re = re.sub(r'((?<!\\)(\\\\)*)\.', escaped, pattern_re) + return pattern_re diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py new file mode 100644 index 000000000..82fcfb8f1 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/markers.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Parser for the environment markers micro-language defined in PEP 508. +""" + +# Note: In PEP 345, the micro-language was Python compatible, so the ast +# module could be used to parse it. However, PEP 508 introduced operators such +# as ~= and === which aren't in Python, necessitating a different approach. + +import os +import sys +import platform +import re + +from .compat import python_implementation, urlparse, string_types +from .util import in_venv, parse_marker + +__all__ = ['interpret'] + +def _is_literal(o): + if not isinstance(o, string_types) or not o: + return False + return o[0] in '\'"' + +class Evaluator(object): + """ + This class is used to evaluate marker expessions. + """ + + operations = { + '==': lambda x, y: x == y, + '===': lambda x, y: x == y, + '~=': lambda x, y: x == y or x > y, + '!=': lambda x, y: x != y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, + 'and': lambda x, y: x and y, + 'or': lambda x, y: x or y, + 'in': lambda x, y: x in y, + 'not in': lambda x, y: x not in y, + } + + def evaluate(self, expr, context): + """ + Evaluate a marker expression returned by the :func:`parse_requirement` + function in the specified context. + """ + if isinstance(expr, string_types): + if expr[0] in '\'"': + result = expr[1:-1] + else: + if expr not in context: + raise SyntaxError('unknown variable: %s' % expr) + result = context[expr] + else: + assert isinstance(expr, dict) + op = expr['op'] + if op not in self.operations: + raise NotImplementedError('op not implemented: %s' % op) + elhs = expr['lhs'] + erhs = expr['rhs'] + if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): + raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + + lhs = self.evaluate(elhs, context) + rhs = self.evaluate(erhs, context) + result = self.operations[op](lhs, rhs) + return result + +def default_context(): + def format_full_version(info): + version = '%s.%s.%s' % (info.major, info.minor, info.micro) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + if hasattr(sys, 'implementation'): + implementation_version = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + implementation_version = '0' + implementation_name = '' + + result = { + 'implementation_name': implementation_name, + 'implementation_version': implementation_version, + 'os_name': os.name, + 'platform_machine': platform.machine(), + 'platform_python_implementation': platform.python_implementation(), + 'platform_release': platform.release(), + 'platform_system': platform.system(), + 'platform_version': platform.version(), + 'platform_in_venv': str(in_venv()), + 'python_full_version': platform.python_version(), + 'python_version': platform.python_version()[:3], + 'sys_platform': sys.platform, + } + return result + +DEFAULT_CONTEXT = default_context() +del default_context + +evaluator = Evaluator() + +def interpret(marker, execution_context=None): + """ + Interpret a marker and return a result depending on environment. + + :param marker: The marker to interpret. + :type marker: str + :param execution_context: The context used for name lookup. + :type execution_context: mapping + """ + try: + expr, rest = parse_marker(marker) + except Exception as e: + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + if rest and rest[0] != '#': + raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + context = dict(DEFAULT_CONTEXT) + if execution_context: + context.update(execution_context) + return evaluator.evaluate(expr, context) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py new file mode 100644 index 000000000..10a1fee35 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1091 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +"""Implementation of the Metadata for Python packages PEPs. + +Supports all metadata formats (1.0, 1.1, 1.2, and 2.0 experimental). +""" +from __future__ import unicode_literals + +import codecs +from email import message_from_file +import json +import logging +import re + + +from . import DistlibException, __version__ +from .compat import StringIO, string_types, text_type +from .markers import interpret +from .util import extract_by_key, get_extras +from .version import get_scheme, PEP440_VERSION_RE + +logger = logging.getLogger(__name__) + + +class MetadataMissingError(DistlibException): + """A required metadata is missing""" + + +class MetadataConflictError(DistlibException): + """Attempt to read or write metadata fields that are conflictual.""" + + +class MetadataUnrecognizedVersionError(DistlibException): + """Unknown metadata version number.""" + + +class MetadataInvalidError(DistlibException): + """A metadata value is invalid""" + +# public API of this module +__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION'] + +# Encoding used for the PKG-INFO files +PKG_INFO_ENCODING = 'utf-8' + +# preferred version. Hopefully will be changed +# to 1.2 once PEP 345 is supported everywhere +PKG_INFO_PREFERRED_VERSION = '1.1' + +_LINE_PREFIX_1_2 = re.compile('\n \\|') +_LINE_PREFIX_PRE_1_2 = re.compile('\n ') +_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License') + +_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'License', 'Classifier', 'Download-URL', 'Obsoletes', + 'Provides', 'Requires') + +_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier', + 'Download-URL') + +_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External') + +_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python', + 'Obsoletes-Dist', 'Requires-External', 'Maintainer', + 'Maintainer-email', 'Project-URL') + +_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform', + 'Supported-Platform', 'Summary', 'Description', + 'Keywords', 'Home-page', 'Author', 'Author-email', + 'Maintainer', 'Maintainer-email', 'License', + 'Classifier', 'Download-URL', 'Obsoletes-Dist', + 'Project-URL', 'Provides-Dist', 'Requires-Dist', + 'Requires-Python', 'Requires-External', 'Private-Version', + 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension', + 'Provides-Extra') + +_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By', + 'Setup-Requires-Dist', 'Extension') + +_566_FIELDS = _426_FIELDS + ('Description-Content-Type',) + +_566_MARKERS = ('Description-Content-Type',) + +_ALL_FIELDS = set() +_ALL_FIELDS.update(_241_FIELDS) +_ALL_FIELDS.update(_314_FIELDS) +_ALL_FIELDS.update(_345_FIELDS) +_ALL_FIELDS.update(_426_FIELDS) +_ALL_FIELDS.update(_566_FIELDS) + +EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''') + + +def _version2fieldlist(version): + if version == '1.0': + return _241_FIELDS + elif version == '1.1': + return _314_FIELDS + elif version == '1.2': + return _345_FIELDS + elif version in ('1.3', '2.1'): + return _345_FIELDS + _566_FIELDS + elif version == '2.0': + return _426_FIELDS + raise MetadataUnrecognizedVersionError(version) + + +def _best_version(fields): + """Detect the best version depending on the fields used.""" + def _has_marker(keys, markers): + for marker in markers: + if marker in keys: + return True + return False + + keys = [] + for key, value in fields.items(): + if value in ([], 'UNKNOWN', None): + continue + keys.append(key) + + possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.0', '2.1'] + + # first let's try to see if a field is not part of one of the version + for key in keys: + if key not in _241_FIELDS and '1.0' in possible_versions: + possible_versions.remove('1.0') + logger.debug('Removed 1.0 due to %s', key) + if key not in _314_FIELDS and '1.1' in possible_versions: + possible_versions.remove('1.1') + logger.debug('Removed 1.1 due to %s', key) + if key not in _345_FIELDS and '1.2' in possible_versions: + possible_versions.remove('1.2') + logger.debug('Removed 1.2 due to %s', key) + if key not in _566_FIELDS and '1.3' in possible_versions: + possible_versions.remove('1.3') + logger.debug('Removed 1.3 due to %s', key) + if key not in _566_FIELDS and '2.1' in possible_versions: + if key != 'Description': # In 2.1, description allowed after headers + possible_versions.remove('2.1') + logger.debug('Removed 2.1 due to %s', key) + if key not in _426_FIELDS and '2.0' in possible_versions: + possible_versions.remove('2.0') + logger.debug('Removed 2.0 due to %s', key) + + # possible_version contains qualified versions + if len(possible_versions) == 1: + return possible_versions[0] # found ! + elif len(possible_versions) == 0: + logger.debug('Out of options - unknown metadata set: %s', fields) + raise MetadataConflictError('Unknown metadata set') + + # let's see if one unique marker is found + is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS) + is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS) + is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS) + is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS) + if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_0) > 1: + raise MetadataConflictError('You used incompatible 1.1/1.2/2.0/2.1 fields') + + # we have the choice, 1.0, or 1.2, or 2.0 + # - 1.0 has a broken Summary field but works with all tools + # - 1.1 is to avoid + # - 1.2 fixes Summary but has little adoption + # - 2.0 adds more features and is very new + if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_0: + # we couldn't find any specific marker + if PKG_INFO_PREFERRED_VERSION in possible_versions: + return PKG_INFO_PREFERRED_VERSION + if is_1_1: + return '1.1' + if is_1_2: + return '1.2' + if is_2_1: + return '2.1' + + return '2.0' + +_ATTR2FIELD = { + 'metadata_version': 'Metadata-Version', + 'name': 'Name', + 'version': 'Version', + 'platform': 'Platform', + 'supported_platform': 'Supported-Platform', + 'summary': 'Summary', + 'description': 'Description', + 'keywords': 'Keywords', + 'home_page': 'Home-page', + 'author': 'Author', + 'author_email': 'Author-email', + 'maintainer': 'Maintainer', + 'maintainer_email': 'Maintainer-email', + 'license': 'License', + 'classifier': 'Classifier', + 'download_url': 'Download-URL', + 'obsoletes_dist': 'Obsoletes-Dist', + 'provides_dist': 'Provides-Dist', + 'requires_dist': 'Requires-Dist', + 'setup_requires_dist': 'Setup-Requires-Dist', + 'requires_python': 'Requires-Python', + 'requires_external': 'Requires-External', + 'requires': 'Requires', + 'provides': 'Provides', + 'obsoletes': 'Obsoletes', + 'project_url': 'Project-URL', + 'private_version': 'Private-Version', + 'obsoleted_by': 'Obsoleted-By', + 'extension': 'Extension', + 'provides_extra': 'Provides-Extra', +} + +_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist') +_VERSIONS_FIELDS = ('Requires-Python',) +_VERSION_FIELDS = ('Version',) +_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes', + 'Requires', 'Provides', 'Obsoletes-Dist', + 'Provides-Dist', 'Requires-Dist', 'Requires-External', + 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist', + 'Provides-Extra', 'Extension') +_LISTTUPLEFIELDS = ('Project-URL',) + +_ELEMENTSFIELD = ('Keywords',) + +_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description') + +_MISSING = object() + +_FILESAFE = re.compile('[^A-Za-z0-9.]+') + + +def _get_name_and_version(name, version, for_filename=False): + """Return the distribution name with version. + + If for_filename is true, return a filename-escaped form.""" + if for_filename: + # For both name and version any runs of non-alphanumeric or '.' + # characters are replaced with a single '-'. Additionally any + # spaces in the version string become '.' + name = _FILESAFE.sub('-', name) + version = _FILESAFE.sub('-', version.replace(' ', '.')) + return '%s-%s' % (name, version) + + +class LegacyMetadata(object): + """The legacy metadata of a release. + + Supports versions 1.0, 1.1 and 1.2 (auto-detected). You can + instantiate the class with one of these arguments (or none): + - *path*, the path to a metadata file + - *fileobj* give a file-like object with metadata as content + - *mapping* is a dict-like object + - *scheme* is a version scheme name + """ + # TODO document the mapping API and UNKNOWN default key + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._fields = {} + self.requires_files = [] + self._dependencies = None + self.scheme = scheme + if path is not None: + self.read(path) + elif fileobj is not None: + self.read_file(fileobj) + elif mapping is not None: + self.update(mapping) + self.set_metadata_version() + + def set_metadata_version(self): + self._fields['Metadata-Version'] = _best_version(self._fields) + + def _write_field(self, fileobj, name, value): + fileobj.write('%s: %s\n' % (name, value)) + + def __getitem__(self, name): + return self.get(name) + + def __setitem__(self, name, value): + return self.set(name, value) + + def __delitem__(self, name): + field_name = self._convert_name(name) + try: + del self._fields[field_name] + except KeyError: + raise KeyError(name) + + def __contains__(self, name): + return (name in self._fields or + self._convert_name(name) in self._fields) + + def _convert_name(self, name): + if name in _ALL_FIELDS: + return name + name = name.replace('-', '_').lower() + return _ATTR2FIELD.get(name, name) + + def _default_value(self, name): + if name in _LISTFIELDS or name in _ELEMENTSFIELD: + return [] + return 'UNKNOWN' + + def _remove_line_prefix(self, value): + if self.metadata_version in ('1.0', '1.1'): + return _LINE_PREFIX_PRE_1_2.sub('\n', value) + else: + return _LINE_PREFIX_1_2.sub('\n', value) + + def __getattr__(self, name): + if name in _ATTR2FIELD: + return self[name] + raise AttributeError(name) + + # + # Public API + # + +# dependencies = property(_get_dependencies, _set_dependencies) + + def get_fullname(self, filesafe=False): + """Return the distribution name with version. + + If filesafe is true, return a filename-escaped form.""" + return _get_name_and_version(self['Name'], self['Version'], filesafe) + + def is_field(self, name): + """return True if name is a valid metadata key""" + name = self._convert_name(name) + return name in _ALL_FIELDS + + def is_multi_field(self, name): + name = self._convert_name(name) + return name in _LISTFIELDS + + def read(self, filepath): + """Read the metadata values from a file path.""" + fp = codecs.open(filepath, 'r', encoding='utf-8') + try: + self.read_file(fp) + finally: + fp.close() + + def read_file(self, fileob): + """Read the metadata values from a file object.""" + msg = message_from_file(fileob) + self._fields['Metadata-Version'] = msg['metadata-version'] + + # When reading, get all the fields we can + for field in _ALL_FIELDS: + if field not in msg: + continue + if field in _LISTFIELDS: + # we can have multiple lines + values = msg.get_all(field) + if field in _LISTTUPLEFIELDS and values is not None: + values = [tuple(value.split(',')) for value in values] + self.set(field, values) + else: + # single line + value = msg[field] + if value is not None and value != 'UNKNOWN': + self.set(field, value) + logger.debug('Attempting to set metadata for %s', self) + self.set_metadata_version() + + def write(self, filepath, skip_unknown=False): + """Write the metadata fields to filepath.""" + fp = codecs.open(filepath, 'w', encoding='utf-8') + try: + self.write_file(fp, skip_unknown) + finally: + fp.close() + + def write_file(self, fileobject, skip_unknown=False): + """Write the PKG-INFO format data to a file object.""" + self.set_metadata_version() + + for field in _version2fieldlist(self['Metadata-Version']): + values = self.get(field) + if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']): + continue + if field in _ELEMENTSFIELD: + self._write_field(fileobject, field, ','.join(values)) + continue + if field not in _LISTFIELDS: + if field == 'Description': + if self.metadata_version in ('1.0', '1.1'): + values = values.replace('\n', '\n ') + else: + values = values.replace('\n', '\n |') + values = [values] + + if field in _LISTTUPLEFIELDS: + values = [','.join(value) for value in values] + + for value in values: + self._write_field(fileobject, field, value) + + def update(self, other=None, **kwargs): + """Set metadata values from the given iterable `other` and kwargs. + + Behavior is like `dict.update`: If `other` has a ``keys`` method, + they are looped over and ``self[key]`` is assigned ``other[key]``. + Else, ``other`` is an iterable of ``(key, value)`` iterables. + + Keys that don't match a metadata field or that have an empty value are + dropped. + """ + def _set(key, value): + if key in _ATTR2FIELD and value: + self.set(self._convert_name(key), value) + + if not other: + # other is None or empty container + pass + elif hasattr(other, 'keys'): + for k in other.keys(): + _set(k, other[k]) + else: + for k, v in other: + _set(k, v) + + if kwargs: + for k, v in kwargs.items(): + _set(k, v) + + def set(self, name, value): + """Control then set a metadata field.""" + name = self._convert_name(name) + + if ((name in _ELEMENTSFIELD or name == 'Platform') and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [v.strip() for v in value.split(',')] + else: + value = [] + elif (name in _LISTFIELDS and + not isinstance(value, (list, tuple))): + if isinstance(value, string_types): + value = [value] + else: + value = [] + + if logger.isEnabledFor(logging.WARNING): + project_name = self['Name'] + + scheme = get_scheme(self.scheme) + if name in _PREDICATE_FIELDS and value is not None: + for v in value: + # check that the values are valid + if not scheme.is_valid_matcher(v.split(';')[0]): + logger.warning( + "'%s': '%s' is not valid (field '%s')", + project_name, v, name) + # FIXME this rejects UNKNOWN, is that right? + elif name in _VERSIONS_FIELDS and value is not None: + if not scheme.is_valid_constraint_list(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + elif name in _VERSION_FIELDS and value is not None: + if not scheme.is_valid_version(value): + logger.warning("'%s': '%s' is not a valid version (field '%s')", + project_name, value, name) + + if name in _UNICODEFIELDS: + if name == 'Description': + value = self._remove_line_prefix(value) + + self._fields[name] = value + + def get(self, name, default=_MISSING): + """Get a metadata field.""" + name = self._convert_name(name) + if name not in self._fields: + if default is _MISSING: + default = self._default_value(name) + return default + if name in _UNICODEFIELDS: + value = self._fields[name] + return value + elif name in _LISTFIELDS: + value = self._fields[name] + if value is None: + return [] + res = [] + for val in value: + if name not in _LISTTUPLEFIELDS: + res.append(val) + else: + # That's for Project-URL + res.append((val[0], val[1])) + return res + + elif name in _ELEMENTSFIELD: + value = self._fields[name] + if isinstance(value, string_types): + return value.split(',') + return self._fields[name] + + def check(self, strict=False): + """Check if the metadata is compliant. If strict is True then raise if + no Name or Version are provided""" + self.set_metadata_version() + + # XXX should check the versions (if the file was loaded) + missing, warnings = [], [] + + for attr in ('Name', 'Version'): # required by PEP 345 + if attr not in self: + missing.append(attr) + + if strict and missing != []: + msg = 'missing required metadata: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + + for attr in ('Home-page', 'Author'): + if attr not in self: + missing.append(attr) + + # checking metadata 1.2 (XXX needs to check 1.1, 1.0) + if self['Metadata-Version'] != '1.2': + return missing, warnings + + scheme = get_scheme(self.scheme) + + def are_valid_constraints(value): + for v in value: + if not scheme.is_valid_matcher(v.split(';')[0]): + return False + return True + + for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints), + (_VERSIONS_FIELDS, + scheme.is_valid_constraint_list), + (_VERSION_FIELDS, + scheme.is_valid_version)): + for field in fields: + value = self.get(field, None) + if value is not None and not controller(value): + warnings.append("Wrong value for '%s': %s" % (field, value)) + + return missing, warnings + + def todict(self, skip_missing=False): + """Return fields as a dict. + + Field names will be converted to use the underscore-lowercase style + instead of hyphen-mixed case (i.e. home_page instead of Home-page). + """ + self.set_metadata_version() + + mapping_1_0 = ( + ('metadata_version', 'Metadata-Version'), + ('name', 'Name'), + ('version', 'Version'), + ('summary', 'Summary'), + ('home_page', 'Home-page'), + ('author', 'Author'), + ('author_email', 'Author-email'), + ('license', 'License'), + ('description', 'Description'), + ('keywords', 'Keywords'), + ('platform', 'Platform'), + ('classifiers', 'Classifier'), + ('download_url', 'Download-URL'), + ) + + data = {} + for key, field_name in mapping_1_0: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + if self['Metadata-Version'] == '1.2': + mapping_1_2 = ( + ('requires_dist', 'Requires-Dist'), + ('requires_python', 'Requires-Python'), + ('requires_external', 'Requires-External'), + ('provides_dist', 'Provides-Dist'), + ('obsoletes_dist', 'Obsoletes-Dist'), + ('project_url', 'Project-URL'), + ('maintainer', 'Maintainer'), + ('maintainer_email', 'Maintainer-email'), + ) + for key, field_name in mapping_1_2: + if not skip_missing or field_name in self._fields: + if key != 'project_url': + data[key] = self[field_name] + else: + data[key] = [','.join(u) for u in self[field_name]] + + elif self['Metadata-Version'] == '1.1': + mapping_1_1 = ( + ('provides', 'Provides'), + ('requires', 'Requires'), + ('obsoletes', 'Obsoletes'), + ) + for key, field_name in mapping_1_1: + if not skip_missing or field_name in self._fields: + data[key] = self[field_name] + + return data + + def add_requirements(self, requirements): + if self['Metadata-Version'] == '1.1': + # we can't have 1.1 metadata *and* Setuptools requires + for field in ('Obsoletes', 'Requires', 'Provides'): + if field in self: + del self[field] + self['Requires-Dist'] += requirements + + # Mapping API + # TODO could add iter* variants + + def keys(self): + return list(_version2fieldlist(self['Metadata-Version'])) + + def __iter__(self): + for key in self.keys(): + yield key + + def values(self): + return [self[key] for key in self.keys()] + + def items(self): + return [(key, self[key]) for key in self.keys()] + + def __repr__(self): + return '<%s %s %s>' % (self.__class__.__name__, self.name, + self.version) + + +METADATA_FILENAME = 'pydist.json' +WHEEL_METADATA_FILENAME = 'metadata.json' + + +class Metadata(object): + """ + The metadata of a release. This implementation uses 2.0 (JSON) + metadata where possible. If not possible, it wraps a LegacyMetadata + instance which handles the key-value metadata format. + """ + + METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$') + + NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I) + + VERSION_MATCHER = PEP440_VERSION_RE + + SUMMARY_MATCHER = re.compile('.{1,2047}') + + METADATA_VERSION = '2.0' + + GENERATOR = 'distlib (%s)' % __version__ + + MANDATORY_KEYS = { + 'name': (), + 'version': (), + 'summary': ('legacy',), + } + + INDEX_KEYS = ('name version license summary description author ' + 'author_email keywords platform home_page classifiers ' + 'download_url') + + DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires ' + 'dev_requires provides meta_requires obsoleted_by ' + 'supports_environments') + + SYNTAX_VALIDATORS = { + 'metadata_version': (METADATA_VERSION_MATCHER, ()), + 'name': (NAME_MATCHER, ('legacy',)), + 'version': (VERSION_MATCHER, ('legacy',)), + 'summary': (SUMMARY_MATCHER, ('legacy',)), + } + + __slots__ = ('_legacy', '_data', 'scheme') + + def __init__(self, path=None, fileobj=None, mapping=None, + scheme='default'): + if [path, fileobj, mapping].count(None) < 2: + raise TypeError('path, fileobj and mapping are exclusive') + self._legacy = None + self._data = None + self.scheme = scheme + #import pdb; pdb.set_trace() + if mapping is not None: + try: + self._validate_mapping(mapping, scheme) + self._data = mapping + except MetadataUnrecognizedVersionError: + self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme) + self.validate() + else: + data = None + if path: + with open(path, 'rb') as f: + data = f.read() + elif fileobj: + data = fileobj.read() + if data is None: + # Initialised with no args - to be added + self._data = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + else: + if not isinstance(data, text_type): + data = data.decode('utf-8') + try: + self._data = json.loads(data) + self._validate_mapping(self._data, scheme) + except ValueError: + # Note: MetadataUnrecognizedVersionError does not + # inherit from ValueError (it's a DistlibException, + # which should not inherit from ValueError). + # The ValueError comes from the json.load - if that + # succeeds and we get a validation error, we want + # that to propagate + self._legacy = LegacyMetadata(fileobj=StringIO(data), + scheme=scheme) + self.validate() + + common_keys = set(('name', 'version', 'license', 'keywords', 'summary')) + + none_list = (None, list) + none_dict = (None, dict) + + mapped_keys = { + 'run_requires': ('Requires-Dist', list), + 'build_requires': ('Setup-Requires-Dist', list), + 'dev_requires': none_list, + 'test_requires': none_list, + 'meta_requires': none_list, + 'extras': ('Provides-Extra', list), + 'modules': none_list, + 'namespaces': none_list, + 'exports': none_dict, + 'commands': none_dict, + 'classifiers': ('Classifier', list), + 'source_url': ('Download-URL', None), + 'metadata_version': ('Metadata-Version', None), + } + + del none_list, none_dict + + def __getattribute__(self, key): + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, maker = mapped[key] + if self._legacy: + if lk is None: + result = None if maker is None else maker() + else: + result = self._legacy.get(lk) + else: + value = None if maker is None else maker() + if key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + result = self._data.get(key, value) + else: + # special cases for PEP 459 + sentinel = object() + result = sentinel + d = self._data.get('extensions') + if d: + if key == 'commands': + result = d.get('python.commands', value) + elif key == 'classifiers': + d = d.get('python.details') + if d: + result = d.get(key, value) + else: + d = d.get('python.exports') + if not d: + d = self._data.get('python.exports') + if d: + result = d.get(key, value) + if result is sentinel: + result = value + elif key not in common: + result = object.__getattribute__(self, key) + elif self._legacy: + result = self._legacy.get(key) + else: + result = self._data.get(key) + return result + + def _validate_value(self, key, value, scheme=None): + if key in self.SYNTAX_VALIDATORS: + pattern, exclusions = self.SYNTAX_VALIDATORS[key] + if (scheme or self.scheme) not in exclusions: + m = pattern.match(value) + if not m: + raise MetadataInvalidError("'%s' is an invalid value for " + "the '%s' property" % (value, + key)) + + def __setattr__(self, key, value): + self._validate_value(key, value) + common = object.__getattribute__(self, 'common_keys') + mapped = object.__getattribute__(self, 'mapped_keys') + if key in mapped: + lk, _ = mapped[key] + if self._legacy: + if lk is None: + raise NotImplementedError + self._legacy[lk] = value + elif key not in ('commands', 'exports', 'modules', 'namespaces', + 'classifiers'): + self._data[key] = value + else: + # special cases for PEP 459 + d = self._data.setdefault('extensions', {}) + if key == 'commands': + d['python.commands'] = value + elif key == 'classifiers': + d = d.setdefault('python.details', {}) + d[key] = value + else: + d = d.setdefault('python.exports', {}) + d[key] = value + elif key not in common: + object.__setattr__(self, key, value) + else: + if key == 'keywords': + if isinstance(value, string_types): + value = value.strip() + if value: + value = value.split() + else: + value = [] + if self._legacy: + self._legacy[key] = value + else: + self._data[key] = value + + @property + def name_and_version(self): + return _get_name_and_version(self.name, self.version, True) + + @property + def provides(self): + if self._legacy: + result = self._legacy['Provides-Dist'] + else: + result = self._data.setdefault('provides', []) + s = '%s (%s)' % (self.name, self.version) + if s not in result: + result.append(s) + return result + + @provides.setter + def provides(self, value): + if self._legacy: + self._legacy['Provides-Dist'] = value + else: + self._data['provides'] = value + + def get_requirements(self, reqts, extras=None, env=None): + """ + Base method to get dependencies, given a set of extras + to satisfy and an optional environment context. + :param reqts: A list of sometimes-wanted dependencies, + perhaps dependent on extras and environment. + :param extras: A list of optional components being requested. + :param env: An optional environment for marker evaluation. + """ + if self._legacy: + result = reqts + else: + result = [] + extras = get_extras(extras or [], self.extras) + for d in reqts: + if 'extra' not in d and 'environment' not in d: + # unconditional + include = True + else: + if 'extra' not in d: + # Not extra-dependent - only environment-dependent + include = True + else: + include = d.get('extra') in extras + if include: + # Not excluded because of extras, check environment + marker = d.get('environment') + if marker: + include = interpret(marker, env) + if include: + result.extend(d['requires']) + for key in ('build', 'dev', 'test'): + e = ':%s:' % key + if e in extras: + extras.remove(e) + # A recursive call, but it should terminate since 'test' + # has been removed from the extras + reqts = self._data.get('%s_requires' % key, []) + result.extend(self.get_requirements(reqts, extras=extras, + env=env)) + return result + + @property + def dictionary(self): + if self._legacy: + return self._from_legacy() + return self._data + + @property + def dependencies(self): + if self._legacy: + raise NotImplementedError + else: + return extract_by_key(self._data, self.DEPENDENCY_KEYS) + + @dependencies.setter + def dependencies(self, value): + if self._legacy: + raise NotImplementedError + else: + self._data.update(value) + + def _validate_mapping(self, mapping, scheme): + if mapping.get('metadata_version') != self.METADATA_VERSION: + raise MetadataUnrecognizedVersionError() + missing = [] + for key, exclusions in self.MANDATORY_KEYS.items(): + if key not in mapping: + if scheme not in exclusions: + missing.append(key) + if missing: + msg = 'Missing metadata items: %s' % ', '.join(missing) + raise MetadataMissingError(msg) + for k, v in mapping.items(): + self._validate_value(k, v, scheme) + + def validate(self): + if self._legacy: + missing, warnings = self._legacy.check(True) + if missing or warnings: + logger.warning('Metadata: missing: %s, warnings: %s', + missing, warnings) + else: + self._validate_mapping(self._data, self.scheme) + + def todict(self): + if self._legacy: + return self._legacy.todict(True) + else: + result = extract_by_key(self._data, self.INDEX_KEYS) + return result + + def _from_legacy(self): + assert self._legacy and not self._data + result = { + 'metadata_version': self.METADATA_VERSION, + 'generator': self.GENERATOR, + } + lmd = self._legacy.todict(True) # skip missing ones + for k in ('name', 'version', 'license', 'summary', 'description', + 'classifier'): + if k in lmd: + if k == 'classifier': + nk = 'classifiers' + else: + nk = k + result[nk] = lmd[k] + kw = lmd.get('Keywords', []) + if kw == ['']: + kw = [] + result['keywords'] = kw + keys = (('requires_dist', 'run_requires'), + ('setup_requires_dist', 'build_requires')) + for ok, nk in keys: + if ok in lmd and lmd[ok]: + result[nk] = [{'requires': lmd[ok]}] + result['provides'] = self.provides + author = {} + maintainer = {} + return result + + LEGACY_MAPPING = { + 'name': 'Name', + 'version': 'Version', + 'license': 'License', + 'summary': 'Summary', + 'description': 'Description', + 'classifiers': 'Classifier', + } + + def _to_legacy(self): + def process_entries(entries): + reqts = set() + for e in entries: + extra = e.get('extra') + env = e.get('environment') + rlist = e['requires'] + for r in rlist: + if not env and not extra: + reqts.add(r) + else: + marker = '' + if extra: + marker = 'extra == "%s"' % extra + if env: + if marker: + marker = '(%s) and %s' % (env, marker) + else: + marker = env + reqts.add(';'.join((r, marker))) + return reqts + + assert self._data and not self._legacy + result = LegacyMetadata() + nmd = self._data + for nk, ok in self.LEGACY_MAPPING.items(): + if nk in nmd: + result[ok] = nmd[nk] + r1 = process_entries(self.run_requires + self.meta_requires) + r2 = process_entries(self.build_requires + self.dev_requires) + if self.extras: + result['Provides-Extra'] = sorted(self.extras) + result['Requires-Dist'] = sorted(r1) + result['Setup-Requires-Dist'] = sorted(r2) + # TODO: other fields such as contacts + return result + + def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True): + if [path, fileobj].count(None) != 1: + raise ValueError('Exactly one of path and fileobj is needed') + self.validate() + if legacy: + if self._legacy: + legacy_md = self._legacy + else: + legacy_md = self._to_legacy() + if path: + legacy_md.write(path, skip_unknown=skip_unknown) + else: + legacy_md.write_file(fileobj, skip_unknown=skip_unknown) + else: + if self._legacy: + d = self._from_legacy() + else: + d = self._data + if fileobj: + json.dump(d, fileobj, ensure_ascii=True, indent=2, + sort_keys=True) + else: + with codecs.open(path, 'w', 'utf-8') as f: + json.dump(d, f, ensure_ascii=True, indent=2, + sort_keys=True) + + def add_requirements(self, requirements): + if self._legacy: + self._legacy.add_requirements(requirements) + else: + run_requires = self._data.setdefault('run_requires', []) + always = None + for entry in run_requires: + if 'environment' not in entry and 'extra' not in entry: + always = entry + break + if always is None: + always = { 'requires': requirements } + run_requires.insert(0, always) + else: + rset = set(always['requires']) | set(requirements) + always['requires'] = sorted(rset) + + def __repr__(self): + name = self.name or '(no name)' + version = self.version or 'no version' + return '<%s %s %s (%s)>' % (self.__class__.__name__, + self.metadata_version, name, version) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py new file mode 100644 index 000000000..cd618a6e9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/resources.py @@ -0,0 +1,355 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import bisect +import io +import logging +import os +import pkgutil +import shutil +import sys +import types +import zipimport + +from . import DistlibException +from .util import cached_property, get_cache_base, path_to_cache_dir, Cache + +logger = logging.getLogger(__name__) + + +cache = None # created when needed + + +class ResourceCache(Cache): + def __init__(self, base=None): + if base is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('resource-cache')) + super(ResourceCache, self).__init__(base) + + def is_stale(self, resource, path): + """ + Is the cache stale for the given resource? + + :param resource: The :class:`Resource` being cached. + :param path: The path of the resource in the cache. + :return: True if the cache is stale. + """ + # Cache invalidation is a hard problem :-) + return True + + def get(self, resource): + """ + Get a resource into the cache, + + :param resource: A :class:`Resource` instance. + :return: The pathname of the resource in the cache. + """ + prefix, path = resource.finder.get_cache_info(resource) + if prefix is None: + result = path + else: + result = os.path.join(self.base, self.prefix_to_dir(prefix), path) + dirname = os.path.dirname(result) + if not os.path.isdir(dirname): + os.makedirs(dirname) + if not os.path.exists(result): + stale = True + else: + stale = self.is_stale(resource, path) + if stale: + # write the bytes of the resource to the cache location + with open(result, 'wb') as f: + f.write(resource.bytes) + return result + + +class ResourceBase(object): + def __init__(self, finder, name): + self.finder = finder + self.name = name + + +class Resource(ResourceBase): + """ + A class representing an in-package resource, such as a data file. This is + not normally instantiated by user code, but rather by a + :class:`ResourceFinder` which manages the resource. + """ + is_container = False # Backwards compatibility + + def as_stream(self): + """ + Get the resource as a stream. + + This is not a property to make it obvious that it returns a new stream + each time. + """ + return self.finder.get_stream(self) + + @cached_property + def file_path(self): + global cache + if cache is None: + cache = ResourceCache() + return cache.get(self) + + @cached_property + def bytes(self): + return self.finder.get_bytes(self) + + @cached_property + def size(self): + return self.finder.get_size(self) + + +class ResourceContainer(ResourceBase): + is_container = True # Backwards compatibility + + @cached_property + def resources(self): + return self.finder.get_resources(self) + + +class ResourceFinder(object): + """ + Resource finder for file system resources. + """ + + if sys.platform.startswith('java'): + skipped_extensions = ('.pyc', '.pyo', '.class') + else: + skipped_extensions = ('.pyc', '.pyo') + + def __init__(self, module): + self.module = module + self.loader = getattr(module, '__loader__', None) + self.base = os.path.dirname(getattr(module, '__file__', '')) + + def _adjust_path(self, path): + return os.path.realpath(path) + + def _make_path(self, resource_name): + # Issue #50: need to preserve type of path on Python 2.x + # like os.path._get_sep + if isinstance(resource_name, bytes): # should only happen on 2.x + sep = b'/' + else: + sep = '/' + parts = resource_name.split(sep) + parts.insert(0, self.base) + result = os.path.join(*parts) + return self._adjust_path(result) + + def _find(self, path): + return os.path.exists(path) + + def get_cache_info(self, resource): + return None, resource.path + + def find(self, resource_name): + path = self._make_path(resource_name) + if not self._find(path): + result = None + else: + if self._is_directory(path): + result = ResourceContainer(self, resource_name) + else: + result = Resource(self, resource_name) + result.path = path + return result + + def get_stream(self, resource): + return open(resource.path, 'rb') + + def get_bytes(self, resource): + with open(resource.path, 'rb') as f: + return f.read() + + def get_size(self, resource): + return os.path.getsize(resource.path) + + def get_resources(self, resource): + def allowed(f): + return (f != '__pycache__' and not + f.endswith(self.skipped_extensions)) + return set([f for f in os.listdir(resource.path) if allowed(f)]) + + def is_container(self, resource): + return self._is_directory(resource.path) + + _is_directory = staticmethod(os.path.isdir) + + def iterator(self, resource_name): + resource = self.find(resource_name) + if resource is not None: + todo = [resource] + while todo: + resource = todo.pop(0) + yield resource + if resource.is_container: + rname = resource.name + for name in resource.resources: + if not rname: + new_name = name + else: + new_name = '/'.join([rname, name]) + child = self.find(new_name) + if child.is_container: + todo.append(child) + else: + yield child + + +class ZipResourceFinder(ResourceFinder): + """ + Resource finder for resources in .zip files. + """ + def __init__(self, module): + super(ZipResourceFinder, self).__init__(module) + archive = self.loader.archive + self.prefix_len = 1 + len(archive) + # PyPy doesn't have a _files attr on zipimporter, and you can't set one + if hasattr(self.loader, '_files'): + self._files = self.loader._files + else: + self._files = zipimport._zip_directory_cache[archive] + self.index = sorted(self._files) + + def _adjust_path(self, path): + return path + + def _find(self, path): + path = path[self.prefix_len:] + if path in self._files: + result = True + else: + if path and path[-1] != os.sep: + path = path + os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + if not result: + logger.debug('_find failed: %r %r', path, self.loader.prefix) + else: + logger.debug('_find worked: %r %r', path, self.loader.prefix) + return result + + def get_cache_info(self, resource): + prefix = self.loader.archive + path = resource.path[1 + len(prefix):] + return prefix, path + + def get_bytes(self, resource): + return self.loader.get_data(resource.path) + + def get_stream(self, resource): + return io.BytesIO(self.get_bytes(resource)) + + def get_size(self, resource): + path = resource.path[self.prefix_len:] + return self._files[path][3] + + def get_resources(self, resource): + path = resource.path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + plen = len(path) + result = set() + i = bisect.bisect(self.index, path) + while i < len(self.index): + if not self.index[i].startswith(path): + break + s = self.index[i][plen:] + result.add(s.split(os.sep, 1)[0]) # only immediate children + i += 1 + return result + + def _is_directory(self, path): + path = path[self.prefix_len:] + if path and path[-1] != os.sep: + path += os.sep + i = bisect.bisect(self.index, path) + try: + result = self.index[i].startswith(path) + except IndexError: + result = False + return result + +_finder_registry = { + type(None): ResourceFinder, + zipimport.zipimporter: ZipResourceFinder +} + +try: + # In Python 3.6, _frozen_importlib -> _frozen_importlib_external + try: + import _frozen_importlib_external as _fi + except ImportError: + import _frozen_importlib as _fi + _finder_registry[_fi.SourceFileLoader] = ResourceFinder + _finder_registry[_fi.FileFinder] = ResourceFinder + del _fi +except (ImportError, AttributeError): + pass + + +def register_finder(loader, finder_maker): + _finder_registry[type(loader)] = finder_maker + +_finder_cache = {} + + +def finder(package): + """ + Return a resource finder for a package. + :param package: The name of the package. + :return: A :class:`ResourceFinder` instance for the package. + """ + if package in _finder_cache: + result = _finder_cache[package] + else: + if package not in sys.modules: + __import__(package) + module = sys.modules[package] + path = getattr(module, '__path__', None) + if path is None: + raise DistlibException('You cannot get a finder for a module, ' + 'only for a package') + loader = getattr(module, '__loader__', None) + finder_maker = _finder_registry.get(type(loader)) + if finder_maker is None: + raise DistlibException('Unable to locate finder for %r' % package) + result = finder_maker(module) + _finder_cache[package] = result + return result + + +_dummy_module = types.ModuleType(str('__dummy__')) + + +def finder_for_path(path): + """ + Return a resource finder for a path, which should represent a container. + + :param path: The path. + :return: A :class:`ResourceFinder` instance for the path. + """ + result = None + # calls any path hooks, gets importer into cache + pkgutil.get_importer(path) + loader = sys.path_importer_cache.get(path) + finder = _finder_registry.get(type(loader)) + if finder: + module = _dummy_module + module.__file__ = os.path.join(path, '') + module.__loader__ = loader + result = finder(module) + return result diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py new file mode 100644 index 000000000..440bd3045 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/scripts.py @@ -0,0 +1,415 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2015 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from io import BytesIO +import logging +import os +import re +import struct +import sys + +from .compat import sysconfig, detect_encoding, ZipFile +from .resources import finder +from .util import (FileOperator, get_export_entry, convert_path, + get_executable, in_venv) + +logger = logging.getLogger(__name__) + +_DEFAULT_MANIFEST = ''' +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%s" + type="win32"/> + + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly>'''.strip() + +# check if Python is called on the first line with this expression +FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$') +SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*- +if __name__ == '__main__': + import sys, re + + def _resolve(module, func): + __import__(module) + mod = sys.modules[module] + parts = func.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + try: + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + + func = _resolve('%(module)s', '%(func)s') + rc = func() # None interpreted as 0 + except Exception as e: # only supporting Python >= 2.6 + sys.stderr.write('%%s\n' %% e) + rc = 1 + sys.exit(rc) +''' + + +def _enquote_executable(executable): + if ' ' in executable: + # make sure we quote only the executable in case of env + # for example /usr/bin/env "/dir with spaces/bin/jython" + # instead of "/usr/bin/env /dir with spaces/bin/jython" + # otherwise whole + if executable.startswith('/usr/bin/env '): + env, _executable = executable.split(' ', 1) + if ' ' in _executable and not _executable.startswith('"'): + executable = '%s "%s"' % (env, _executable) + else: + if not executable.startswith('"'): + executable = '"%s"' % executable + return executable + + +class ScriptMaker(object): + """ + A class to copy or create scripts from source scripts or callable + specifications. + """ + script_template = SCRIPT_TEMPLATE + + executable = None # for shebangs + + def __init__(self, source_dir, target_dir, add_launchers=True, + dry_run=False, fileop=None): + self.source_dir = source_dir + self.target_dir = target_dir + self.add_launchers = add_launchers + self.force = False + self.clobber = False + # It only makes sense to set mode bits on POSIX. + self.set_mode = (os.name == 'posix') or (os.name == 'java' and + os._name == 'posix') + self.variants = set(('', 'X.Y')) + self._fileop = fileop or FileOperator(dry_run) + + self._is_nt = os.name == 'nt' or ( + os.name == 'java' and os._name == 'nt') + + def _get_alternate_executable(self, executable, options): + if options.get('gui', False) and self._is_nt: # pragma: no cover + dn, fn = os.path.split(executable) + fn = fn.replace('python', 'pythonw') + executable = os.path.join(dn, fn) + return executable + + if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): + """ + Determine if the specified executable is a script + (contains a #! line) + """ + try: + with open(executable) as fp: + return fp.read(2) == '#!' + except (OSError, IOError): + logger.warning('Failed to open %s', executable) + return False + + def _fix_jython_executable(self, executable): + if self._is_shell(executable): + # Workaround for Jython is not needed on Linux systems. + import java + + if java.lang.System.getProperty('os.name') == 'Linux': + return executable + elif executable.lower().endswith('jython.exe'): + # Use wrapper exe for Jython on Windows + return executable + return '/usr/bin/env %s' % executable + + def _build_shebang(self, executable, post_interp): + """ + Build a shebang line. In the simple case (on Windows, or a shebang line + which is not too long or contains spaces) use a simple formulation for + the shebang. Otherwise, use /bin/sh as the executable, with a contrived + shebang which allows the script to run either under Python or sh, using + suitable quoting. Thanks to Harald Nordgren for his input. + + See also: http://www.in-ulm.de/~mascheck/various/shebang/#length + https://hg.mozilla.org/mozilla-central/file/tip/mach + """ + if os.name != 'posix': + simple_shebang = True + else: + # Add 3 for '#!' prefix and newline suffix. + shebang_length = len(executable) + len(post_interp) + 3 + if sys.platform == 'darwin': + max_shebang_length = 512 + else: + max_shebang_length = 127 + simple_shebang = ((b' ' not in executable) and + (shebang_length <= max_shebang_length)) + + if simple_shebang: + result = b'#!' + executable + post_interp + b'\n' + else: + result = b'#!/bin/sh\n' + result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n' + result += b"' '''" + return result + + def _get_shebang(self, encoding, post_interp=b'', options=None): + enquote = True + if self.executable: + executable = self.executable + enquote = False # assume this will be taken care of + elif not sysconfig.is_python_build(): + executable = get_executable() + elif in_venv(): # pragma: no cover + executable = os.path.join(sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) + if options: + executable = self._get_alternate_executable(executable, options) + + if sys.platform.startswith('java'): # pragma: no cover + executable = self._fix_jython_executable(executable) + # Normalise case for Windows + executable = os.path.normcase(executable) + # If the user didn't specify an executable, it may be necessary to + # cater for executable paths with spaces (not uncommon on Windows) + if enquote: + executable = _enquote_executable(executable) + # Issue #51: don't use fsencode, since we later try to + # check that the shebang is decodable using utf-8. + executable = executable.encode('utf-8') + # in case of IronPython, play safe and enable frames support + if (sys.platform == 'cli' and '-X:Frames' not in post_interp + and '-X:FullFrames' not in post_interp): # pragma: no cover + post_interp += b' -X:Frames' + shebang = self._build_shebang(executable, post_interp) + # Python parser starts to read a script using UTF-8 until + # it gets a #coding:xxx cookie. The shebang has to be the + # first line of a file, the #coding:xxx cookie cannot be + # written before. So the shebang has to be decodable from + # UTF-8. + try: + shebang.decode('utf-8') + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable from utf-8' % shebang) + # If the script is encoded to a custom encoding (use a + # #coding:xxx cookie), the shebang has to be decodable from + # the script encoding too. + if encoding != 'utf-8': + try: + shebang.decode(encoding) + except UnicodeDecodeError: # pragma: no cover + raise ValueError( + 'The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % (shebang, encoding)) + return shebang + + def _get_script_text(self, entry): + return self.script_template % dict(module=entry.prefix, + func=entry.suffix) + + manifest = _DEFAULT_MANIFEST + + def get_manifest(self, exename): + base = os.path.basename(exename) + return self.manifest % base + + def _write_script(self, names, shebang, script_bytes, filenames, ext): + use_launcher = self.add_launchers and self._is_nt + linesep = os.linesep.encode('utf-8') + if not use_launcher: + script_bytes = shebang + linesep + script_bytes + else: # pragma: no cover + if ext == 'py': + launcher = self._get_launcher('t') + else: + launcher = self._get_launcher('w') + stream = BytesIO() + with ZipFile(stream, 'w') as zf: + zf.writestr('__main__.py', script_bytes) + zip_data = stream.getvalue() + script_bytes = launcher + shebang + linesep + zip_data + for name in names: + outname = os.path.join(self.target_dir, name) + if use_launcher: # pragma: no cover + n, e = os.path.splitext(outname) + if e.startswith('.py'): + outname = n + outname = '%s.exe' % outname + try: + self._fileop.write_binary_file(outname, script_bytes) + except Exception: + # Failed writing an executable - it might be in use. + logger.warning('Failed to write executable - trying to ' + 'use .deleteme logic') + dfname = '%s.deleteme' % outname + if os.path.exists(dfname): + os.remove(dfname) # Not allowed to fail here + os.rename(outname, dfname) # nor here + self._fileop.write_binary_file(outname, script_bytes) + logger.debug('Able to replace executable using ' + '.deleteme logic') + try: + os.remove(dfname) + except Exception: + pass # still in use - ignore error + else: + if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + outname = '%s.%s' % (outname, ext) + if os.path.exists(outname) and not self.clobber: + logger.warning('Skipping existing file %s', outname) + continue + self._fileop.write_binary_file(outname, script_bytes) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + + def _make_script(self, entry, filenames, options=None): + post_interp = b'' + if options: + args = options.get('interpreter_args', []) + if args: + args = ' %s' % ' '.join(args) + post_interp = args.encode('utf-8') + shebang = self._get_shebang('utf-8', post_interp, options=options) + script = self._get_script_text(entry).encode('utf-8') + name = entry.name + scriptnames = set() + if '' in self.variants: + scriptnames.add(name) + if 'X' in self.variants: + scriptnames.add('%s%s' % (name, sys.version[0])) + if 'X.Y' in self.variants: + scriptnames.add('%s-%s' % (name, sys.version[:3])) + if options and options.get('gui', False): + ext = 'pyw' + else: + ext = 'py' + self._write_script(scriptnames, shebang, script, filenames, ext) + + def _copy_script(self, script, filenames): + adjust = False + script = os.path.join(self.source_dir, convert_path(script)) + outname = os.path.join(self.target_dir, os.path.basename(script)) + if not self.force and not self._fileop.newer(script, outname): + logger.debug('not copying %s (up-to-date)', script) + return + + # Always open the file, but ignore failures in dry-run mode -- + # that way, we'll get accurate feedback if we can read the + # script. + try: + f = open(script, 'rb') + except IOError: # pragma: no cover + if not self.dry_run: + raise + f = None + else: + first_line = f.readline() + if not first_line: # pragma: no cover + logger.warning('%s: %s is an empty file (skipping)', + self.get_command_name(), script) + return + + match = FIRST_LINE_RE.match(first_line.replace(b'\r\n', b'\n')) + if match: + adjust = True + post_interp = match.group(1) or b'' + + if not adjust: + if f: + f.close() + self._fileop.copy_file(script, outname) + if self.set_mode: + self._fileop.set_executable_mode([outname]) + filenames.append(outname) + else: + logger.info('copying and adjusting %s -> %s', script, + self.target_dir) + if not self._fileop.dry_run: + encoding, lines = detect_encoding(f.readline) + f.seek(0) + shebang = self._get_shebang(encoding, post_interp) + if b'pythonw' in first_line: # pragma: no cover + ext = 'pyw' + else: + ext = 'py' + n = os.path.basename(outname) + self._write_script([n], shebang, f.read(), filenames, ext) + if f: + f.close() + + @property + def dry_run(self): + return self._fileop.dry_run + + @dry_run.setter + def dry_run(self, value): + self._fileop.dry_run = value + + if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + # Executable launcher support. + # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ + + def _get_launcher(self, kind): + if struct.calcsize('P') == 8: # 64-bit + bits = '64' + else: + bits = '32' + name = '%s%s.exe' % (kind, bits) + # Issue 31: don't hardcode an absolute package name, but + # determine it relative to the current package + distlib_package = __name__.rsplit('.', 1)[0] + result = finder(distlib_package).find(name).bytes + return result + + # Public API follows + + def make(self, specification, options=None): + """ + Make a script. + + :param specification: The specification, which is either a valid export + entry specification (to make a script from a + callable) or a filename (to make a script by + copying from a source location). + :param options: A dictionary of options controlling script generation. + :return: A list of all absolute pathnames written to. + """ + filenames = [] + entry = get_export_entry(specification) + if entry is None: + self._copy_script(specification, filenames) + else: + self._make_script(entry, filenames, options=options) + return filenames + + def make_multiple(self, specifications, options=None): + """ + Take a list of specifications and make scripts from them, + :param specifications: A list of specifications. + :return: A list of all absolute pathnames written to, + """ + filenames = [] + for specification in specifications: + filenames.extend(self.make(specification, options)) + return filenames diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/t32.exe new file mode 100755 index 0000000000000000000000000000000000000000..a09d926872d84ae22a617dfe9ebb560d420b37de GIT binary patch literal 92672 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/t64.exe new file mode 100755 index 0000000000000000000000000000000000000000..9da9b40de922fb203df6b9a1d0ad4139af536850 GIT binary patch literal 102400 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�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk 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�?dYNUd4WaURX_A__M4W}D0!0n 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py new file mode 100644 index 000000000..b1d3f905b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/util.py @@ -0,0 +1,1755 @@ +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +import codecs +from collections import deque +import contextlib +import csv +from glob import iglob as std_iglob +import io +import json +import logging +import os +import py_compile +import re +import socket +try: + import ssl +except ImportError: # pragma: no cover + ssl = None +import subprocess +import sys +import tarfile +import tempfile +import textwrap + +try: + import threading +except ImportError: # pragma: no cover + import dummy_threading as threading +import time + +from . import DistlibException +from .compat import (string_types, text_type, shutil, raw_input, StringIO, + cache_from_source, urlopen, urljoin, httplib, xmlrpclib, + splittype, HTTPHandler, BaseConfigurator, valid_ident, + Container, configparser, URLError, ZipFile, fsdecode, + unquote, urlparse) + +logger = logging.getLogger(__name__) + +# +# Requirement parsing code as per PEP 508 +# + +IDENTIFIER = re.compile(r'^([\w\.-]+)\s*') +VERSION_IDENTIFIER = re.compile(r'^([\w\.*+-]+)\s*') +COMPARE_OP = re.compile(r'^(<=?|>=?|={2,3}|[~!]=)\s*') +MARKER_OP = re.compile(r'^((<=?)|(>=?)|={2,3}|[~!]=|in|not\s+in)\s*') +OR = re.compile(r'^or\b\s*') +AND = re.compile(r'^and\b\s*') +NON_SPACE = re.compile(r'(\S+)\s*') +STRING_CHUNK = re.compile(r'([\s\w\.{}()*+#:;,/?!~`@$%^&=|<>\[\]-]+)') + + +def parse_marker(marker_string): + """ + Parse a marker string and return a dictionary containing a marker expression. + + The dictionary will contain keys "op", "lhs" and "rhs" for non-terminals in + the expression grammar, or strings. A string contained in quotes is to be + interpreted as a literal string, and a string not contained in quotes is a + variable (such as os_name). + """ + def marker_var(remaining): + # either identifier, or literal string + m = IDENTIFIER.match(remaining) + if m: + result = m.groups()[0] + remaining = remaining[m.end():] + elif not remaining: + raise SyntaxError('unexpected end of input') + else: + q = remaining[0] + if q not in '\'"': + raise SyntaxError('invalid expression: %s' % remaining) + oq = '\'"'.replace(q, '') + remaining = remaining[1:] + parts = [q] + while remaining: + # either a string chunk, or oq, or q to terminate + if remaining[0] == q: + break + elif remaining[0] == oq: + parts.append(oq) + remaining = remaining[1:] + else: + m = STRING_CHUNK.match(remaining) + if not m: + raise SyntaxError('error in string literal: %s' % remaining) + parts.append(m.groups()[0]) + remaining = remaining[m.end():] + else: + s = ''.join(parts) + raise SyntaxError('unterminated string: %s' % s) + parts.append(q) + result = ''.join(parts) + remaining = remaining[1:].lstrip() # skip past closing quote + return result, remaining + + def marker_expr(remaining): + if remaining and remaining[0] == '(': + result, remaining = marker(remaining[1:].lstrip()) + if remaining[0] != ')': + raise SyntaxError('unterminated parenthesis: %s' % remaining) + remaining = remaining[1:].lstrip() + else: + lhs, remaining = marker_var(remaining) + while remaining: + m = MARKER_OP.match(remaining) + if not m: + break + op = m.groups()[0] + remaining = remaining[m.end():] + rhs, remaining = marker_var(remaining) + lhs = {'op': op, 'lhs': lhs, 'rhs': rhs} + result = lhs + return result, remaining + + def marker_and(remaining): + lhs, remaining = marker_expr(remaining) + while remaining: + m = AND.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_expr(remaining) + lhs = {'op': 'and', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + def marker(remaining): + lhs, remaining = marker_and(remaining) + while remaining: + m = OR.match(remaining) + if not m: + break + remaining = remaining[m.end():] + rhs, remaining = marker_and(remaining) + lhs = {'op': 'or', 'lhs': lhs, 'rhs': rhs} + return lhs, remaining + + return marker(marker_string) + + +def parse_requirement(req): + """ + Parse a requirement passed in as a string. Return a Container + whose attributes contain the various parts of the requirement. + """ + remaining = req.strip() + if not remaining or remaining.startswith('#'): + return None + m = IDENTIFIER.match(remaining) + if not m: + raise SyntaxError('name expected: %s' % remaining) + distname = m.groups()[0] + remaining = remaining[m.end():] + extras = mark_expr = versions = uri = None + if remaining and remaining[0] == '[': + i = remaining.find(']', 1) + if i < 0: + raise SyntaxError('unterminated extra: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + extras = [] + while s: + m = IDENTIFIER.match(s) + if not m: + raise SyntaxError('malformed extra: %s' % s) + extras.append(m.groups()[0]) + s = s[m.end():] + if not s: + break + if s[0] != ',': + raise SyntaxError('comma expected in extras: %s' % s) + s = s[1:].lstrip() + if not extras: + extras = None + if remaining: + if remaining[0] == '@': + # it's a URI + remaining = remaining[1:].lstrip() + m = NON_SPACE.match(remaining) + if not m: + raise SyntaxError('invalid URI: %s' % remaining) + uri = m.groups()[0] + t = urlparse(uri) + # there are issues with Python and URL parsing, so this test + # is a bit crude. See bpo-20271, bpo-23505. Python doesn't + # always parse invalid URLs correctly - it should raise + # exceptions for malformed URLs + if not (t.scheme and t.netloc): + raise SyntaxError('Invalid URL: %s' % uri) + remaining = remaining[m.end():].lstrip() + else: + + def get_versions(ver_remaining): + """ + Return a list of operator, version tuples if any are + specified, else None. + """ + m = COMPARE_OP.match(ver_remaining) + versions = None + if m: + versions = [] + while True: + op = m.groups()[0] + ver_remaining = ver_remaining[m.end():] + m = VERSION_IDENTIFIER.match(ver_remaining) + if not m: + raise SyntaxError('invalid version: %s' % ver_remaining) + v = m.groups()[0] + versions.append((op, v)) + ver_remaining = ver_remaining[m.end():] + if not ver_remaining or ver_remaining[0] != ',': + break + ver_remaining = ver_remaining[1:].lstrip() + m = COMPARE_OP.match(ver_remaining) + if not m: + raise SyntaxError('invalid constraint: %s' % ver_remaining) + if not versions: + versions = None + return versions, ver_remaining + + if remaining[0] != '(': + versions, remaining = get_versions(remaining) + else: + i = remaining.find(')', 1) + if i < 0: + raise SyntaxError('unterminated parenthesis: %s' % remaining) + s = remaining[1:i] + remaining = remaining[i + 1:].lstrip() + # As a special diversion from PEP 508, allow a version number + # a.b.c in parentheses as a synonym for ~= a.b.c (because this + # is allowed in earlier PEPs) + if COMPARE_OP.match(s): + versions, _ = get_versions(s) + else: + m = VERSION_IDENTIFIER.match(s) + if not m: + raise SyntaxError('invalid constraint: %s' % s) + v = m.groups()[0] + s = s[m.end():].lstrip() + if s: + raise SyntaxError('invalid constraint: %s' % s) + versions = [('~=', v)] + + if remaining: + if remaining[0] != ';': + raise SyntaxError('invalid requirement: %s' % remaining) + remaining = remaining[1:].lstrip() + + mark_expr, remaining = parse_marker(remaining) + + if remaining and remaining[0] != '#': + raise SyntaxError('unexpected trailing data: %s' % remaining) + + if not versions: + rs = distname + else: + rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) + return Container(name=distname, extras=extras, constraints=versions, + marker=mark_expr, url=uri, requirement=rs) + + +def get_resources_dests(resources_root, rules): + """Find destinations for resources files""" + + def get_rel_path(root, path): + # normalizes and returns a lstripped-/-separated path + root = root.replace(os.path.sep, '/') + path = path.replace(os.path.sep, '/') + assert path.startswith(root) + return path[len(root):].lstrip('/') + + destinations = {} + for base, suffix, dest in rules: + prefix = os.path.join(resources_root, base) + for abs_base in iglob(prefix): + abs_glob = os.path.join(abs_base, suffix) + for abs_path in iglob(abs_glob): + resource_file = get_rel_path(resources_root, abs_path) + if dest is None: # remove the entry if it was here + destinations.pop(resource_file, None) + else: + rel_path = get_rel_path(abs_base, abs_path) + rel_dest = dest.replace(os.path.sep, '/').rstrip('/') + destinations[resource_file] = rel_dest + '/' + rel_path + return destinations + + +def in_venv(): + if hasattr(sys, 'real_prefix'): + # virtualenv venvs + result = True + else: + # PEP 405 venvs + result = sys.prefix != getattr(sys, 'base_prefix', sys.prefix) + return result + + +def get_executable(): +# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as +# changes to the stub launcher mean that sys.executable always points +# to the stub on OS X +# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' +# in os.environ): +# result = os.environ['__PYVENV_LAUNCHER__'] +# else: +# result = sys.executable +# return result + result = os.path.normcase(sys.executable) + if not isinstance(result, text_type): + result = fsdecode(result) + return result + + +def proceed(prompt, allowed_chars, error_prompt=None, default=None): + p = prompt + while True: + s = raw_input(p) + p = prompt + if not s and default: + s = default + if s: + c = s[0].lower() + if c in allowed_chars: + break + if error_prompt: + p = '%c: %s\n%s' % (c, error_prompt, prompt) + return c + + +def extract_by_key(d, keys): + if isinstance(keys, string_types): + keys = keys.split() + result = {} + for key in keys: + if key in d: + result[key] = d[key] + return result + +def read_exports(stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + # Try to load as JSON, falling back on legacy format + data = stream.read() + stream = StringIO(data) + try: + jdata = json.load(stream) + result = jdata['extensions']['python.exports']['exports'] + for group, entries in result.items(): + for k, v in entries.items(): + s = '%s = %s' % (k, v) + entry = get_export_entry(s) + assert entry is not None + entries[k] = entry + return result + except Exception: + stream.seek(0, 0) + + def read_stream(cp, stream): + if hasattr(cp, 'read_file'): + cp.read_file(stream) + else: + cp.readfp(stream) + + cp = configparser.ConfigParser() + try: + read_stream(cp, stream) + except configparser.MissingSectionHeaderError: + stream.close() + data = textwrap.dedent(data) + stream = StringIO(data) + read_stream(cp, stream) + + result = {} + for key in cp.sections(): + result[key] = entries = {} + for name, value in cp.items(key): + s = '%s = %s' % (name, value) + entry = get_export_entry(s) + assert entry is not None + #entry.dist = self + entries[name] = entry + return result + + +def write_exports(exports, stream): + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getwriter('utf-8')(stream) + cp = configparser.ConfigParser() + for k, v in exports.items(): + # TODO check k, v for valid values + cp.add_section(k) + for entry in v.values(): + if entry.suffix is None: + s = entry.prefix + else: + s = '%s:%s' % (entry.prefix, entry.suffix) + if entry.flags: + s = '%s [%s]' % (s, ', '.join(entry.flags)) + cp.set(k, entry.name, s) + cp.write(stream) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + +@contextlib.contextmanager +def chdir(d): + cwd = os.getcwd() + try: + os.chdir(d) + yield + finally: + os.chdir(cwd) + + +@contextlib.contextmanager +def socket_timeout(seconds=15): + cto = socket.getdefaulttimeout() + try: + socket.setdefaulttimeout(seconds) + yield + finally: + socket.setdefaulttimeout(cto) + + +class cached_property(object): + def __init__(self, func): + self.func = func + #for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) + + def __get__(self, obj, cls=None): + if obj is None: + return self + value = self.func(obj) + object.__setattr__(obj, self.func.__name__, value) + #obj.__dict__[self.func.__name__] = value = self.func(obj) + return value + +def convert_path(pathname): + """Return 'pathname' as a name that will work on the native filesystem. + + The path is split on '/' and put back together again using the current + directory separator. Needed because filenames in the setup script are + always supplied in Unix style, and have to be converted to the local + convention before we can actually use them in the filesystem. Raises + ValueError on non-Unix-ish systems if 'pathname' either starts or + ends with a slash. + """ + if os.sep == '/': + return pathname + if not pathname: + return pathname + if pathname[0] == '/': + raise ValueError("path '%s' cannot be absolute" % pathname) + if pathname[-1] == '/': + raise ValueError("path '%s' cannot end with '/'" % pathname) + + paths = pathname.split('/') + while os.curdir in paths: + paths.remove(os.curdir) + if not paths: + return os.curdir + return os.path.join(*paths) + + +class FileOperator(object): + def __init__(self, dry_run=False): + self.dry_run = dry_run + self.ensured = set() + self._init_record() + + def _init_record(self): + self.record = False + self.files_written = set() + self.dirs_created = set() + + def record_as_written(self, path): + if self.record: + self.files_written.add(path) + + def newer(self, source, target): + """Tell if the target is newer than the source. + + Returns true if 'source' exists and is more recently modified than + 'target', or if 'source' exists and 'target' doesn't. + + Returns false if both exist and 'target' is the same age or younger + than 'source'. Raise PackagingFileError if 'source' does not exist. + + Note that this test is not very accurate: files created in the same + second will have the same "age". + """ + if not os.path.exists(source): + raise DistlibException("file '%r' does not exist" % + os.path.abspath(source)) + if not os.path.exists(target): + return True + + return os.stat(source).st_mtime > os.stat(target).st_mtime + + def copy_file(self, infile, outfile, check=True): + """Copy a file respecting dry-run and force flags. + """ + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying %s to %s', infile, outfile) + if not self.dry_run: + msg = None + if check: + if os.path.islink(outfile): + msg = '%s is a symlink' % outfile + elif os.path.exists(outfile) and not os.path.isfile(outfile): + msg = '%s is a non-regular file' % outfile + if msg: + raise ValueError(msg + ' which would be overwritten') + shutil.copyfile(infile, outfile) + self.record_as_written(outfile) + + def copy_stream(self, instream, outfile, encoding=None): + assert not os.path.isdir(outfile) + self.ensure_dir(os.path.dirname(outfile)) + logger.info('Copying stream %s to %s', instream, outfile) + if not self.dry_run: + if encoding is None: + outstream = open(outfile, 'wb') + else: + outstream = codecs.open(outfile, 'w', encoding=encoding) + try: + shutil.copyfileobj(instream, outstream) + finally: + outstream.close() + self.record_as_written(outfile) + + def write_binary_file(self, path, data): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.ensure_dir(os.path.dirname(path)) + if not self.dry_run: + with open(path, 'wb') as f: + f.write(data.encode(encoding)) + self.record_as_written(path) + + def set_mode(self, bits, mask, files): + if os.name == 'posix' or (os.name == 'java' and os._name == 'posix'): + # Set the executable bits (owner, group, and world) on + # all the files specified. + for f in files: + if self.dry_run: + logger.info("changing mode of %s", f) + else: + mode = (os.stat(f).st_mode | bits) & mask + logger.info("changing mode of %s to %o", f, mode) + os.chmod(f, mode) + + set_executable_mode = lambda s, f: s.set_mode(0o555, 0o7777, f) + + def ensure_dir(self, path): + path = os.path.abspath(path) + if path not in self.ensured and not os.path.exists(path): + self.ensured.add(path) + d, f = os.path.split(path) + self.ensure_dir(d) + logger.info('Creating %s' % path) + if not self.dry_run: + os.mkdir(path) + if self.record: + self.dirs_created.add(path) + + def byte_compile(self, path, optimize=False, force=False, prefix=None): + dpath = cache_from_source(path, not optimize) + logger.info('Byte-compiling %s to %s', path, dpath) + if not self.dry_run: + if force or self.newer(path, dpath): + if not prefix: + diagpath = None + else: + assert path.startswith(prefix) + diagpath = path[len(prefix):] + py_compile.compile(path, dpath, diagpath, True) # raise error + self.record_as_written(dpath) + return dpath + + def ensure_removed(self, path): + if os.path.exists(path): + if os.path.isdir(path) and not os.path.islink(path): + logger.debug('Removing directory tree at %s', path) + if not self.dry_run: + shutil.rmtree(path) + if self.record: + if path in self.dirs_created: + self.dirs_created.remove(path) + else: + if os.path.islink(path): + s = 'link' + else: + s = 'file' + logger.debug('Removing %s %s', s, path) + if not self.dry_run: + os.remove(path) + if self.record: + if path in self.files_written: + self.files_written.remove(path) + + def is_writable(self, path): + result = False + while not result: + if os.path.exists(path): + result = os.access(path, os.W_OK) + break + parent = os.path.dirname(path) + if parent == path: + break + path = parent + return result + + def commit(self): + """ + Commit recorded changes, turn off recording, return + changes. + """ + assert self.record + result = self.files_written, self.dirs_created + self._init_record() + return result + + def rollback(self): + if not self.dry_run: + for f in list(self.files_written): + if os.path.exists(f): + os.remove(f) + # dirs should all be empty now, except perhaps for + # __pycache__ subdirs + # reverse so that subdirs appear before their parents + dirs = sorted(self.dirs_created, reverse=True) + for d in dirs: + flist = os.listdir(d) + if flist: + assert flist == ['__pycache__'] + sd = os.path.join(d, flist[0]) + os.rmdir(sd) + os.rmdir(d) # should fail if non-empty + self._init_record() + +def resolve(module_name, dotted_path): + if module_name in sys.modules: + mod = sys.modules[module_name] + else: + mod = __import__(module_name) + if dotted_path is None: + result = mod + else: + parts = dotted_path.split('.') + result = getattr(mod, parts.pop(0)) + for p in parts: + result = getattr(result, p) + return result + + +class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): + self.name = name + self.prefix = prefix + self.suffix = suffix + self.flags = flags + + @cached_property + def value(self): + return resolve(self.prefix, self.suffix) + + def __repr__(self): # pragma: no cover + return '<ExportEntry %s = %s:%s %s>' % (self.name, self.prefix, + self.suffix, self.flags) + + def __eq__(self, other): + if not isinstance(other, ExportEntry): + result = False + else: + result = (self.name == other.name and + self.prefix == other.prefix and + self.suffix == other.suffix and + self.flags == other.flags) + return result + + __hash__ = object.__hash__ + + +ENTRY_RE = re.compile(r'''(?P<name>(\w|[-.+])+) + \s*=\s*(?P<callable>(\w+)([:\.]\w+)*) + \s*(\[\s*(?P<flags>\w+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? + ''', re.VERBOSE) + +def get_export_entry(specification): + m = ENTRY_RE.search(specification) + if not m: + result = None + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + else: + d = m.groupdict() + name = d['name'] + path = d['callable'] + colons = path.count(':') + if colons == 0: + prefix, suffix = path, None + else: + if colons != 1: + raise DistlibException("Invalid specification " + "'%s'" % specification) + prefix, suffix = path.split(':') + flags = d['flags'] + if flags is None: + if '[' in specification or ']' in specification: + raise DistlibException("Invalid specification " + "'%s'" % specification) + flags = [] + else: + flags = [f.strip() for f in flags.split(',')] + result = ExportEntry(name, prefix, suffix, flags) + return result + + +def get_cache_base(suffix=None): + """ + Return the default base location for distlib caches. If the directory does + not exist, it is created. Use the suffix provided for the base directory, + and default to '.distlib' if it isn't provided. + + On Windows, if LOCALAPPDATA is defined in the environment, then it is + assumed to be a directory, and will be the parent directory of the result. + On POSIX, and on Windows if LOCALAPPDATA is not defined, the user's home + directory - using os.expanduser('~') - will be the parent directory of + the result. + + The result is just the directory '.distlib' in the parent directory as + determined above, or with the name specified with ``suffix``. + """ + if suffix is None: + suffix = '.distlib' + if os.name == 'nt' and 'LOCALAPPDATA' in os.environ: + result = os.path.expandvars('$localappdata') + else: + # Assume posix, or old Windows + result = os.path.expanduser('~') + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if os.path.isdir(result): + usable = os.access(result, os.W_OK) + if not usable: + logger.warning('Directory exists but is not writable: %s', result) + else: + try: + os.makedirs(result) + usable = True + except OSError: + logger.warning('Unable to create %s', result, exc_info=True) + usable = False + if not usable: + result = tempfile.mkdtemp() + logger.warning('Default location unusable, using %s', result) + return os.path.join(result, suffix) + + +def path_to_cache_dir(path): + """ + Convert an absolute path to a directory name for use in a cache. + + The algorithm used is: + + #. On Windows, any ``':'`` in the drive is replaced with ``'---'``. + #. Any occurrence of ``os.sep`` is replaced with ``'--'``. + #. ``'.cache'`` is appended. + """ + d, p = os.path.splitdrive(os.path.abspath(path)) + if d: + d = d.replace(':', '---') + p = p.replace(os.sep, '--') + return d + p + '.cache' + + +def ensure_slash(s): + if not s.endswith('/'): + return s + '/' + return s + + +def parse_credentials(netloc): + username = password = None + if '@' in netloc: + prefix, netloc = netloc.split('@', 1) + if ':' not in prefix: + username = prefix + else: + username, password = prefix.split(':', 1) + return username, password, netloc + + +def get_process_umask(): + result = os.umask(0o22) + os.umask(result) + return result + +def is_string_sequence(seq): + result = True + i = None + for i, s in enumerate(seq): + if not isinstance(s, string_types): + result = False + break + assert i is not None + return result + +PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) +PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') + + +def split_filename(filename, project_name=None): + """ + Extract name, version, python version from a filename (no extension) + + Return name, version, pyver or None + """ + result = None + pyver = None + filename = unquote(filename).replace(' ', '-') + m = PYTHON_VERSION.search(filename) + if m: + pyver = m.group(1) + filename = filename[:m.start()] + if project_name and len(filename) > len(project_name) + 1: + m = re.match(re.escape(project_name) + r'\b', filename) + if m: + n = m.end() + result = filename[:n], filename[n + 1:], pyver + if result is None: + m = PROJECT_NAME_AND_VERSION.match(filename) + if m: + result = m.group(1), m.group(3), pyver + return result + +# Allow spaces in name because of legacy dists like "Twisted Core" +NAME_VERSION_RE = re.compile(r'(?P<name>[\w .-]+)\s*' + r'\(\s*(?P<ver>[^\s)]+)\)$') + +def parse_name_and_version(p): + """ + A utility method used to get name and version from a string. + + From e.g. a Provides-Dist value. + + :param p: A value in a form 'foo (1.0)' + :return: The name and version as a tuple. + """ + m = NAME_VERSION_RE.match(p) + if not m: + raise DistlibException('Ill-formed name/version string: \'%s\'' % p) + d = m.groupdict() + return d['name'].strip().lower(), d['ver'] + +def get_extras(requested, available): + result = set() + requested = set(requested or []) + available = set(available or []) + if '*' in requested: + requested.remove('*') + result |= available + for r in requested: + if r == '-': + result.add(r) + elif r.startswith('-'): + unwanted = r[1:] + if unwanted not in available: + logger.warning('undeclared extra: %s' % unwanted) + if unwanted in result: + result.remove(unwanted) + else: + if r not in available: + logger.warning('undeclared extra: %s' % r) + result.add(r) + return result +# +# Extended metadata functionality +# + +def _get_external_data(url): + result = {} + try: + # urlopen might fail if it runs into redirections, + # because of Python issue #13696. Fixed in locators + # using a custom redirect handler. + resp = urlopen(url) + headers = resp.info() + ct = headers.get('Content-Type') + if not ct.startswith('application/json'): + logger.debug('Unexpected response for JSON request: %s', ct) + else: + reader = codecs.getreader('utf-8')(resp) + #data = reader.read().decode('utf-8') + #result = json.loads(data) + result = json.load(reader) + except Exception as e: + logger.exception('Failed to get external data for %s: %s', url, e) + return result + +_external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + +def get_project_data(name): + url = '%s/%s/project.json' % (name[0].upper(), name) + url = urljoin(_external_data_base_url, url) + result = _get_external_data(url) + return result + +def get_package_data(name, version): + url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) + url = urljoin(_external_data_base_url, url) + return _get_external_data(url) + + +class Cache(object): + """ + A class implementing a cache for resources that need to live in the file system + e.g. shared libraries. This class was moved from resources to here because it + could be used by other modules, e.g. the wheel module. + """ + + def __init__(self, base): + """ + Initialise an instance. + + :param base: The base directory where the cache should be located. + """ + # we use 'isdir' instead of 'exists', because we want to + # fail if there's a file with that name + if not os.path.isdir(base): # pragma: no cover + os.makedirs(base) + if (os.stat(base).st_mode & 0o77) != 0: + logger.warning('Directory \'%s\' is not private', base) + self.base = os.path.abspath(os.path.normpath(base)) + + def prefix_to_dir(self, prefix): + """ + Converts a resource prefix to a directory name in the cache. + """ + return path_to_cache_dir(prefix) + + def clear(self): + """ + Clear the cache. + """ + not_removed = [] + for fn in os.listdir(self.base): + fn = os.path.join(self.base, fn) + try: + if os.path.islink(fn) or os.path.isfile(fn): + os.remove(fn) + elif os.path.isdir(fn): + shutil.rmtree(fn) + except Exception: + not_removed.append(fn) + return not_removed + + +class EventMixin(object): + """ + A very simple publish/subscribe system. + """ + def __init__(self): + self._subscribers = {} + + def add(self, event, subscriber, append=True): + """ + Add a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be added (and called when the + event is published). + :param append: Whether to append or prepend the subscriber to an + existing subscriber list for the event. + """ + subs = self._subscribers + if event not in subs: + subs[event] = deque([subscriber]) + else: + sq = subs[event] + if append: + sq.append(subscriber) + else: + sq.appendleft(subscriber) + + def remove(self, event, subscriber): + """ + Remove a subscriber for an event. + + :param event: The name of an event. + :param subscriber: The subscriber to be removed. + """ + subs = self._subscribers + if event not in subs: + raise ValueError('No subscribers: %r' % event) + subs[event].remove(subscriber) + + def get_subscribers(self, event): + """ + Return an iterator for the subscribers for an event. + :param event: The event to return subscribers for. + """ + return iter(self._subscribers.get(event, ())) + + def publish(self, event, *args, **kwargs): + """ + Publish a event and return a list of values returned by its + subscribers. + + :param event: The event to publish. + :param args: The positional arguments to pass to the event's + subscribers. + :param kwargs: The keyword arguments to pass to the event's + subscribers. + """ + result = [] + for subscriber in self.get_subscribers(event): + try: + value = subscriber(event, *args, **kwargs) + except Exception: + logger.exception('Exception during event publication') + value = None + result.append(value) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', + event, args, kwargs, result) + return result + +# +# Simple sequencing +# +class Sequencer(object): + def __init__(self): + self._preds = {} + self._succs = {} + self._nodes = set() # nodes with no preds/succs + + def add_node(self, node): + self._nodes.add(node) + + def remove_node(self, node, edges=False): + if node in self._nodes: + self._nodes.remove(node) + if edges: + for p in set(self._preds.get(node, ())): + self.remove(p, node) + for s in set(self._succs.get(node, ())): + self.remove(node, s) + # Remove empties + for k, v in list(self._preds.items()): + if not v: + del self._preds[k] + for k, v in list(self._succs.items()): + if not v: + del self._succs[k] + + def add(self, pred, succ): + assert pred != succ + self._preds.setdefault(succ, set()).add(pred) + self._succs.setdefault(pred, set()).add(succ) + + def remove(self, pred, succ): + assert pred != succ + try: + preds = self._preds[succ] + succs = self._succs[pred] + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of anything' % succ) + try: + preds.remove(pred) + succs.remove(succ) + except KeyError: # pragma: no cover + raise ValueError('%r not a successor of %r' % (succ, pred)) + + def is_step(self, step): + return (step in self._preds or step in self._succs or + step in self._nodes) + + def get_steps(self, final): + if not self.is_step(final): + raise ValueError('Unknown: %r' % final) + result = [] + todo = [] + seen = set() + todo.append(final) + while todo: + step = todo.pop(0) + if step in seen: + # if a step was already seen, + # move it to the end (so it will appear earlier + # when reversed on return) ... but not for the + # final step, as that would be confusing for + # users + if step != final: + result.remove(step) + result.append(step) + else: + seen.add(step) + result.append(step) + preds = self._preds.get(step, ()) + todo.extend(preds) + return reversed(result) + + @property + def strong_connections(self): + #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + index_counter = [0] + stack = [] + lowlinks = {} + index = {} + result = [] + + graph = self._succs + + def strongconnect(node): + # set the depth index for this node to the smallest unused index + index[node] = index_counter[0] + lowlinks[node] = index_counter[0] + index_counter[0] += 1 + stack.append(node) + + # Consider successors + try: + successors = graph[node] + except Exception: + successors = [] + for successor in successors: + if successor not in lowlinks: + # Successor has not yet been visited + strongconnect(successor) + lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + elif successor in stack: + # the successor is in the stack and hence in the current + # strongly connected component (SCC) + lowlinks[node] = min(lowlinks[node],index[successor]) + + # If `node` is a root node, pop the stack and generate an SCC + if lowlinks[node] == index[node]: + connected_component = [] + + while True: + successor = stack.pop() + connected_component.append(successor) + if successor == node: break + component = tuple(connected_component) + # storing the result + result.append(component) + + for node in graph: + if node not in lowlinks: + strongconnect(node) + + return result + + @property + def dot(self): + result = ['digraph G {'] + for succ in self._preds: + preds = self._preds[succ] + for pred in preds: + result.append(' %s -> %s;' % (pred, succ)) + for node in self._nodes: + result.append(' %s;' % node) + result.append('}') + return '\n'.join(result) + +# +# Unarchiving functionality for zip, tar, tgz, tbz, whl +# + +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', + '.tgz', '.tbz', '.whl') + +def unarchive(archive_filename, dest_dir, format=None, check=True): + + def check_path(path): + if not isinstance(path, text_type): + path = path.decode('utf-8') + p = os.path.abspath(os.path.join(dest_dir, path)) + if not p.startswith(dest_dir) or p[plen] != os.sep: + raise ValueError('path outside destination: %r' % p) + + dest_dir = os.path.abspath(dest_dir) + plen = len(dest_dir) + archive = None + if format is None: + if archive_filename.endswith(('.zip', '.whl')): + format = 'zip' + elif archive_filename.endswith(('.tar.gz', '.tgz')): + format = 'tgz' + mode = 'r:gz' + elif archive_filename.endswith(('.tar.bz2', '.tbz')): + format = 'tbz' + mode = 'r:bz2' + elif archive_filename.endswith('.tar'): + format = 'tar' + mode = 'r' + else: # pragma: no cover + raise ValueError('Unknown format for %r' % archive_filename) + try: + if format == 'zip': + archive = ZipFile(archive_filename, 'r') + if check: + names = archive.namelist() + for name in names: + check_path(name) + else: + archive = tarfile.open(archive_filename, mode) + if check: + names = archive.getnames() + for name in names: + check_path(name) + if format != 'zip' and sys.version_info[0] < 3: + # See Python issue 17153. If the dest path contains Unicode, + # tarfile extraction fails on Python 2.x if a member path name + # contains non-ASCII characters - it leads to an implicit + # bytes -> unicode conversion using ASCII to decode. + for tarinfo in archive.getmembers(): + if not isinstance(tarinfo.name, text_type): + tarinfo.name = tarinfo.name.decode('utf-8') + archive.extractall(dest_dir) + + finally: + if archive: + archive.close() + + +def zip_dir(directory): + """zip a directory tree into a BytesIO object""" + result = io.BytesIO() + dlen = len(directory) + with ZipFile(result, "w") as zf: + for root, dirs, files in os.walk(directory): + for name in files: + full = os.path.join(root, name) + rel = root[dlen:] + dest = os.path.join(rel, name) + zf.write(full, dest) + return result + +# +# Simple progress bar +# + +UNITS = ('', 'K', 'M', 'G','T','P') + + +class Progress(object): + unknown = 'UNKNOWN' + + def __init__(self, minval=0, maxval=100): + assert maxval is None or maxval >= minval + self.min = self.cur = minval + self.max = maxval + self.started = None + self.elapsed = 0 + self.done = False + + def update(self, curval): + assert self.min <= curval + assert self.max is None or curval <= self.max + self.cur = curval + now = time.time() + if self.started is None: + self.started = now + else: + self.elapsed = now - self.started + + def increment(self, incr): + assert incr >= 0 + self.update(self.cur + incr) + + def start(self): + self.update(self.min) + return self + + def stop(self): + if self.max is not None: + self.update(self.max) + self.done = True + + @property + def maximum(self): + return self.unknown if self.max is None else self.max + + @property + def percentage(self): + if self.done: + result = '100 %' + elif self.max is None: + result = ' ?? %' + else: + v = 100.0 * (self.cur - self.min) / (self.max - self.min) + result = '%3d %%' % v + return result + + def format_duration(self, duration): + if (duration <= 0) and self.max is None or self.cur == self.min: + result = '??:??:??' + #elif duration < 1: + # result = '--:--:--' + else: + result = time.strftime('%H:%M:%S', time.gmtime(duration)) + return result + + @property + def ETA(self): + if self.done: + prefix = 'Done' + t = self.elapsed + #import pdb; pdb.set_trace() + else: + prefix = 'ETA ' + if self.max is None: + t = -1 + elif self.elapsed == 0 or (self.cur == self.min): + t = 0 + else: + #import pdb; pdb.set_trace() + t = float(self.max - self.min) + t /= self.cur - self.min + t = (t - 1) * self.elapsed + return '%s: %s' % (prefix, self.format_duration(t)) + + @property + def speed(self): + if self.elapsed == 0: + result = 0.0 + else: + result = (self.cur - self.min) / self.elapsed + for unit in UNITS: + if result < 1000: + break + result /= 1000.0 + return '%d %sB/s' % (result, unit) + +# +# Glob functionality +# + +RICH_GLOB = re.compile(r'\{([^}]*)\}') +_CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') +_CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') + + +def iglob(path_glob): + """Extended globbing function that supports ** and {opt1,opt2,opt3}.""" + if _CHECK_RECURSIVE_GLOB.search(path_glob): + msg = """invalid glob %r: recursive glob "**" must be used alone""" + raise ValueError(msg % path_glob) + if _CHECK_MISMATCH_SET.search(path_glob): + msg = """invalid glob %r: mismatching set marker '{' or '}'""" + raise ValueError(msg % path_glob) + return _iglob(path_glob) + + +def _iglob(path_glob): + rich_path_glob = RICH_GLOB.split(path_glob, 1) + if len(rich_path_glob) > 1: + assert len(rich_path_glob) == 3, rich_path_glob + prefix, set, suffix = rich_path_glob + for item in set.split(','): + for path in _iglob(''.join((prefix, item, suffix))): + yield path + else: + if '**' not in path_glob: + for item in std_iglob(path_glob): + yield item + else: + prefix, radical = path_glob.split('**', 1) + if prefix == '': + prefix = '.' + if radical == '': + radical = '*' + else: + # we support both + radical = radical.lstrip('/') + radical = radical.lstrip('\\') + for path, dir, files in os.walk(prefix): + path = os.path.normpath(path) + for fn in _iglob(os.path.join(path, radical)): + yield fn + +if ssl: + from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, + CertificateError) + + +# +# HTTPSConnection which verifies certificates/matches domains +# + + class HTTPSConnection(httplib.HTTPSConnection): + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None + + # noinspection PyPropertyAccess + def connect(self): + sock = socket.create_connection((self.host, self.port), self.timeout) + if getattr(self, '_tunnel_host', False): + self.sock = sock + self._tunnel() + + if not hasattr(ssl, 'SSLContext'): + # For 2.x + if self.ca_certs: + cert_reqs = ssl.CERT_REQUIRED + else: + cert_reqs = ssl.CERT_NONE + self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, + cert_reqs=cert_reqs, + ssl_version=ssl.PROTOCOL_SSLv23, + ca_certs=self.ca_certs) + else: # pragma: no cover + context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + context.options |= ssl.OP_NO_SSLv2 + if self.cert_file: + context.load_cert_chain(self.cert_file, self.key_file) + kwargs = {} + if self.ca_certs: + context.verify_mode = ssl.CERT_REQUIRED + context.load_verify_locations(cafile=self.ca_certs) + if getattr(ssl, 'HAS_SNI', False): + kwargs['server_hostname'] = self.host + self.sock = context.wrap_socket(sock, **kwargs) + if self.ca_certs and self.check_domain: + try: + match_hostname(self.sock.getpeercert(), self.host) + logger.debug('Host verified: %s', self.host) + except CertificateError: # pragma: no cover + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): + BaseHTTPSHandler.__init__(self) + self.ca_certs = ca_certs + self.check_domain = check_domain + + def _conn_maker(self, *args, **kwargs): + """ + This is called to create a connection instance. Normally you'd + pass a connection class to do_open, but it doesn't actually check for + a class, and just expects a callable. As long as we behave just as a + constructor would have, we should be OK. If it ever changes so that + we *must* pass a class, we'll create an UnsafeHTTPSConnection class + which just sets check_domain to False in the class definition, and + choose which one to pass to do_open. + """ + result = HTTPSConnection(*args, **kwargs) + if self.ca_certs: + result.ca_certs = self.ca_certs + result.check_domain = self.check_domain + return result + + def https_open(self, req): + try: + return self.do_open(self._conn_maker, req) + except URLError as e: + if 'certificate verify failed' in str(e.reason): + raise CertificateError('Unable to verify server certificate ' + 'for %s' % req.host) + else: + raise + + # + # To prevent against mixing HTTP traffic with HTTPS (examples: A Man-In-The- + # Middle proxy using HTTP listens on port 443, or an index mistakenly serves + # HTML containing a http://xyz link when it should be https://xyz), + # you can use the following handler class, which does not allow HTTP traffic. + # + # It works by inheriting from HTTPHandler - so build_opener won't add a + # handler for HTTP itself. + # + class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): + raise URLError('Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + +# +# XML-RPC with timeouts +# + +_ver_info = sys.version_info[:2] + +if _ver_info == (2, 6): + class HTTP(httplib.HTTP): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + + if ssl: + class HTTPS(httplib.HTTPS): + def __init__(self, host='', port=None, **kwargs): + if port == 0: # 0 means use port 0, not the default port + port = None + self._setup(self._connection_class(host, port, **kwargs)) + + +class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.Transport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, x509 = self.get_host_info(host) + if _ver_info == (2, 6): + result = HTTP(h, timeout=self.timeout) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPConnection(h) + result = self._connection[1] + return result + +if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): + self.timeout = timeout + xmlrpclib.SafeTransport.__init__(self, use_datetime) + + def make_connection(self, host): + h, eh, kwargs = self.get_host_info(host) + if not kwargs: + kwargs = {} + kwargs['timeout'] = self.timeout + if _ver_info == (2, 6): + result = HTTPS(host, None, **kwargs) + else: + if not self._connection or host != self._connection[0]: + self._extra_headers = eh + self._connection = host, httplib.HTTPSConnection(h, None, + **kwargs) + result = self._connection[1] + return result + + +class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): + self.timeout = timeout = kwargs.pop('timeout', None) + # The above classes only come into play if a timeout + # is specified + if timeout is not None: + scheme, _ = splittype(uri) + use_datetime = kwargs.get('use_datetime', 0) + if scheme == 'https': + tcls = SafeTransport + else: + tcls = Transport + kwargs['transport'] = t = tcls(timeout, use_datetime=use_datetime) + self.transport = t + xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + +# +# CSV functionality. This is provided because on 2.x, the csv module can't +# handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. +# + +def _csv_open(fn, mode, **kwargs): + if sys.version_info[0] < 3: + mode += 'b' + else: + kwargs['newline'] = '' + # Python 3 determines encoding from locale. Force 'utf-8' + # file encoding to match other forced utf-8 encoding + kwargs['encoding'] = 'utf-8' + return open(fn, mode, **kwargs) + + +class CSVBase(object): + defaults = { + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) + } + + def __enter__(self): + return self + + def __exit__(self, *exc_info): + self.stream.close() + + +class CSVReader(CSVBase): + def __init__(self, **kwargs): + if 'stream' in kwargs: + stream = kwargs['stream'] + if sys.version_info[0] >= 3: + # needs to be a text stream + stream = codecs.getreader('utf-8')(stream) + self.stream = stream + else: + self.stream = _csv_open(kwargs['path'], 'r') + self.reader = csv.reader(self.stream, **self.defaults) + + def __iter__(self): + return self + + def next(self): + result = next(self.reader) + if sys.version_info[0] < 3: + for i, item in enumerate(result): + if not isinstance(item, text_type): + result[i] = item.decode('utf-8') + return result + + __next__ = next + +class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): + self.stream = _csv_open(fn, 'w') + self.writer = csv.writer(self.stream, **self.defaults) + + def writerow(self, row): + if sys.version_info[0] < 3: + r = [] + for item in row: + if isinstance(item, text_type): + item = item.encode('utf-8') + r.append(item) + row = r + self.writer.writerow(row) + +# +# Configurator functionality +# + +class Configurator(BaseConfigurator): + + value_converters = dict(BaseConfigurator.value_converters) + value_converters['inc'] = 'inc_convert' + + def __init__(self, config, base=None): + super(Configurator, self).__init__(config) + self.base = base or os.getcwd() + + def configure_custom(self, config): + def convert(o): + if isinstance(o, (list, tuple)): + result = type(o)([convert(i) for i in o]) + elif isinstance(o, dict): + if '()' in o: + result = self.configure_custom(o) + else: + result = {} + for k in o: + result[k] = convert(o[k]) + else: + result = self.convert(o) + return result + + c = config.pop('()') + if not callable(c): + c = self.resolve(c) + props = config.pop('.', None) + # Check for valid identifiers + args = config.pop('[]', ()) + if args: + args = tuple([convert(o) for o in args]) + items = [(k, convert(config[k])) for k in config if valid_ident(k)] + kwargs = dict(items) + result = c(*args, **kwargs) + if props: + for n, v in props.items(): + setattr(result, n, convert(v)) + return result + + def __getitem__(self, key): + result = self.config[key] + if isinstance(result, dict) and '()' in result: + self.config[key] = result = self.configure_custom(result) + return result + + def inc_convert(self, value): + """Default converter for the inc:// protocol.""" + if not os.path.isabs(value): + value = os.path.join(self.base, value) + with codecs.open(value, 'r', encoding='utf-8') as f: + result = json.load(f) + return result + + +class SubprocessMixin(object): + """ + Mixin for running subprocesses and capturing their output + """ + def __init__(self, verbose=False, progress=None): + self.verbose = verbose + self.progress = progress + + def reader(self, stream, context): + """ + Read lines from a subprocess' output stream and either pass to a progress + callable (if specified) or write progress information to sys.stderr. + """ + progress = self.progress + verbose = self.verbose + while True: + s = stream.readline() + if not s: + break + if progress is not None: + progress(s, context) + else: + if not verbose: + sys.stderr.write('.') + else: + sys.stderr.write(s.decode('utf-8')) + sys.stderr.flush() + stream.close() + + def run_command(self, cmd, **kwargs): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, + stderr=subprocess.PIPE, **kwargs) + t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) + t1.start() + t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) + t2.start() + p.wait() + t1.join() + t2.join() + if self.progress is not None: + self.progress('done.', 'main') + elif self.verbose: + sys.stderr.write('done.\n') + return p + + +def normalize_name(name): + """Normalize a python package name a la PEP 503""" + # https://www.python.org/dev/peps/pep-0503/#normalized-names + return re.sub('[-_.]+', '-', name).lower() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py new file mode 100644 index 000000000..959f15387 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/version.py @@ -0,0 +1,736 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2012-2017 The Python Software Foundation. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +""" +Implementation of a flexible versioning scheme providing support for PEP-440, +setuptools-compatible and semantic versioning. +""" + +import logging +import re + +from .compat import string_types +from .util import parse_requirement + +__all__ = ['NormalizedVersion', 'NormalizedMatcher', + 'LegacyVersion', 'LegacyMatcher', + 'SemanticVersion', 'SemanticMatcher', + 'UnsupportedVersionError', 'get_scheme'] + +logger = logging.getLogger(__name__) + + +class UnsupportedVersionError(ValueError): + """This is an unsupported version.""" + pass + + +class Version(object): + def __init__(self, s): + self._string = s = s.strip() + self._parts = parts = self.parse(s) + assert isinstance(parts, tuple) + assert len(parts) > 0 + + def parse(self, s): + raise NotImplementedError('please implement in a subclass') + + def _check_compatible(self, other): + if type(self) != type(other): + raise TypeError('cannot compare %r and %r' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + def __lt__(self, other): + self._check_compatible(other) + return self._parts < other._parts + + def __gt__(self, other): + return not (self.__lt__(other) or self.__eq__(other)) + + def __le__(self, other): + return self.__lt__(other) or self.__eq__(other) + + def __ge__(self, other): + return self.__gt__(other) or self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self._parts) + + def __repr__(self): + return "%s('%s')" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + @property + def is_prerelease(self): + raise NotImplementedError('Please implement in subclasses.') + + +class Matcher(object): + version_class = None + + # value is either a callable or the name of a method + _operators = { + '<': lambda v, c, p: v < c, + '>': lambda v, c, p: v > c, + '<=': lambda v, c, p: v == c or v < c, + '>=': lambda v, c, p: v == c or v > c, + '==': lambda v, c, p: v == c, + '===': lambda v, c, p: v == c, + # by default, compatible => >=. + '~=': lambda v, c, p: v == c or v > c, + '!=': lambda v, c, p: v != c, + } + + # this is a method only to support alternative implementations + # via overriding + def parse_requirement(self, s): + return parse_requirement(s) + + def __init__(self, s): + if self.version_class is None: + raise ValueError('Please specify a version class') + self._string = s = s.strip() + r = self.parse_requirement(s) + if not r: + raise ValueError('Not valid: %r' % s) + self.name = r.name + self.key = self.name.lower() # for case-insensitive comparisons + clist = [] + if r.constraints: + # import pdb; pdb.set_trace() + for op, s in r.constraints: + if s.endswith('.*'): + if op not in ('==', '!='): + raise ValueError('\'.*\' not allowed for ' + '%r constraints' % op) + # Could be a partial version (e.g. for '2.*') which + # won't parse as a version, so keep it as a string + vn, prefix = s[:-2], True + # Just to check that vn is a valid version + self.version_class(vn) + else: + # Should parse as a version, so we can create an + # instance for the comparison + vn, prefix = self.version_class(s), False + clist.append((op, vn, prefix)) + self._parts = tuple(clist) + + def match(self, version): + """ + Check if the provided version matches the constraints. + + :param version: The version to match against this instance. + :type version: String or :class:`Version` instance. + """ + if isinstance(version, string_types): + version = self.version_class(version) + for operator, constraint, prefix in self._parts: + f = self._operators.get(operator) + if isinstance(f, string_types): + f = getattr(self, f) + if not f: + msg = ('%r not implemented ' + 'for %s' % (operator, self.__class__.__name__)) + raise NotImplementedError(msg) + if not f(version, constraint, prefix): + return False + return True + + @property + def exact_version(self): + result = None + if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='): + result = self._parts[0][1] + return result + + def _check_compatible(self, other): + if type(self) != type(other) or self.name != other.name: + raise TypeError('cannot compare %s and %s' % (self, other)) + + def __eq__(self, other): + self._check_compatible(other) + return self.key == other.key and self._parts == other._parts + + def __ne__(self, other): + return not self.__eq__(other) + + # See http://docs.python.org/reference/datamodel#object.__hash__ + def __hash__(self): + return hash(self.key) + hash(self._parts) + + def __repr__(self): + return "%s(%r)" % (self.__class__.__name__, self._string) + + def __str__(self): + return self._string + + +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' + r'(\.(post)(\d+))?(\.(dev)(\d+))?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') + + +def _pep_440_key(s): + s = s.strip() + m = PEP440_VERSION_RE.match(s) + if not m: + raise UnsupportedVersionError('Not a valid version: %s' % s) + groups = m.groups() + nums = tuple(int(v) for v in groups[1].split('.')) + while len(nums) > 1 and nums[-1] == 0: + nums = nums[:-1] + + if not groups[0]: + epoch = 0 + else: + epoch = int(groups[0]) + pre = groups[4:6] + post = groups[7:9] + dev = groups[10:12] + local = groups[13] + if pre == (None, None): + pre = () + else: + pre = pre[0], int(pre[1]) + if post == (None, None): + post = () + else: + post = post[0], int(post[1]) + if dev == (None, None): + dev = () + else: + dev = dev[0], int(dev[1]) + if local is None: + local = () + else: + parts = [] + for part in local.split('.'): + # to ensure that numeric compares as > lexicographic, avoid + # comparing them directly, but encode a tuple which ensures + # correct sorting + if part.isdigit(): + part = (1, int(part)) + else: + part = (0, part) + parts.append(part) + local = tuple(parts) + if not pre: + # either before pre-release, or final release and after + if not post and dev: + # before pre-release + pre = ('a', -1) # to sort before a0 + else: + pre = ('z',) # to sort after all pre-releases + # now look at the state of post and dev. + if not post: + post = ('_',) # sort before 'a' + if not dev: + dev = ('final',) + + #print('%s -> %s' % (s, m.groups())) + return epoch, nums, pre, post, dev, local + + +_normalized_key = _pep_440_key + + +class NormalizedVersion(Version): + """A rational version. + + Good: + 1.2 # equivalent to "1.2.0" + 1.2.0 + 1.2a1 + 1.2.3a2 + 1.2.3b1 + 1.2.3c1 + 1.2.3.4 + TODO: fill this out + + Bad: + 1 # minimum two numbers + 1.2a # release level must have a release serial + 1.2.3b + """ + def parse(self, s): + result = _normalized_key(s) + # _normalized_key loses trailing zeroes in the release + # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0 + # However, PEP 440 prefix matching needs it: for example, + # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0). + m = PEP440_VERSION_RE.match(s) # must succeed + groups = m.groups() + self._release_clause = tuple(int(v) for v in groups[1].split('.')) + return result + + PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev']) + + @property + def is_prerelease(self): + return any(t[0] in self.PREREL_TAGS for t in self._parts if t) + + +def _match_prefix(x, y): + x = str(x) + y = str(y) + if x == y: + return True + if not x.startswith(y): + return False + n = len(y) + return x[n] == '.' + + +class NormalizedMatcher(Matcher): + version_class = NormalizedVersion + + # value is either a callable or the name of a method + _operators = { + '~=': '_match_compatible', + '<': '_match_lt', + '>': '_match_gt', + '<=': '_match_le', + '>=': '_match_ge', + '==': '_match_eq', + '===': '_match_arbitrary', + '!=': '_match_ne', + } + + def _adjust_local(self, version, constraint, prefix): + if prefix: + strip_local = '+' not in constraint and version._parts[-1] + else: + # both constraint and version are + # NormalizedVersion instances. + # If constraint does not have a local component, + # ensure the version doesn't, either. + strip_local = not constraint._parts[-1] and version._parts[-1] + if strip_local: + s = version._string.split('+', 1)[0] + version = self.version_class(s) + return version, constraint + + def _match_lt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version >= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_gt(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version <= constraint: + return False + release_clause = constraint._release_clause + pfx = '.'.join([str(i) for i in release_clause]) + return not _match_prefix(version, pfx) + + def _match_le(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version <= constraint + + def _match_ge(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + return version >= constraint + + def _match_eq(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version == constraint) + else: + result = _match_prefix(version, constraint) + return result + + def _match_arbitrary(self, version, constraint, prefix): + return str(version) == str(constraint) + + def _match_ne(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if not prefix: + result = (version != constraint) + else: + result = not _match_prefix(version, constraint) + return result + + def _match_compatible(self, version, constraint, prefix): + version, constraint = self._adjust_local(version, constraint, prefix) + if version == constraint: + return True + if version < constraint: + return False +# if not prefix: +# return True + release_clause = constraint._release_clause + if len(release_clause) > 1: + release_clause = release_clause[:-1] + pfx = '.'.join([str(i) for i in release_clause]) + return _match_prefix(version, pfx) + +_REPLACEMENTS = ( + (re.compile('[.+-]$'), ''), # remove trailing puncts + (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start + (re.compile('^[.-]'), ''), # remove leading puncts + (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses + (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion) + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha + (re.compile(r'\b(pre-alpha|prealpha)\b'), + 'pre.alpha'), # standardise + (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses +) + +_SUFFIX_REPLACEMENTS = ( + (re.compile('^[:~._+-]+'), ''), # remove leading puncts + (re.compile('[,*")([\\]]'), ''), # remove unwanted chars + (re.compile('[~:+_ -]'), '.'), # replace illegal chars + (re.compile('[.]{2,}'), '.'), # multiple runs of '.' + (re.compile(r'\.$'), ''), # trailing '.' +) + +_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)') + + +def _suggest_semantic_version(s): + """ + Try to suggest a semantic form for a version for which + _suggest_normalized_version couldn't come up with anything. + """ + result = s.strip().lower() + for pat, repl in _REPLACEMENTS: + result = pat.sub(repl, result) + if not result: + result = '0.0.0' + + # Now look for numeric prefix, and separate it out from + # the rest. + #import pdb; pdb.set_trace() + m = _NUMERIC_PREFIX.match(result) + if not m: + prefix = '0.0.0' + suffix = result + else: + prefix = m.groups()[0].split('.') + prefix = [int(i) for i in prefix] + while len(prefix) < 3: + prefix.append(0) + if len(prefix) == 3: + suffix = result[m.end():] + else: + suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():] + prefix = prefix[:3] + prefix = '.'.join([str(i) for i in prefix]) + suffix = suffix.strip() + if suffix: + #import pdb; pdb.set_trace() + # massage the suffix. + for pat, repl in _SUFFIX_REPLACEMENTS: + suffix = pat.sub(repl, suffix) + + if not suffix: + result = prefix + else: + sep = '-' if 'dev' in suffix else '+' + result = prefix + sep + suffix + if not is_semver(result): + result = None + return result + + +def _suggest_normalized_version(s): + """Suggest a normalized version close to the given version string. + + If you have a version string that isn't rational (i.e. NormalizedVersion + doesn't like it) then you might be able to get an equivalent (or close) + rational version from this function. + + This does a number of simple normalizations to the given string, based + on observation of versions currently in use on PyPI. Given a dump of + those version during PyCon 2009, 4287 of them: + - 2312 (53.93%) match NormalizedVersion without change + with the automatic suggestion + - 3474 (81.04%) match when using this suggestion method + + @param s {str} An irrational version string. + @returns A rational version string, or None, if couldn't determine one. + """ + try: + _normalized_key(s) + return s # already rational + except UnsupportedVersionError: + pass + + rs = s.lower() + + # part of this could use maketrans + for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'), + ('beta', 'b'), ('rc', 'c'), ('-final', ''), + ('-pre', 'c'), + ('-release', ''), ('.release', ''), ('-stable', ''), + ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''), + ('final', '')): + rs = rs.replace(orig, repl) + + # if something ends with dev or pre, we add a 0 + rs = re.sub(r"pre$", r"pre0", rs) + rs = re.sub(r"dev$", r"dev0", rs) + + # if we have something like "b-2" or "a.2" at the end of the + # version, that is probably beta, alpha, etc + # let's remove the dash or dot + rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs) + + # 1.0-dev-r371 -> 1.0.dev371 + # 0.1-dev-r79 -> 0.1.dev79 + rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs) + + # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1 + rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs) + + # Clean: v0.3, v1.0 + if rs.startswith('v'): + rs = rs[1:] + + # Clean leading '0's on numbers. + #TODO: unintended side-effect on, e.g., "2003.05.09" + # PyPI stats: 77 (~2%) better + rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) + + # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers + # zero. + # PyPI stats: 245 (7.56%) better + rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs) + + # the 'dev-rNNN' tag is a dev tag + rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs) + + # clean the - when used as a pre delimiter + rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs) + + # a terminal "dev" or "devel" can be changed into ".dev0" + rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs) + + # a terminal "dev" can be changed into ".dev0" + rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs) + + # a terminal "final" or "stable" can be removed + rs = re.sub(r"(final|stable)$", "", rs) + + # The 'r' and the '-' tags are post release tags + # 0.4a1.r10 -> 0.4a1.post10 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 + rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) + + # Clean 'r' instead of 'dev' usage: + # 0.9.33+r17222 -> 0.9.33.dev17222 + # 1.0dev123 -> 1.0.dev123 + # 1.0.git123 -> 1.0.dev123 + # 1.0.bzr123 -> 1.0.dev123 + # 0.1a0dev.123 -> 0.1a0.dev123 + # PyPI stats: ~150 (~4%) better + rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs) + + # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage: + # 0.2.pre1 -> 0.2c1 + # 0.2-c1 -> 0.2c1 + # 1.0preview123 -> 1.0c123 + # PyPI stats: ~21 (0.62%) better + rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs) + + # Tcl/Tk uses "px" for their post release markers + rs = re.sub(r"p(\d+)$", r".post\1", rs) + + try: + _normalized_key(rs) + except UnsupportedVersionError: + rs = None + return rs + +# +# Legacy version processing (distribute-compatible) +# + +_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) +_VERSION_REPLACE = { + 'pre': 'c', + 'preview': 'c', + '-': 'final-', + 'rc': 'c', + 'dev': '@', + '': None, + '.': None, +} + + +def _legacy_key(s): + def get_parts(s): + result = [] + for p in _VERSION_PART.split(s.lower()): + p = _VERSION_REPLACE.get(p, p) + if p: + if '0' <= p[:1] <= '9': + p = p.zfill(8) + else: + p = '*' + p + result.append(p) + result.append('*final') + return result + + result = [] + for p in get_parts(s): + if p.startswith('*'): + if p < '*final': + while result and result[-1] == '*final-': + result.pop() + while result and result[-1] == '00000000': + result.pop() + result.append(p) + return tuple(result) + + +class LegacyVersion(Version): + def parse(self, s): + return _legacy_key(s) + + @property + def is_prerelease(self): + result = False + for x in self._parts: + if (isinstance(x, string_types) and x.startswith('*') and + x < '*final'): + result = True + break + return result + + +class LegacyMatcher(Matcher): + version_class = LegacyVersion + + _operators = dict(Matcher._operators) + _operators['~='] = '_match_compatible' + + numeric_re = re.compile(r'^(\d+(\.\d+)*)') + + def _match_compatible(self, version, constraint, prefix): + if version < constraint: + return False + m = self.numeric_re.match(str(constraint)) + if not m: + logger.warning('Cannot compute compatible match for version %s ' + ' and constraint %s', version, constraint) + return True + s = m.groups()[0] + if '.' in s: + s = s.rsplit('.', 1)[0] + return _match_prefix(version, s) + +# +# Semantic versioning +# + +_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' + r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' + r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) + + +def is_semver(s): + return _SEMVER_RE.match(s) + + +def _semantic_key(s): + def make_tuple(s, absent): + if s is None: + result = (absent,) + else: + parts = s[1:].split('.') + # We can't compare ints and strings on Python 3, so fudge it + # by zero-filling numeric values so simulate a numeric comparison + result = tuple([p.zfill(8) if p.isdigit() else p for p in parts]) + return result + + m = is_semver(s) + if not m: + raise UnsupportedVersionError(s) + groups = m.groups() + major, minor, patch = [int(i) for i in groups[:3]] + # choose the '|' and '*' so that versions sort correctly + pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*') + return (major, minor, patch), pre, build + + +class SemanticVersion(Version): + def parse(self, s): + return _semantic_key(s) + + @property + def is_prerelease(self): + return self._parts[1][0] != '|' + + +class SemanticMatcher(Matcher): + version_class = SemanticVersion + + +class VersionScheme(object): + def __init__(self, key, matcher, suggester=None): + self.key = key + self.matcher = matcher + self.suggester = suggester + + def is_valid_version(self, s): + try: + self.matcher.version_class(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_matcher(self, s): + try: + self.matcher(s) + result = True + except UnsupportedVersionError: + result = False + return result + + def is_valid_constraint_list(self, s): + """ + Used for processing some metadata fields + """ + return self.is_valid_matcher('dummy_name (%s)' % s) + + def suggest(self, s): + if self.suggester is None: + result = None + else: + result = self.suggester(s) + return result + +_SCHEMES = { + 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, + _suggest_normalized_version), + 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s), + 'semantic': VersionScheme(_semantic_key, SemanticMatcher, + _suggest_semantic_version), +} + +_SCHEMES['default'] = _SCHEMES['normalized'] + + +def get_scheme(name): + if name not in _SCHEMES: + raise ValueError('unknown scheme name: %r' % name) + return _SCHEMES[name] diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/w32.exe new file mode 100755 index 0000000000000000000000000000000000000000..732215a9d34ccb7b417d637a7646d9b843ecafa8 GIT binary patch literal 89088 zcmeFae|S?>wm*FGqitH!CO`{C3REl(SahnPNDYM`O{q#T7)Xdvz$<hz5gjb&0FD$| zPs=nt#$jgk-tk`NUb*PJIy$3wMg@OiORy=5PEkZ0P^;6cyPm2=Y8#~Xyq~pC(iU~@ z_dd`2ywCg3TS)e=wSTX@_S$Q$y;FJf9>F9Cf*Bu86NCeB>CeT#|L3nblC!40kR?2m z{>H@z3`^g*ct!B1Tk<#8{Ol(+x7?n8>n(TO@iQ_1pEl;#NO$D_^p5<p8@>6r|7^p? zD>5@P3KB)%InlPUc<U{5lb_$uJ2!U@!dIxT&CTYnHuoCtzCL#`-1%8w%`JjkymkHD zpYr&>Cg9H}+(GW%^wV2|ROUbGfyXTfOART)i?<!WISJD#7!6|#8G`TvV*Xu^z32+K zc6>T0?9%;4K}Zn{6fx`yPa}*$9C+R!7zI~72c&$InY+UdMGBkF3c`HyxD3K09`bzW z?_q;rO&5ec#{?noJ4vI19bbHBt~vx^h2FH$V8i|^#EsiUg#JboP3@w-(&Uf&%NK<8 zSJZ5{MZ852W)~s>WeT(LIf&1wKNqULLI)GN_(-E-D)X~ZK=1;t<%*guHMhdg`-(mb zHzDv1KBN9zR9?--O+N$ReOXAr81V9z!X5SJ5`=3<1^<8V|AP@&sr2}Qvp;hQT24iW zOHg|EiZd1ojV;oo#(r^ba2`^8T22{~_UQ@YMZp7O1R*2@?SerFE~TuJB_wDaYC0h8 zfONF1t%{=H`W`bdYp+>YBsg9Ty9ec3iy+O3xa}TIvPK#Q&udyx1MvwG0(#iaGC|N| zJ#3?<Y4YLRkU`54s9BYRjyISA>){9$tW;Y34lPnX=&>D4X~|k7c$TwEfOzs@Yh#Nz z`FV;`(w!E`sKg@`2E}bDY>ku^4XS@tV(WO*<eu67;0Clk;vRHp!Qf<+5w0B!*Y>g? zYH=KK#%%Yu1~&m>IlB^#2^syGG|2AB1(}4aOcaC%!)}%`I7AIC2(Ro3yW`GSttng^ z_xb=ECor!L{-PNO>_ulJ3%fm=O0X!s%)$GZ?~I94l-^KEAX0n$?4wGpr7&i4#~)OB zQD%2NrWUKtZuYT1Vnu}AeF`cSgx>Rkk@}Lg{WltgT76VeA2aic`cTnpXrt2WXmJkM z9%u<Rp-*9{$HQ)>Xm?McyDyZ28Ux7mpxy?mnmvzMMr-85vkRrJLaDRx>|I7je+cM+ zj{RJ(3Vrgke;W@#D!y%U%fQLtlPKTAzWtVuOQdXpwsy6eRjt^cZ%0D4bF7$F;f!th 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ð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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/w64.exe new file mode 100755 index 0000000000000000000000000000000000000000..c41bd0a011fd760ce20ba795d9e535e0d2c39876 GIT binary patch literal 99328 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 B=L-M; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py new file mode 100644 index 000000000..36934106e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distlib/wheel.py @@ -0,0 +1,984 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2017 Vinay Sajip. +# Licensed to the Python Software Foundation under a contributor agreement. +# See LICENSE.txt and CONTRIBUTORS.txt. +# +from __future__ import unicode_literals + +import base64 +import codecs +import datetime +import distutils.util +from email import message_from_file +import hashlib +import imp +import json +import logging +import os +import posixpath +import re +import shutil +import sys +import tempfile +import zipfile + +from . import __version__, DistlibException +from .compat import sysconfig, ZipFile, fsdecode, text_type, filter +from .database import InstalledDistribution +from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME +from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, + cached_property, get_cache_base, read_exports, tempdir) +from .version import NormalizedVersion, UnsupportedVersionError + +logger = logging.getLogger(__name__) + +cache = None # created when needed + +if hasattr(sys, 'pypy_version_info'): # pragma: no cover + IMP_PREFIX = 'pp' +elif sys.platform.startswith('java'): # pragma: no cover + IMP_PREFIX = 'jy' +elif sys.platform == 'cli': # pragma: no cover + IMP_PREFIX = 'ip' +else: + IMP_PREFIX = 'cp' + +VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') +if not VER_SUFFIX: # pragma: no cover + VER_SUFFIX = '%s%s' % sys.version_info[:2] +PYVER = 'py' + VER_SUFFIX +IMPVER = IMP_PREFIX + VER_SUFFIX + +ARCH = distutils.util.get_platform().replace('-', '_').replace('.', '_') + +ABI = sysconfig.get_config_var('SOABI') +if ABI and ABI.startswith('cpython-'): + ABI = ABI.replace('cpython-', 'cp') +else: + def _derive_abi(): + parts = ['cp', VER_SUFFIX] + if sysconfig.get_config_var('Py_DEBUG'): + parts.append('d') + if sysconfig.get_config_var('WITH_PYMALLOC'): + parts.append('m') + if sysconfig.get_config_var('Py_UNICODE_SIZE') == 4: + parts.append('u') + return ''.join(parts) + ABI = _derive_abi() + del _derive_abi + +FILENAME_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))? +-(?P<py>\w+\d+(\.\w+\d+)*) +-(?P<bi>\w+) +-(?P<ar>\w+(\.\w+)*) +\.whl$ +''', re.IGNORECASE | re.VERBOSE) + +NAME_VERSION_RE = re.compile(r''' +(?P<nm>[^-]+) +-(?P<vn>\d+[^-]*) +(-(?P<bn>\d+[^-]*))?$ +''', re.IGNORECASE | re.VERBOSE) + +SHEBANG_RE = re.compile(br'\s*#![^\r\n]*') +SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$') +SHEBANG_PYTHON = b'#!python' +SHEBANG_PYTHONW = b'#!pythonw' + +if os.sep == '/': + to_posix = lambda o: o +else: + to_posix = lambda o: o.replace(os.sep, '/') + + +class Mounter(object): + def __init__(self): + self.impure_wheels = {} + self.libs = {} + + def add(self, pathname, extensions): + self.impure_wheels[pathname] = extensions + self.libs.update(extensions) + + def remove(self, pathname): + extensions = self.impure_wheels.pop(pathname) + for k, v in extensions: + if k in self.libs: + del self.libs[k] + + def find_module(self, fullname, path=None): + if fullname in self.libs: + result = self + else: + result = None + return result + + def load_module(self, fullname): + if fullname in sys.modules: + result = sys.modules[fullname] + else: + if fullname not in self.libs: + raise ImportError('unable to find extension for %s' % fullname) + result = imp.load_dynamic(fullname, self.libs[fullname]) + result.__loader__ = self + parts = fullname.rsplit('.', 1) + if len(parts) > 1: + result.__package__ = parts[0] + return result + +_hook = Mounter() + + +class Wheel(object): + """ + Class to build and install from Wheel files (PEP 427). + """ + + wheel_version = (1, 1) + hash_kind = 'sha256' + + def __init__(self, filename=None, sign=False, verify=False): + """ + Initialise an instance using a (valid) filename. + """ + self.sign = sign + self.should_verify = verify + self.buildver = '' + self.pyver = [PYVER] + self.abi = ['none'] + self.arch = ['any'] + self.dirname = os.getcwd() + if filename is None: + self.name = 'dummy' + self.version = '0.1' + self._filename = self.filename + else: + m = NAME_VERSION_RE.match(filename) + if m: + info = m.groupdict('') + self.name = info['nm'] + # Reinstate the local version separator + self.version = info['vn'].replace('_', '-') + self.buildver = info['bn'] + self._filename = self.filename + else: + dirname, filename = os.path.split(filename) + m = FILENAME_RE.match(filename) + if not m: + raise DistlibException('Invalid name or ' + 'filename: %r' % filename) + if dirname: + self.dirname = os.path.abspath(dirname) + self._filename = filename + info = m.groupdict('') + self.name = info['nm'] + self.version = info['vn'] + self.buildver = info['bn'] + self.pyver = info['py'].split('.') + self.abi = info['bi'].split('.') + self.arch = info['ar'].split('.') + + @property + def filename(self): + """ + Build and return a filename from the various components. + """ + if self.buildver: + buildver = '-' + self.buildver + else: + buildver = '' + pyver = '.'.join(self.pyver) + abi = '.'.join(self.abi) + arch = '.'.join(self.arch) + # replace - with _ as a local version separator + version = self.version.replace('-', '_') + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, + pyver, abi, arch) + + @property + def exists(self): + path = os.path.join(self.dirname, self.filename) + return os.path.isfile(path) + + @property + def tags(self): + for pyver in self.pyver: + for abi in self.abi: + for arch in self.arch: + yield pyver, abi, arch + + @cached_property + def metadata(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + wrapper = codecs.getreader('utf-8') + with ZipFile(pathname, 'r') as zf: + wheel_metadata = self.get_wheel_metadata(zf) + wv = wheel_metadata['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if file_version < (1, 1): + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, 'METADATA'] + else: + fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + result = None + for fn in fns: + try: + metadata_filename = posixpath.join(info_dir, fn) + with zf.open(metadata_filename) as bf: + wf = wrapper(bf) + result = Metadata(fileobj=wf) + if result: + break + except KeyError: + pass + if not result: + raise ValueError('Invalid wheel, because metadata is ' + 'missing: looked in %s' % ', '.join(fns)) + return result + + def get_wheel_metadata(self, zf): + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + metadata_filename = posixpath.join(info_dir, 'WHEEL') + with zf.open(metadata_filename) as bf: + wf = codecs.getreader('utf-8')(bf) + message = message_from_file(wf) + return dict(message) + + @cached_property + def info(self): + pathname = os.path.join(self.dirname, self.filename) + with ZipFile(pathname, 'r') as zf: + result = self.get_wheel_metadata(zf) + return result + + def process_shebang(self, data): + m = SHEBANG_RE.match(data) + if m: + end = m.end() + shebang, data_after_shebang = data[:end], data[end:] + # Preserve any arguments after the interpreter + if b'pythonw' in shebang.lower(): + shebang_python = SHEBANG_PYTHONW + else: + shebang_python = SHEBANG_PYTHON + m = SHEBANG_DETAIL_RE.match(shebang) + if m: + args = b' ' + m.groups()[-1] + else: + args = b'' + shebang = shebang_python + args + data = shebang + data_after_shebang + else: + cr = data.find(b'\r') + lf = data.find(b'\n') + if cr < 0 or cr > lf: + term = b'\n' + else: + if data[cr:cr + 2] == b'\r\n': + term = b'\r\n' + else: + term = b'\r' + data = SHEBANG_PYTHON + term + data + return data + + def get_hash(self, data, hash_kind=None): + if hash_kind is None: + hash_kind = self.hash_kind + try: + hasher = getattr(hashlib, hash_kind) + except AttributeError: + raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + result = hasher(data).digest() + result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') + return hash_kind, result + + def write_record(self, records, record_path, base): + records = list(records) # make a copy for sorting + p = to_posix(os.path.relpath(record_path, base)) + records.append((p, '', '')) + records.sort() + with CSVWriter(record_path) as writer: + for row in records: + writer.writerow(row) + + def write_records(self, info, libdir, archive_paths): + records = [] + distinfo, info_dir = info + hasher = getattr(hashlib, self.hash_kind) + for ap, p in archive_paths: + with open(p, 'rb') as f: + data = f.read() + digest = '%s=%s' % self.get_hash(data) + size = os.path.getsize(p) + records.append((ap, digest, size)) + + p = os.path.join(distinfo, 'RECORD') + self.write_record(records, p, libdir) + ap = to_posix(os.path.join(info_dir, 'RECORD')) + archive_paths.append((ap, p)) + + def build_zip(self, pathname, archive_paths): + with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf: + for ap, p in archive_paths: + logger.debug('Wrote %s to %s in wheel', p, ap) + zf.write(p, ap) + + def build(self, paths, tags=None, wheel_version=None): + """ + Build a wheel from files in specified paths, and use any specified tags + when determining the name of the wheel. + """ + if tags is None: + tags = {} + + libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0] + if libkey == 'platlib': + is_pure = 'false' + default_pyver = [IMPVER] + default_abi = [ABI] + default_arch = [ARCH] + else: + is_pure = 'true' + default_pyver = [PYVER] + default_abi = ['none'] + default_arch = ['any'] + + self.pyver = tags.get('pyver', default_pyver) + self.abi = tags.get('abi', default_abi) + self.arch = tags.get('arch', default_arch) + + libdir = paths[libkey] + + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + archive_paths = [] + + # First, stuff which is not in site-packages + for key in ('data', 'headers', 'scripts'): + if key not in paths: + continue + path = paths[key] + if os.path.isdir(path): + for root, dirs, files in os.walk(path): + for fn in files: + p = fsdecode(os.path.join(root, fn)) + rp = os.path.relpath(p, path) + ap = to_posix(os.path.join(data_dir, key, rp)) + archive_paths.append((ap, p)) + if key == 'scripts' and not p.endswith('.exe'): + with open(p, 'rb') as f: + data = f.read() + data = self.process_shebang(data) + with open(p, 'wb') as f: + f.write(data) + + # Now, stuff which is in site-packages, other than the + # distinfo stuff. + path = libdir + distinfo = None + for root, dirs, files in os.walk(path): + if root == path: + # At the top level only, save distinfo for later + # and skip it for now + for i, dn in enumerate(dirs): + dn = fsdecode(dn) + if dn.endswith('.dist-info'): + distinfo = os.path.join(root, dn) + del dirs[i] + break + assert distinfo, '.dist-info directory expected, not found' + + for fn in files: + # comment out next suite to leave .pyc files in + if fsdecode(fn).endswith(('.pyc', '.pyo')): + continue + p = os.path.join(root, fn) + rp = to_posix(os.path.relpath(p, path)) + archive_paths.append((rp, p)) + + # Now distinfo. Assumed to be flat, i.e. os.listdir is enough. + files = os.listdir(distinfo) + for fn in files: + if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'): + p = fsdecode(os.path.join(distinfo, fn)) + ap = to_posix(os.path.join(info_dir, fn)) + archive_paths.append((ap, p)) + + wheel_metadata = [ + 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version), + 'Generator: distlib %s' % __version__, + 'Root-Is-Purelib: %s' % is_pure, + ] + for pyver, abi, arch in self.tags: + wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch)) + p = os.path.join(distinfo, 'WHEEL') + with open(p, 'w') as f: + f.write('\n'.join(wheel_metadata)) + ap = to_posix(os.path.join(info_dir, 'WHEEL')) + archive_paths.append((ap, p)) + + # Now, at last, RECORD. + # Paths in here are archive paths - nothing else makes sense. + self.write_records((distinfo, info_dir), libdir, archive_paths) + # Now, ready to build the zip file + pathname = os.path.join(self.dirname, self.filename) + self.build_zip(pathname, archive_paths) + return pathname + + def install(self, paths, maker, **kwargs): + """ + Install a wheel to the specified paths. If kwarg ``warner`` is + specified, it should be a callable, which will be called with two + tuples indicating the wheel version of this software and the wheel + version in the file, if there is a discrepancy in the versions. + This can be used to issue any warnings to raise any exceptions. + If kwarg ``lib_only`` is True, only the purelib/platlib files are + installed, and the headers, scripts, data and dist-info metadata are + not written. + + The return value is a :class:`InstalledDistribution` instance unless + ``options.lib_only`` is True, in which case the return value is ``None``. + """ + + dry_run = maker.dry_run + warner = kwargs.get('warner') + lib_only = kwargs.get('lib_only', False) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + if (file_version != self.wheel_version) and warner: + warner(self.wheel_version, file_version) + + if message['Root-Is-Purelib'] == 'true': + libdir = paths['purelib'] + else: + libdir = paths['platlib'] + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + data_pfx = posixpath.join(data_dir, '') + info_pfx = posixpath.join(info_dir, '') + script_pfx = posixpath.join(data_dir, 'scripts', '') + + # make a new instance rather than a copy of maker's, + # as we mutate it + fileop = FileOperator(dry_run=dry_run) + fileop.record = True # so we can rollback if needed + + bc = not sys.dont_write_bytecode # Double negatives. Lovely! + + outfiles = [] # for RECORD writing + + # for script copying/shebang processing + workdir = tempfile.mkdtemp() + # set target dir later + # we default add_launchers to False, as the + # Python Launcher should be used instead + maker.source_dir = workdir + maker.target_dir = None + try: + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + if lib_only and u_arcname.startswith((info_pfx, data_pfx)): + logger.debug('lib_only: skipping %s', u_arcname) + continue + is_script = (u_arcname.startswith(script_pfx) + and not u_arcname.endswith('.exe')) + + if u_arcname.startswith(data_pfx): + _, where, rp = u_arcname.split('/', 2) + outfile = os.path.join(paths[where], convert_path(rp)) + else: + # meant for site-packages. + if u_arcname in (wheel_metadata_name, record_name): + continue + outfile = os.path.join(libdir, convert_path(u_arcname)) + if not is_script: + with zf.open(arcname) as bf: + fileop.copy_stream(bf, outfile) + outfiles.append(outfile) + # Double check the digest of the written file + if not dry_run and row[1]: + with open(outfile, 'rb') as bf: + data = bf.read() + _, newdigest = self.get_hash(data, kind) + if newdigest != digest: + raise DistlibException('digest mismatch ' + 'on write for ' + '%s' % outfile) + if bc and outfile.endswith('.py'): + try: + pyc = fileop.byte_compile(outfile) + outfiles.append(pyc) + except Exception: + # Don't give up if byte-compilation fails, + # but log it and perhaps warn the user + logger.warning('Byte-compilation failed', + exc_info=True) + else: + fn = os.path.basename(convert_path(arcname)) + workname = os.path.join(workdir, fn) + with zf.open(arcname) as bf: + fileop.copy_stream(bf, workname) + + dn, fn = os.path.split(outfile) + maker.target_dir = dn + filenames = maker.make(fn) + fileop.set_executable_mode(filenames) + outfiles.extend(filenames) + + if lib_only: + logger.debug('lib_only: returning None') + dist = None + else: + # Generate scripts + + # Try to get pydist.json so we can see if there are + # any commands to generate. If this fails (e.g. because + # of a legacy wheel), log a warning but don't give up. + commands = None + file_version = self.info['Wheel-Version'] + if file_version == '1.0': + # Use legacy info + ep = posixpath.join(info_dir, 'entry_points.txt') + try: + with zf.open(ep) as bwf: + epdata = read_exports(bwf) + commands = {} + for key in ('console', 'gui'): + k = '%s_scripts' % key + if k in epdata: + commands['wrap_%s' % key] = d = {} + for v in epdata[k].values(): + s = '%s:%s' % (v.prefix, v.suffix) + if v.flags: + s += ' %s' % v.flags + d[v.name] = s + except Exception: + logger.warning('Unable to read legacy script ' + 'metadata, so cannot generate ' + 'scripts') + else: + try: + with zf.open(metadata_name) as bwf: + wf = wrapper(bwf) + commands = json.load(wf).get('extensions') + if commands: + commands = commands.get('python.commands') + except Exception: + logger.warning('Unable to read JSON metadata, so ' + 'cannot generate scripts') + if commands: + console_scripts = commands.get('wrap_console', {}) + gui_scripts = commands.get('wrap_gui', {}) + if console_scripts or gui_scripts: + script_dir = paths.get('scripts', '') + if not os.path.isdir(script_dir): + raise ValueError('Valid script path not ' + 'specified') + maker.target_dir = script_dir + for k, v in console_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script) + fileop.set_executable_mode(filenames) + + if gui_scripts: + options = {'gui': True } + for k, v in gui_scripts.items(): + script = '%s = %s' % (k, v) + filenames = maker.make(script, options) + fileop.set_executable_mode(filenames) + + p = os.path.join(libdir, info_dir) + dist = InstalledDistribution(p) + + # Write SHARED + paths = dict(paths) # don't change passed in dict + del paths['purelib'] + del paths['platlib'] + paths['lib'] = libdir + p = dist.write_shared_locations(paths, dry_run) + if p: + outfiles.append(p) + + # Write RECORD + dist.write_installed_files(outfiles, paths['prefix'], + dry_run) + return dist + except Exception: # pragma: no cover + logger.exception('installation failed.') + fileop.rollback() + raise + finally: + shutil.rmtree(workdir) + + def _get_dylib_cache(self): + global cache + if cache is None: + # Use native string to avoid issues on 2.x: see Python #20140. + base = os.path.join(get_cache_base(), str('dylib-cache'), + sys.version[:3]) + cache = Cache(base) + return cache + + def _get_extensions(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + arcname = posixpath.join(info_dir, 'EXTENSIONS') + wrapper = codecs.getreader('utf-8') + result = [] + with ZipFile(pathname, 'r') as zf: + try: + with zf.open(arcname) as bf: + wf = wrapper(bf) + extensions = json.load(wf) + cache = self._get_dylib_cache() + prefix = cache.prefix_to_dir(pathname) + cache_base = os.path.join(cache.base, prefix) + if not os.path.isdir(cache_base): + os.makedirs(cache_base) + for name, relpath in extensions.items(): + dest = os.path.join(cache_base, convert_path(relpath)) + if not os.path.exists(dest): + extract = True + else: + file_time = os.stat(dest).st_mtime + file_time = datetime.datetime.fromtimestamp(file_time) + info = zf.getinfo(relpath) + wheel_time = datetime.datetime(*info.date_time) + extract = wheel_time > file_time + if extract: + zf.extract(relpath, cache_base) + result.append((name, dest)) + except KeyError: + pass + return result + + def is_compatible(self): + """ + Determine if a wheel is compatible with the running system. + """ + return is_compatible(self) + + def is_mountable(self): + """ + Determine if a wheel is asserted as mountable by its metadata. + """ + return True # for now - metadata details TBD + + def mount(self, append=False): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if not self.is_compatible(): + msg = 'Wheel %s not compatible with this Python.' % pathname + raise DistlibException(msg) + if not self.is_mountable(): + msg = 'Wheel %s is marked as not mountable.' % pathname + raise DistlibException(msg) + if pathname in sys.path: + logger.debug('%s already in path', pathname) + else: + if append: + sys.path.append(pathname) + else: + sys.path.insert(0, pathname) + extensions = self._get_extensions() + if extensions: + if _hook not in sys.meta_path: + sys.meta_path.append(_hook) + _hook.add(pathname, extensions) + + def unmount(self): + pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) + if pathname not in sys.path: + logger.debug('%s not in path', pathname) + else: + sys.path.remove(pathname) + if pathname in _hook.impure_wheels: + _hook.remove(pathname) + if not _hook.impure_wheels: + if _hook in sys.meta_path: + sys.meta_path.remove(_hook) + + def verify(self): + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + data_dir = '%s.data' % name_ver + info_dir = '%s.dist-info' % name_ver + + metadata_name = posixpath.join(info_dir, METADATA_FILENAME) + wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') + record_name = posixpath.join(info_dir, 'RECORD') + + wrapper = codecs.getreader('utf-8') + + with ZipFile(pathname, 'r') as zf: + with zf.open(wheel_metadata_name) as bwf: + wf = wrapper(bwf) + message = message_from_file(wf) + wv = message['Wheel-Version'].split('.', 1) + file_version = tuple([int(i) for i in wv]) + # TODO version verification + + records = {} + with zf.open(record_name) as bf: + with CSVReader(stream=bf) as reader: + for row in reader: + p = row[0] + records[p] = row + + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + + # The signature file won't be in RECORD, + # and we don't currently don't do anything with it + if u_arcname.endswith('/RECORD.jws'): + continue + row = records[u_arcname] + if row[2] and str(zinfo.file_size) != row[2]: + raise DistlibException('size mismatch for ' + '%s' % u_arcname) + if row[1]: + kind, value = row[1].split('=', 1) + with zf.open(arcname) as bf: + data = bf.read() + _, digest = self.get_hash(data, kind) + if digest != value: + raise DistlibException('digest mismatch for ' + '%s' % arcname) + + def update(self, modifier, dest_dir=None, **kwargs): + """ + Update the contents of a wheel in a generic way. The modifier should + be a callable which expects a dictionary argument: its keys are + archive-entry paths, and its values are absolute filesystem paths + where the contents the corresponding archive entries can be found. The + modifier is free to change the contents of the files pointed to, add + new entries and remove entries, before returning. This method will + extract the entire contents of the wheel to a temporary location, call + the modifier, and then use the passed (and possibly updated) + dictionary to write a new wheel. If ``dest_dir`` is specified, the new + wheel is written there -- otherwise, the original wheel is overwritten. + + The modifier should return True if it updated the wheel, else False. + This method returns the same value the modifier returns. + """ + + def get_version(path_map, info_dir): + version = path = None + key = '%s/%s' % (info_dir, METADATA_FILENAME) + if key not in path_map: + key = '%s/PKG-INFO' % info_dir + if key in path_map: + path = path_map[key] + version = Metadata(path=path).version + return version, path + + def update_version(version, path): + updated = None + try: + v = NormalizedVersion(version) + i = version.find('-') + if i < 0: + updated = '%s+1' % version + else: + parts = [int(s) for s in version[i + 1:].split('.')] + parts[-1] += 1 + updated = '%s+%s' % (version[:i], + '.'.join(str(i) for i in parts)) + except UnsupportedVersionError: + logger.debug('Cannot update non-compliant (PEP-440) ' + 'version %r', version) + if updated: + md = Metadata(path=path) + md.version = updated + legacy = not path.endswith(METADATA_FILENAME) + md.write(path=path, legacy=legacy) + logger.debug('Version updated from %r to %r', version, + updated) + + pathname = os.path.join(self.dirname, self.filename) + name_ver = '%s-%s' % (self.name, self.version) + info_dir = '%s.dist-info' % name_ver + record_name = posixpath.join(info_dir, 'RECORD') + with tempdir() as workdir: + with ZipFile(pathname, 'r') as zf: + path_map = {} + for zinfo in zf.infolist(): + arcname = zinfo.filename + if isinstance(arcname, text_type): + u_arcname = arcname + else: + u_arcname = arcname.decode('utf-8') + if u_arcname == record_name: + continue + if '..' in u_arcname: + raise DistlibException('invalid entry in ' + 'wheel: %r' % u_arcname) + zf.extract(zinfo, workdir) + path = os.path.join(workdir, convert_path(u_arcname)) + path_map[u_arcname] = path + + # Remember the version. + original_version, _ = get_version(path_map, info_dir) + # Files extracted. Call the modifier. + modified = modifier(path_map, **kwargs) + if modified: + # Something changed - need to build a new wheel. + current_version, path = get_version(path_map, info_dir) + if current_version and (current_version == original_version): + # Add or update local version to signify changes. + update_version(current_version, path) + # Decide where the new wheel goes. + if dest_dir is None: + fd, newpath = tempfile.mkstemp(suffix='.whl', + prefix='wheel-update-', + dir=workdir) + os.close(fd) + else: + if not os.path.isdir(dest_dir): + raise DistlibException('Not a directory: %r' % dest_dir) + newpath = os.path.join(dest_dir, self.filename) + archive_paths = list(path_map.items()) + distinfo = os.path.join(workdir, info_dir) + info = distinfo, info_dir + self.write_records(info, workdir, archive_paths) + self.build_zip(newpath, archive_paths) + if dest_dir is None: + shutil.copyfile(newpath, pathname) + return modified + +def compatible_tags(): + """ + Return (pyver, abi, arch) tuples compatible with this Python. + """ + versions = [VER_SUFFIX] + major = VER_SUFFIX[0] + for minor in range(sys.version_info[1] - 1, - 1, -1): + versions.append(''.join([major, str(minor)])) + + abis = [] + for suffix, _, _ in imp.get_suffixes(): + if suffix.startswith('.abi'): + abis.append(suffix.split('.', 2)[1]) + abis.sort() + if ABI != 'none': + abis.insert(0, ABI) + abis.append('none') + result = [] + + arches = [ARCH] + if sys.platform == 'darwin': + m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH) + if m: + name, major, minor, arch = m.groups() + minor = int(minor) + matches = [arch] + if arch in ('i386', 'ppc'): + matches.append('fat') + if arch in ('i386', 'ppc', 'x86_64'): + matches.append('fat3') + if arch in ('ppc64', 'x86_64'): + matches.append('fat64') + if arch in ('i386', 'x86_64'): + matches.append('intel') + if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'): + matches.append('universal') + while minor >= 0: + for match in matches: + s = '%s_%s_%s_%s' % (name, major, minor, match) + if s != ARCH: # already there + arches.append(s) + minor -= 1 + + # Most specific - our Python version, ABI and arch + for abi in abis: + for arch in arches: + result.append((''.join((IMP_PREFIX, versions[0])), abi, arch)) + + # where no ABI / arch dependency, but IMP_PREFIX dependency + for i, version in enumerate(versions): + result.append((''.join((IMP_PREFIX, version)), 'none', 'any')) + if i == 0: + result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any')) + + # no IMP_PREFIX, ABI or arch dependency + for i, version in enumerate(versions): + result.append((''.join(('py', version)), 'none', 'any')) + if i == 0: + result.append((''.join(('py', version[0])), 'none', 'any')) + return set(result) + + +COMPATIBLE_TAGS = compatible_tags() + +del compatible_tags + + +def is_compatible(wheel, tags=None): + if not isinstance(wheel, Wheel): + wheel = Wheel(wheel) # assume it's a filename + result = False + if tags is None: + tags = COMPATIBLE_TAGS + for ver, abi, arch in tags: + if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch: + result = True + break + return result diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/distro.py b/myenv/lib/python3.7/site-packages/pip/_vendor/distro.py new file mode 100644 index 000000000..0f792eabf --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/distro.py @@ -0,0 +1,1104 @@ +# Copyright 2015,2016 Nir Cohen +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +The ``distro`` package (``distro`` stands for Linux Distribution) provides +information about the Linux distribution it runs on, such as a reliable +machine-readable distro ID, or version information. + +It is a renewed alternative implementation for Python's original +:py:func:`platform.linux_distribution` function, but it provides much more +functionality. An alternative implementation became necessary because Python +3.5 deprecated this function, and Python 3.7 is expected to remove it +altogether. Its predecessor function :py:func:`platform.dist` was already +deprecated since Python 2.6 and is also expected to be removed in Python 3.7. +Still, there are many cases in which access to Linux distribution information +is needed. See `Python issue 1322 <https://bugs.python.org/issue1322>`_ for +more information. +""" + +import os +import re +import sys +import json +import shlex +import logging +import argparse +import subprocess + + +_UNIXCONFDIR = os.environ.get('UNIXCONFDIR', '/etc') +_OS_RELEASE_BASENAME = 'os-release' + +#: Translation table for normalizing the "ID" attribute defined in os-release +#: files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as defined in the os-release file, translated to lower case, +#: with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_OS_ID = {} + +#: Translation table for normalizing the "Distributor ID" attribute returned by +#: the lsb_release command, for use by the :func:`distro.id` method. +#: +#: * Key: Value as returned by the lsb_release command, translated to lower +#: case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_LSB_ID = { + 'enterpriseenterprise': 'oracle', # Oracle Enterprise Linux + 'redhatenterpriseworkstation': 'rhel', # RHEL 6, 7 Workstation + 'redhatenterpriseserver': 'rhel', # RHEL 6, 7 Server +} + +#: Translation table for normalizing the distro ID derived from the file name +#: of distro release files, for use by the :func:`distro.id` method. +#: +#: * Key: Value as derived from the file name of a distro release file, +#: translated to lower case, with blanks translated to underscores. +#: +#: * Value: Normalized value. +NORMALIZED_DISTRO_ID = { + 'redhat': 'rhel', # RHEL 6.x, 7.x +} + +# Pattern for content of distro release file (reversed) +_DISTRO_RELEASE_CONTENT_REVERSED_PATTERN = re.compile( + r'(?:[^)]*\)(.*)\()? *(?:STL )?([\d.+\-a-z]*\d) *(?:esaeler *)?(.+)') + +# Pattern for base file name of distro release file +_DISTRO_RELEASE_BASENAME_PATTERN = re.compile( + r'(\w+)[-_](release|version)$') + +# Base file names to be ignored when searching for distro release file +_DISTRO_RELEASE_IGNORE_BASENAMES = ( + 'debian_version', + 'lsb-release', + 'oem-release', + _OS_RELEASE_BASENAME, + 'system-release' +) + + +def linux_distribution(full_distribution_name=True): + """ + Return information about the current Linux distribution as a tuple + ``(id_name, version, codename)`` with items as follows: + + * ``id_name``: If *full_distribution_name* is false, the result of + :func:`distro.id`. Otherwise, the result of :func:`distro.name`. + + * ``version``: The result of :func:`distro.version`. + + * ``codename``: The result of :func:`distro.codename`. + + The interface of this function is compatible with the original + :py:func:`platform.linux_distribution` function, supporting a subset of + its parameters. + + The data it returns may not exactly be the same, because it uses more data + sources than the original function, and that may lead to different data if + the Linux distribution is not consistent across multiple data sources it + provides (there are indeed such distributions ...). + + Another reason for differences is the fact that the :func:`distro.id` + method normalizes the distro ID string to a reliable machine-readable value + for a number of popular Linux distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current Linux distribution, as a + machine-readable string. + + For a number of Linux distributions, the returned distro ID value is + *reliable*, in the sense that it is documented and that it does not change + across releases of the distribution. + + This package maintains the following reliable distro ID values: + + ============== ========================================= + Distro ID Distribution + ============== ========================================= + "ubuntu" Ubuntu + "debian" Debian + "rhel" RedHat Enterprise Linux + "centos" CentOS + "fedora" Fedora + "sles" SUSE Linux Enterprise Server + "opensuse" openSUSE + "amazon" Amazon Linux + "arch" Arch Linux + "cloudlinux" CloudLinux OS + "exherbo" Exherbo Linux + "gentoo" GenToo Linux + "ibm_powerkvm" IBM PowerKVM + "kvmibm" KVM for IBM z Systems + "linuxmint" Linux Mint + "mageia" Mageia + "mandriva" Mandriva Linux + "parallels" Parallels + "pidora" Pidora + "raspbian" Raspbian + "oracle" Oracle Linux (and Oracle Enterprise Linux) + "scientific" Scientific Linux + "slackware" Slackware + "xenserver" XenServer + ============== ========================================= + + If you have a need to get distros for reliable IDs added into this set, + or if you find that the :func:`distro.id` function returns a different + distro ID for one of the listed distros, please create an issue in the + `distro issue tracker`_. + + **Lookup hierarchy and transformations:** + + First, the ID is obtained from the following sources, in the specified + order. The first available and non-empty value is used: + + * the value of the "ID" attribute of the os-release file, + + * the value of the "Distributor ID" attribute returned by the lsb_release + command, + + * the first part of the file name of the distro release file, + + The so determined ID value then passes the following transformations, + before it is returned by this method: + + * it is translated to lower case, + + * blanks (which should not be there anyway) are translated to underscores, + + * a normalization of the ID is performed, based upon + `normalization tables`_. The purpose of this normalization is to ensure + that the ID is as reliable as possible, even across incompatible changes + in the Linux distributions. A common reason for an incompatible change is + the addition of an os-release file, or the addition of the lsb_release + command, with ID values that differ from what was previously determined + from the distro release file name. + """ + return _distro.id() + + +def name(pretty=False): + """ + Return the name of the current Linux distribution, as a human-readable + string. + + If *pretty* is false, the name is returned without version or codename. + (e.g. "CentOS Linux") + + If *pretty* is true, the version and codename are appended. + (e.g. "CentOS Linux 7.1.1503 (Core)") + + **Lookup hierarchy:** + + The name is obtained from the following sources, in the specified order. + The first available and non-empty value is used: + + * If *pretty* is false: + + - the value of the "NAME" attribute of the os-release file, + + - the value of the "Distributor ID" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file. + + * If *pretty* is true: + + - the value of the "PRETTY_NAME" attribute of the os-release file, + + - the value of the "Description" attribute returned by the lsb_release + command, + + - the value of the "<name>" field of the distro release file, appended + with the value of the pretty version ("<version_id>" and "<codename>" + fields) of the distro release file, if available. + """ + return _distro.name(pretty) + + +def version(pretty=False, best=False): + """ + Return the version of the current Linux distribution, as a human-readable + string. + + If *pretty* is false, the version is returned without codename (e.g. + "7.0"). + + If *pretty* is true, the codename in parenthesis is appended, if the + codename is non-empty (e.g. "7.0 (Maipo)"). + + Some distributions provide version numbers with different precisions in + the different sources of distribution information. Examining the different + sources in a fixed priority order does not always yield the most precise + version (e.g. for Debian 8.2, or CentOS 7.1). + + The *best* parameter can be used to control the approach for the returned + version: + + If *best* is false, the first non-empty version number in priority order of + the examined sources is returned. + + If *best* is true, the most precise version number out of all examined + sources is returned. + + **Lookup hierarchy:** + + In all cases, the version number is obtained from the following sources. + If *best* is false, this order represents the priority order: + + * the value of the "VERSION_ID" attribute of the os-release file, + * the value of the "Release" attribute returned by the lsb_release + command, + * the version number parsed from the "<version_id>" field of the first line + of the distro release file, + * the version number parsed from the "PRETTY_NAME" attribute of the + os-release file, if it follows the format of the distro release files. + * the version number parsed from the "Description" attribute returned by + the lsb_release command, if it follows the format of the distro release + files. + """ + return _distro.version(pretty, best) + + +def version_parts(best=False): + """ + Return the version of the current Linux distribution as a tuple + ``(major, minor, build_number)`` with items as follows: + + * ``major``: The result of :func:`distro.major_version`. + + * ``minor``: The result of :func:`distro.minor_version`. + + * ``build_number``: The result of :func:`distro.build_number`. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.version_parts(best) + + +def major_version(best=False): + """ + Return the major version of the current Linux distribution, as a string, + if provided. + Otherwise, the empty string is returned. The major version is the first + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.major_version(best) + + +def minor_version(best=False): + """ + Return the minor version of the current Linux distribution, as a string, + if provided. + Otherwise, the empty string is returned. The minor version is the second + part of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.minor_version(best) + + +def build_number(best=False): + """ + Return the build number of the current Linux distribution, as a string, + if provided. + Otherwise, the empty string is returned. The build number is the third part + of the dot-separated version string. + + For a description of the *best* parameter, see the :func:`distro.version` + method. + """ + return _distro.build_number(best) + + +def like(): + """ + Return a space-separated list of distro IDs of distributions that are + closely related to the current Linux distribution in regards to packaging + and programming interfaces, for example distributions the current + distribution is a derivative from. + + **Lookup hierarchy:** + + This information item is only provided by the os-release file. + For details, see the description of the "ID_LIKE" attribute in the + `os-release man page + <http://www.freedesktop.org/software/systemd/man/os-release.html>`_. + """ + return _distro.like() + + +def codename(): + """ + Return the codename for the release of the current Linux distribution, + as a string. + + If the distribution does not have a codename, an empty string is returned. + + Note that the returned codename is not always really a codename. For + example, openSUSE returns "x86_64". This function does not handle such + cases in any special way and just returns the string it finds, if any. + + **Lookup hierarchy:** + + * the codename within the "VERSION" attribute of the os-release file, if + provided, + + * the value of the "Codename" attribute returned by the lsb_release + command, + + * the value of the "<codename>" field of the distro release file. + """ + return _distro.codename() + + +def info(pretty=False, best=False): + """ + Return certain machine-readable information items about the current Linux + distribution in a dictionary, as shown in the following example: + + .. sourcecode:: python + + { + 'id': 'rhel', + 'version': '7.0', + 'version_parts': { + 'major': '7', + 'minor': '0', + 'build_number': '' + }, + 'like': 'fedora', + 'codename': 'Maipo' + } + + The dictionary structure and keys are always the same, regardless of which + information items are available in the underlying data sources. The values + for the various keys are as follows: + + * ``id``: The result of :func:`distro.id`. + + * ``version``: The result of :func:`distro.version`. + + * ``version_parts -> major``: The result of :func:`distro.major_version`. + + * ``version_parts -> minor``: The result of :func:`distro.minor_version`. + + * ``version_parts -> build_number``: The result of + :func:`distro.build_number`. + + * ``like``: The result of :func:`distro.like`. + + * ``codename``: The result of :func:`distro.codename`. + + For a description of the *pretty* and *best* parameters, see the + :func:`distro.version` method. + """ + return _distro.info(pretty, best) + + +def os_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the os-release file data source of the current Linux distribution. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_info() + + +def lsb_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the lsb_release command data source of the current Linux distribution. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_info() + + +def distro_release_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current Linux distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current Linux distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `os-release file`_ for details about these information items. + """ + return _distro.os_release_attr(attribute) + + +def lsb_release_attr(attribute): + """ + Return a single named information item from the lsb_release command output + data source of the current Linux distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `lsb_release command output`_ for details about these information + items. + """ + return _distro.lsb_release_attr(attribute) + + +def distro_release_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current Linux distribution. + + Parameters: + + * ``attribute`` (string): Key of the information item. + + Returns: + + * (string): Value of the information item, if the item exists. + The empty string, if the item does not exist. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_attr(attribute) + + +class cached_property(object): + """A version of @property which caches the value. On access, it calls the + underlying function and sets the value in `__dict__` so future accesses + will not re-call the property. + """ + def __init__(self, f): + self._fname = f.__name__ + self._f = f + + def __get__(self, obj, owner): + assert obj is not None, 'call {} on an instance'.format(self._fname) + ret = obj.__dict__[self._fname] = self._f(obj) + return ret + + +class LinuxDistribution(object): + """ + Provides information about a Linux distribution. + + This package creates a private module-global instance of this class with + default initialization arguments, that is used by the + `consolidated accessor functions`_ and `single source accessor functions`_. + By using default initialization arguments, that module-global instance + returns data about the current Linux distribution (i.e. the distro this + package runs on). + + Normally, it is not necessary to create additional instances of this class. + However, in situations where control is needed over the exact data sources + that are used, instances of this class can be created with a specific + distro release file, or a specific os-release file, or without invoking the + lsb_release command. + """ + + def __init__(self, + include_lsb=True, + os_release_file='', + distro_release_file=''): + """ + The initialization method of this class gathers information from the + available data sources, and stores that in private instance attributes. + Subsequent access to the information items uses these private instance + attributes, so that the data sources are read only once. + + Parameters: + + * ``include_lsb`` (bool): Controls whether the + `lsb_release command output`_ is included as a data source. + + If the lsb_release command is not available in the program execution + path, the data source for the lsb_release command will be empty. + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is to be used as a data source. + + An empty string (the default) will cause the default path name to + be used (see `os-release file`_ for details). + + If the specified or defaulted os-release file does not exist, the + data source for the os-release file will be empty. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is to be used as a data source. + + An empty string (the default) will cause a default search algorithm + to be used (see `distro release file`_ for details). + + If the specified distro release file does not exist, or if no default + distro release file can be found, the data source for the distro + release file will be empty. + + Public instance attributes: + + * ``os_release_file`` (string): The path name of the + `os-release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``distro_release_file`` (string): The path name of the + `distro release file`_ that is actually used as a data source. The + empty string if no distro release file is used as a data source. + + * ``include_lsb`` (bool): The result of the ``include_lsb`` parameter. + This controls whether the lsb information will be loaded. + + Raises: + + * :py:exc:`IOError`: Some I/O issue with an os-release file or distro + release file. + + * :py:exc:`subprocess.CalledProcessError`: The lsb_release command had + some issue (other than not being available in the program execution + path). + + * :py:exc:`UnicodeError`: A data source has unexpected characters or + uses an unexpected encoding. + """ + self.os_release_file = os_release_file or \ + os.path.join(_UNIXCONFDIR, _OS_RELEASE_BASENAME) + self.distro_release_file = distro_release_file or '' # updated later + self.include_lsb = include_lsb + + def __repr__(self): + """Return repr of all info + """ + return \ + "LinuxDistribution(" \ + "os_release_file={self.os_release_file!r}, " \ + "distro_release_file={self.distro_release_file!r}, " \ + "include_lsb={self.include_lsb!r}, " \ + "_os_release_info={self._os_release_info!r}, " \ + "_lsb_release_info={self._lsb_release_info!r}, " \ + "_distro_release_info={self._distro_release_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the Linux distribution that is compatible + with Python's :func:`platform.linux_distribution`, supporting a subset + of its parameters. + + For details, see :func:`distro.linux_distribution`. + """ + return ( + self.name() if full_distribution_name else self.id(), + self.version(), + self.codename() + ) + + def id(self): + """Return the distro ID of the Linux distribution, as a string. + + For details, see :func:`distro.id`. + """ + def normalize(distro_id, table): + distro_id = distro_id.lower().replace(' ', '_') + return table.get(distro_id, distro_id) + + distro_id = self.os_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_OS_ID) + + distro_id = self.lsb_release_attr('distributor_id') + if distro_id: + return normalize(distro_id, NORMALIZED_LSB_ID) + + distro_id = self.distro_release_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the Linux distribution, as a string. + + For details, see :func:`distro.name`. + """ + name = self.os_release_attr('name') \ + or self.lsb_release_attr('distributor_id') \ + or self.distro_release_attr('name') + if pretty: + name = self.os_release_attr('pretty_name') \ + or self.lsb_release_attr('description') + if not name: + name = self.distro_release_attr('name') + version = self.version(pretty=True) + if version: + name = name + ' ' + version + return name or '' + + def version(self, pretty=False, best=False): + """ + Return the version of the Linux distribution, as a string. + + For details, see :func:`distro.version`. + """ + versions = [ + self.os_release_attr('version_id'), + self.lsb_release_attr('release'), + self.distro_release_attr('version_id'), + self._parse_distro_release_content( + self.os_release_attr('pretty_name')).get('version_id', ''), + self._parse_distro_release_content( + self.lsb_release_attr('description')).get('version_id', '') + ] + version = '' + if best: + # This algorithm uses the last version in priority order that has + # the best precision. If the versions are not in conflict, that + # does not matter; otherwise, using the last one instead of the + # first one might be considered a surprise. + for v in versions: + if v.count(".") > version.count(".") or version == '': + version = v + else: + for v in versions: + if v != '': + version = v + break + if pretty and version and self.codename(): + version = u'{0} ({1})'.format(version, self.codename()) + return version + + def version_parts(self, best=False): + """ + Return the version of the Linux distribution, as a tuple of version + numbers. + + For details, see :func:`distro.version_parts`. + """ + version_str = self.version(best=best) + if version_str: + version_regex = re.compile(r'(\d+)\.?(\d+)?\.?(\d+)?') + matches = version_regex.match(version_str) + if matches: + major, minor, build_number = matches.groups() + return major, minor or '', build_number or '' + return '', '', '' + + def major_version(self, best=False): + """ + Return the major version number of the current distribution. + + For details, see :func:`distro.major_version`. + """ + return self.version_parts(best)[0] + + def minor_version(self, best=False): + """ + Return the minor version number of the Linux distribution. + + For details, see :func:`distro.minor_version`. + """ + return self.version_parts(best)[1] + + def build_number(self, best=False): + """ + Return the build number of the Linux distribution. + + For details, see :func:`distro.build_number`. + """ + return self.version_parts(best)[2] + + def like(self): + """ + Return the IDs of distributions that are like the Linux distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the Linux distribution. + + For details, see :func:`distro.codename`. + """ + return self.os_release_attr('codename') \ + or self.lsb_release_attr('codename') \ + or self.distro_release_attr('codename') \ + or '' + + def info(self, pretty=False, best=False): + """ + Return certain machine-readable information about the Linux + distribution. + + For details, see :func:`distro.info`. + """ + return dict( + id=self.id(), + version=self.version(pretty, best), + version_parts=dict( + major=self.major_version(best), + minor=self.minor_version(best), + build_number=self.build_number(best) + ), + like=self.like(), + codename=self.codename(), + ) + + def os_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the os-release file data source of the Linux distribution. + + For details, see :func:`distro.os_release_info`. + """ + return self._os_release_info + + def lsb_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the lsb_release command data source of the Linux + distribution. + + For details, see :func:`distro.lsb_release_info`. + """ + return self._lsb_release_info + + def distro_release_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the distro release file data source of the Linux + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the Linux distribution. + + For details, see :func:`distro.os_release_attr`. + """ + return self._os_release_info.get(attribute, '') + + def lsb_release_attr(self, attribute): + """ + Return a single named information item from the lsb_release command + output data source of the Linux distribution. + + For details, see :func:`distro.lsb_release_attr`. + """ + return self._lsb_release_info.get(attribute, '') + + def distro_release_attr(self, attribute): + """ + Return a single named information item from the distro release file + data source of the Linux distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + @cached_property + def _os_release_info(self): + """ + Get the information items from the specified os-release file. + + Returns: + A dictionary containing all information items. + """ + if os.path.isfile(self.os_release_file): + with open(self.os_release_file) as release_file: + return self._parse_os_release_content(release_file) + return {} + + @staticmethod + def _parse_os_release_content(lines): + """ + Parse the lines of an os-release file. + + Parameters: + + * lines: Iterable through the lines in the os-release file. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + lexer = shlex.shlex(lines, posix=True) + lexer.whitespace_split = True + + # The shlex module defines its `wordchars` variable using literals, + # making it dependent on the encoding of the Python source file. + # In Python 2.6 and 2.7, the shlex source file is encoded in + # 'iso-8859-1', and the `wordchars` variable is defined as a byte + # string. This causes a UnicodeDecodeError to be raised when the + # parsed content is a unicode object. The following fix resolves that + # (... but it should be fixed in shlex...): + if sys.version_info[0] == 2 and isinstance(lexer.wordchars, bytes): + lexer.wordchars = lexer.wordchars.decode('iso-8859-1') + + tokens = list(lexer) + for token in tokens: + # At this point, all shell-like parsing has been done (i.e. + # comments processed, quotes and backslash escape sequences + # processed, multi-line values assembled, trailing newlines + # stripped, etc.), so the tokens are now either: + # * variable assignments: var=value + # * commands or their arguments (not allowed in os-release) + if '=' in token: + k, v = token.split('=', 1) + if isinstance(v, bytes): + v = v.decode('utf-8') + props[k.lower()] = v + if k == 'VERSION': + # this handles cases in which the codename is in + # the `(CODENAME)` (rhel, centos, fedora) format + # or in the `, CODENAME` format (Ubuntu). + codename = re.search(r'(\(\D+\))|,(\s+)?\D+', v) + if codename: + codename = codename.group() + codename = codename.strip('()') + codename = codename.strip(',') + codename = codename.strip() + # codename appears within paranthese. + props['codename'] = codename + else: + props['codename'] = '' + else: + # Ignore any tokens that are not variable assignments + pass + return props + + @cached_property + def _lsb_release_info(self): + """ + Get the information items from the lsb_release command output. + + Returns: + A dictionary containing all information items. + """ + if not self.include_lsb: + return {} + with open(os.devnull, 'w') as devnull: + try: + cmd = ('lsb_release', '-a') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: # Command not found + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_lsb_release_content(content) + + @staticmethod + def _parse_lsb_release_content(lines): + """ + Parse the output of the lsb_release command. + + Parameters: + + * lines: Iterable through the lines of the lsb_release output. + Each line must be a unicode string or a UTF-8 encoded byte + string. + + Returns: + A dictionary containing all information items. + """ + props = {} + for line in lines: + kv = line.strip('\n').split(':', 1) + if len(kv) != 2: + # Ignore lines without colon. + continue + k, v = kv + props.update({k.replace(' ', '_').lower(): v.strip()}) + return props + + @cached_property + def _distro_release_info(self): + """ + Get the information items from the specified distro release file. + + Returns: + A dictionary containing all information items. + """ + if self.distro_release_file: + # If it was specified, we use it and parse what we can, even if + # its file name or content does not match the expected pattern. + distro_info = self._parse_distro_release_file( + self.distro_release_file) + basename = os.path.basename(self.distro_release_file) + # The file name pattern for user-specified distro release files + # is somewhat more tolerant (compared to when searching for the + # file), because we want to use what was specified as best as + # possible. + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + distro_info['id'] = match.group(1) + return distro_info + else: + try: + basenames = os.listdir(_UNIXCONFDIR) + # We sort for repeatability in cases where there are multiple + # distro specific files; e.g. CentOS, Oracle, Enterprise all + # containing `redhat-release` on top of their own. + basenames.sort() + except OSError: + # This may occur when /etc is not readable but we can't be + # sure about the *-release files. Check common entries of + # /etc for information. If they turn out to not be there the + # error is handled in `_parse_distro_release_file()`. + basenames = ['SuSE-release', + 'arch-release', + 'base-release', + 'centos-release', + 'fedora-release', + 'gentoo-release', + 'mageia-release', + 'mandrake-release', + 'mandriva-release', + 'mandrivalinux-release', + 'manjaro-release', + 'oracle-release', + 'redhat-release', + 'sl-release', + 'slackware-version'] + for basename in basenames: + if basename in _DISTRO_RELEASE_IGNORE_BASENAMES: + continue + match = _DISTRO_RELEASE_BASENAME_PATTERN.match(basename) + if match: + filepath = os.path.join(_UNIXCONFDIR, basename) + distro_info = self._parse_distro_release_file(filepath) + if 'name' in distro_info: + # The name is always present if the pattern matches + self.distro_release_file = filepath + distro_info['id'] = match.group(1) + return distro_info + return {} + + def _parse_distro_release_file(self, filepath): + """ + Parse a distro release file. + + Parameters: + + * filepath: Path name of the distro release file. + + Returns: + A dictionary containing all information items. + """ + try: + with open(filepath) as fp: + # Only parse the first line. For instance, on SLES there + # are multiple lines. We don't want them... + return self._parse_distro_release_content(fp.readline()) + except (OSError, IOError): + # Ignore not being able to read a specific, seemingly version + # related file. + # See https://github.com/nir0s/distro/issues/162 + return {} + + @staticmethod + def _parse_distro_release_content(line): + """ + Parse a line from a distro release file. + + Parameters: + * line: Line from the distro release file. Must be a unicode string + or a UTF-8 encoded byte string. + + Returns: + A dictionary containing all information items. + """ + if isinstance(line, bytes): + line = line.decode('utf-8') + matches = _DISTRO_RELEASE_CONTENT_REVERSED_PATTERN.match( + line.strip()[::-1]) + distro_info = {} + if matches: + # regexp ensures non-None + distro_info['name'] = matches.group(3)[::-1] + if matches.group(2): + distro_info['version_id'] = matches.group(2)[::-1] + if matches.group(1): + distro_info['codename'] = matches.group(1)[::-1] + elif line: + distro_info['name'] = line.strip() + return distro_info + + +_distro = LinuxDistribution() + + +def main(): + logger = logging.getLogger(__name__) + logger.setLevel(logging.DEBUG) + logger.addHandler(logging.StreamHandler(sys.stdout)) + + parser = argparse.ArgumentParser(description="Linux distro info tool") + parser.add_argument( + '--json', + '-j', + help="Output in machine readable format", + action="store_true") + args = parser.parse_args() + + if args.json: + logger.info(json.dumps(info(), indent=4, sort_keys=True)) + else: + logger.info('Name: %s', name(pretty=True)) + distribution_version = version(pretty=True) + logger.info('Version: %s', distribution_version) + distribution_codename = codename() + logger.info('Codename: %s', distribution_codename) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py new file mode 100644 index 000000000..0b5400212 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__init__.py @@ -0,0 +1,35 @@ +""" +HTML parsing library based on the `WHATWG HTML specification +<https://whatwg.org/html>`_. The parser is designed to be compatible with +existing HTML found in the wild and implements well-defined error recovery that +is largely compatible with modern desktop web browsers. + +Example usage:: + + from pip._vendor import html5lib + with open("my_document.html", "rb") as f: + tree = html5lib.parse(f) + +For convenience, this module re-exports the following names: + +* :func:`~.html5parser.parse` +* :func:`~.html5parser.parseFragment` +* :class:`~.html5parser.HTMLParser` +* :func:`~.treebuilders.getTreeBuilder` +* :func:`~.treewalkers.getTreeWalker` +* :func:`~.serializer.serialize` +""" + +from __future__ import absolute_import, division, unicode_literals + +from .html5parser import HTMLParser, parse, parseFragment +from .treebuilders import getTreeBuilder +from .treewalkers import getTreeWalker +from .serializer import serialize + +__all__ = ["HTMLParser", "parse", "parseFragment", "getTreeBuilder", + "getTreeWalker", "serialize"] + +# this has to be at the top level, see how setup.py parses this +#: Distribution version number. +__version__ = "1.0.1" diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88b04c5e290c1b051ff90eed90f208e621ba61f9 GIT binary patch literal 1321 zcmaJ>TW{Mo6qYZs9obG&AloyMr+R3lW}C6p=!&jDyFP5gfEfrNV4x|Hl9}?Nl9ZkF zVgIMV_J{Pkr~ZXL?T}8hCId!6N957b`Mz`0i|I6uU|lZ1{Qa+f6#eZFpVk02&*8Rf z5H!jn+M!+1k=?8-ds$ERvwkO{J=zz0a*z$=FdNEIHVV2uu`lB+4*P)^%Sko~`=OZ1 zgX{qIBf3vxI;Imktp?d4J;;ve;cwCGi2T`&qWJal=bunbjOD6Ag6D>qYm^hqDAEeK zHAAb5*FP*Teni32)~w(qFNot>#ZTAH)pn7l+ck09D$%A&*G`IOE1aMueCr)EgSbVM zSzamd>NLt3DzvP@M=luJa<`7z6}Qe)2q>j)6h(Z8zvY4=;?J@cOfuyx+A<+dDJ!}6 z$c)hj8CK{G1M&{I#DFM>shGIF4~3+r%qUOjjng%_%296g7I@kuj$d984}%&@Dz;d} zF@jYZEm6(u1aFw400vaFamdFyhol7~9|zJkQx8w%HKw{~JlDkAoIFA&CO?@WVo|vW z*50i%jG^yuy(A%956f8`zXFUxD?sB+73>iN1rY)B2B;Z!%C0=V4fQFt5PIu#r-)=0 zD1U_(WuuD4>W_dv-&JAfe)Yd^Ul~$)*1@U}#M=8#e0_cmRlVcMhmto?DWAoPxh0%m z?9TtO+Y<5SGqa0uykiBm;6(6u%p|wlRr~?QBbxQvLy}u98prUi4DE>W4Y$yc?NOt6 z0rka#J7$QmA3D2lLZ9z=w|gNU?KC_-MLg@Y2X}dcW_qL9Q3S>QEgj>h)(pKEd9m+> zpK&t=@ow)dd7Pa6GJDVtvF`<p+Zf}ragAXZ8<@Pv^t^zdLDY^zBLzO@p5u1%d1?bp zJNBxZEC$Rr{+Cz4_oze&KpkV~S(t9EFn%AIV~^>@N0ZiuZ-`^*hL{wZ$d@jaCe1G~ zKDTrA-G+W!;Cl1*V^^M6mqwhG^CwTzWeS6E%9V8haB7PA`8Vz@@yc-DOi1_*_|Zr) j=88Lvllr<HJ>9kNvoC;wJp$419(RvB6MuC_ol*ZE-GHCG literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f929920ac81a557bfd71fdfd454d5624de9e38a GIT binary patch literal 13768 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 J8-0zw{{vkQ-0lDX literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ec33e5f50fc026b8c8579147ac1aaecdc24c8b2 GIT binary patch literal 22659 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..664d08df9c32ed2fed8aac53e3a07f793c37a40f GIT binary patch literal 41560 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 YoLBE@*&EOCKRB=le2KMU@;j6Gzd0sr<p2Nx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02ffe274aef31fa8b1472017a1fd102261fb065c GIT binary patch literal 3313 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95ba90090bc583b5797629e7700998217394c57d GIT binary patch literal 66225 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%0DvhG#6*rQX> zphNBxH|&5q#VyL|UKN*K<wS40RMV^ZdK+Z6TYBGnNhNZfN@VZ7X<F_M=uyI6iJ5wo zbG^FV*J`_;kpVcXvbZfrw6)#h#2(V<PA#=pwr_76CqkvF=@sc~lR6dKbjWSW^){83 zHkF<pm9~CWvAxRuU08swK3Z_m(SjSK!WJ{aCya5|`D!#Rt1Z~Q(-;-iqW;ZNL%*>l zrb*SRc5S*-^LJ`R?K<J@Do9Og9y(RKTU0=Lb%?#nie9yIZL00P8+5w*oat&(8R=A6 zYTqPXY~L(Xp`z8I_G+VAzb+N|1{LK-?Qw&Ss8f$@gdA2yXx9Gp%4TN28a=(*t!;F@ zVT_*2`!4a|4(UX-i<G>nJ#UwV_=xgwqw;Fwy+;eqH4~%?+^T$U(cZS`#I<Qd8<oEs zH=2o)h53k<-z&!ZfL7D49p3SV@T^<<c|>d3qYJOmB~>vMzt$bh;5T*ZTIC$>h-!^W zQmb=g!071%Qc5jNpIXem`=tkcYVkJjm3X6C+&&#ZpSTtWG`U5sL4&G!gNchq4XA=O z+>>TicDyWYwcW5q?P;%g4F|=CIQ0C{f@`H4t;&&J<@;Who>uKgmol<ZT&sg39&f6v z(l3?Vv+roZS=^B$+TC4Za^Bk~zR!F6OuW$ukaX<5ee1G?)hnc$T_VBn?NjyMA)S89 zaM~<N?J67n%F-S&WcyX+Hpof9epQ<d%8Ct|dxOsM2CZd-%=Z4*r4t);emCsaxX#}O zwMiRP)HkRwuhS84G?sCz8nr(0LO!o<+p|(#Uz1Fj9^#8{dRW}o11jr%Dwci1w0HZI zAAOBtBibKyY($^gznO)m@kN;jBVDR`eLAguYBX9+6RP%oYM$E7T?Vu8HJS`+eEQUi z^r;y4swr<*wskAFdzJfLdhFB6%Mi)x5v{RHn`~0M)u?t!d%8<$gL)WkFB{3x3!R2) zhGtdu7Uh4F4zbDHOE5l1Lx(XT;?y6|p{!f~KJNmb5F$3=u<i!Lqu=lB%XP=7?nI9+ znk_n(y(&D7y)xT6zp}kLpeofSQ}x#KA{mVvgtn+)?Nvc*Qx5kihkL}6K60N_ZEnoL z!=m0Fe3^T{-x%txD%R~UOYQC2TDw~IcI}#U^oUwMQT78Ox`!Rki>L5~7nOe<&NliD zZu^KF1s&NgJ$Z%6Az4Wd$Y2k@VrEg!L=FghkI2F95ob?k0^3vtI#p>qjTox^>yoY0 z0p(G*Y~c>72z2Xe(6>RDqUNeoZC<BxxXGj|kGfP>n~Y^Q*VTgbJt2D7_k^Q|ohkqi zJ(Df?#L<F}3bVVlm)+`Ibn6oGI&<cLOypthY^Qn-T`G=UTDa*MsjO91x4BtoQm^;v zg43(=-={uM-+Hwc4>-N-Q>)Oft3=nUW;TpDP=<B&NgF#Fxu-{T;9bgyoieopIysx3 z)*hOruT|oGrl+c*dsJJR)llzI8_}fc-OlDvC#FZ$sYiviMO9#D+tGrF(nhxqsY|mq zsDQL7HyVuaZZmATS39S3(ja;>U~H`Rwb$s2j-^Xyr`L#<vT&y?aPM{*tJW=CZ|!lo z-tvk_pL&qHw58pTNJn-&DYQpa@USwa!LjT*7ma(R8dczaWqONR_#VyH|DaUY=2&ub zTCz=ig@f8ao8DJw-(`;GTl<}(`DW!(^Cmg7Xusdd)R)VoENs(}wTa0b&}FLS5z5JT zNqXsqfZQ)>M~Dp7fHHQM4!>6&8@WL^(4+;QKz4cfLwbK$Wv4;sy;((~vs3GL?o)L3 z7~xi_ZPJ$dRiWCI5$z()M;_1`x=oW!y5u*Q6NrvIG6nl2XZy=$RPE23GVL!)ciUB7 z+Kv5vP2{5gHQIbLD_We}Og-v~G(9L+I-fNaH$8-qoTP12No#AAO#K^7n{693rRklQ zxPx!1xA)r7f^(!hjVi7Us*-K0E}c48t@k>!+O|(6xQmjg?dzOtdv$H<yhrnNnmpG~ zKyL6n=Vb3x6V&#+bG7AF=W4U|sZ(6RcRNME-+WfaAg27V*vbJlOg$<M-C{cjR0_Jy za)<pr3D?^XN*y}WdsX+lRd>2|Qo2={_sX5_0Wr^qTDgvcYC*c48=$JN-8#kHY9d;U z0amNk_#8LBzfXuRO>HU=y*lb%72IC!st&B}e(AaPwC4qhYT=EqNu3()e^zF<Ur#6B zI9hOCwxC=R8`MBFeA?*26KUejA@M*Dbx5}RH%Y3n;E?vNansR)3nfF3PEU`nhCS+c z^(u3F)MEDNy47RctByydvs%7SJKLx1>r?ji=}_C1jSX7wMpf61TcsZxb*|gYk^44r z8V<GSc+DyQc5~Qm4vp5C&HlC~9ny}Y1=mZkbGOhgwI407y(7vqp#169Zg*=py1Qgl zDmq=-`%V>(PR-t_n$o3SU6(FlP0EcX6_!r5F)cc!4?UYLxcg|q$D~)?>Q;1b(zqPT z4Cq~koji3%bQ$hc#&+pq-lSdGp}OAnnh^xG*IlA4ht`P%s9V~shPhq#FK-(osK$Pi zX6x7K*`u{L8=W$bVVR@69?jT;P3I&XhT6Lx<!OWQ3bz@LL08iqDkFP!{9P&|jSq8| z2Xw9LQ|9*R((<TWl|9yga=K4B+@}iJu59YrCR|h-(XJELt76?O3b}vp(SoVc`%W#m z+ZcxJs%g8#Z9XFQ<4DW<q;C6F>tuO5q>F#AuGW1jCVeVCeWtT}q^(vXvFiMFsdDt_ z-0s!%jYi2#y=uh!_K_Px{W!AmXu)KubZ?{3jmB!4Q`=pSs0rUjrNo+Vr=YGts%iIY zr`mKd{mQbw*QDP5^-7hc{pzW<>8$ptW$n`0?bliFSC#AECgpdj1=TH$o<Qoz`?V8& zDtG<5Pw&^k?NKrAS3BFK3fpfwt*X_go$FUE>eoT`tBm%mMQq+Bo$8cMy{QwlaR+nv zkT}W%db{m$VYxQ7(OAUox-N^D9=eYO<jvQGXg_;Yzj{=tHmcb68#8W>wEK->s_^en zOVp|sZKrzGJu2@#MwisJ>rsYmHU}5mRBmN`IPxHmVL+{V*W=Pl^_5iro{+@PaMmO0 z!RY|HUN`1O4+XXT9m?p9+Ru$@Saz!N$|iZhJST)Z47_Toj5X`@Y*a<rD9hJ?nzWsc zyRWj=F5Az6Ug@d2eBC;#ezhn4s?y!NRqERu1?X>gf^E5A|3*rsjvZEwY*Ti&>a?_* zRcO026629?Q<3Y|t%puruhDsxv_^B2A2%yR0dW^YHPM`cZr9T#Rf6`<n4G;P=e;s; z@eq#48Owld#*eh~wf)Au-7aUSN6d1Gn;Y7kF!{(PsY`bI10o6o;-DRtDhI?bJLs53 zNj|JX+-x34!F?UAT4%pOrLtk;#24|WD_Lt=MKlu5_?S%1dZx`?kn!SYYSuR`5X84h zGJc^`5vWSwuMVc7OfZrNq6`r{i#{#5mVT=fR0w}1Sx<$SPDLjA(<Gv`fnb8N#cYbj z!|@oNT%Q)NtDc$}H4T5uymn?f#(#`T4bbcIk&6iB!XKqk`*?GAI7W@&&xCAhgz40* zcUl@Rpt0z8YNq5y{0T%digyR0<c)zuJxYS$HF;?LM(S$Ojd-02{%CY+X84Wx6G*)7 z4Sx(mnenH!lm`PrgnQ<@k%x?^bm7KyZCz*;E>EA0nzG*M^A{{b1ixryIx`G4Ob_7U z{1fpT!QZCLz+b4+w{}tygwgo)0RDJ&E!y)>4+ik(&=}8jd_*V`r39j2&vfBz(RBP_ z2L6PU+OzS9KMGTZD0*2k9W{m$Gbq(NoqFt@UK62o%t<uF=_4dOHxf&ux#1F95T%G- z;=e?lnmKhk{XzBW2>%^z3V%w1Px*u}f#}LfxP)Z<;nUg~{EDkv=xZHQGh=e;n&O*I zZ<C{85k;1g>G)gk1ped~T|}Y`WDElNEm+f;)5wj#QMB=$nW>r5>GT(Ap~UgK<(r;} zCuz>6^SpScr@?VQewp>28DMnr3@{-PsKK;bGj5`Jw`MF7vYd#2Mj#vx(Nxa}BtU#K zATlH@Gh|va-Win5J0nChf?pPn8N}+bGa?XX{6!f4nrRv-$<)kfR}wS-<h%rWIhf{j z7oJ7Rl3ySG;M7J^5sKHwNmoV<5+G{^^UKSv`0>kuV*FOnOVluBGEv7cx<t}B`xp~m z9h-)?Ag;!QN=jv@I;ANm=28~YpCD`Us9f^m5PEuo#xdEh!l&k^x+^gCqJTSjtdwvk zjdmq*TiW)LI_=9i$*`nu2HqQ$pSBdAt)lsX>O&M=*GD>GzJzAAs8cKFR>jBYR>x>u z+^?nl=ebieXjf9vE0c!KN}5S<GD!lrHl8wZRj!g?y(XHXxooboMU;)%z(YVtN6h^V z$TV6r#8AzkS1qiB_*TrD1+!kUcs7EIXT#W3s96^Zd9P42WL1#W$@rL1NmiB$n@vmw zTlWgJ?m{7@74rTNC`g6a_pueVb*Z(B=(P`vAdU$L$cdbU`N&W9Rp=T}!SY;GQJ0Lc z0r9CE4`-_SFai<0|FkL*N!LPUD|nP35yZR|P|d8jf)@e$r9shmC}1E)n!o&p^{qhG znXJ<@NsGtLq!(z~d3`-e(vIn@HIqB(pBYa~i=zJFGhrno5U~W7FKedsW)@kQY~ifM z8PBZ6V9Bfi-Z+82Foh=jXUPJJfHCy5h~?<kEavqr;q@%)oo5!Ue6zUOk+b*(R0(Cw zSa-A%e=G+JqDeEcmT9ihnxq6aUqe!2oW>U6&q0mlFzqPMtyw%S&nz<Fv!^X&d+3{u zKUyWhnjJv0Z?+C#HuZVr>_`;fnoBLBKWs(sXLIjI&&CG;GBEprXeHi(K<Of*vsFe% z&c>=r!c7#)N<;@?&0#6@&AAC)3QEqIPb~J$Q5hBrhhdJ0E)(=^4zqKPuyYQJ?i>|e zq2TWvNRDrgNbPV?`uav<?Hma89C^<b)kAAnac(snNx_7^Gy_H-AL_yzJ7C+V)5}HN z3A(cS=BSX*VOCgk@Rk)ChA?1`_%G;2dL@m^JBLM>e$ls^l(oEed2b>HTQ^BHH%a-M zlA#2R)OQn?&saB;R|3LCd^h72F(iLCtF(D<rmNnYxu%<?rklAYt5QU_5~5oP(e+m{ zgE>%JWmA_c@mIr;`^o^n+*ahi5=Mve=z@uW_%Gf{YG^Dk2lTh~H_B^SF}1E0Vx$vh z%Xoqlb*}&;D0O;>-+T;>rI?s}r%Fv@%V^B!Xvw!aW)hrCE_2F#nHi18F$6B)Zg&jT zkZ1CXC`GKVhSd6w(x_>R$F(>S0l%UUcCN`pd8FJKlVVhwDv@Q()WZdr)VbCPu6aq_ zpbV}d4X0YnW$u^jB9B*B2_A2P7IjU)TqTp-7sp(nd@|{>Czy(4(z#kpF#<C$nRJ^G zw3JM$4e?fzw0SDYW>!YgJ#ElmSsP*X995a`IE*)O_jHV=M0Wz0a#hErDDEB<mvSdq zm12-8>2I-#S2~4bIKf@NRmpnct)yLqzfujArxNDCJD0qB?_3h`5pyB%=~}gSC3Erq zy9oZ08f$`gE{(f{eQ$BOt+}FcbGc^E+%%MG9xJMUp3$~>Mw8|lO`1o|oG=ex@=QhQ zLwU`OH>vn)N^qt2VVo;5rfDacG+Ne>*`%L153fQF**d4r)Q*<q+yocR3#}H*?VU%X zDw-FEcND-PFm_%%#zE}UjM1OR!}QK0w_zlHUAur1imH!(BEq7|d7j#EBs)$;F-63w z9c6+lS5%c*<Ef0(`!TtQ7Cj-C;u7a^xm2g@=v<nJHg!_3x&_?ThIWTi@>ek$x@#e$ z3?y+z@26(Q4@zO%Kn=RH=@7tiB$KjHwG`3|)MJV|Ll~h6lA8ueA$R9Z4chZlkY#8& zpu&SifvR7Cw}FQ6GBBQgC#D@b$(6y~Dpj@+rw3R(o#}=2h>guLh31O&&?GTesM5St zZH$;IUgn~76<*;3Uvp53W~A0lM!bZBvz~lRnr0@^GW8LEC9D^T0gKYXAboXC7+_+W zf%<Ba+zg<>nsjBo)Mff386>84k^F03l79~BB^nXOT_Ww|(K6KeJms?Hk?qO)=B4EP zL@3PjJQyS2d^!oj)%ogN359btUz{r@ux#XlW&HE)Dt!EyqA&?4r0$has!cpAP}nZm zjQM!oJe_uAtodvpPMnW-OB{QyFxpAhV+GHASR8A<bbNl2&UMf@Q)*U6B9ywtZ~K8O zHJ@E6`lZGpcq~aJ9D+N7m3f2-<BjoHrzy4o8<rT}ah9a>pkl=I(8jxf#_U}{*3Y|u z&RIMQ=&*$>yB@EMT7VZ~!F<y<q1nk@z{B(`K#}5{%8W8WoyYMe?v@oNlTM^>0bZGf z9v9)IX>vj`93lEnFWyN5n~;mp{@+?4YuAEg1bnz<$^69`i+<7dTWA2*EwT{Z!r6Qa z!5GY-XJN&xj2Ay(;zC`ItcC3Kfv}%PB!ve23(YdM&@596i9eo&=;P?YT0Y(+xHoVo zYT^=d^mF?<??UGA!kRdoJz0<Q{Kw($HF{Jo!gG5<F78^}M{=s;LXPL?ARp2s<~fmL zG-u9>%w==ARnjH(Ba68Vdx_G!+$Mdrx#aj~lHfRsWAoxXB5BZ=LZkVdFW*;`vU$#; zw4d`9O%_+zM{rH1Khi<hWf>XfoQ{XAg)B597vf~jb~Z>O7A9Oyq_t24Zy`BNBNnD{ z3>m`fW$575zi2j}m}aa+yhZUZnm=<f+mS^oYo0|gCVsqNjg15XdK9`ycR_q~=Uqhd zF?vxAM4vW{)1-5f;F|O?oP&p_Sw?b-bHw9Y6baLYZ3OTBr}LR92DwNyW6`PvEP~%0 zV2qbQ{@!n-Sx;o)8Rw4bOpP{a#>AhHpP<=BNa~UpE3>tTnP@G7rwon7;zK>r<!waX zT2yS-6C4tnpw>Cw#PiIGNmR2!<!ct>bDG=^9i%LxV^k!Y4x`$<1qmIgqs238EuKAp z;k=BG39S9%h0|tK5S8h*7Rz)k4xsnm#Q`iY{>5f$7aOC&0^nUtQ(CeZuLb9?%TOgX zd=Nj}?bjlM<G1>>|HGLYW^=@~8p>78YAxoOErBlKMMg8oH?<Zsqy3A;xzGBR=(;Bq z8J0ly!44vENFjQ*q>A_3eo(m+vP70fCK%}w7U?BsX<UM#p<Z1Yg;FiDG#1mBXk=L$ zE<stBMmiB*n8tE6Z)NhStdua7?S*fNo-{1skrp|kK3qd=QO0V-r930@PESV-vdBI* zD%iX+Rb@iu#1ohW6t<y<8XLU?UnI}lSaE_|53MCQ=EF)xL{9sb=uMs_G961&d;p&H zF5v~7e!;S(bU2SGSz5(fv6T4iTT0)9fMhX6F7Hx0kM_gm;anE^KIkG5=OlQfiOGg$ zoQW<9VMqbIdl9;1(o}XR?%p<emy*O<OT|_!m2NMsm(KWZ6?^5om0m=OKHbWhZ<Wlq za%S&sl;*h&e6Vhl3%BtFYZ>24vzE#E)iM&NtZ$jhrBIA}nKa>DMqKbN;|7*VJ<GHn z=9;x!Z0&M2vHs<%f?mD>VlC$l_~_-KM4aCwYIbnT<v!SQu6Vgryqqe|`U2V)p<s4E zG$G?*Uoa4a5%30rHY`LyRD%ge>1Lu&yMjCzniUA~%||BSNPsrZ0W^z-RB41lVDRG2 z>f~BFvqPv3(+(<k76a;Of=1!Ldhlv2)IukTUcAAN`WUl0VBr_>VvuAMuQmhw5yUMY z<fFqy{36Y#2RA4du1!jQ3IwoRpeP4n)l3kpmI=D@q8^iqF_|D5F+m;xZjV7gi%@AI zRj+kYNID%($}nT$q~^*%&!~f{=>eV^4<APa>cDw_00*yRsJsCgU0noK>082Z5jWV@ zP!~9W+nAUDxzWmma*BKgs6ijz0Y^+MVoJGvID_E(u0r8l23SYwm#SSI)SG<106u1g zDy%B(KyalBcVux5!yiGxkkS1Tiq)xaOJP3F=TwB~KC2&^T+dpK0N=tzWfY*9vZ|^Q zID{xBlH#DRN}BOjv4N<v@n$rtgzxuaC=x(Xgy=p6=H6FD-Qi4hE0}6!@h5^wLdMi; ze7_hxts;H!<CWJz;&>4S`0$>SXyK$JeB+fzj8GllX)U2d*_5ECk#KTV(B!3;&tl_& z#FTo0WJ_UyTq(RDBc7Jps4eCPRi$k3SFME81Y<msc4RA~@eE!pj4_VjXj1ROjN+JS z2<~-WTpG?#gTi4b<MZ;dyGKmJCI_qsT{-0vrI!i4R48sJ6VGTXRD@r6`CztH72~D1 ziX|8C?nVQC{HEeiYy?)PBFOK<8#`xIDqX0QRsl)}$1Kp<5}iFm=@O-ocgi-KHngBi zw3;Pa%@VC<iB_{zvMtr>mTLB;ntds$DXLkj#g?KNy154b<$|pRY%O4GMqBIG@-^Dc z8to?Cl%{%X(9L4dTDe7EgrLkbC92R+zO*)z)@IV$Oj?^^IgYQX*J0Fa_Ik};uidEE zV)ZEIuTsVHsV@Us58c8Aro?8p20l2rwX{@Kv34TLdr?H=Tpb9RE{fJ9$y>Fma1)9e z0HK{V;$%nges<i}QHoi{b$ONoZ?Knp=w4PVdZ9g=>tY1pZ;=L2nsd=fVO6t`j?KCc zOB*#tl=j5Fprrdj<sl24+3-UaLOBPkFLJ`Eg_JT)LJ+MW)tt4Y0Ny9h4`mbu)nsJ7 z^oDul;wKwQh=dZ{7jKZ4%wP>$AAU6^TwA8}_HO7ykj@UgY@;pwf*nL?=R<@n-WUo* z@l714v}oX1SBmOiu_TeyncyP$Xqw9AdxS=az!qpsoD^ykGeAYF<*^KE9tZNog-9X^ z5PzcBbx<y%=?F7dAMwCj_4yGGdc8gZ=(dkvuTSHkJ7F~I^m0{+*HvRehEv?!EiRGB z8ahNoMp_x@9i(CABC61bUhuk7te%Kt;etznFAdbKrTlg9dnk2nlKYvEWf8|q{76Vp ze4ro;qmKy2YJrjv5<%1#OmSO9!L*Ii5LXRxg=u{8i1Ofl-aIw*PH`k43k6V(mu0XR zzYtJb4g3h^0wS_$xW>%1G)`)$2P|gDDg8xl6o9;qKq$I4w5kpVtGQSbr;NmXy2d7d zI0wb(XVE#l<26PN6UC+&fqJ*tjL9V!s~t>pMJOvvX)w292W7?f2iHdN;WG5ro<>8q z?Af$N`E7kx1_9_a%!x&8V?r*tkK_tQsK_>Jkx%zPe%tt*HYtUN9IztWROds8IctMe zN%Ao~b|{>|rzRi~K3kr-DYDI4?YFBV$r|v~Ym=h+Y<y>hY!FfI44#>x>dm7wBQ&Ja zOECzX7cchbTw%FC@55VdBj6y?>*3_!7cZH`keOmNmH_Tw(|g2;7m@mS4EEo$SJ06B zb`&4CLwO3|RE`31Jfp=Ol66kx0KcRu#Y{Pgg2wbCs15@{X3-vP^D|dDm#4(N+oG@& zN6*Gk1gxlw<5j!7c#n0Z7}H@V%pCdcgy}iGW*R-WY|$MMmH{^Lep_#U`D{@d%Z3|4 zYzKjU`fNPs!PAjO<HXt3>Oxy~hUzJ{GZDD+oF_z2WuYP7gJ*pq-A@Pw>q0PI^iY-` zE}I+|hsYXbEh2b0g$Z94Q{)YCPeWiDq>DU7U#Oa!@P<f6Jdh+bqq_;AnCeiNW)i<z z4pLN%y$Ijkr^~c};g>T-C6h0t`wW&w%1<67-%9X10*Y5H*G;*Us;0nYG*ASnF5Y3_ zW$K9dLh8VWSUfD+dQuUPB#ASQkm(scr1MtUahGu+NnVscw2GJkP9q>}@P$_K>O35j z9_WBa2}`1pDBn3kDf-4H7pHHaQbXdEp&EE+{LEZvRlU=T1hdf>l9{t$3sI*pB-}uh zAH5-8IqQK*zz|^<vfdDH3FwzbkWRq=wnA%yJT7`Bhq}cdM#3h753kL;;_-kEW^YtA zo*cs6M9d4>gN(PDb*vi9r_26oe8qsC1o2f@GerXOBf(qECc(M9f>SMgLY79VnLtx9 zVr?}(nL<Ps7<}IYt#X`JX?*D=u@ZbPt_CmgO%C`1K73#$IOP(w&y+esflJMm%QOKq zE>|u$fh$blN)22>;z6Y^xm-(Ms-?+u<|~()(wCY-mzk8yO?{V}OCLdiy2qkZ4X**F z$g1Ya@`NkEm~aJ#<`1ir<x{JN1T56B#@;Y5U}4?J`*c_14YOj&lI-E5j4(Y3=?&Ag zSokGd2Ey{j>0qoc3^AcK6O>h}NCJ=o<fSBX8c~{hOPL^>RF+jWOw$;qUtbuumNT-6 z^@O=$et;`XPrrJ@(G~O?!}zRlj0R9lL^ilcho~T(dg>!0lqJ@}#*B;>TLj7_7B9>f zeMC@}X%x?Lg;VmrZ7ZCjVfjGVHwud-^oLW?1#I)eDgLl9+&!qC=?E^1@=$=;L03bo zL?MTBSR+M<sGcIkohiXiFOiboTj6>hYt1yWqW+oyyfm`cHGwF3NHu|4e9?vj30`M$ zfie~mksecs&hcxom|!3^VnO`)o=<|FlPi$`yLm{2PN8}PutLz%SVI$3T(c6dXXmXZ z1y@VZR}<&9{5A2~6fMr9YU1&gwEiHOwxy#f&a00mST&+{IK}7AST#Hc{u+o9AL!NS zg5$4Qt9ywWe3u7a4!)hF3x-hG_ec<nLxe_?@i9SfBP_ZRS{iVTtPie<5%S_`Y|4T0 zpfX(+gi>X65D>vXI=%2IMM4Z84Ce%Xe9IRR<Km0xiU3LqQcM)a%LK`KP$~Gs<S|8R z$>t!6ckokN<TA)DLrRq<ikb2*7}w-5!OOitG=;}msTHhJcyJk$#z8osnhKwz2Ii{> z8Q5V)lX2pNFQV&BMAn;#jzYX@UxXzWeNhR<=K;vlgUFykDyUXamSG=-&^mvtDhWHu z37{U@Blz)HG(W-Yi|9jbct8dZ=hH8;t`NENvR->vu+3hf3|b-GTOrc0!aUrzLLP4O zt%O=Z_x()KoPVXckw6d6WxOk?GXKhOf{$ygmAnhHR&q<$N~wD#*X@f=W0AF@(^#FN z)97np=p8*Rj7mIgX`&UdL{@Y*FU~kw;pe=IqXB2J$Jfd6xf-+?4d_F1SbE8N5y2EA zU7i8M_de<%iO~R#qv$H1N+C*ZA(}{F*IdN3n)pf~CqOgGDN#~Lx>Sdra&EQ~oJ4nJ z(Fn00zdROHPtT>J`V^U1Ulgjw&B>veKT6+9M+OPds)v-7NGKwjjFO)&A)Hb8qw0+z zp!ekvAeLFtAnp0RQC7JqynU)k&)t}!(W0oGARiqPi%=Thhd|K6=hdJV9$MB*T;^hw z6PAIDp*TvAS4-|J42&y<wpybp?v%n{Il*mlxQ<)`vW%nroT61D?F1(c{&yq{ezEzY zRD3@#6w(cVH%hw`{L(szUs?x2%sR*`nh(Fc4uZ-$C;?grHN-3kB~g_hDOd`zM@ArN z7LOu|$f7}^&?>A8ngwlggtO#ADi69x@<*%X;YM$i6vKnFadetI0$&tk#{4qn*+ra> zl%h2_(4$ewvP(XZkG3)>UmWFa4*TX&r-CT&1pHBbm=A$CzGg<<<UjytAJi(ZT~S%5 ziRd~V<#igrv_2CN%H!}w<El)uydcg;yrXd7fCnp`)n&Yi=cbpMM<#sZB$)!kM^nUo z6;;Gxn=!jo4`<Lg=c2w)ocJIM6$pFeMNxB->&NF@_?U$Pyoh;m?n;twPG3<r19NXh zxh6jmTA_VW@d%2ey!Rq@A_@E_F(8V0@kZ%X0LjYSq%jz5yu49T8!M_@0s)JC6vYH1 zc@@+VQ91c$%602q&cY}>8tRA@6^{mlJ({R`G*K3H>W$g&MpGgIMN#A9;2J$D!<Fz( zki>v{0g6EvN7D%?H{~coP_~67QI|UtWp~C`%ez5*)DVA8ld)tq1tF6_1l=qm5~9D= zLMF0+W>)b{E}CAk2pW;;ES4*L2qPcOqhfq6MYZsXSStr%qiV6=#JA&ce~2H}_12QA zcx&<eN!H>AmNGsjlt{;8e*DV3BS4J9$2##P9DLiHuE_GJJ9;GG@2)Tz5+HlZDK<3D zs*MIQ7!W!r_SeQlzWnqhHQJ(CwJdlZIzhAW^&ZZYO!3!VJhiBxn7_%x9P!nrnR;XN z7X$dE$;B^L$l<ZdoT7~3h+7Z5u}WGuVwGH?l1hw-Ep$E5;g9KkR|JG%z8Jp$LyK@s z*F!7DTIyxpMubmzL5Nw%%snmw6^%y<KGg?KFlE0*LrH8MV^zsIbREA`R!)umOi3Q_ za23rzJ!3^KDFV6@#pD37m?=*I^3v>k@v%v&NxJSKW8=fe70H_U@zpnWmXN^at%xbv zd!%qB$RgWg1jy~>E39-#kew_F>7SW+V=Oo^-f;2V7Yn~+&WM1P5Y;7uE@6^!iL3MC zdyzCgHsrpTxcH#lFHklho){e*$N29Q@k>@B#&=X=Y^r@Rab>(Qa$OMP!d8ss3yB!| za6S`4It_9RN8G}IywYD;(Ml-l^cM>d*UAS8s9pQb1}&y*08^eQXabFgL>ONxg>K+` zuo$5azwGofMK_B%z|6*nOL46plBFT?h$M}+T?o<mDFvg}TnK3{gpkXMF{et1U^`Fy zM?ZymV@v_`p(s`tr(+&sAD!_c1MV<zuW|ZHEy*D)^3hYSJb{U6>^Q}AE60?!xEug4 zN5tHG^u^R{Gewo&7#||zR~t(5-^L)0_Df>;bXx+4fZ*6@3Fmrm;nRDx5D-B{ex}@| zBp1L1WTrtSSIH^2g!tZXOpd>aRB#=942}%?C=pub5RGxT6PDWf<e9SKUI|jr4^k&I zmlpMwGjz(pPXo~?IArRgRF--RCsEi&`*3#3H;#o;jVW?RM&Vic2%BE9++*_MRNH7L zg?Wr8Zu1i;k0%C$=*5Q@iACvJJk3CTP4l^%KUP0O_LQ;u*{T!uVn_6W4J%g9_mV+a zKI(NRhLWOE$iVB-|7-8udK@{bI6k)f<{9tI>?R}-MQD__eIpxq;37mW8;FzylwF9l z0$H=RcW08FX>YgN_E?ET!u_6bzXd)D5+9?#!9F2@gy4<e|D0;uqs`?3@`T5lI;X0u ztE)~`ojT{#>1u#y2#XyVd}L%GVf{Ouh8~;Qm`P93ktM(<Lae6*H37LKjzjJ9YY-?8 zYOO;El-nv3o8M7w0R2`mMqcDvUG97>&4Z~u&aq7ER%c)N5bLeDa4shc!CSV{M|><; zx%2`y4-P7@LzOKuB)OXjqWlP|#`@H&5}m66t)L9(TP~!S)*I!<5%QoG=fU+iU%LK+ zQKJ-KuO!FFVUm$t+Tv?%BW<n#P1@qSd5ZY7i};A1#c-Ko#1o^R;V(+RMG1r+IkAYw zLe7veD_>ryB<=}bAKYVf(hRJV+^h~{H>ldk>P>nWvkp~W5Qw^t9BRqRO}AC3%4z=; z5^7S`3J({tLO7j3U`e1pNQ7{kvOwKvti>vY1OpLU$T6E<hG5)LKBG<s;G>)js%UI$ z&RAQDF(GYA$49>VmW+>VgRV2?;x_N04~}Hi)J>ib)l?hwnY@(;uOd*U!esS~o%(z- zx+>k9BoQiBD`;I$<_g`!?gC-{Ssu;?FnGeglyaP~PTNh^V8bRe?&^%`AOC`|jjVWV zYXzV>9a5Blav3pglXQ$tO%HKq9T~5VomKA$Gy+CX5jMWGou=9aCT__~DWt1p*ESpt z)gv|ZjJu?8JB(N2*tn1e!{aH#ignIRy1Ix$a?IB1dqaZ>NU8d6u-$L_LZpnPkx-C5 zhzB5iTHm^8@17`Q4nnX^gS$3U?>dd{+FVK5CA8HbzH7JiFzT~mBHvLenknX!H5hY9 z(Mvw;tVL)9>{=_N21T%dI15XQ#sVULMA{J-a7zKV5dh5kk?5<~aG-9nw1SYuY#sud zp@Leh1mT-C*LkGUO(P*{@|S>hsSu4VgR**%6Pu-#5X>M-Ff)h{GlK{*Gl&o;r7)R6 z>~=9&y!qUyW8cAL78vAv;P#AQ4Jm>(q-d-mhKOT>m^DPuts#yv)>BMwE`zdV?*}%3 z*c@ei(wNA+L}N^`5><-f9XEa?MX-w)H1e7WB<5u*YOarDhM^<O*+L>zLy*DAK18R` z_9%gB(J1;wqv#hJFG<iM4O(rHB&FR)h1}|6LT35Sy3De-ia5<KS_1d2j4qxhBuO0D zw>(<7p?p50j+d4xAscC4(yDxt{Kj<?i>IvHSYmeyy->*3xZDg%im(C|GC-(Bcf{z6 z#^~UP8y%A3)P<xX*b#sx#}#fzNSKR0#C={7g=47~8a^KvmLV0;qS!6QjqsQ-czqZ* zx;ai0Rw2{P3s=Gc=6+_7t7*~b*6b=dV{utAY2*h%>Cb{LR%djb>(8BHP7$zVpNZv7 zE4(A&GAiYF8S}YhaVLO{&Ll{jT-Agm^sy=y&P`-DrUnSNIaBMFgJm;IXNZ)*+7!Dr zDiL6i8>HZ*3@VkBBolUo&|H1X)r6fo(i_v<uOTcTccQc$X$OJEA}j`ZfTAW^GsrS0 zXH;rDr-WwqOJq^71|GSGO<bCZx4ROdcMYY#e6g)N<<S|%97zr2>==6+-ylRz4Ph!o z&OiuFaEd{!SpW&YL?t~57?F={ttV=l7EpR+1`Oi|%m+t;Kp{Hp^0nPNd~CXDWlFp} zq9NV#q}lV0gG3LIuo;ynMyV4s;S$j*l$QCei8>;(ZTXmxZXi{rT~*WvGCG01oVV?W z?da%J(_~3-KJ>m8q(~*0oy4FgnBI^!8b#L-Di6zOP?3c@k@@v_L8@#ST^+EDt^=sD zcg2JV?Jx*Ov?h`QNJ=MGT-pRmF?8Ax0C7@)z+mhKbC*m)bRUD(p==e)?eSidViFPg z3N49|wI?Q|_fkOUWLJlXySAT!$)=(jRX2TN0Ih4Qn@!hNEE6{G$zwF>IwFc}H|PpC z!{&~syS$+aFhIN};0*#LsiG{#WS8q2q5{*sr^rg2X%sR`UWqeG4&scV_5d0*XlAb+ znNe1((>3H6KdxtuANR-=i(K)@6Bc>GsOD8Nw_<V|)hKg3v|6hGrwyA~5-4=($i}5( zYML;g0>YNm9S7=;19dt3NsJfL`0#<I&ESEijyg?+H#7}67wpDB({V#n5E_t_K@k(H zao!XZF(tSnR?eiHA*hrK^dxQ(pj1ZNZ4LWqqSseqcQ8)bgY%_-64+^EQ!)<L)5+)# z3$<=C*2SxY#psia4MUK?p;-d1Lm;{a&80mx6js!m=vD5f_sK!bhYP6tj!cfYuIjM^ zOQY*}f&t-FrJ55`;=6AoYlR`%7n;-{ebRMA+`!Y2*~lxEBc9|V>J{-(a9zyD?w$)` zGC!B4tYreGN{~>JKV`GgIVKZQM;CP)r5=yu26Z#-GV1F7UUOAZn?g+jy}H}rCOaTC zoQo@WN{UZrknr5FkYuFzs7k<0cLA#DR=x3P!FHrtY)nT$E5yXtlXT*?auR08T8A#8 zw6HxsT*^9#Iw5H#*ic&aq<BMIeM!S9se(%HQ0c}x5_pJddO&}NsM318NDM&!%Iacn ziL|i_%6(F~44GCz>WeBy7*7fMyF(fwVL@WBpjdw8TRLeKywtjm*gg)ZxqT%tKC|Ov zNtRCBkyabIQd@<+<H~!#Vj;14(-TivzWKAu>|b|0+grv%_a(uBJ!V3)`V%dW(K<6h z_GjRG)i{(bUQh+kw5}sw+u)>@R4yC>t=2J0skJoB!76M($9&k`9tF@!Q&|VpQDr*2 zLOp-!t2XuCo1y@bS%3+dH0Glz>WtL%ovB{&4R!7k3A@rt$2!R@74IP8i;xg$;DSN< zi@|w<@|ZxbLV|2^L8z@P#^rX`qYQYzykvrYdBq1+P~a{5LeH7jF0Q47E{Uc#(t;f< z^4BZ~O`1qRY?4hIUl4Y0T+Yxo4&!uc$_7R;Bk~jzAnYX()XFin;gU?%Y9)uRn))g~ zC9_t6)DR}65L*`<AtjsQG`KjF=rwbJHN|Pw>*hYN3niG59fY%(cuq7^rQ(@AyfY)E zGZU?6Xi?^aG4lyOH!&!g2T6EtLQpbyzs6{8Et>~J{M;u}XRfg{cbg#4Ix(Kx)=NA$ z!+bJ#(_1{Z=cfQ)+2*EF==NYso(G|4?&O#^V%R*)l4R~<H=cX1%)P~Rau%41Lz)UA z)^+ABiOz`CoiiMRBLWC=W&}BNkC-#7SA6C~I1{I-qcfWh3L(@Ys2AxXtaFihaK;N` zwCRFPaFfLrwuD6sD}7;Nc(!!%j2Hf#g*_))%<$EU7qin>{9xa|{Uw~P{e~Zl=_hCY zHGFO9El+&s@?%AdV?Xa*Q1DF!Zzy<E!M7BATfuh}d{@Eu6ntO74;1`R!H*RDSiw&e z{8Yiu6uhP2Z3RD9@CyaMRPZYWzgF-Y1;17BI|aX2@COBdRPc_1KPmXL0;{P`DZQsN z^zZ4&&3ig~{+`bEy_XVP&T7u;!?k)ms<)qJNF5Gzl2pBSO=o4TC1iT>cXIvkcAZ>3 z9SUYw<!CC5Qxs25c-^4h{tAp@bQMlq6rbj~#b*?JmSCW&=uZ_<J)Y*j{3yZgt=G1` zvH$h<>#f(@ueD!m-D<zxz8hWJD*nzz3odtxe}LDmSL@bvm0bKw8U9UhwnJHJX0lbY z9XmN1fG_{_<S+1F?h}l*ZnTD5H`>G2jn1%rZR>KU-g^d%%=7r@zYME{PcEK%>5wBQ zhX*rUyAI%72S~a)f8hWhxzWLKc~EJ$ada@r58$~4yKuTjzT?wzH8~hk+>4i^I_vjO z4^Kw@e!boAvxCZe=it45U;eJ)O4{!a^FhDA)+%eZHSI~7^tzfRdS$JsRVd}%+txeR zHrmy$FZN$DHEwiuJ{XPV)%qfoe2OB9rxiS-U`b@h?77c!;mwAmS*uX|@+Z`aTNT@+ zw4xwot58=Ks#`6k2Fh`s-<O}QTUYCCH4oixFe>XVYBFzrAtKj%B`-&iFPyYe)|Zgj z=r82FRoY%T#+jN^@%*KXvVQbva&qT6IhVPmOb1#tXYrKvW9sjdJJ-?7-!snxhr?HJ z|G4(GFFrY;qBpTrl=VZN_yV`T@cdf(!=C;uLNTYhu3f+ne=w=z;|Z?Q^~V?kR_Oit zXu$cY^YBE&<vB=DOkQ9oec7@--fKKQ?&GR~b^Wj$)w`Bpr#@LcWT^D|@>&Lad)eX_ zLJ6aZ&Dx&dA7Z>RaQk>d4;+o=Yv?ncx^H={s4MowdQZaSdRO$O`SEaB+Y1AY>}7Pf zI3K@wGtYTHXq{pYFfovBN9D_M(VLZzU-{IPdS{M>BBa+@lcWBKolwHNOr)%_o$X2f z>ge=3?5V6TOb%~fUqv&f-mPQa)v0&B3TeaawK-CEmt)>W@4F52I{TbY%Fl~Il>dBi zYwN*w){dg~>aWx8tRexsKjpqG|Ko(_i7TjjHL-TUJgrF;Y;a*7Z}Rw+^)k*?Ig8q@ z=9hKat?du^?Z0oH_rLl<WxvPu&U>VPKuzzzYgM}yw%yuaqd-H6^Du%Re>lHhr`NgE zYJU4*`d9c!r`OtTx0lb|hVIQTTT!IlYxSZe^DEIZN0U=9YHfFVl(hcKqFtljZcD#y z{vQhQOP2C+;=8R&N%GjEoe!twn^HFv*ic|Yfei&V6xdK;LxBwiHWb)UU_*fo1vV7e gP+&uW|4$0+M*n@gd)TwqOOb_XxAO>ApoilB0Kn7d!~g&Q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8920cfe1cb21a210ba3fd3fb75b0e79f4842edfc GIT binary patch literal 97822 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bbea4c4e08bb0f22d91002698a2ac6aacc2a236 GIT binary patch literal 10838 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 000000000..68f9b1e26 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_ihatexml.py @@ -0,0 +1,288 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +import warnings + +from .constants import DataLossWarning + +baseChar = """ +[#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | +[#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | +[#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | +[#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | +[#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | +[#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | +[#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | +[#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | +[#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | +[#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | +[#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | +[#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | +[#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | +[#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | +[#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | +[#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | +[#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | +[#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | +[#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | +[#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | +[#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | +[#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | +[#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | +[#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | +[#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | +[#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | +[#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | +[#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | +[#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | +[#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | +#x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | +#x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | +#x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | +[#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | +[#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | +#x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | +[#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | +[#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | +[#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | +[#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | +[#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | +#x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | +[#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | +[#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | +[#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | +[#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]""" + +ideographic = """[#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]""" + +combiningCharacter = """ +[#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | +[#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | +[#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | +[#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | +#x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | +[#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | +[#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | +#x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | +[#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | +[#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | +#x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | +[#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | +[#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | +[#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | +[#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | +[#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | +#x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | +[#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | +#x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | +[#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | +[#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | +#x3099 | #x309A""" + +digit = """ +[#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | +[#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | +[#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | +[#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]""" + +extender = """ +#x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | +#[#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]""" + +letter = " | ".join([baseChar, ideographic]) + +# Without the +name = " | ".join([letter, digit, ".", "-", "_", combiningCharacter, + extender]) +nameFirst = " | ".join([letter, "_"]) + +reChar = re.compile(r"#x([\d|A-F]{4,4})") +reCharRange = re.compile(r"\[#x([\d|A-F]{4,4})-#x([\d|A-F]{4,4})\]") + + +def charStringToList(chars): + charRanges = [item.strip() for item in chars.split(" | ")] + rv = [] + for item in charRanges: + foundMatch = False + for regexp in (reChar, reCharRange): + match = regexp.match(item) + if match is not None: + rv.append([hexToInt(item) for item in match.groups()]) + if len(rv[-1]) == 1: + rv[-1] = rv[-1] * 2 + foundMatch = True + break + if not foundMatch: + assert len(item) == 1 + + rv.append([ord(item)] * 2) + rv = normaliseCharList(rv) + return rv + + +def normaliseCharList(charList): + charList = sorted(charList) + for item in charList: + assert item[1] >= item[0] + rv = [] + i = 0 + while i < len(charList): + j = 1 + rv.append(charList[i]) + while i + j < len(charList) and charList[i + j][0] <= rv[-1][1] + 1: + rv[-1][1] = charList[i + j][1] + j += 1 + i += j + return rv + +# We don't really support characters above the BMP :( +max_unicode = int("FFFF", 16) + + +def missingRanges(charList): + rv = [] + if charList[0] != 0: + rv.append([0, charList[0][0] - 1]) + for i, item in enumerate(charList[:-1]): + rv.append([item[1] + 1, charList[i + 1][0] - 1]) + if charList[-1][1] != max_unicode: + rv.append([charList[-1][1] + 1, max_unicode]) + return rv + + +def listToRegexpStr(charList): + rv = [] + for item in charList: + if item[0] == item[1]: + rv.append(escapeRegexp(chr(item[0]))) + else: + rv.append(escapeRegexp(chr(item[0])) + "-" + + escapeRegexp(chr(item[1]))) + return "[%s]" % "".join(rv) + + +def hexToInt(hex_str): + return int(hex_str, 16) + + +def escapeRegexp(string): + specialCharacters = (".", "^", "$", "*", "+", "?", "{", "}", + "[", "]", "|", "(", ")", "-") + for char in specialCharacters: + string = string.replace(char, "\\" + char) + + return string + +# output from the above +nonXmlNameBMPRegexp = re.compile('[\x00-,/:-@\\[-\\^`\\{-\xb6\xb8-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u02cf\u02d2-\u02ff\u0346-\u035f\u0362-\u0385\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482\u0487-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u0590\u05a2\u05ba\u05be\u05c0\u05c3\u05c5-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u063f\u0653-\u065f\u066a-\u066f\u06b8-\u06b9\u06bf\u06cf\u06d4\u06e9\u06ee-\u06ef\u06fa-\u0900\u0904\u093a-\u093b\u094e-\u0950\u0955-\u0957\u0964-\u0965\u0970-\u0980\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09bb\u09bd\u09c5-\u09c6\u09c9-\u09ca\u09ce-\u09d6\u09d8-\u09db\u09de\u09e4-\u09e5\u09f2-\u0a01\u0a03-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a3b\u0a3d\u0a43-\u0a46\u0a49-\u0a4a\u0a4e-\u0a58\u0a5d\u0a5f-\u0a65\u0a75-\u0a80\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abb\u0ac6\u0aca\u0ace-\u0adf\u0ae1-\u0ae5\u0af0-\u0b00\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3b\u0b44-\u0b46\u0b49-\u0b4a\u0b4e-\u0b55\u0b58-\u0b5b\u0b5e\u0b62-\u0b65\u0b70-\u0b81\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0bbd\u0bc3-\u0bc5\u0bc9\u0bce-\u0bd6\u0bd8-\u0be6\u0bf0-\u0c00\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c3d\u0c45\u0c49\u0c4e-\u0c54\u0c57-\u0c5f\u0c62-\u0c65\u0c70-\u0c81\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cbd\u0cc5\u0cc9\u0cce-\u0cd4\u0cd7-\u0cdd\u0cdf\u0ce2-\u0ce5\u0cf0-\u0d01\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d3d\u0d44-\u0d45\u0d49\u0d4e-\u0d56\u0d58-\u0d5f\u0d62-\u0d65\u0d70-\u0e00\u0e2f\u0e3b-\u0e3f\u0e4f\u0e5a-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eba\u0ebe-\u0ebf\u0ec5\u0ec7\u0ece-\u0ecf\u0eda-\u0f17\u0f1a-\u0f1f\u0f2a-\u0f34\u0f36\u0f38\u0f3a-\u0f3d\u0f48\u0f6a-\u0f70\u0f85\u0f8c-\u0f8f\u0f96\u0f98\u0fae-\u0fb0\u0fb8\u0fba-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u20cf\u20dd-\u20e0\u20e2-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3004\u3006\u3008-\u3020\u3030\u3036-\u3040\u3095-\u3098\u309b-\u309c\u309f-\u30a0\u30fb\u30ff-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +nonXmlNameFirstBMPRegexp = re.compile('[\x00-@\\[-\\^`\\{-\xbf\xd7\xf7\u0132-\u0133\u013f-\u0140\u0149\u017f\u01c4-\u01cc\u01f1-\u01f3\u01f6-\u01f9\u0218-\u024f\u02a9-\u02ba\u02c2-\u0385\u0387\u038b\u038d\u03a2\u03cf\u03d7-\u03d9\u03db\u03dd\u03df\u03e1\u03f4-\u0400\u040d\u0450\u045d\u0482-\u048f\u04c5-\u04c6\u04c9-\u04ca\u04cd-\u04cf\u04ec-\u04ed\u04f6-\u04f7\u04fa-\u0530\u0557-\u0558\u055a-\u0560\u0587-\u05cf\u05eb-\u05ef\u05f3-\u0620\u063b-\u0640\u064b-\u0670\u06b8-\u06b9\u06bf\u06cf\u06d4\u06d6-\u06e4\u06e7-\u0904\u093a-\u093c\u093e-\u0957\u0962-\u0984\u098d-\u098e\u0991-\u0992\u09a9\u09b1\u09b3-\u09b5\u09ba-\u09db\u09de\u09e2-\u09ef\u09f2-\u0a04\u0a0b-\u0a0e\u0a11-\u0a12\u0a29\u0a31\u0a34\u0a37\u0a3a-\u0a58\u0a5d\u0a5f-\u0a71\u0a75-\u0a84\u0a8c\u0a8e\u0a92\u0aa9\u0ab1\u0ab4\u0aba-\u0abc\u0abe-\u0adf\u0ae1-\u0b04\u0b0d-\u0b0e\u0b11-\u0b12\u0b29\u0b31\u0b34-\u0b35\u0b3a-\u0b3c\u0b3e-\u0b5b\u0b5e\u0b62-\u0b84\u0b8b-\u0b8d\u0b91\u0b96-\u0b98\u0b9b\u0b9d\u0ba0-\u0ba2\u0ba5-\u0ba7\u0bab-\u0bad\u0bb6\u0bba-\u0c04\u0c0d\u0c11\u0c29\u0c34\u0c3a-\u0c5f\u0c62-\u0c84\u0c8d\u0c91\u0ca9\u0cb4\u0cba-\u0cdd\u0cdf\u0ce2-\u0d04\u0d0d\u0d11\u0d29\u0d3a-\u0d5f\u0d62-\u0e00\u0e2f\u0e31\u0e34-\u0e3f\u0e46-\u0e80\u0e83\u0e85-\u0e86\u0e89\u0e8b-\u0e8c\u0e8e-\u0e93\u0e98\u0ea0\u0ea4\u0ea6\u0ea8-\u0ea9\u0eac\u0eaf\u0eb1\u0eb4-\u0ebc\u0ebe-\u0ebf\u0ec5-\u0f3f\u0f48\u0f6a-\u109f\u10c6-\u10cf\u10f7-\u10ff\u1101\u1104\u1108\u110a\u110d\u1113-\u113b\u113d\u113f\u1141-\u114b\u114d\u114f\u1151-\u1153\u1156-\u1158\u115a-\u115e\u1162\u1164\u1166\u1168\u116a-\u116c\u116f-\u1171\u1174\u1176-\u119d\u119f-\u11a7\u11a9-\u11aa\u11ac-\u11ad\u11b0-\u11b6\u11b9\u11bb\u11c3-\u11ea\u11ec-\u11ef\u11f1-\u11f8\u11fa-\u1dff\u1e9c-\u1e9f\u1efa-\u1eff\u1f16-\u1f17\u1f1e-\u1f1f\u1f46-\u1f47\u1f4e-\u1f4f\u1f58\u1f5a\u1f5c\u1f5e\u1f7e-\u1f7f\u1fb5\u1fbd\u1fbf-\u1fc1\u1fc5\u1fcd-\u1fcf\u1fd4-\u1fd5\u1fdc-\u1fdf\u1fed-\u1ff1\u1ff5\u1ffd-\u2125\u2127-\u2129\u212c-\u212d\u212f-\u217f\u2183-\u3006\u3008-\u3020\u302a-\u3040\u3095-\u30a0\u30fb-\u3104\u312d-\u4dff\u9fa6-\uabff\ud7a4-\uffff]') # noqa + +# Simpler things +nonPubidCharRegexp = re.compile("[^\x20\x0D\x0Aa-zA-Z0-9\\-'()+,./:=?;!*#@$_%]") + + +class InfosetFilter(object): + replacementRegexp = re.compile(r"U[\dA-F]{5,5}") + + def __init__(self, + dropXmlnsLocalName=False, + dropXmlnsAttrNs=False, + preventDoubleDashComments=False, + preventDashAtCommentEnd=False, + replaceFormFeedCharacters=True, + preventSingleQuotePubid=False): + + self.dropXmlnsLocalName = dropXmlnsLocalName + self.dropXmlnsAttrNs = dropXmlnsAttrNs + + self.preventDoubleDashComments = preventDoubleDashComments + self.preventDashAtCommentEnd = preventDashAtCommentEnd + + self.replaceFormFeedCharacters = replaceFormFeedCharacters + + self.preventSingleQuotePubid = preventSingleQuotePubid + + self.replaceCache = {} + + def coerceAttribute(self, name, namespace=None): + if self.dropXmlnsLocalName and name.startswith("xmlns:"): + warnings.warn("Attributes cannot begin with xmlns", DataLossWarning) + return None + elif (self.dropXmlnsAttrNs and + namespace == "http://www.w3.org/2000/xmlns/"): + warnings.warn("Attributes cannot be in the xml namespace", DataLossWarning) + return None + else: + return self.toXmlName(name) + + def coerceElement(self, name): + return self.toXmlName(name) + + def coerceComment(self, data): + if self.preventDoubleDashComments: + while "--" in data: + warnings.warn("Comments cannot contain adjacent dashes", DataLossWarning) + data = data.replace("--", "- -") + if data.endswith("-"): + warnings.warn("Comments cannot end in a dash", DataLossWarning) + data += " " + return data + + def coerceCharacters(self, data): + if self.replaceFormFeedCharacters: + for _ in range(data.count("\x0C")): + warnings.warn("Text cannot contain U+000C", DataLossWarning) + data = data.replace("\x0C", " ") + # Other non-xml characters + return data + + def coercePubid(self, data): + dataOutput = data + for char in nonPubidCharRegexp.findall(data): + warnings.warn("Coercing non-XML pubid", DataLossWarning) + replacement = self.getReplacementCharacter(char) + dataOutput = dataOutput.replace(char, replacement) + if self.preventSingleQuotePubid and dataOutput.find("'") >= 0: + warnings.warn("Pubid cannot contain single quote", DataLossWarning) + dataOutput = dataOutput.replace("'", self.getReplacementCharacter("'")) + return dataOutput + + def toXmlName(self, name): + nameFirst = name[0] + nameRest = name[1:] + m = nonXmlNameFirstBMPRegexp.match(nameFirst) + if m: + warnings.warn("Coercing non-XML name", DataLossWarning) + nameFirstOutput = self.getReplacementCharacter(nameFirst) + else: + nameFirstOutput = nameFirst + + nameRestOutput = nameRest + replaceChars = set(nonXmlNameBMPRegexp.findall(nameRest)) + for char in replaceChars: + warnings.warn("Coercing non-XML name", DataLossWarning) + replacement = self.getReplacementCharacter(char) + nameRestOutput = nameRestOutput.replace(char, replacement) + return nameFirstOutput + nameRestOutput + + def getReplacementCharacter(self, char): + if char in self.replaceCache: + replacement = self.replaceCache[char] + else: + replacement = self.escapeChar(char) + return replacement + + def fromXmlName(self, name): + for item in set(self.replacementRegexp.findall(name)): + name = name.replace(item, self.unescapeChar(item)) + return name + + def escapeChar(self, char): + replacement = "U%05X" % ord(char) + self.replaceCache[char] = replacement + return replacement + + def unescapeChar(self, charcode): + return chr(int(charcode[1:], 16)) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 000000000..21c6bbc49 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_inputstream.py @@ -0,0 +1,923 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type, binary_type +from pip._vendor.six.moves import http_client, urllib + +import codecs +import re + +from pip._vendor import webencodings + +from .constants import EOF, spaceCharacters, asciiLetters, asciiUppercase +from .constants import _ReparseException +from . import _utils + +from io import StringIO + +try: + from io import BytesIO +except ImportError: + BytesIO = StringIO + +# Non-unicode versions of constants for use in the pre-parser +spaceCharactersBytes = frozenset([item.encode("ascii") for item in spaceCharacters]) +asciiLettersBytes = frozenset([item.encode("ascii") for item in asciiLetters]) +asciiUppercaseBytes = frozenset([item.encode("ascii") for item in asciiUppercase]) +spacesAngleBrackets = spaceCharactersBytes | frozenset([b">", b"<"]) + + +invalid_unicode_no_surrogate = "[\u0001-\u0008\u000B\u000E-\u001F\u007F-\u009F\uFDD0-\uFDEF\uFFFE\uFFFF\U0001FFFE\U0001FFFF\U0002FFFE\U0002FFFF\U0003FFFE\U0003FFFF\U0004FFFE\U0004FFFF\U0005FFFE\U0005FFFF\U0006FFFE\U0006FFFF\U0007FFFE\U0007FFFF\U0008FFFE\U0008FFFF\U0009FFFE\U0009FFFF\U000AFFFE\U000AFFFF\U000BFFFE\U000BFFFF\U000CFFFE\U000CFFFF\U000DFFFE\U000DFFFF\U000EFFFE\U000EFFFF\U000FFFFE\U000FFFFF\U0010FFFE\U0010FFFF]" # noqa + +if _utils.supports_lone_surrogates: + # Use one extra step of indirection and create surrogates with + # eval. Not using this indirection would introduce an illegal + # unicode literal on platforms not supporting such lone + # surrogates. + assert invalid_unicode_no_surrogate[-1] == "]" and invalid_unicode_no_surrogate.count("]") == 1 + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate[:-1] + + eval('"\\uD800-\\uDFFF"') + # pylint:disable=eval-used + "]") +else: + invalid_unicode_re = re.compile(invalid_unicode_no_surrogate) + +non_bmp_invalid_codepoints = set([0x1FFFE, 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, 0x5FFFF, + 0x6FFFE, 0x6FFFF, 0x7FFFE, 0x7FFFF, 0x8FFFE, + 0x8FFFF, 0x9FFFE, 0x9FFFF, 0xAFFFE, 0xAFFFF, + 0xBFFFE, 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, 0xFFFFF, + 0x10FFFE, 0x10FFFF]) + +ascii_punctuation_re = re.compile("[\u0009-\u000D\u0020-\u002F\u003A-\u0040\u005C\u005B-\u0060\u007B-\u007E]") + +# Cache for charsUntil() +charsUntilRegEx = {} + + +class BufferedStream(object): + """Buffering for streams that do not have buffering of their own + + The buffer is implemented as a list of chunks on the assumption that + joining many strings will be slow since it is O(n**2) + """ + + def __init__(self, stream): + self.stream = stream + self.buffer = [] + self.position = [-1, 0] # chunk number, offset + + def tell(self): + pos = 0 + for chunk in self.buffer[:self.position[0]]: + pos += len(chunk) + pos += self.position[1] + return pos + + def seek(self, pos): + assert pos <= self._bufferedBytes() + offset = pos + i = 0 + while len(self.buffer[i]) < offset: + offset -= len(self.buffer[i]) + i += 1 + self.position = [i, offset] + + def read(self, bytes): + if not self.buffer: + return self._readStream(bytes) + elif (self.position[0] == len(self.buffer) and + self.position[1] == len(self.buffer[-1])): + return self._readStream(bytes) + else: + return self._readFromBuffer(bytes) + + def _bufferedBytes(self): + return sum([len(item) for item in self.buffer]) + + def _readStream(self, bytes): + data = self.stream.read(bytes) + self.buffer.append(data) + self.position[0] += 1 + self.position[1] = len(data) + return data + + def _readFromBuffer(self, bytes): + remainingBytes = bytes + rv = [] + bufferIndex = self.position[0] + bufferOffset = self.position[1] + while bufferIndex < len(self.buffer) and remainingBytes != 0: + assert remainingBytes > 0 + bufferedData = self.buffer[bufferIndex] + + if remainingBytes <= len(bufferedData) - bufferOffset: + bytesToRead = remainingBytes + self.position = [bufferIndex, bufferOffset + bytesToRead] + else: + bytesToRead = len(bufferedData) - bufferOffset + self.position = [bufferIndex, len(bufferedData)] + bufferIndex += 1 + rv.append(bufferedData[bufferOffset:bufferOffset + bytesToRead]) + remainingBytes -= bytesToRead + + bufferOffset = 0 + + if remainingBytes: + rv.append(self._readStream(remainingBytes)) + + return b"".join(rv) + + +def HTMLInputStream(source, **kwargs): + # Work around Python bug #20007: read(0) closes the connection. + # http://bugs.python.org/issue20007 + if (isinstance(source, http_client.HTTPResponse) or + # Also check for addinfourl wrapping HTTPResponse + (isinstance(source, urllib.response.addbase) and + isinstance(source.fp, http_client.HTTPResponse))): + isUnicode = False + elif hasattr(source, "read"): + isUnicode = isinstance(source.read(0), text_type) + else: + isUnicode = isinstance(source, text_type) + + if isUnicode: + encodings = [x for x in kwargs if x.endswith("_encoding")] + if encodings: + raise TypeError("Cannot set an encoding with a unicode input, set %r" % encodings) + + return HTMLUnicodeInputStream(source, **kwargs) + else: + return HTMLBinaryInputStream(source, **kwargs) + + +class HTMLUnicodeInputStream(object): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + _defaultChunkSize = 10240 + + def __init__(self, source): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + + if not _utils.supports_lone_surrogates: + # Such platforms will have already checked for such + # surrogate errors, so no need to do this checking. + self.reportCharacterErrors = None + elif len("\U0010FFFF") == 1: + self.reportCharacterErrors = self.characterErrorsUCS4 + else: + self.reportCharacterErrors = self.characterErrorsUCS2 + + # List of where new lines occur + self.newLines = [0] + + self.charEncoding = (lookupEncoding("utf-8"), "certain") + self.dataStream = self.openStream(source) + + self.reset() + + def reset(self): + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + self.errors = [] + + # number of (complete) lines in previous chunks + self.prevNumLines = 0 + # number of columns in the last line of the previous chunk + self.prevNumCols = 0 + + # Deal with CR LF and surrogates split over chunk boundaries + self._bufferedCharacter = None + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = StringIO(source) + + return stream + + def _position(self, offset): + chunk = self.chunk + nLines = chunk.count('\n', 0, offset) + positionLine = self.prevNumLines + nLines + lastLinePos = chunk.rfind('\n', 0, offset) + if lastLinePos == -1: + positionColumn = self.prevNumCols + offset + else: + positionColumn = offset - (lastLinePos + 1) + return (positionLine, positionColumn) + + def position(self): + """Returns (line, col) of the current position in the stream.""" + line, col = self._position(self.chunkOffset) + return (line + 1, col) + + def char(self): + """ Read one character from the stream or queue if available. Return + EOF when EOF is reached. + """ + # Read a new chunk from the input stream if necessary + if self.chunkOffset >= self.chunkSize: + if not self.readChunk(): + return EOF + + chunkOffset = self.chunkOffset + char = self.chunk[chunkOffset] + self.chunkOffset = chunkOffset + 1 + + return char + + def readChunk(self, chunkSize=None): + if chunkSize is None: + chunkSize = self._defaultChunkSize + + self.prevNumLines, self.prevNumCols = self._position(self.chunkSize) + + self.chunk = "" + self.chunkSize = 0 + self.chunkOffset = 0 + + data = self.dataStream.read(chunkSize) + + # Deal with CR LF and surrogates broken across chunks + if self._bufferedCharacter: + data = self._bufferedCharacter + data + self._bufferedCharacter = None + elif not data: + # We have no more data, bye-bye stream + return False + + if len(data) > 1: + lastv = ord(data[-1]) + if lastv == 0x0D or 0xD800 <= lastv <= 0xDBFF: + self._bufferedCharacter = data[-1] + data = data[:-1] + + if self.reportCharacterErrors: + self.reportCharacterErrors(data) + + # Replace invalid characters + data = data.replace("\r\n", "\n") + data = data.replace("\r", "\n") + + self.chunk = data + self.chunkSize = len(data) + + return True + + def characterErrorsUCS4(self, data): + for _ in range(len(invalid_unicode_re.findall(data))): + self.errors.append("invalid-codepoint") + + def characterErrorsUCS2(self, data): + # Someone picked the wrong compile option + # You lose + skip = False + for match in invalid_unicode_re.finditer(data): + if skip: + continue + codepoint = ord(match.group()) + pos = match.start() + # Pretty sure there should be endianness issues here + if _utils.isSurrogatePair(data[pos:pos + 2]): + # We have a surrogate pair! + char_val = _utils.surrogatePairToCodepoint(data[pos:pos + 2]) + if char_val in non_bmp_invalid_codepoints: + self.errors.append("invalid-codepoint") + skip = True + elif (codepoint >= 0xD800 and codepoint <= 0xDFFF and + pos == len(data) - 1): + self.errors.append("invalid-codepoint") + else: + skip = False + self.errors.append("invalid-codepoint") + + def charsUntil(self, characters, opposite=False): + """ Returns a string of characters from the stream up to but not + including any character in 'characters' or EOF. 'characters' must be + a container that supports the 'in' method and iteration over its + characters. + """ + + # Use a cache of regexps to find the required characters + try: + chars = charsUntilRegEx[(characters, opposite)] + except KeyError: + if __debug__: + for c in characters: + assert(ord(c) < 128) + regex = "".join(["\\x%02x" % ord(c) for c in characters]) + if not opposite: + regex = "^%s" % regex + chars = charsUntilRegEx[(characters, opposite)] = re.compile("[%s]+" % regex) + + rv = [] + + while True: + # Find the longest matching prefix + m = chars.match(self.chunk, self.chunkOffset) + if m is None: + # If nothing matched, and it wasn't because we ran out of chunk, + # then stop + if self.chunkOffset != self.chunkSize: + break + else: + end = m.end() + # If not the whole chunk matched, return everything + # up to the part that didn't match + if end != self.chunkSize: + rv.append(self.chunk[self.chunkOffset:end]) + self.chunkOffset = end + break + # If the whole remainder of the chunk matched, + # use it all and read the next chunk + rv.append(self.chunk[self.chunkOffset:]) + if not self.readChunk(): + # Reached EOF + break + + r = "".join(rv) + return r + + def unget(self, char): + # Only one character is allowed to be ungotten at once - it must + # be consumed again before any further call to unget + if char is not None: + if self.chunkOffset == 0: + # unget is called quite rarely, so it's a good idea to do + # more work here if it saves a bit of work in the frequently + # called char and charsUntil. + # So, just prepend the ungotten character onto the current + # chunk: + self.chunk = char + self.chunk + self.chunkSize += 1 + else: + self.chunkOffset -= 1 + assert self.chunk[self.chunkOffset] == char + + +class HTMLBinaryInputStream(HTMLUnicodeInputStream): + """Provides a unicode stream of characters to the HTMLTokenizer. + + This class takes care of character encoding and removing or replacing + incorrect byte-sequences and also provides column and line tracking. + + """ + + def __init__(self, source, override_encoding=None, transport_encoding=None, + same_origin_parent_encoding=None, likely_encoding=None, + default_encoding="windows-1252", useChardet=True): + """Initialises the HTMLInputStream. + + HTMLInputStream(source, [encoding]) -> Normalized stream from source + for use by html5lib. + + source can be either a file-object, local filename or a string. + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + """ + # Raw Stream - for unicode objects this will encode to utf-8 and set + # self.charEncoding as appropriate + self.rawStream = self.openStream(source) + + HTMLUnicodeInputStream.__init__(self, self.rawStream) + + # Encoding Information + # Number of bytes to use when looking for a meta element with + # encoding information + self.numBytesMeta = 1024 + # Number of bytes to use when using detecting encoding using chardet + self.numBytesChardet = 100 + # Things from args + self.override_encoding = override_encoding + self.transport_encoding = transport_encoding + self.same_origin_parent_encoding = same_origin_parent_encoding + self.likely_encoding = likely_encoding + self.default_encoding = default_encoding + + # Determine encoding + self.charEncoding = self.determineEncoding(useChardet) + assert self.charEncoding[0] is not None + + # Call superclass + self.reset() + + def reset(self): + self.dataStream = self.charEncoding[0].codec_info.streamreader(self.rawStream, 'replace') + HTMLUnicodeInputStream.reset(self) + + def openStream(self, source): + """Produces a file object from source. + + source can be either a file object, local filename or a string. + + """ + # Already a file object + if hasattr(source, 'read'): + stream = source + else: + stream = BytesIO(source) + + try: + stream.seek(stream.tell()) + except: # pylint:disable=bare-except + stream = BufferedStream(stream) + + return stream + + def determineEncoding(self, chardet=True): + # BOMs take precedence over everything + # This will also read past the BOM if present + charEncoding = self.detectBOM(), "certain" + if charEncoding[0] is not None: + return charEncoding + + # If we've been overriden, we've been overriden + charEncoding = lookupEncoding(self.override_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Now check the transport layer + charEncoding = lookupEncoding(self.transport_encoding), "certain" + if charEncoding[0] is not None: + return charEncoding + + # Look for meta elements with encoding information + charEncoding = self.detectEncodingMeta(), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Parent document encoding + charEncoding = lookupEncoding(self.same_origin_parent_encoding), "tentative" + if charEncoding[0] is not None and not charEncoding[0].name.startswith("utf-16"): + return charEncoding + + # "likely" encoding + charEncoding = lookupEncoding(self.likely_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Guess with chardet, if available + if chardet: + try: + from pip._vendor.chardet.universaldetector import UniversalDetector + except ImportError: + pass + else: + buffers = [] + detector = UniversalDetector() + while not detector.done: + buffer = self.rawStream.read(self.numBytesChardet) + assert isinstance(buffer, bytes) + if not buffer: + break + buffers.append(buffer) + detector.feed(buffer) + detector.close() + encoding = lookupEncoding(detector.result['encoding']) + self.rawStream.seek(0) + if encoding is not None: + return encoding, "tentative" + + # Try the default encoding + charEncoding = lookupEncoding(self.default_encoding), "tentative" + if charEncoding[0] is not None: + return charEncoding + + # Fallback to html5lib's default if even that hasn't worked + return lookupEncoding("windows-1252"), "tentative" + + def changeEncoding(self, newEncoding): + assert self.charEncoding[1] != "certain" + newEncoding = lookupEncoding(newEncoding) + if newEncoding is None: + return + if newEncoding.name in ("utf-16be", "utf-16le"): + newEncoding = lookupEncoding("utf-8") + assert newEncoding is not None + elif newEncoding == self.charEncoding[0]: + self.charEncoding = (self.charEncoding[0], "certain") + else: + self.rawStream.seek(0) + self.charEncoding = (newEncoding, "certain") + self.reset() + raise _ReparseException("Encoding changed from %s to %s" % (self.charEncoding[0], newEncoding)) + + def detectBOM(self): + """Attempts to detect at BOM at the start of the stream. If + an encoding can be determined from the BOM return the name of the + encoding otherwise return None""" + bomDict = { + codecs.BOM_UTF8: 'utf-8', + codecs.BOM_UTF16_LE: 'utf-16le', codecs.BOM_UTF16_BE: 'utf-16be', + codecs.BOM_UTF32_LE: 'utf-32le', codecs.BOM_UTF32_BE: 'utf-32be' + } + + # Go to beginning of file and read in 4 bytes + string = self.rawStream.read(4) + assert isinstance(string, bytes) + + # Try detecting the BOM using bytes from the string + encoding = bomDict.get(string[:3]) # UTF-8 + seek = 3 + if not encoding: + # Need to detect UTF-32 before UTF-16 + encoding = bomDict.get(string) # UTF-32 + seek = 4 + if not encoding: + encoding = bomDict.get(string[:2]) # UTF-16 + seek = 2 + + # Set the read position past the BOM if one was found, otherwise + # set it to the start of the stream + if encoding: + self.rawStream.seek(seek) + return lookupEncoding(encoding) + else: + self.rawStream.seek(0) + return None + + def detectEncodingMeta(self): + """Report the encoding declared by the meta element + """ + buffer = self.rawStream.read(self.numBytesMeta) + assert isinstance(buffer, bytes) + parser = EncodingParser(buffer) + self.rawStream.seek(0) + encoding = parser.getEncoding() + + if encoding is not None and encoding.name in ("utf-16be", "utf-16le"): + encoding = lookupEncoding("utf-8") + + return encoding + + +class EncodingBytes(bytes): + """String-like object with an associated position and various extra methods + If the position is ever greater than the string length then an exception is + raised""" + def __new__(self, value): + assert isinstance(value, bytes) + return bytes.__new__(self, value.lower()) + + def __init__(self, value): + # pylint:disable=unused-argument + self._position = -1 + + def __iter__(self): + return self + + def __next__(self): + p = self._position = self._position + 1 + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + return self[p:p + 1] + + def next(self): + # Py2 compat + return self.__next__() + + def previous(self): + p = self._position + if p >= len(self): + raise StopIteration + elif p < 0: + raise TypeError + self._position = p = p - 1 + return self[p:p + 1] + + def setPosition(self, position): + if self._position >= len(self): + raise StopIteration + self._position = position + + def getPosition(self): + if self._position >= len(self): + raise StopIteration + if self._position >= 0: + return self._position + else: + return None + + position = property(getPosition, setPosition) + + def getCurrentByte(self): + return self[self.position:self.position + 1] + + currentByte = property(getCurrentByte) + + def skip(self, chars=spaceCharactersBytes): + """Skip past a list of characters""" + p = self.position # use property for the error-checking + while p < len(self): + c = self[p:p + 1] + if c not in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def skipUntil(self, chars): + p = self.position + while p < len(self): + c = self[p:p + 1] + if c in chars: + self._position = p + return c + p += 1 + self._position = p + return None + + def matchBytes(self, bytes): + """Look for a sequence of bytes at the start of a string. If the bytes + are found return True and advance the position to the byte after the + match. Otherwise return False and leave the position alone""" + p = self.position + data = self[p:p + len(bytes)] + rv = data.startswith(bytes) + if rv: + self.position += len(bytes) + return rv + + def jumpTo(self, bytes): + """Look for the next sequence of bytes matching a given sequence. If + a match is found advance the position to the last byte of the match""" + newPosition = self[self.position:].find(bytes) + if newPosition > -1: + # XXX: This is ugly, but I can't see a nicer way to fix this. + if self._position == -1: + self._position = 0 + self._position += (newPosition + len(bytes) - 1) + return True + else: + raise StopIteration + + +class EncodingParser(object): + """Mini parser for detecting character encoding from meta elements""" + + def __init__(self, data): + """string - the data to work on for encoding detection""" + self.data = EncodingBytes(data) + self.encoding = None + + def getEncoding(self): + methodDispatch = ( + (b"<!--", self.handleComment), + (b"<meta", self.handleMeta), + (b"</", self.handlePossibleEndTag), + (b"<!", self.handleOther), + (b"<?", self.handleOther), + (b"<", self.handlePossibleStartTag)) + for _ in self.data: + keepParsing = True + for key, method in methodDispatch: + if self.data.matchBytes(key): + try: + keepParsing = method() + break + except StopIteration: + keepParsing = False + break + if not keepParsing: + break + + return self.encoding + + def handleComment(self): + """Skip over comments""" + return self.data.jumpTo(b"-->") + + def handleMeta(self): + if self.data.currentByte not in spaceCharactersBytes: + # if we have <meta not followed by a space so just keep going + return True + # We have a valid meta element we want to search for attributes + hasPragma = False + pendingEncoding = None + while True: + # Try to find the next attribute after the current position + attr = self.getAttribute() + if attr is None: + return True + else: + if attr[0] == b"http-equiv": + hasPragma = attr[1] == b"content-type" + if hasPragma and pendingEncoding is not None: + self.encoding = pendingEncoding + return False + elif attr[0] == b"charset": + tentativeEncoding = attr[1] + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + self.encoding = codec + return False + elif attr[0] == b"content": + contentParser = ContentAttrParser(EncodingBytes(attr[1])) + tentativeEncoding = contentParser.parse() + if tentativeEncoding is not None: + codec = lookupEncoding(tentativeEncoding) + if codec is not None: + if hasPragma: + self.encoding = codec + return False + else: + pendingEncoding = codec + + def handlePossibleStartTag(self): + return self.handlePossibleTag(False) + + def handlePossibleEndTag(self): + next(self.data) + return self.handlePossibleTag(True) + + def handlePossibleTag(self, endTag): + data = self.data + if data.currentByte not in asciiLettersBytes: + # If the next byte is not an ascii letter either ignore this + # fragment (possible start tag case) or treat it according to + # handleOther + if endTag: + data.previous() + self.handleOther() + return True + + c = data.skipUntil(spacesAngleBrackets) + if c == b"<": + # return to the first step in the overall "two step" algorithm + # reprocessing the < byte + data.previous() + else: + # Read all attributes + attr = self.getAttribute() + while attr is not None: + attr = self.getAttribute() + return True + + def handleOther(self): + return self.data.jumpTo(b">") + + def getAttribute(self): + """Return a name,value pair for the next attribute in the stream, + if one is found, or None""" + data = self.data + # Step 1 (skip chars) + c = data.skip(spaceCharactersBytes | frozenset([b"/"])) + assert c is None or len(c) == 1 + # Step 2 + if c in (b">", None): + return None + # Step 3 + attrName = [] + attrValue = [] + # Step 4 attribute name + while True: + if c == b"=" and attrName: + break + elif c in spaceCharactersBytes: + # Step 6! + c = data.skip() + break + elif c in (b"/", b">"): + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrName.append(c.lower()) + elif c is None: + return None + else: + attrName.append(c) + # Step 5 + c = next(data) + # Step 7 + if c != b"=": + data.previous() + return b"".join(attrName), b"" + # Step 8 + next(data) + # Step 9 + c = data.skip() + # Step 10 + if c in (b"'", b'"'): + # 10.1 + quoteChar = c + while True: + # 10.2 + c = next(data) + # 10.3 + if c == quoteChar: + next(data) + return b"".join(attrName), b"".join(attrValue) + # 10.4 + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + # 10.5 + else: + attrValue.append(c) + elif c == b">": + return b"".join(attrName), b"" + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + # Step 11 + while True: + c = next(data) + if c in spacesAngleBrackets: + return b"".join(attrName), b"".join(attrValue) + elif c in asciiUppercaseBytes: + attrValue.append(c.lower()) + elif c is None: + return None + else: + attrValue.append(c) + + +class ContentAttrParser(object): + def __init__(self, data): + assert isinstance(data, bytes) + self.data = data + + def parse(self): + try: + # Check if the attr name is charset + # otherwise return + self.data.jumpTo(b"charset") + self.data.position += 1 + self.data.skip() + if not self.data.currentByte == b"=": + # If there is no = sign keep looking for attrs + return None + self.data.position += 1 + self.data.skip() + # Look for an encoding between matching quote marks + if self.data.currentByte in (b'"', b"'"): + quoteMark = self.data.currentByte + self.data.position += 1 + oldPosition = self.data.position + if self.data.jumpTo(quoteMark): + return self.data[oldPosition:self.data.position] + else: + return None + else: + # Unquoted value + oldPosition = self.data.position + try: + self.data.skipUntil(spaceCharactersBytes) + return self.data[oldPosition:self.data.position] + except StopIteration: + # Return the whole remaining value + return self.data[oldPosition:] + except StopIteration: + return None + + +def lookupEncoding(encoding): + """Return the python codec name corresponding to an encoding or None if the + string doesn't correspond to a valid encoding.""" + if isinstance(encoding, binary_type): + try: + encoding = encoding.decode("ascii") + except UnicodeDecodeError: + return None + + if encoding is not None: + try: + return webencodings.lookup(encoding) + except AttributeError: + return None + else: + return None diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 000000000..ef1ccf879 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_tokenizer.py @@ -0,0 +1,1721 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import unichr as chr + +from collections import deque + +from .constants import spaceCharacters +from .constants import entities +from .constants import asciiLetters, asciiUpper2Lower +from .constants import digits, hexDigits, EOF +from .constants import tokenTypes, tagTokenTypes +from .constants import replacementCharacters + +from ._inputstream import HTMLInputStream + +from ._trie import Trie + +entitiesTrie = Trie(entities) + + +class HTMLTokenizer(object): + """ This class takes care of tokenizing HTML. + + * self.currentToken + Holds the token that is currently being processed. + + * self.state + Holds a reference to the method to be invoked... XXX + + * self.stream + Points to HTMLInputStream object. + """ + + def __init__(self, stream, parser=None, **kwargs): + + self.stream = HTMLInputStream(stream, **kwargs) + self.parser = parser + + # Setup the initial tokenizer state + self.escapeFlag = False + self.lastFourChars = [] + self.state = self.dataState + self.escape = False + + # The current token being created + self.currentToken = None + super(HTMLTokenizer, self).__init__() + + def __iter__(self): + """ This is where the magic happens. + + We do our usually processing through the states and when we have a token + to return we yield the token which pauses processing until the next token + is requested. + """ + self.tokenQueue = deque([]) + # Start processing. When EOF is reached self.state will return False + # instead of True and the loop will terminate. + while self.state(): + while self.stream.errors: + yield {"type": tokenTypes["ParseError"], "data": self.stream.errors.pop(0)} + while self.tokenQueue: + yield self.tokenQueue.popleft() + + def consumeNumberEntity(self, isHex): + """This function returns either U+FFFD or the character based on the + decimal or hexadecimal representation. It also discards ";" if present. + If not present self.tokenQueue.append({"type": tokenTypes["ParseError"]}) is invoked. + """ + + allowed = digits + radix = 10 + if isHex: + allowed = hexDigits + radix = 16 + + charStack = [] + + # Consume all the characters that are in range while making sure we + # don't hit an EOF. + c = self.stream.char() + while c in allowed and c is not EOF: + charStack.append(c) + c = self.stream.char() + + # Convert the set of characters consumed to an int. + charAsInt = int("".join(charStack), radix) + + # Certain characters get replaced with others + if charAsInt in replacementCharacters: + char = replacementCharacters[charAsInt] + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + elif ((0xD800 <= charAsInt <= 0xDFFF) or + (charAsInt > 0x10FFFF)): + char = "\uFFFD" + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + else: + # Should speed up this check somehow (e.g. move the set to a constant) + if ((0x0001 <= charAsInt <= 0x0008) or + (0x000E <= charAsInt <= 0x001F) or + (0x007F <= charAsInt <= 0x009F) or + (0xFDD0 <= charAsInt <= 0xFDEF) or + charAsInt in frozenset([0x000B, 0xFFFE, 0xFFFF, 0x1FFFE, + 0x1FFFF, 0x2FFFE, 0x2FFFF, 0x3FFFE, + 0x3FFFF, 0x4FFFE, 0x4FFFF, 0x5FFFE, + 0x5FFFF, 0x6FFFE, 0x6FFFF, 0x7FFFE, + 0x7FFFF, 0x8FFFE, 0x8FFFF, 0x9FFFE, + 0x9FFFF, 0xAFFFE, 0xAFFFF, 0xBFFFE, + 0xBFFFF, 0xCFFFE, 0xCFFFF, 0xDFFFE, + 0xDFFFF, 0xEFFFE, 0xEFFFF, 0xFFFFE, + 0xFFFFF, 0x10FFFE, 0x10FFFF])): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "illegal-codepoint-for-numeric-entity", + "datavars": {"charAsInt": charAsInt}}) + try: + # Try/except needed as UCS-2 Python builds' unichar only works + # within the BMP. + char = chr(charAsInt) + except ValueError: + v = charAsInt - 0x10000 + char = chr(0xD800 | (v >> 10)) + chr(0xDC00 | (v & 0x3FF)) + + # Discard the ; if present. Otherwise, put it back on the queue and + # invoke parseError on parser. + if c != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "numeric-entity-without-semicolon"}) + self.stream.unget(c) + + return char + + def consumeEntity(self, allowedChar=None, fromAttribute=False): + # Initialise to the default output for when no entity is matched + output = "&" + + charStack = [self.stream.char()] + if (charStack[0] in spaceCharacters or charStack[0] in (EOF, "<", "&") or + (allowedChar is not None and allowedChar == charStack[0])): + self.stream.unget(charStack[0]) + + elif charStack[0] == "#": + # Read the next character to see if it's hex or decimal + hex = False + charStack.append(self.stream.char()) + if charStack[-1] in ("x", "X"): + hex = True + charStack.append(self.stream.char()) + + # charStack[-1] should be the first digit + if (hex and charStack[-1] in hexDigits) \ + or (not hex and charStack[-1] in digits): + # At least one digit found, so consume the whole number + self.stream.unget(charStack[-1]) + output = self.consumeNumberEntity(hex) + else: + # No digits found + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "expected-numeric-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + else: + # At this point in the process might have named entity. Entities + # are stored in the global variable "entities". + # + # Consume characters and compare to these to a substring of the + # entity names in the list until the substring no longer matches. + while (charStack[-1] is not EOF): + if not entitiesTrie.has_keys_with_prefix("".join(charStack)): + break + charStack.append(self.stream.char()) + + # At this point we have a string that starts with some characters + # that may match an entity + # Try to find the longest entity the string will match to take care + # of ¬i for instance. + try: + entityName = entitiesTrie.longest_prefix("".join(charStack[:-1])) + entityLength = len(entityName) + except KeyError: + entityName = None + + if entityName is not None: + if entityName[-1] != ";": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "named-entity-without-semicolon"}) + if (entityName[-1] != ";" and fromAttribute and + (charStack[entityLength] in asciiLetters or + charStack[entityLength] in digits or + charStack[entityLength] == "=")): + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + else: + output = entities[entityName] + self.stream.unget(charStack.pop()) + output += "".join(charStack[entityLength:]) + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-named-entity"}) + self.stream.unget(charStack.pop()) + output = "&" + "".join(charStack) + + if fromAttribute: + self.currentToken["data"][-1][1] += output + else: + if output in spaceCharacters: + tokenType = "SpaceCharacters" + else: + tokenType = "Characters" + self.tokenQueue.append({"type": tokenTypes[tokenType], "data": output}) + + def processEntityInAttribute(self, allowedChar): + """This method replaces the need for "entityInAttributeValueState". + """ + self.consumeEntity(allowedChar=allowedChar, fromAttribute=True) + + def emitCurrentToken(self): + """This method is a generic handler for emitting the tags. It also sets + the state to "data" because that's what's needed after a token has been + emitted. + """ + token = self.currentToken + # Add token to the queue to be yielded + if (token["type"] in tagTokenTypes): + token["name"] = token["name"].translate(asciiUpper2Lower) + if token["type"] == tokenTypes["EndTag"]: + if token["data"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "attributes-in-end-tag"}) + if token["selfClosing"]: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "self-closing-flag-on-end-tag"}) + self.tokenQueue.append(token) + self.state = self.dataState + + # Below are the various tokenizer states worked out. + def dataState(self): + data = self.stream.char() + if data == "&": + self.state = self.entityDataState + elif data == "<": + self.state = self.tagOpenState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\u0000"}) + elif data is EOF: + # Tokenization ends. + return False + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def entityDataState(self): + self.consumeEntity() + self.state = self.dataState + return True + + def rcdataState(self): + data = self.stream.char() + if data == "&": + self.state = self.characterReferenceInRcdata + elif data == "<": + self.state = self.rcdataLessThanSignState + elif data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data in spaceCharacters: + # Directly after emitting a token you switch back to the "data + # state". At that point spaceCharacters are important so they are + # emitted separately. + self.tokenQueue.append({"type": tokenTypes["SpaceCharacters"], "data": + data + self.stream.charsUntil(spaceCharacters, True)}) + # No need to update lastFourChars here, since the first space will + # have already been appended to lastFourChars and will have broken + # any <!-- or --> sequences + else: + chars = self.stream.charsUntil(("&", "<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def characterReferenceInRcdata(self): + self.consumeEntity() + self.state = self.rcdataState + return True + + def rawtextState(self): + data = self.stream.char() + if data == "<": + self.state = self.rawtextLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataState(self): + data = self.stream.char() + if data == "<": + self.state = self.scriptDataLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + # Tokenization ends. + return False + else: + chars = self.stream.charsUntil(("<", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def plaintextState(self): + data = self.stream.char() + if data == EOF: + # Tokenization ends. + return False + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + self.stream.charsUntil("\u0000")}) + return True + + def tagOpenState(self): + data = self.stream.char() + if data == "!": + self.state = self.markupDeclarationOpenState + elif data == "/": + self.state = self.closeTagOpenState + elif data in asciiLetters: + self.currentToken = {"type": tokenTypes["StartTag"], + "name": data, "data": [], + "selfClosing": False, + "selfClosingAcknowledged": False} + self.state = self.tagNameState + elif data == ">": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-right-bracket"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<>"}) + self.state = self.dataState + elif data == "?": + # XXX In theory it could be something besides a tag name. But + # do we really care? + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name-but-got-question-mark"}) + self.stream.unget(data) + self.state = self.bogusCommentState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-tag-name"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.dataState + return True + + def closeTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.currentToken = {"type": tokenTypes["EndTag"], "name": data, + "data": [], "selfClosing": False} + self.state = self.tagNameState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-right-bracket"}) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-eof"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.state = self.dataState + else: + # XXX data can be _'_... + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-closing-tag-but-got-char", + "datavars": {"data": data}}) + self.stream.unget(data) + self.state = self.bogusCommentState + return True + + def tagNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-tag-name"}) + self.state = self.dataState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + else: + self.currentToken["name"] += data + # (Don't use charsUntil here, because tag names are + # very short and it's faster to not do anything fancy) + return True + + def rcdataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rcdataEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rcdataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rcdataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rcdataState + return True + + def rawtextLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.rawtextEndTagOpenState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.rawtextEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def rawtextEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.rawtextState + return True + + def scriptDataLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEndTagOpenState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<!"}) + self.state = self.scriptDataEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer += data + self.state = self.scriptDataEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapeStartDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapeStartDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + else: + self.stream.unget(data) + self.state = self.scriptDataState + return True + + def scriptDataEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.state = self.dataState + else: + chars = self.stream.charsUntil(("<", "-", "\u0000")) + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": + data + chars}) + return True + + def scriptDataEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataEscapedDashDashState + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.state = self.scriptDataEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataEscapedState + elif data == EOF: + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.temporaryBuffer = "" + self.state = self.scriptDataEscapedEndTagOpenState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<" + data}) + self.temporaryBuffer = data + self.state = self.scriptDataDoubleEscapeStartState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagOpenState(self): + data = self.stream.char() + if data in asciiLetters: + self.temporaryBuffer = data + self.state = self.scriptDataEscapedEndTagNameState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "</"}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataEscapedEndTagNameState(self): + appropriate = self.currentToken and self.currentToken["name"].lower() == self.temporaryBuffer.lower() + data = self.stream.char() + if data in spaceCharacters and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.beforeAttributeNameState + elif data == "/" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.state = self.selfClosingStartTagState + elif data == ">" and appropriate: + self.currentToken = {"type": tokenTypes["EndTag"], + "name": self.temporaryBuffer, + "data": [], "selfClosing": False} + self.emitCurrentToken() + self.state = self.dataState + elif data in asciiLetters: + self.temporaryBuffer += data + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "</" + self.temporaryBuffer}) + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapeStartState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataDoubleEscapedState + else: + self.state = self.scriptDataEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataEscapedState + return True + + def scriptDataDoubleEscapedState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + return True + + def scriptDataDoubleEscapedDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + self.state = self.scriptDataDoubleEscapedDashDashState + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedDashDashState(self): + data = self.stream.char() + if data == "-": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "-"}) + elif data == "<": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "<"}) + self.state = self.scriptDataDoubleEscapedLessThanSignState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": ">"}) + self.state = self.scriptDataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": "\uFFFD"}) + self.state = self.scriptDataDoubleEscapedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-script-in-script"}) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapedLessThanSignState(self): + data = self.stream.char() + if data == "/": + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": "/"}) + self.temporaryBuffer = "" + self.state = self.scriptDataDoubleEscapeEndState + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def scriptDataDoubleEscapeEndState(self): + data = self.stream.char() + if data in (spaceCharacters | frozenset(("/", ">"))): + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + if self.temporaryBuffer.lower() == "script": + self.state = self.scriptDataEscapedState + else: + self.state = self.scriptDataDoubleEscapedState + elif data in asciiLetters: + self.tokenQueue.append({"type": tokenTypes["Characters"], "data": data}) + self.temporaryBuffer += data + else: + self.stream.unget(data) + self.state = self.scriptDataDoubleEscapedState + return True + + def beforeAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data in ("'", '"', "=", "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-name-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def attributeNameState(self): + data = self.stream.char() + leavingThisState = True + emitToken = False + if data == "=": + self.state = self.beforeAttributeValueState + elif data in asciiLetters: + self.currentToken["data"][-1][0] += data +\ + self.stream.charsUntil(asciiLetters, True) + leavingThisState = False + elif data == ">": + # XXX If we emit here the attributes are converted to a dict + # without being checked and when the code below runs we error + # because data is a dict not a list + emitToken = True + elif data in spaceCharacters: + self.state = self.afterAttributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][0] += "\uFFFD" + leavingThisState = False + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "invalid-character-in-attribute-name"}) + self.currentToken["data"][-1][0] += data + leavingThisState = False + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-attribute-name"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][0] += data + leavingThisState = False + + if leavingThisState: + # Attributes are not dropped at this stage. That happens when the + # start tag token is emitted so values can still be safely appended + # to attributes, but we do want to report the parse error in time. + self.currentToken["data"][-1][0] = ( + self.currentToken["data"][-1][0].translate(asciiUpper2Lower)) + for name, _ in self.currentToken["data"][:-1]: + if self.currentToken["data"][-1][0] == name: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "duplicate-attribute"}) + break + # XXX Fix for above XXX + if emitToken: + self.emitCurrentToken() + return True + + def afterAttributeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "=": + self.state = self.beforeAttributeValueState + elif data == ">": + self.emitCurrentToken() + elif data in asciiLetters: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data == "/": + self.state = self.selfClosingStartTagState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"].append(["\uFFFD", ""]) + self.state = self.attributeNameState + elif data in ("'", '"', "<"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "invalid-character-after-attribute-name"}) + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-end-of-tag-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"].append([data, ""]) + self.state = self.attributeNameState + return True + + def beforeAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.stream.charsUntil(spaceCharacters, True) + elif data == "\"": + self.state = self.attributeValueDoubleQuotedState + elif data == "&": + self.state = self.attributeValueUnQuotedState + self.stream.unget(data) + elif data == "'": + self.state = self.attributeValueSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-right-bracket"}) + self.emitCurrentToken() + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + self.state = self.attributeValueUnQuotedState + elif data in ("=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "equals-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-attribute-value-but-got-eof"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.state = self.attributeValueUnQuotedState + return True + + def attributeValueDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute('"') + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-double-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("\"", "&", "\u0000")) + return True + + def attributeValueSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterAttributeValueState + elif data == "&": + self.processEntityInAttribute("'") + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-single-quote"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data +\ + self.stream.charsUntil(("'", "&", "\u0000")) + return True + + def attributeValueUnQuotedState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == "&": + self.processEntityInAttribute(">") + elif data == ">": + self.emitCurrentToken() + elif data in ('"', "'", "=", "<", "`"): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-in-unquoted-attribute-value"}) + self.currentToken["data"][-1][1] += data + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"][-1][1] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-attribute-value-no-quotes"}) + self.state = self.dataState + else: + self.currentToken["data"][-1][1] += data + self.stream.charsUntil( + frozenset(("&", ">", '"', "'", "=", "<", "`", "\u0000")) | spaceCharacters) + return True + + def afterAttributeValueState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeAttributeNameState + elif data == ">": + self.emitCurrentToken() + elif data == "/": + self.state = self.selfClosingStartTagState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-EOF-after-attribute-value"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-attribute-value"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def selfClosingStartTagState(self): + data = self.stream.char() + if data == ">": + self.currentToken["selfClosing"] = True + self.emitCurrentToken() + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": + "unexpected-EOF-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-character-after-solidus-in-tag"}) + self.stream.unget(data) + self.state = self.beforeAttributeNameState + return True + + def bogusCommentState(self): + # Make a new comment token and give it as value all the characters + # until the first > or EOF (charsUntil checks for EOF automatically) + # and emit it. + data = self.stream.charsUntil(">") + data = data.replace("\u0000", "\uFFFD") + self.tokenQueue.append( + {"type": tokenTypes["Comment"], "data": data}) + + # Eat the character directly after the bogus comment which is either a + # ">" or an EOF. + self.stream.char() + self.state = self.dataState + return True + + def markupDeclarationOpenState(self): + charStack = [self.stream.char()] + if charStack[-1] == "-": + charStack.append(self.stream.char()) + if charStack[-1] == "-": + self.currentToken = {"type": tokenTypes["Comment"], "data": ""} + self.state = self.commentStartState + return True + elif charStack[-1] in ('d', 'D'): + matched = True + for expected in (('o', 'O'), ('c', 'C'), ('t', 'T'), + ('y', 'Y'), ('p', 'P'), ('e', 'E')): + charStack.append(self.stream.char()) + if charStack[-1] not in expected: + matched = False + break + if matched: + self.currentToken = {"type": tokenTypes["Doctype"], + "name": "", + "publicId": None, "systemId": None, + "correct": True} + self.state = self.doctypeState + return True + elif (charStack[-1] == "[" and + self.parser is not None and + self.parser.tree.openElements and + self.parser.tree.openElements[-1].namespace != self.parser.tree.defaultNamespace): + matched = True + for expected in ["C", "D", "A", "T", "A", "["]: + charStack.append(self.stream.char()) + if charStack[-1] != expected: + matched = False + break + if matched: + self.state = self.cdataSectionState + return True + + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-dashes-or-doctype"}) + + while charStack: + self.stream.unget(charStack.pop()) + self.state = self.bogusCommentState + return True + + def commentStartState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentStartDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + self.state = self.commentState + return True + + def commentStartDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "incorrect-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "\uFFFD" + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "eof-in-comment"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += data + \ + self.stream.charsUntil(("-", "\u0000")) + return True + + def commentEndDashState(self): + data = self.stream.char() + if data == "-": + self.state = self.commentEndState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "-\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "-" + data + self.state = self.commentState + return True + + def commentEndState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--\uFFFD" + self.state = self.commentState + elif data == "!": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-bang-after-double-dash-in-comment"}) + self.state = self.commentEndBangState + elif data == "-": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-dash-after-double-dash-in-comment"}) + self.currentToken["data"] += data + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-double-dash"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + # XXX + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-comment"}) + self.currentToken["data"] += "--" + data + self.state = self.commentState + return True + + def commentEndBangState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "-": + self.currentToken["data"] += "--!" + self.state = self.commentEndDashState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["data"] += "--!\uFFFD" + self.state = self.commentState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-comment-end-bang-state"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["data"] += "--!" + data + self.state = self.commentState + return True + + def doctypeState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "need-space-after-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeNameState + return True + + def beforeDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-right-bracket"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] = "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-doctype-name-but-got-eof"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] = data + self.state = self.doctypeNameState + return True + + def doctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.state = self.afterDoctypeNameState + elif data == ">": + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["name"] += "\uFFFD" + self.state = self.doctypeNameState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype-name"}) + self.currentToken["correct"] = False + self.currentToken["name"] = self.currentToken["name"].translate(asciiUpper2Lower) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["name"] += data + return True + + def afterDoctypeNameState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.currentToken["correct"] = False + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + if data in ("p", "P"): + matched = True + for expected in (("u", "U"), ("b", "B"), ("l", "L"), + ("i", "I"), ("c", "C")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypePublicKeywordState + return True + elif data in ("s", "S"): + matched = True + for expected in (("y", "Y"), ("s", "S"), ("t", "T"), + ("e", "E"), ("m", "M")): + data = self.stream.char() + if data not in expected: + matched = False + break + if matched: + self.state = self.afterDoctypeSystemKeywordState + return True + + # All the characters read before the current 'data' will be + # [a-zA-Z], so they're garbage in the bogus doctype and can be + # discarded; only the latest character might be '>' or EOF + # and needs to be ungetted + self.stream.unget(data) + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "expected-space-or-right-bracket-in-doctype", "datavars": + {"data": data}}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + + return True + + def afterDoctypePublicKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypePublicIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypePublicIdentifierState + return True + + def beforeDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["publicId"] = "" + self.state = self.doctypePublicIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypePublicIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def doctypePublicIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypePublicIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["publicId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["publicId"] += data + return True + + def afterDoctypePublicIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.betweenDoctypePublicAndSystemIdentifiersState + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def betweenDoctypePublicAndSystemIdentifiersState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data == '"': + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def afterDoctypeSystemKeywordState(self): + data = self.stream.char() + if data in spaceCharacters: + self.state = self.beforeDoctypeSystemIdentifierState + elif data in ("'", '"'): + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.stream.unget(data) + self.state = self.beforeDoctypeSystemIdentifierState + return True + + def beforeDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == "\"": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierDoubleQuotedState + elif data == "'": + self.currentToken["systemId"] = "" + self.state = self.doctypeSystemIdentifierSingleQuotedState + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.currentToken["correct"] = False + self.state = self.bogusDoctypeState + return True + + def doctypeSystemIdentifierDoubleQuotedState(self): + data = self.stream.char() + if data == "\"": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def doctypeSystemIdentifierSingleQuotedState(self): + data = self.stream.char() + if data == "'": + self.state = self.afterDoctypeSystemIdentifierState + elif data == "\u0000": + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + self.currentToken["systemId"] += "\uFFFD" + elif data == ">": + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-end-of-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.currentToken["systemId"] += data + return True + + def afterDoctypeSystemIdentifierState(self): + data = self.stream.char() + if data in spaceCharacters: + pass + elif data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "eof-in-doctype"}) + self.currentToken["correct"] = False + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + self.tokenQueue.append({"type": tokenTypes["ParseError"], "data": + "unexpected-char-in-doctype"}) + self.state = self.bogusDoctypeState + return True + + def bogusDoctypeState(self): + data = self.stream.char() + if data == ">": + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + elif data is EOF: + # XXX EMIT + self.stream.unget(data) + self.tokenQueue.append(self.currentToken) + self.state = self.dataState + else: + pass + return True + + def cdataSectionState(self): + data = [] + while True: + data.append(self.stream.charsUntil("]")) + data.append(self.stream.charsUntil(">")) + char = self.stream.char() + if char == EOF: + break + else: + assert char == ">" + if data[-1][-2:] == "]]": + data[-1] = data[-1][:-2] + break + else: + data.append(char) + + data = "".join(data) # pylint:disable=redefined-variable-type + # Deal with null here rather than in the parser + nullCount = data.count("\u0000") + if nullCount > 0: + for _ in range(nullCount): + self.tokenQueue.append({"type": tokenTypes["ParseError"], + "data": "invalid-codepoint"}) + data = data.replace("\u0000", "\uFFFD") + if data: + self.tokenQueue.append({"type": tokenTypes["Characters"], + "data": data}) + self.state = self.dataState + return True diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 000000000..ccc70bda4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__init__.py @@ -0,0 +1,14 @@ +from __future__ import absolute_import, division, unicode_literals + +from .py import Trie as PyTrie + +Trie = PyTrie + +# pylint:disable=wrong-import-position +try: + from .datrie import Trie as DATrie +except ImportError: + pass +else: + Trie = DATrie +# pylint:enable=wrong-import-position diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fe0b5a69a40f8d56be573f358d622180001ec97b GIT binary patch literal 434 zcmXw!%}&EG49A_cD`jJ2hlzLCVT7-VO+p9|NN_<2CIOXD)GZlgq#w9xMIVV*>Xj3( zz=>oMj{LLzPn<Xx-EJGKt!6tfi~xMQ;@?7>oLMjKEd&UnAt4b-Xhah)@(2hjJnbi~ zC?Ft%s8#pZ%7#@!0*{ame2|;(ZM-Jn)-$BR6UZ=X3I73xtsi?Y483MMo)?)ejpQoH zGc-*oRHX`)rA@y~)glv;Yh@(Hy7;kE!jLrn43)ecwwpHR%hHr6IY(;u&~xxD8k*M_ zxFoo%-SH?8v02B<b5}Q=oArBFh#7tXc3h{!?<dPqRk4w*ijgfdEhH8!K{j7;J}JiO zaV3rxJg*M+%yRO&LcPBnPp53ga+Qx%T9{bt5iZ7)L-P?kaqYa4smPGMnM9AZnltXk kVVtW}8P0d}x(QE`Oq5!lx_=fuiviuDzDG%)^hiMe0McD^@Bjb+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cac32ffb7cacf042cf839ecc67093b47e9f0780c GIT binary patch literal 1517 zcmZux&2Aev5GJ`RX(h`}Y8z=>q=A6uvWG}+5~EIF82w4xLs4C9Aix3vv0760+Fb3L zq*PnjTq+mIxldpp`y_pbz4nw>$f+}w?OKHiaF$CBIrDwrkl!yaw+OVO{ReOV_6Ye0 zf3BMkgKwdm7hnVtRFRBEG-DCVyvU<C$CRJdq8cSX6X6N}oCsgmW?obmwLKEnKf+ED zdeyynU~)CKlBZdbYg+{(ounqsN7eoDC{1!9xk|0nu`(g88o$Oxk&X@$+<x6K9c<<m z7)c^3NW=t<JhAki45<s>jC@fO^>Y%{L_-Adt&65;!ME|A_#_G-sdnY>>r_s^{BB^Z zjuYD%#71@!6&uqT=DK5H)$|kQq7eeL+;p=EKbBZpk{P>Tm*gG$05lv2`myy&HlusQ z<w6BJ4@&l$;7sWC6MA(R9$JIG2HkuC=8%-+?dm&P(hKr|TvF|q^iOu;?~%U<FwrtL z*4F%%+QX1lth-s!Q<$z7S`O1w-GCE5jeCVoC$W{iNvwOrTnVX7FVnrj5$D@xYxK=T zyhwO4dA4bX+XqKleLdWI`Leg)E7Ia=I)V^NJ=Mw9_H%m@<D~0+B1a<Ey+fO+EtL*> z9Es_1WUE`8eQNF)X_GuFcJCt?L{=x$N62mWSe}{gj>;3zbGLir82VMsj0>rC9lR?a z-6{``ffDhJR71T4^ZFhb0NLc+iNbkE=L_xY)g}x~0EVy?7SMoAn>TS6gu|lw0iB<K zIelD`3vx+bBjc=O7r;6&-Vz|vN$U+%vlDCor;xcEG)4$L{TX~*0+k0DJJRO{^QqPk zW5W>%N0s<onN?VsCrDRl3lrRM3Et&<cf$K{LJ4(tT-WUq5<Gon;R-_K(HRx=bErRn z@dRMNJt)}{`GajhDS>zA_6z{)ydf66X7qRP1c0pn5vvg>ujzPnAS+MFQ5F0m&wkW8 z*9&-Q`hT=5Du+GBUg6w8oJa$q0rlBKx=L5sbj@L1^jtuRcgo4~00t-u3W1W8fMtUW zQ3%=x+3|`jWYkc%O8=G$Ym3o1JSN#!u-Uk010<L}ydx>+hLM_8!1*Z7B<EF&^DGx* zh2u8oC*xRMtu#0ndBXX;I@aNMm!N(GqiXr8Tob7jxZu@v22fx%Xji;g_t*_SyU5r| zGiU@YcOUv;17i=zcB~<`#v7%PDUBGar6gBMCKet|qwx)KoBoS)i;Q4r4qz9Bb_}eu Gw)Zbw?qDeZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/datrie.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39c5e673c7faf8d03def211c2765f9aaa9b95354 GIT binary patch literal 2036 zcmb7FTTdf56t?G<NeGY)EP`I?RgKzBdP8NaRkiGHRaL5ZDJoL5D{F`ynCx7F?WBN) zmxUh!kNqS45q|B{{)ImE98W?6Lfhhzk3Gkp^L^)H&y)H28i6+0S$XlNN626JGHviq z9z$2ZfZ&AFgru}fQ>W{sZr7!#a}qE0yMdj%NhJ-tA<R9{S3zH+<R`*?9-I>%h}xOk z^?Bu2(h6ULMbdK3Vzj67WTXX)(_t>P33)t@Rh(z0G0Ngz&IL<iEo79a7B$|Ej0KEU zEsiwP$3yX&f}tK-n>H6FkD;sIKnT*MoOB&dxpPjsE_b;HqgQf5Havv)fLD19#tL8N zbv}PiyCGlTi=e6U2EPYmjW_ucjB|Vr_}`a481FeCum#Xj@f5lmgV5xRoH|F}7xaQ& zl4s;a`_$D=;cEBHQJ-p$(=+;t9<3BEtSy{+g>&H--X*2v@QYn?*w`gH;Lb&*a4unI zL0EY79@wf{Tg~Urse9@denAFd;XWdV&vzjeK+D}eS=~yK^_SvUt*0ZU*Z0J_(lXBW zl_9N~ah1@<!(~&0C}&DXSx-phZ>l>G&L5@BrEw$9P4H|BqiwuF9%sg9JkpWzAs4A? z1;$e%=^L+9_6{Pcj0<*+hjZhPqhuuhAaWHf|2^&uWjv0w=!_%T>E{U-Qgu?<*&8sn zsW!6j#{AnJ8;-yJQujCa2QvApzwz*4XQwlahYu{vBzYiv8=K$g!w8kOv$4o{E;|Q0 zO*WEvufxDo(E&;@w1>wgWGv2N%@~%rYJwm%pbNA{L+DMXL7Vhs9-VAYcV49wQ;XfE z6u&PZ4FmErfH2eT7L^UqwH%37<$V<BYAM!WX6lUf@=QlSpRpCtC|fP`<lY4E-_;)0 zFg6^ofocMvPyr>VW86e!B{D6MZ-7=9gB^?^gDGBpf@c@5K_T3ge^|1w;H*siGfUgK z{y7~cA{Chy+!hA7ZT-E0igAV`%Gf(Iuvc-lD{qJ^M75x6Q{4ZI>l|bILSq>+_WlfB zW8&u3;`TL6ycMjkb(ml#FK9t8r-8Mo64N|MsR@Qs^y8x&S+!d}oI$NxR6J03MKj9> zkz)8I`#shNti+pE)CYiZ6B}_qnZaJO*tc1^Gna)V&-R7V|AWOxz~HkP7E6}J_3!VD zzjXb3ET{BMq4*dGd_F^B^%fGP5jd-Lya=)=6^xl0V`<Ju3C`h!9*&}<T#;{qIr%n< zcTr$z$#oQ16%u1F(RGQ?GnuhR0gs#gBUE8xFPe~s_0TP!njP)>c54nP^hbImfr7-t zF0nKv{%hekWbZD!RW5+WEW%~io?LWo1@&mJYM<>zN|?&llc(tTZFEfdsC4uPJmo3` MvFy}o-Ko3(0PVNFRsaA1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..903ab0d5004ac7f84a73d1847843ee3ada1abe71 GIT binary patch literal 2239 zcma)7&2Aev5GJ`lTFJ7lq^T35ZK|SZ3l)u&rgh=~hLN8(1&Y9z8Z96+Al4#fue`gG zNlLYi)uqaV*vGy=ABNYS@(MY1hHELY5d_)A4u`|p8S<MSK3QI_5qJi>YcK9q2>A~u z^T!9~5q$bN5J3b@Nk+RgV_lYcU5}!SrG6H41IK%5m{qzJ;C&IKQC98NDEWnmP*h$L zQIWNo*R6`^H`1!U0*j>O+0}SY57V)cJjq5wWo#spNurZsZX4q~=?#VCX=0>`Q{AGr zYUHuu=42#cvb2|I*)u$qee;T<J!<`3mB=0%pFbWjkKohKfJoA%f^?ang1sbNPk6$I z5w<Hr7z0re5saaziW-a+(GYd9{E~Jfu_9JMQWZ<E{c9=$V?7209~=>@r|{`tff&FF z9TfD8o|B)*jLxXOZJ6+8^lw_wf^g6H<?0M)f$)KbA~2N#bo&fuks#nI-09)b@R_^O z!0TH;3i6^cr3Ty>I%B^RN{*QOiSD$RtpSX=HgVpQDgbQ|vG!d{kN+X64)fQlGg8SU zHnKB`Ri{5pg;ctesm|Vj^G&^xKbVLgdwevxch~ec_XjHdzQ6JCVQ059N=A2_?KHik zdK;TRn4=hl?&A}gi=pZqm@M5$lf4c%5R=a6q&+%$UESK3xjY`J?Ik=#d8E@OMy<_x zk|&1q_EtLVLA<xy3+2;WkJGeyC{J`V8*9_tlT8g)^L=fJa-pwUFHTeIqmHfaLWcaT z)KJ-gi`c|A)R0_Kz_e80y|{NE!G`rxncI3f9}Sb-XaLIBGVNO*e|1=uWEr+>qxm+m zZZrZ(=o*b!NLOe`PnRzp<x+~^VO@&gpO^##au`C0AzD;@1hN)W>o8ak_ITB8o%7x> zH!;A@IVwBs2tB=a;qcAsB4H4iOHLtG$N=)Ibjs9CP$)f9=lQDB3Wws#IbVCrU;V<L zTlipC*2f}#pD)A}R5(Wn=7(FL=~mu@CSY06bu5^xXsS=~kQk@8g1E%_zBJ%3;~dxL z{u&pDTP*G@d_r?1SVk^_{{mA$CpnDt8jSRi!3cZMP2=K<5JP!G84tX3s-DB>|H-Co z>X`ubAo{HEX1-6R{xrxNbLotg5~yb~4GZ6ds67Mw$`p_*$KScXgLMM7DOf%$!n4X; zc1|fN0>K`TX>c_81HC|_Df}XE4aG+bEpJDy!tNEGrxmG>VX&T-#@3)$D5L*M%z?sy zD{L_;M1pw&^(92BQf6p4QnH^MTb2$jJ4kHc{<Snw*HHg5+D`U4$n|X?SS>YHr!~69 z8m?-5cAYk89rzkMt-1(ckuH!&)ECGLn9OTOt%wq5#GC;d_hIxdaE69D2<A9X{k#qh z*GXn<>R%umIAnJPgJ|KJ54b{mKF0#_c6Oh^ak13Ymq@N)g1|XoT0vPmU!mY@B;O!u zA-N2My>Sq0*MK;p%u5jOgQC6;ga9VKL*_cGvlZY^*Bu(~`U~^ChRrCCGs(HFah?su zI7J?M#nCuU%N6wrZsap02)}9~`2vXx)wjsK*{0*L&$%0}3XEO>649s{dF5NX>DG2y zOX##eHe&@&6*d~>A;GKAuEKTDzPJk7IyrV%kPXW#+hrB>;=Nc)XUtX}KY5C0eb-iO Tv{fE$8ylL&tM>+^3%uU{cq{3) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 000000000..ecfff32a7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/_base.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import Mapping + + +class Trie(Mapping): + """Abstract base class for tries""" + + def keys(self, prefix=None): + # pylint:disable=arguments-differ + keys = super(Trie, self).keys() + + if prefix is None: + return set(keys) + + return {x for x in keys if x.startswith(prefix)} + + def has_keys_with_prefix(self, prefix): + for key in self.keys(): + if key.startswith(prefix): + return True + + return False + + def longest_prefix(self, prefix): + if prefix in self: + return prefix + + for i in range(1, len(prefix) + 1): + if prefix[:-i] in self: + return prefix[:-i] + + raise KeyError(prefix) + + def longest_prefix_item(self, prefix): + lprefix = self.longest_prefix(prefix) + return (lprefix, self[lprefix]) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 000000000..cb1af60fc --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/datrie.py @@ -0,0 +1,44 @@ +from __future__ import absolute_import, division, unicode_literals + +from datrie import Trie as DATrie +from pip._vendor.six import text_type + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + chars = set() + for key in data.keys(): + if not isinstance(key, text_type): + raise TypeError("All keys must be strings") + for char in key: + chars.add(char) + + self._data = DATrie("".join(chars)) + for key, value in data.items(): + self._data[key] = value + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + raise NotImplementedError() + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + return self._data.keys(prefix) + + def has_keys_with_prefix(self, prefix): + return self._data.has_keys_with_prefix(prefix) + + def longest_prefix(self, prefix): + return self._data.longest_prefix(prefix) + + def longest_prefix_item(self, prefix): + return self._data.longest_prefix_item(prefix) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 000000000..5531263df --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_trie/py.py @@ -0,0 +1,67 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from bisect import bisect_left + +from ._base import Trie as ABCTrie + + +class Trie(ABCTrie): + def __init__(self, data): + if not all(isinstance(x, text_type) for x in data.keys()): + raise TypeError("All keys must be strings") + + self._data = data + self._keys = sorted(data.keys()) + self._cachestr = "" + self._cachepoints = (0, len(data)) + + def __contains__(self, key): + return key in self._data + + def __len__(self): + return len(self._data) + + def __iter__(self): + return iter(self._data) + + def __getitem__(self, key): + return self._data[key] + + def keys(self, prefix=None): + if prefix is None or prefix == "" or not self._keys: + return set(self._keys) + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + start = i = bisect_left(self._keys, prefix, lo, hi) + else: + start = i = bisect_left(self._keys, prefix) + + keys = set() + if start == len(self._keys): + return keys + + while self._keys[i].startswith(prefix): + keys.add(self._keys[i]) + i += 1 + + self._cachestr = prefix + self._cachepoints = (start, i) + + return keys + + def has_keys_with_prefix(self, prefix): + if prefix in self._data: + return True + + if prefix.startswith(self._cachestr): + lo, hi = self._cachepoints + i = bisect_left(self._keys, prefix, lo, hi) + else: + i = bisect_left(self._keys, prefix) + + if i == len(self._keys): + return False + + return self._keys[i].startswith(prefix) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py new file mode 100644 index 000000000..a559fa0e5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/_utils.py @@ -0,0 +1,124 @@ +from __future__ import absolute_import, division, unicode_literals + +from types import ModuleType + +from pip._vendor.six import text_type + +try: + import xml.etree.cElementTree as default_etree +except ImportError: + import xml.etree.ElementTree as default_etree + + +__all__ = ["default_etree", "MethodDispatcher", "isSurrogatePair", + "surrogatePairToCodepoint", "moduleFactoryFactory", + "supports_lone_surrogates"] + + +# Platforms not supporting lone surrogates (\uD800-\uDFFF) should be +# caught by the below test. In general this would be any platform +# using UTF-16 as its encoding of unicode strings, such as +# Jython. This is because UTF-16 itself is based on the use of such +# surrogates, and there is no mechanism to further escape such +# escapes. +try: + _x = eval('"\\uD800"') # pylint:disable=eval-used + if not isinstance(_x, text_type): + # We need this with u"" because of http://bugs.jython.org/issue2039 + _x = eval('u"\\uD800"') # pylint:disable=eval-used + assert isinstance(_x, text_type) +except: # pylint:disable=bare-except + supports_lone_surrogates = False +else: + supports_lone_surrogates = True + + +class MethodDispatcher(dict): + """Dict with 2 special properties: + + On initiation, keys that are lists, sets or tuples are converted to + multiple keys so accessing any one of the items in the original + list-like object returns the matching value + + md = MethodDispatcher({("foo", "bar"):"baz"}) + md["foo"] == "baz" + + A default value which can be set through the default attribute. + """ + + def __init__(self, items=()): + # Using _dictEntries instead of directly assigning to self is about + # twice as fast. Please do careful performance testing before changing + # anything here. + _dictEntries = [] + for name, value in items: + if isinstance(name, (list, tuple, frozenset, set)): + for item in name: + _dictEntries.append((item, value)) + else: + _dictEntries.append((name, value)) + dict.__init__(self, _dictEntries) + assert len(self) == len(_dictEntries) + self.default = None + + def __getitem__(self, key): + return dict.get(self, key, self.default) + + +# Some utility functions to deal with weirdness around UCS2 vs UCS4 +# python builds + +def isSurrogatePair(data): + return (len(data) == 2 and + ord(data[0]) >= 0xD800 and ord(data[0]) <= 0xDBFF and + ord(data[1]) >= 0xDC00 and ord(data[1]) <= 0xDFFF) + + +def surrogatePairToCodepoint(data): + char_val = (0x10000 + (ord(data[0]) - 0xD800) * 0x400 + + (ord(data[1]) - 0xDC00)) + return char_val + +# Module Factory Factory (no, this isn't Java, I know) +# Here to stop this being duplicated all over the place. + + +def moduleFactoryFactory(factory): + moduleCache = {} + + def moduleFactory(baseModule, *args, **kwargs): + if isinstance(ModuleType.__name__, type("")): + name = "_%s_factory" % baseModule.__name__ + else: + name = b"_%s_factory" % baseModule.__name__ + + kwargs_tuple = tuple(kwargs.items()) + + try: + return moduleCache[name][args][kwargs_tuple] + except KeyError: + mod = ModuleType(name) + objs = factory(baseModule, *args, **kwargs) + mod.__dict__.update(objs) + if "name" not in moduleCache: + moduleCache[name] = {} + if "args" not in moduleCache[name]: + moduleCache[name][args] = {} + if "kwargs" not in moduleCache[name][args]: + moduleCache[name][args][kwargs_tuple] = {} + moduleCache[name][args][kwargs_tuple] = mod + return mod + + return moduleFactory + + +def memoize(func): + cache = {} + + def wrapped(*args, **kwargs): + key = (tuple(args), tuple(kwargs.items())) + if key not in cache: + cache[key] = func(*args, **kwargs) + return cache[key] + + return wrapped diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py new file mode 100644 index 000000000..bca155e11 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/constants.py @@ -0,0 +1,2947 @@ +from __future__ import absolute_import, division, unicode_literals + +import string + +EOF = None + +E = { + "null-character": + "Null character in input stream, replaced with U+FFFD.", + "invalid-codepoint": + "Invalid codepoint in stream.", + "incorrectly-placed-solidus": + "Solidus (/) incorrectly placed in tag.", + "incorrect-cr-newline-entity": + "Incorrect CR newline entity, replaced with LF.", + "illegal-windows-1252-entity": + "Entity used with illegal number (windows-1252 reference).", + "cant-convert-numeric-entity": + "Numeric entity couldn't be converted to character " + "(codepoint U+%(charAsInt)08x).", + "illegal-codepoint-for-numeric-entity": + "Numeric entity represents an illegal codepoint: " + "U+%(charAsInt)08x.", + "numeric-entity-without-semicolon": + "Numeric entity didn't end with ';'.", + "expected-numeric-entity-but-got-eof": + "Numeric entity expected. Got end of file instead.", + "expected-numeric-entity": + "Numeric entity expected but none found.", + "named-entity-without-semicolon": + "Named entity didn't end with ';'.", + "expected-named-entity": + "Named entity expected. Got none.", + "attributes-in-end-tag": + "End tag contains unexpected attributes.", + 'self-closing-flag-on-end-tag': + "End tag contains unexpected self-closing flag.", + "expected-tag-name-but-got-right-bracket": + "Expected tag name. Got '>' instead.", + "expected-tag-name-but-got-question-mark": + "Expected tag name. Got '?' instead. (HTML doesn't " + "support processing instructions.)", + "expected-tag-name": + "Expected tag name. Got something else instead", + "expected-closing-tag-but-got-right-bracket": + "Expected closing tag. Got '>' instead. Ignoring '</>'.", + "expected-closing-tag-but-got-eof": + "Expected closing tag. Unexpected end of file.", + "expected-closing-tag-but-got-char": + "Expected closing tag. Unexpected character '%(data)s' found.", + "eof-in-tag-name": + "Unexpected end of file in the tag name.", + "expected-attribute-name-but-got-eof": + "Unexpected end of file. Expected attribute name instead.", + "eof-in-attribute-name": + "Unexpected end of file in attribute name.", + "invalid-character-in-attribute-name": + "Invalid character in attribute name", + "duplicate-attribute": + "Dropped duplicate attribute on tag.", + "expected-end-of-tag-name-but-got-eof": + "Unexpected end of file. Expected = or end of tag.", + "expected-attribute-value-but-got-eof": + "Unexpected end of file. Expected attribute value.", + "expected-attribute-value-but-got-right-bracket": + "Expected attribute value. Got '>' instead.", + 'equals-in-unquoted-attribute-value': + "Unexpected = in unquoted attribute", + 'unexpected-character-in-unquoted-attribute-value': + "Unexpected character in unquoted attribute", + "invalid-character-after-attribute-name": + "Unexpected character after attribute name.", + "unexpected-character-after-attribute-value": + "Unexpected character after attribute value.", + "eof-in-attribute-value-double-quote": + "Unexpected end of file in attribute value (\").", + "eof-in-attribute-value-single-quote": + "Unexpected end of file in attribute value (').", + "eof-in-attribute-value-no-quotes": + "Unexpected end of file in attribute value.", + "unexpected-EOF-after-solidus-in-tag": + "Unexpected end of file in tag. Expected >", + "unexpected-character-after-solidus-in-tag": + "Unexpected character after / in tag. Expected >", + "expected-dashes-or-doctype": + "Expected '--' or 'DOCTYPE'. Not found.", + "unexpected-bang-after-double-dash-in-comment": + "Unexpected ! after -- in comment", + "unexpected-space-after-double-dash-in-comment": + "Unexpected space after -- in comment", + "incorrect-comment": + "Incorrect comment.", + "eof-in-comment": + "Unexpected end of file in comment.", + "eof-in-comment-end-dash": + "Unexpected end of file in comment (-)", + "unexpected-dash-after-double-dash-in-comment": + "Unexpected '-' after '--' found in comment.", + "eof-in-comment-double-dash": + "Unexpected end of file in comment (--).", + "eof-in-comment-end-space-state": + "Unexpected end of file in comment.", + "eof-in-comment-end-bang-state": + "Unexpected end of file in comment.", + "unexpected-char-in-comment": + "Unexpected character in comment found.", + "need-space-after-doctype": + "No space after literal string 'DOCTYPE'.", + "expected-doctype-name-but-got-right-bracket": + "Unexpected > character. Expected DOCTYPE name.", + "expected-doctype-name-but-got-eof": + "Unexpected end of file. Expected DOCTYPE name.", + "eof-in-doctype-name": + "Unexpected end of file in DOCTYPE name.", + "eof-in-doctype": + "Unexpected end of file in DOCTYPE.", + "expected-space-or-right-bracket-in-doctype": + "Expected space or '>'. Got '%(data)s'", + "unexpected-end-of-doctype": + "Unexpected end of DOCTYPE.", + "unexpected-char-in-doctype": + "Unexpected character in DOCTYPE.", + "eof-in-innerhtml": + "XXX innerHTML EOF", + "unexpected-doctype": + "Unexpected DOCTYPE. Ignored.", + "non-html-root": + "html needs to be the first start tag.", + "expected-doctype-but-got-eof": + "Unexpected End of file. Expected DOCTYPE.", + "unknown-doctype": + "Erroneous DOCTYPE.", + "expected-doctype-but-got-chars": + "Unexpected non-space characters. Expected DOCTYPE.", + "expected-doctype-but-got-start-tag": + "Unexpected start tag (%(name)s). Expected DOCTYPE.", + "expected-doctype-but-got-end-tag": + "Unexpected end tag (%(name)s). Expected DOCTYPE.", + "end-tag-after-implied-root": + "Unexpected end tag (%(name)s) after the (implied) root element.", + "expected-named-closing-tag-but-got-eof": + "Unexpected end of file. Expected end tag (%(name)s).", + "two-heads-are-not-better-than-one": + "Unexpected start tag head in existing head. Ignored.", + "unexpected-end-tag": + "Unexpected end tag (%(name)s). Ignored.", + "unexpected-start-tag-out-of-my-head": + "Unexpected start tag (%(name)s) that can be in head. Moved.", + "unexpected-start-tag": + "Unexpected start tag (%(name)s).", + "missing-end-tag": + "Missing end tag (%(name)s).", + "missing-end-tags": + "Missing end tags (%(name)s).", + "unexpected-start-tag-implies-end-tag": + "Unexpected start tag (%(startName)s) " + "implies end tag (%(endName)s).", + "unexpected-start-tag-treated-as": + "Unexpected start tag (%(originalName)s). Treated as %(newName)s.", + "deprecated-tag": + "Unexpected start tag %(name)s. Don't use it!", + "unexpected-start-tag-ignored": + "Unexpected start tag %(name)s. Ignored.", + "expected-one-end-tag-but-got-another": + "Unexpected end tag (%(gotName)s). " + "Missing end tag (%(expectedName)s).", + "end-tag-too-early": + "End tag (%(name)s) seen too early. Expected other end tag.", + "end-tag-too-early-named": + "Unexpected end tag (%(gotName)s). Expected end tag (%(expectedName)s).", + "end-tag-too-early-ignored": + "End tag (%(name)s) seen too early. Ignored.", + "adoption-agency-1.1": + "End tag (%(name)s) violates step 1, " + "paragraph 1 of the adoption agency algorithm.", + "adoption-agency-1.2": + "End tag (%(name)s) violates step 1, " + "paragraph 2 of the adoption agency algorithm.", + "adoption-agency-1.3": + "End tag (%(name)s) violates step 1, " + "paragraph 3 of the adoption agency algorithm.", + "adoption-agency-4.4": + "End tag (%(name)s) violates step 4, " + "paragraph 4 of the adoption agency algorithm.", + "unexpected-end-tag-treated-as": + "Unexpected end tag (%(originalName)s). Treated as %(newName)s.", + "no-end-tag": + "This element (%(name)s) has no end tag.", + "unexpected-implied-end-tag-in-table": + "Unexpected implied end tag (%(name)s) in the table phase.", + "unexpected-implied-end-tag-in-table-body": + "Unexpected implied end tag (%(name)s) in the table body phase.", + "unexpected-char-implies-table-voodoo": + "Unexpected non-space characters in " + "table context caused voodoo mode.", + "unexpected-hidden-input-in-table": + "Unexpected input with type hidden in table context.", + "unexpected-form-in-table": + "Unexpected form in table context.", + "unexpected-start-tag-implies-table-voodoo": + "Unexpected start tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-end-tag-implies-table-voodoo": + "Unexpected end tag (%(name)s) in " + "table context caused voodoo mode.", + "unexpected-cell-in-table-body": + "Unexpected table cell start tag (%(name)s) " + "in the table body phase.", + "unexpected-cell-end-tag": + "Got table cell end tag (%(name)s) " + "while required end tags are missing.", + "unexpected-end-tag-in-table-body": + "Unexpected end tag (%(name)s) in the table body phase. Ignored.", + "unexpected-implied-end-tag-in-table-row": + "Unexpected implied end tag (%(name)s) in the table row phase.", + "unexpected-end-tag-in-table-row": + "Unexpected end tag (%(name)s) in the table row phase. Ignored.", + "unexpected-select-in-select": + "Unexpected select start tag in the select phase " + "treated as select end tag.", + "unexpected-input-in-select": + "Unexpected input start tag in the select phase.", + "unexpected-start-tag-in-select": + "Unexpected start tag token (%(name)s in the select phase. " + "Ignored.", + "unexpected-end-tag-in-select": + "Unexpected end tag (%(name)s) in the select phase. Ignored.", + "unexpected-table-element-start-tag-in-select-in-table": + "Unexpected table element start tag (%(name)s) in the select in table phase.", + "unexpected-table-element-end-tag-in-select-in-table": + "Unexpected table element end tag (%(name)s) in the select in table phase.", + "unexpected-char-after-body": + "Unexpected non-space characters in the after body phase.", + "unexpected-start-tag-after-body": + "Unexpected start tag token (%(name)s)" + " in the after body phase.", + "unexpected-end-tag-after-body": + "Unexpected end tag token (%(name)s)" + " in the after body phase.", + "unexpected-char-in-frameset": + "Unexpected characters in the frameset phase. Characters ignored.", + "unexpected-start-tag-in-frameset": + "Unexpected start tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-frameset-in-frameset-innerhtml": + "Unexpected end tag token (frameset) " + "in the frameset phase (innerHTML).", + "unexpected-end-tag-in-frameset": + "Unexpected end tag token (%(name)s)" + " in the frameset phase. Ignored.", + "unexpected-char-after-frameset": + "Unexpected non-space characters in the " + "after frameset phase. Ignored.", + "unexpected-start-tag-after-frameset": + "Unexpected start tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-frameset": + "Unexpected end tag (%(name)s)" + " in the after frameset phase. Ignored.", + "unexpected-end-tag-after-body-innerhtml": + "Unexpected end tag after body(innerHtml)", + "expected-eof-but-got-char": + "Unexpected non-space characters. Expected end of file.", + "expected-eof-but-got-start-tag": + "Unexpected start tag (%(name)s)" + ". Expected end of file.", + "expected-eof-but-got-end-tag": + "Unexpected end tag (%(name)s)" + ". Expected end of file.", + "eof-in-table": + "Unexpected end of file. Expected table content.", + "eof-in-select": + "Unexpected end of file. Expected select content.", + "eof-in-frameset": + "Unexpected end of file. Expected frameset content.", + "eof-in-script-in-script": + "Unexpected end of file. Expected script content.", + "eof-in-foreign-lands": + "Unexpected end of file. Expected foreign content", + "non-void-element-with-trailing-solidus": + "Trailing solidus not allowed on element %(name)s", + "unexpected-html-element-in-foreign-content": + "Element %(name)s not allowed in a non-html context", + "unexpected-end-tag-before-html": + "Unexpected end tag (%(name)s) before html.", + "unexpected-inhead-noscript-tag": + "Element %(name)s not allowed in a inhead-noscript context", + "eof-in-head-noscript": + "Unexpected end of file. Expected inhead-noscript content", + "char-in-head-noscript": + "Unexpected non-space character. Expected inhead-noscript content", + "XXX-undefined-error": + "Undefined error (this sucks and should be fixed)", +} + +namespaces = { + "html": "http://www.w3.org/1999/xhtml", + "mathml": "http://www.w3.org/1998/Math/MathML", + "svg": "http://www.w3.org/2000/svg", + "xlink": "http://www.w3.org/1999/xlink", + "xml": "http://www.w3.org/XML/1998/namespace", + "xmlns": "http://www.w3.org/2000/xmlns/" +} + +scopingElements = frozenset([ + (namespaces["html"], "applet"), + (namespaces["html"], "caption"), + (namespaces["html"], "html"), + (namespaces["html"], "marquee"), + (namespaces["html"], "object"), + (namespaces["html"], "table"), + (namespaces["html"], "td"), + (namespaces["html"], "th"), + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext"), + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title"), +]) + +formattingElements = frozenset([ + (namespaces["html"], "a"), + (namespaces["html"], "b"), + (namespaces["html"], "big"), + (namespaces["html"], "code"), + (namespaces["html"], "em"), + (namespaces["html"], "font"), + (namespaces["html"], "i"), + (namespaces["html"], "nobr"), + (namespaces["html"], "s"), + (namespaces["html"], "small"), + (namespaces["html"], "strike"), + (namespaces["html"], "strong"), + (namespaces["html"], "tt"), + (namespaces["html"], "u") +]) + +specialElements = frozenset([ + (namespaces["html"], "address"), + (namespaces["html"], "applet"), + (namespaces["html"], "area"), + (namespaces["html"], "article"), + (namespaces["html"], "aside"), + (namespaces["html"], "base"), + (namespaces["html"], "basefont"), + (namespaces["html"], "bgsound"), + (namespaces["html"], "blockquote"), + (namespaces["html"], "body"), + (namespaces["html"], "br"), + (namespaces["html"], "button"), + (namespaces["html"], "caption"), + (namespaces["html"], "center"), + (namespaces["html"], "col"), + (namespaces["html"], "colgroup"), + (namespaces["html"], "command"), + (namespaces["html"], "dd"), + (namespaces["html"], "details"), + (namespaces["html"], "dir"), + (namespaces["html"], "div"), + (namespaces["html"], "dl"), + (namespaces["html"], "dt"), + (namespaces["html"], "embed"), + (namespaces["html"], "fieldset"), + (namespaces["html"], "figure"), + (namespaces["html"], "footer"), + (namespaces["html"], "form"), + (namespaces["html"], "frame"), + (namespaces["html"], "frameset"), + (namespaces["html"], "h1"), + (namespaces["html"], "h2"), + (namespaces["html"], "h3"), + (namespaces["html"], "h4"), + (namespaces["html"], "h5"), + (namespaces["html"], "h6"), + (namespaces["html"], "head"), + (namespaces["html"], "header"), + (namespaces["html"], "hr"), + (namespaces["html"], "html"), + (namespaces["html"], "iframe"), + # Note that image is commented out in the spec as "this isn't an + # element that can end up on the stack, so it doesn't matter," + (namespaces["html"], "image"), + (namespaces["html"], "img"), + (namespaces["html"], "input"), + (namespaces["html"], "isindex"), + (namespaces["html"], "li"), + (namespaces["html"], "link"), + (namespaces["html"], "listing"), + (namespaces["html"], "marquee"), + (namespaces["html"], "menu"), + (namespaces["html"], "meta"), + (namespaces["html"], "nav"), + (namespaces["html"], "noembed"), + (namespaces["html"], "noframes"), + (namespaces["html"], "noscript"), + (namespaces["html"], "object"), + (namespaces["html"], "ol"), + (namespaces["html"], "p"), + (namespaces["html"], "param"), + (namespaces["html"], "plaintext"), + (namespaces["html"], "pre"), + (namespaces["html"], "script"), + (namespaces["html"], "section"), + (namespaces["html"], "select"), + (namespaces["html"], "style"), + (namespaces["html"], "table"), + (namespaces["html"], "tbody"), + (namespaces["html"], "td"), + (namespaces["html"], "textarea"), + (namespaces["html"], "tfoot"), + (namespaces["html"], "th"), + (namespaces["html"], "thead"), + (namespaces["html"], "title"), + (namespaces["html"], "tr"), + (namespaces["html"], "ul"), + (namespaces["html"], "wbr"), + (namespaces["html"], "xmp"), + (namespaces["svg"], "foreignObject") +]) + +htmlIntegrationPointElements = frozenset([ + (namespaces["mathml"], "annotation-xml"), + (namespaces["svg"], "foreignObject"), + (namespaces["svg"], "desc"), + (namespaces["svg"], "title") +]) + +mathmlTextIntegrationPointElements = frozenset([ + (namespaces["mathml"], "mi"), + (namespaces["mathml"], "mo"), + (namespaces["mathml"], "mn"), + (namespaces["mathml"], "ms"), + (namespaces["mathml"], "mtext") +]) + +adjustSVGAttributes = { + "attributename": "attributeName", + "attributetype": "attributeType", + "basefrequency": "baseFrequency", + "baseprofile": "baseProfile", + "calcmode": "calcMode", + "clippathunits": "clipPathUnits", + "contentscripttype": "contentScriptType", + "contentstyletype": "contentStyleType", + "diffuseconstant": "diffuseConstant", + "edgemode": "edgeMode", + "externalresourcesrequired": "externalResourcesRequired", + "filterres": "filterRes", + "filterunits": "filterUnits", + "glyphref": "glyphRef", + "gradienttransform": "gradientTransform", + "gradientunits": "gradientUnits", + "kernelmatrix": "kernelMatrix", + "kernelunitlength": "kernelUnitLength", + "keypoints": "keyPoints", + "keysplines": "keySplines", + "keytimes": "keyTimes", + "lengthadjust": "lengthAdjust", + "limitingconeangle": "limitingConeAngle", + "markerheight": "markerHeight", + "markerunits": "markerUnits", + "markerwidth": "markerWidth", + "maskcontentunits": "maskContentUnits", + "maskunits": "maskUnits", + "numoctaves": "numOctaves", + "pathlength": "pathLength", + "patterncontentunits": "patternContentUnits", + "patterntransform": "patternTransform", + "patternunits": "patternUnits", + "pointsatx": "pointsAtX", + "pointsaty": "pointsAtY", + "pointsatz": "pointsAtZ", + "preservealpha": "preserveAlpha", + "preserveaspectratio": "preserveAspectRatio", + "primitiveunits": "primitiveUnits", + "refx": "refX", + "refy": "refY", + "repeatcount": "repeatCount", + "repeatdur": "repeatDur", + "requiredextensions": "requiredExtensions", + "requiredfeatures": "requiredFeatures", + "specularconstant": "specularConstant", + "specularexponent": "specularExponent", + "spreadmethod": "spreadMethod", + "startoffset": "startOffset", + "stddeviation": "stdDeviation", + "stitchtiles": "stitchTiles", + "surfacescale": "surfaceScale", + "systemlanguage": "systemLanguage", + "tablevalues": "tableValues", + "targetx": "targetX", + "targety": "targetY", + "textlength": "textLength", + "viewbox": "viewBox", + "viewtarget": "viewTarget", + "xchannelselector": "xChannelSelector", + "ychannelselector": "yChannelSelector", + "zoomandpan": "zoomAndPan" +} + +adjustMathMLAttributes = {"definitionurl": "definitionURL"} + +adjustForeignAttributes = { + "xlink:actuate": ("xlink", "actuate", namespaces["xlink"]), + "xlink:arcrole": ("xlink", "arcrole", namespaces["xlink"]), + "xlink:href": ("xlink", "href", namespaces["xlink"]), + "xlink:role": ("xlink", "role", namespaces["xlink"]), + "xlink:show": ("xlink", "show", namespaces["xlink"]), + "xlink:title": ("xlink", "title", namespaces["xlink"]), + "xlink:type": ("xlink", "type", namespaces["xlink"]), + "xml:base": ("xml", "base", namespaces["xml"]), + "xml:lang": ("xml", "lang", namespaces["xml"]), + "xml:space": ("xml", "space", namespaces["xml"]), + "xmlns": (None, "xmlns", namespaces["xmlns"]), + "xmlns:xlink": ("xmlns", "xlink", namespaces["xmlns"]) +} + +unadjustForeignAttributes = dict([((ns, local), qname) for qname, (prefix, local, ns) in + adjustForeignAttributes.items()]) + +spaceCharacters = frozenset([ + "\t", + "\n", + "\u000C", + " ", + "\r" +]) + +tableInsertModeElements = frozenset([ + "table", + "tbody", + "tfoot", + "thead", + "tr" +]) + +asciiLowercase = frozenset(string.ascii_lowercase) +asciiUppercase = frozenset(string.ascii_uppercase) +asciiLetters = frozenset(string.ascii_letters) +digits = frozenset(string.digits) +hexDigits = frozenset(string.hexdigits) + +asciiUpper2Lower = dict([(ord(c), ord(c.lower())) + for c in string.ascii_uppercase]) + +# Heading elements need to be ordered +headingElements = ( + "h1", + "h2", + "h3", + "h4", + "h5", + "h6" +) + +voidElements = frozenset([ + "base", + "command", + "event-source", + "link", + "meta", + "hr", + "br", + "img", + "embed", + "param", + "area", + "col", + "input", + "source", + "track" +]) + +cdataElements = frozenset(['title', 'textarea']) + +rcdataElements = frozenset([ + 'style', + 'script', + 'xmp', + 'iframe', + 'noembed', + 'noframes', + 'noscript' +]) + +booleanAttributes = { + "": frozenset(["irrelevant", "itemscope"]), + "style": frozenset(["scoped"]), + "img": frozenset(["ismap"]), + "audio": frozenset(["autoplay", "controls"]), + "video": frozenset(["autoplay", "controls"]), + "script": frozenset(["defer", "async"]), + "details": frozenset(["open"]), + "datagrid": frozenset(["multiple", "disabled"]), + "command": frozenset(["hidden", "disabled", "checked", "default"]), + "hr": frozenset(["noshade"]), + "menu": frozenset(["autosubmit"]), + "fieldset": frozenset(["disabled", "readonly"]), + "option": frozenset(["disabled", "readonly", "selected"]), + "optgroup": frozenset(["disabled", "readonly"]), + "button": frozenset(["disabled", "autofocus"]), + "input": frozenset(["disabled", "readonly", "required", "autofocus", "checked", "ismap"]), + "select": frozenset(["disabled", "readonly", "autofocus", "multiple"]), + "output": frozenset(["disabled", "readonly"]), + "iframe": frozenset(["seamless"]), +} + +# entitiesWindows1252 has to be _ordered_ and needs to have an index. It +# therefore can't be a frozenset. +entitiesWindows1252 = ( + 8364, # 0x80 0x20AC EURO SIGN + 65533, # 0x81 UNDEFINED + 8218, # 0x82 0x201A SINGLE LOW-9 QUOTATION MARK + 402, # 0x83 0x0192 LATIN SMALL LETTER F WITH HOOK + 8222, # 0x84 0x201E DOUBLE LOW-9 QUOTATION MARK + 8230, # 0x85 0x2026 HORIZONTAL ELLIPSIS + 8224, # 0x86 0x2020 DAGGER + 8225, # 0x87 0x2021 DOUBLE DAGGER + 710, # 0x88 0x02C6 MODIFIER LETTER CIRCUMFLEX ACCENT + 8240, # 0x89 0x2030 PER MILLE SIGN + 352, # 0x8A 0x0160 LATIN CAPITAL LETTER S WITH CARON + 8249, # 0x8B 0x2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK + 338, # 0x8C 0x0152 LATIN CAPITAL LIGATURE OE + 65533, # 0x8D UNDEFINED + 381, # 0x8E 0x017D LATIN CAPITAL LETTER Z WITH CARON + 65533, # 0x8F UNDEFINED + 65533, # 0x90 UNDEFINED + 8216, # 0x91 0x2018 LEFT SINGLE QUOTATION MARK + 8217, # 0x92 0x2019 RIGHT SINGLE QUOTATION MARK + 8220, # 0x93 0x201C LEFT DOUBLE QUOTATION MARK + 8221, # 0x94 0x201D RIGHT DOUBLE QUOTATION MARK + 8226, # 0x95 0x2022 BULLET + 8211, # 0x96 0x2013 EN DASH + 8212, # 0x97 0x2014 EM DASH + 732, # 0x98 0x02DC SMALL TILDE + 8482, # 0x99 0x2122 TRADE MARK SIGN + 353, # 0x9A 0x0161 LATIN SMALL LETTER S WITH CARON + 8250, # 0x9B 0x203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + 339, # 0x9C 0x0153 LATIN SMALL LIGATURE OE + 65533, # 0x9D UNDEFINED + 382, # 0x9E 0x017E LATIN SMALL LETTER Z WITH CARON + 376 # 0x9F 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS +) + +xmlEntities = frozenset(['lt;', 'gt;', 'amp;', 'apos;', 'quot;']) + +entities = { + "AElig": "\xc6", + "AElig;": "\xc6", + "AMP": "&", + "AMP;": "&", + "Aacute": "\xc1", + "Aacute;": "\xc1", + "Abreve;": "\u0102", + "Acirc": "\xc2", + "Acirc;": "\xc2", + "Acy;": "\u0410", + "Afr;": "\U0001d504", + "Agrave": "\xc0", + "Agrave;": "\xc0", + "Alpha;": "\u0391", + "Amacr;": "\u0100", + "And;": "\u2a53", + "Aogon;": "\u0104", + "Aopf;": "\U0001d538", + "ApplyFunction;": "\u2061", + "Aring": "\xc5", + "Aring;": "\xc5", + "Ascr;": "\U0001d49c", + "Assign;": "\u2254", + "Atilde": "\xc3", + "Atilde;": "\xc3", + "Auml": "\xc4", + "Auml;": "\xc4", + "Backslash;": "\u2216", + "Barv;": "\u2ae7", + "Barwed;": "\u2306", + "Bcy;": "\u0411", + "Because;": "\u2235", + "Bernoullis;": "\u212c", + "Beta;": "\u0392", + "Bfr;": "\U0001d505", + "Bopf;": "\U0001d539", + "Breve;": "\u02d8", + "Bscr;": "\u212c", + "Bumpeq;": "\u224e", + "CHcy;": "\u0427", + "COPY": "\xa9", + "COPY;": "\xa9", + "Cacute;": "\u0106", + "Cap;": "\u22d2", + "CapitalDifferentialD;": "\u2145", + "Cayleys;": "\u212d", + "Ccaron;": "\u010c", + "Ccedil": "\xc7", + "Ccedil;": "\xc7", + "Ccirc;": "\u0108", + "Cconint;": "\u2230", + "Cdot;": "\u010a", + "Cedilla;": "\xb8", + "CenterDot;": "\xb7", + "Cfr;": "\u212d", + "Chi;": "\u03a7", + "CircleDot;": "\u2299", + "CircleMinus;": "\u2296", + "CirclePlus;": "\u2295", + "CircleTimes;": "\u2297", + "ClockwiseContourIntegral;": "\u2232", + "CloseCurlyDoubleQuote;": "\u201d", + "CloseCurlyQuote;": "\u2019", + "Colon;": "\u2237", + "Colone;": "\u2a74", + "Congruent;": "\u2261", + "Conint;": "\u222f", + "ContourIntegral;": "\u222e", + "Copf;": "\u2102", + "Coproduct;": "\u2210", + "CounterClockwiseContourIntegral;": "\u2233", + "Cross;": "\u2a2f", + "Cscr;": "\U0001d49e", + "Cup;": "\u22d3", + "CupCap;": "\u224d", + "DD;": "\u2145", + "DDotrahd;": "\u2911", + "DJcy;": "\u0402", + "DScy;": "\u0405", + "DZcy;": "\u040f", + "Dagger;": "\u2021", + "Darr;": "\u21a1", + "Dashv;": "\u2ae4", + "Dcaron;": "\u010e", + "Dcy;": "\u0414", + "Del;": "\u2207", + "Delta;": "\u0394", + "Dfr;": "\U0001d507", + "DiacriticalAcute;": "\xb4", + "DiacriticalDot;": "\u02d9", + "DiacriticalDoubleAcute;": "\u02dd", + "DiacriticalGrave;": "`", + "DiacriticalTilde;": "\u02dc", + "Diamond;": "\u22c4", + "DifferentialD;": "\u2146", + "Dopf;": "\U0001d53b", + "Dot;": "\xa8", + "DotDot;": "\u20dc", + "DotEqual;": "\u2250", + "DoubleContourIntegral;": "\u222f", + "DoubleDot;": "\xa8", + "DoubleDownArrow;": "\u21d3", + "DoubleLeftArrow;": "\u21d0", + "DoubleLeftRightArrow;": "\u21d4", + "DoubleLeftTee;": "\u2ae4", + "DoubleLongLeftArrow;": "\u27f8", + "DoubleLongLeftRightArrow;": "\u27fa", + "DoubleLongRightArrow;": "\u27f9", + "DoubleRightArrow;": "\u21d2", + "DoubleRightTee;": "\u22a8", + "DoubleUpArrow;": "\u21d1", + "DoubleUpDownArrow;": "\u21d5", + "DoubleVerticalBar;": "\u2225", + "DownArrow;": "\u2193", + "DownArrowBar;": "\u2913", + "DownArrowUpArrow;": "\u21f5", + "DownBreve;": "\u0311", + "DownLeftRightVector;": "\u2950", + "DownLeftTeeVector;": "\u295e", + "DownLeftVector;": "\u21bd", + "DownLeftVectorBar;": "\u2956", + "DownRightTeeVector;": "\u295f", + "DownRightVector;": "\u21c1", + "DownRightVectorBar;": "\u2957", + "DownTee;": "\u22a4", + "DownTeeArrow;": "\u21a7", + "Downarrow;": "\u21d3", + "Dscr;": "\U0001d49f", + "Dstrok;": "\u0110", + "ENG;": "\u014a", + "ETH": "\xd0", + "ETH;": "\xd0", + "Eacute": "\xc9", + "Eacute;": "\xc9", + "Ecaron;": "\u011a", + "Ecirc": "\xca", + "Ecirc;": "\xca", + "Ecy;": "\u042d", + "Edot;": "\u0116", + "Efr;": "\U0001d508", + "Egrave": "\xc8", + "Egrave;": "\xc8", + "Element;": "\u2208", + "Emacr;": "\u0112", + "EmptySmallSquare;": "\u25fb", + "EmptyVerySmallSquare;": "\u25ab", + "Eogon;": "\u0118", + "Eopf;": "\U0001d53c", + "Epsilon;": "\u0395", + "Equal;": "\u2a75", + "EqualTilde;": "\u2242", + "Equilibrium;": "\u21cc", + "Escr;": "\u2130", + "Esim;": "\u2a73", + "Eta;": "\u0397", + "Euml": "\xcb", + "Euml;": "\xcb", + "Exists;": "\u2203", + "ExponentialE;": "\u2147", + "Fcy;": "\u0424", + "Ffr;": "\U0001d509", + "FilledSmallSquare;": "\u25fc", + "FilledVerySmallSquare;": "\u25aa", + "Fopf;": "\U0001d53d", + "ForAll;": "\u2200", + "Fouriertrf;": "\u2131", + "Fscr;": "\u2131", + "GJcy;": "\u0403", + "GT": ">", + "GT;": ">", + "Gamma;": "\u0393", + "Gammad;": "\u03dc", + "Gbreve;": "\u011e", + "Gcedil;": "\u0122", + "Gcirc;": "\u011c", + "Gcy;": "\u0413", + "Gdot;": "\u0120", + "Gfr;": "\U0001d50a", + "Gg;": "\u22d9", + "Gopf;": "\U0001d53e", + "GreaterEqual;": "\u2265", + "GreaterEqualLess;": "\u22db", + "GreaterFullEqual;": "\u2267", + "GreaterGreater;": "\u2aa2", + "GreaterLess;": "\u2277", + "GreaterSlantEqual;": "\u2a7e", + "GreaterTilde;": "\u2273", + "Gscr;": "\U0001d4a2", + "Gt;": "\u226b", + "HARDcy;": "\u042a", + "Hacek;": "\u02c7", + "Hat;": "^", + "Hcirc;": "\u0124", + "Hfr;": "\u210c", + "HilbertSpace;": "\u210b", + "Hopf;": "\u210d", + "HorizontalLine;": "\u2500", + "Hscr;": "\u210b", + "Hstrok;": "\u0126", + "HumpDownHump;": "\u224e", + "HumpEqual;": "\u224f", + "IEcy;": "\u0415", + "IJlig;": "\u0132", + "IOcy;": "\u0401", + "Iacute": "\xcd", + "Iacute;": "\xcd", + "Icirc": "\xce", + "Icirc;": "\xce", + "Icy;": "\u0418", + "Idot;": "\u0130", + "Ifr;": "\u2111", + "Igrave": "\xcc", + "Igrave;": "\xcc", + "Im;": "\u2111", + "Imacr;": "\u012a", + "ImaginaryI;": "\u2148", + "Implies;": "\u21d2", + "Int;": "\u222c", + "Integral;": "\u222b", + "Intersection;": "\u22c2", + "InvisibleComma;": "\u2063", + "InvisibleTimes;": "\u2062", + "Iogon;": "\u012e", + "Iopf;": "\U0001d540", + "Iota;": "\u0399", + "Iscr;": "\u2110", + "Itilde;": "\u0128", + "Iukcy;": "\u0406", + "Iuml": "\xcf", + "Iuml;": "\xcf", + "Jcirc;": "\u0134", + "Jcy;": "\u0419", + "Jfr;": "\U0001d50d", + "Jopf;": "\U0001d541", + "Jscr;": "\U0001d4a5", + "Jsercy;": "\u0408", + "Jukcy;": "\u0404", + "KHcy;": "\u0425", + "KJcy;": "\u040c", + "Kappa;": "\u039a", + "Kcedil;": "\u0136", + "Kcy;": "\u041a", + "Kfr;": "\U0001d50e", + "Kopf;": "\U0001d542", + "Kscr;": "\U0001d4a6", + "LJcy;": "\u0409", + "LT": "<", + "LT;": "<", + "Lacute;": "\u0139", + "Lambda;": "\u039b", + "Lang;": "\u27ea", + "Laplacetrf;": "\u2112", + "Larr;": "\u219e", + "Lcaron;": "\u013d", + "Lcedil;": "\u013b", + "Lcy;": "\u041b", + "LeftAngleBracket;": "\u27e8", + "LeftArrow;": "\u2190", + "LeftArrowBar;": "\u21e4", + "LeftArrowRightArrow;": "\u21c6", + "LeftCeiling;": "\u2308", + "LeftDoubleBracket;": "\u27e6", + "LeftDownTeeVector;": "\u2961", + "LeftDownVector;": "\u21c3", + "LeftDownVectorBar;": "\u2959", + "LeftFloor;": "\u230a", + "LeftRightArrow;": "\u2194", + "LeftRightVector;": "\u294e", + "LeftTee;": "\u22a3", + "LeftTeeArrow;": "\u21a4", + "LeftTeeVector;": "\u295a", + "LeftTriangle;": "\u22b2", + "LeftTriangleBar;": "\u29cf", + "LeftTriangleEqual;": "\u22b4", + "LeftUpDownVector;": "\u2951", + "LeftUpTeeVector;": "\u2960", + "LeftUpVector;": "\u21bf", + "LeftUpVectorBar;": "\u2958", + "LeftVector;": "\u21bc", + "LeftVectorBar;": "\u2952", + "Leftarrow;": "\u21d0", + "Leftrightarrow;": "\u21d4", + "LessEqualGreater;": "\u22da", + "LessFullEqual;": "\u2266", + "LessGreater;": "\u2276", + "LessLess;": "\u2aa1", + "LessSlantEqual;": "\u2a7d", + "LessTilde;": "\u2272", + "Lfr;": "\U0001d50f", + "Ll;": "\u22d8", + "Lleftarrow;": "\u21da", + "Lmidot;": "\u013f", + "LongLeftArrow;": "\u27f5", + "LongLeftRightArrow;": "\u27f7", + "LongRightArrow;": "\u27f6", + "Longleftarrow;": "\u27f8", + "Longleftrightarrow;": "\u27fa", + "Longrightarrow;": "\u27f9", + "Lopf;": "\U0001d543", + "LowerLeftArrow;": "\u2199", + "LowerRightArrow;": "\u2198", + "Lscr;": "\u2112", + "Lsh;": "\u21b0", + "Lstrok;": "\u0141", + "Lt;": "\u226a", + "Map;": "\u2905", + "Mcy;": "\u041c", + "MediumSpace;": "\u205f", + "Mellintrf;": "\u2133", + "Mfr;": "\U0001d510", + "MinusPlus;": "\u2213", + "Mopf;": "\U0001d544", + "Mscr;": "\u2133", + "Mu;": "\u039c", + "NJcy;": "\u040a", + "Nacute;": "\u0143", + "Ncaron;": "\u0147", + "Ncedil;": "\u0145", + "Ncy;": "\u041d", + "NegativeMediumSpace;": "\u200b", + "NegativeThickSpace;": "\u200b", + "NegativeThinSpace;": "\u200b", + "NegativeVeryThinSpace;": "\u200b", + "NestedGreaterGreater;": "\u226b", + "NestedLessLess;": "\u226a", + "NewLine;": "\n", + "Nfr;": "\U0001d511", + "NoBreak;": "\u2060", + "NonBreakingSpace;": "\xa0", + "Nopf;": "\u2115", + "Not;": "\u2aec", + "NotCongruent;": "\u2262", + "NotCupCap;": "\u226d", + "NotDoubleVerticalBar;": "\u2226", + "NotElement;": "\u2209", + "NotEqual;": "\u2260", + "NotEqualTilde;": "\u2242\u0338", + "NotExists;": "\u2204", + "NotGreater;": "\u226f", + "NotGreaterEqual;": "\u2271", + "NotGreaterFullEqual;": "\u2267\u0338", + "NotGreaterGreater;": "\u226b\u0338", + "NotGreaterLess;": "\u2279", + "NotGreaterSlantEqual;": "\u2a7e\u0338", + "NotGreaterTilde;": "\u2275", + "NotHumpDownHump;": "\u224e\u0338", + "NotHumpEqual;": "\u224f\u0338", + "NotLeftTriangle;": "\u22ea", + "NotLeftTriangleBar;": "\u29cf\u0338", + "NotLeftTriangleEqual;": "\u22ec", + "NotLess;": "\u226e", + "NotLessEqual;": "\u2270", + "NotLessGreater;": "\u2278", + "NotLessLess;": "\u226a\u0338", + "NotLessSlantEqual;": "\u2a7d\u0338", + "NotLessTilde;": "\u2274", + "NotNestedGreaterGreater;": "\u2aa2\u0338", + "NotNestedLessLess;": "\u2aa1\u0338", + "NotPrecedes;": "\u2280", + "NotPrecedesEqual;": "\u2aaf\u0338", + "NotPrecedesSlantEqual;": "\u22e0", + "NotReverseElement;": "\u220c", + "NotRightTriangle;": "\u22eb", + "NotRightTriangleBar;": "\u29d0\u0338", + "NotRightTriangleEqual;": "\u22ed", + "NotSquareSubset;": "\u228f\u0338", + "NotSquareSubsetEqual;": "\u22e2", + "NotSquareSuperset;": "\u2290\u0338", + "NotSquareSupersetEqual;": "\u22e3", + "NotSubset;": "\u2282\u20d2", + "NotSubsetEqual;": "\u2288", + "NotSucceeds;": "\u2281", + "NotSucceedsEqual;": "\u2ab0\u0338", + "NotSucceedsSlantEqual;": "\u22e1", + "NotSucceedsTilde;": "\u227f\u0338", + "NotSuperset;": "\u2283\u20d2", + "NotSupersetEqual;": "\u2289", + "NotTilde;": "\u2241", + "NotTildeEqual;": "\u2244", + "NotTildeFullEqual;": "\u2247", + "NotTildeTilde;": "\u2249", + "NotVerticalBar;": "\u2224", + "Nscr;": "\U0001d4a9", + "Ntilde": "\xd1", + "Ntilde;": "\xd1", + "Nu;": "\u039d", + "OElig;": "\u0152", + "Oacute": "\xd3", + "Oacute;": "\xd3", + "Ocirc": "\xd4", + "Ocirc;": "\xd4", + "Ocy;": "\u041e", + "Odblac;": "\u0150", + "Ofr;": "\U0001d512", + "Ograve": "\xd2", + "Ograve;": "\xd2", + "Omacr;": "\u014c", + "Omega;": "\u03a9", + "Omicron;": "\u039f", + "Oopf;": "\U0001d546", + "OpenCurlyDoubleQuote;": "\u201c", + "OpenCurlyQuote;": "\u2018", + "Or;": "\u2a54", + "Oscr;": "\U0001d4aa", + "Oslash": "\xd8", + "Oslash;": "\xd8", + "Otilde": "\xd5", + "Otilde;": "\xd5", + "Otimes;": "\u2a37", + "Ouml": "\xd6", + "Ouml;": "\xd6", + "OverBar;": "\u203e", + "OverBrace;": "\u23de", + "OverBracket;": "\u23b4", + "OverParenthesis;": "\u23dc", + "PartialD;": "\u2202", + "Pcy;": "\u041f", + "Pfr;": "\U0001d513", + "Phi;": "\u03a6", + "Pi;": "\u03a0", + "PlusMinus;": "\xb1", + "Poincareplane;": "\u210c", + "Popf;": "\u2119", + "Pr;": "\u2abb", + "Precedes;": "\u227a", + "PrecedesEqual;": "\u2aaf", + "PrecedesSlantEqual;": "\u227c", + "PrecedesTilde;": "\u227e", + "Prime;": "\u2033", + "Product;": "\u220f", + "Proportion;": "\u2237", + "Proportional;": "\u221d", + "Pscr;": "\U0001d4ab", + "Psi;": "\u03a8", + "QUOT": "\"", + "QUOT;": "\"", + "Qfr;": "\U0001d514", + "Qopf;": "\u211a", + "Qscr;": "\U0001d4ac", + "RBarr;": "\u2910", + "REG": "\xae", + "REG;": "\xae", + "Racute;": "\u0154", + "Rang;": "\u27eb", + "Rarr;": "\u21a0", + "Rarrtl;": "\u2916", + "Rcaron;": "\u0158", + "Rcedil;": "\u0156", + "Rcy;": "\u0420", + "Re;": "\u211c", + "ReverseElement;": "\u220b", + "ReverseEquilibrium;": "\u21cb", + "ReverseUpEquilibrium;": "\u296f", + "Rfr;": "\u211c", + "Rho;": "\u03a1", + "RightAngleBracket;": "\u27e9", + "RightArrow;": "\u2192", + "RightArrowBar;": "\u21e5", + "RightArrowLeftArrow;": "\u21c4", + "RightCeiling;": "\u2309", + "RightDoubleBracket;": "\u27e7", + "RightDownTeeVector;": "\u295d", + "RightDownVector;": "\u21c2", + "RightDownVectorBar;": "\u2955", + "RightFloor;": "\u230b", + "RightTee;": "\u22a2", + "RightTeeArrow;": "\u21a6", + "RightTeeVector;": "\u295b", + "RightTriangle;": "\u22b3", + "RightTriangleBar;": "\u29d0", + "RightTriangleEqual;": "\u22b5", + "RightUpDownVector;": "\u294f", + "RightUpTeeVector;": "\u295c", + "RightUpVector;": "\u21be", + "RightUpVectorBar;": "\u2954", + "RightVector;": "\u21c0", + "RightVectorBar;": "\u2953", + "Rightarrow;": "\u21d2", + "Ropf;": "\u211d", + "RoundImplies;": "\u2970", + "Rrightarrow;": "\u21db", + "Rscr;": "\u211b", + "Rsh;": "\u21b1", + "RuleDelayed;": "\u29f4", + "SHCHcy;": "\u0429", + "SHcy;": "\u0428", + "SOFTcy;": "\u042c", + "Sacute;": "\u015a", + "Sc;": "\u2abc", + "Scaron;": "\u0160", + "Scedil;": "\u015e", + "Scirc;": "\u015c", + "Scy;": "\u0421", + "Sfr;": "\U0001d516", + "ShortDownArrow;": "\u2193", + "ShortLeftArrow;": "\u2190", + "ShortRightArrow;": "\u2192", + "ShortUpArrow;": "\u2191", + "Sigma;": "\u03a3", + "SmallCircle;": "\u2218", + "Sopf;": "\U0001d54a", + "Sqrt;": "\u221a", + "Square;": "\u25a1", + "SquareIntersection;": "\u2293", + "SquareSubset;": "\u228f", + "SquareSubsetEqual;": "\u2291", + "SquareSuperset;": "\u2290", + "SquareSupersetEqual;": "\u2292", + "SquareUnion;": "\u2294", + "Sscr;": "\U0001d4ae", + "Star;": "\u22c6", + "Sub;": "\u22d0", + "Subset;": "\u22d0", + "SubsetEqual;": "\u2286", + "Succeeds;": "\u227b", + "SucceedsEqual;": "\u2ab0", + "SucceedsSlantEqual;": "\u227d", + "SucceedsTilde;": "\u227f", + "SuchThat;": "\u220b", + "Sum;": "\u2211", + "Sup;": "\u22d1", + "Superset;": "\u2283", + "SupersetEqual;": "\u2287", + "Supset;": "\u22d1", + "THORN": "\xde", + "THORN;": "\xde", + "TRADE;": "\u2122", + "TSHcy;": "\u040b", + "TScy;": "\u0426", + "Tab;": "\t", + "Tau;": "\u03a4", + "Tcaron;": "\u0164", + "Tcedil;": "\u0162", + "Tcy;": "\u0422", + "Tfr;": "\U0001d517", + "Therefore;": "\u2234", + "Theta;": "\u0398", + "ThickSpace;": "\u205f\u200a", + "ThinSpace;": "\u2009", + "Tilde;": "\u223c", + "TildeEqual;": "\u2243", + "TildeFullEqual;": "\u2245", + "TildeTilde;": "\u2248", + "Topf;": "\U0001d54b", + "TripleDot;": "\u20db", + "Tscr;": "\U0001d4af", + "Tstrok;": "\u0166", + "Uacute": "\xda", + "Uacute;": "\xda", + "Uarr;": "\u219f", + "Uarrocir;": "\u2949", + "Ubrcy;": "\u040e", + "Ubreve;": "\u016c", + "Ucirc": "\xdb", + "Ucirc;": "\xdb", + "Ucy;": "\u0423", + "Udblac;": "\u0170", + "Ufr;": "\U0001d518", + "Ugrave": "\xd9", + "Ugrave;": "\xd9", + "Umacr;": "\u016a", + "UnderBar;": "_", + "UnderBrace;": "\u23df", + "UnderBracket;": "\u23b5", + "UnderParenthesis;": "\u23dd", + "Union;": "\u22c3", + "UnionPlus;": "\u228e", + "Uogon;": "\u0172", + "Uopf;": "\U0001d54c", + "UpArrow;": "\u2191", + "UpArrowBar;": "\u2912", + "UpArrowDownArrow;": "\u21c5", + "UpDownArrow;": "\u2195", + "UpEquilibrium;": "\u296e", + "UpTee;": "\u22a5", + "UpTeeArrow;": "\u21a5", + "Uparrow;": "\u21d1", + "Updownarrow;": "\u21d5", + "UpperLeftArrow;": "\u2196", + "UpperRightArrow;": "\u2197", + "Upsi;": "\u03d2", + "Upsilon;": "\u03a5", + "Uring;": "\u016e", + "Uscr;": "\U0001d4b0", + "Utilde;": "\u0168", + "Uuml": "\xdc", + "Uuml;": "\xdc", + "VDash;": "\u22ab", + "Vbar;": "\u2aeb", + "Vcy;": "\u0412", + "Vdash;": "\u22a9", + "Vdashl;": "\u2ae6", + "Vee;": "\u22c1", + "Verbar;": "\u2016", + "Vert;": "\u2016", + "VerticalBar;": "\u2223", + "VerticalLine;": "|", + "VerticalSeparator;": "\u2758", + "VerticalTilde;": "\u2240", + "VeryThinSpace;": "\u200a", + "Vfr;": "\U0001d519", + "Vopf;": "\U0001d54d", + "Vscr;": "\U0001d4b1", + "Vvdash;": "\u22aa", + "Wcirc;": "\u0174", + "Wedge;": "\u22c0", + "Wfr;": "\U0001d51a", + "Wopf;": "\U0001d54e", + "Wscr;": "\U0001d4b2", + "Xfr;": "\U0001d51b", + "Xi;": "\u039e", + "Xopf;": "\U0001d54f", + "Xscr;": "\U0001d4b3", + "YAcy;": "\u042f", + "YIcy;": "\u0407", + "YUcy;": "\u042e", + "Yacute": "\xdd", + "Yacute;": "\xdd", + "Ycirc;": "\u0176", + "Ycy;": "\u042b", + "Yfr;": "\U0001d51c", + "Yopf;": "\U0001d550", + "Yscr;": "\U0001d4b4", + "Yuml;": "\u0178", + "ZHcy;": "\u0416", + "Zacute;": "\u0179", + "Zcaron;": "\u017d", + "Zcy;": "\u0417", + "Zdot;": "\u017b", + "ZeroWidthSpace;": "\u200b", + "Zeta;": "\u0396", + "Zfr;": "\u2128", + "Zopf;": "\u2124", + "Zscr;": "\U0001d4b5", + "aacute": "\xe1", + "aacute;": "\xe1", + "abreve;": "\u0103", + "ac;": "\u223e", + "acE;": "\u223e\u0333", + "acd;": "\u223f", + "acirc": "\xe2", + "acirc;": "\xe2", + "acute": "\xb4", + "acute;": "\xb4", + "acy;": "\u0430", + "aelig": "\xe6", + "aelig;": "\xe6", + "af;": "\u2061", + "afr;": "\U0001d51e", + "agrave": "\xe0", + "agrave;": "\xe0", + "alefsym;": "\u2135", + "aleph;": "\u2135", + "alpha;": "\u03b1", + "amacr;": "\u0101", + "amalg;": "\u2a3f", + "amp": "&", + "amp;": "&", + "and;": "\u2227", + "andand;": "\u2a55", + "andd;": "\u2a5c", + "andslope;": "\u2a58", + "andv;": "\u2a5a", + "ang;": "\u2220", + "ange;": "\u29a4", + "angle;": "\u2220", + "angmsd;": "\u2221", + "angmsdaa;": "\u29a8", + "angmsdab;": "\u29a9", + "angmsdac;": "\u29aa", + "angmsdad;": "\u29ab", + "angmsdae;": "\u29ac", + "angmsdaf;": "\u29ad", + "angmsdag;": "\u29ae", + "angmsdah;": "\u29af", + "angrt;": "\u221f", + "angrtvb;": "\u22be", + "angrtvbd;": "\u299d", + "angsph;": "\u2222", + "angst;": "\xc5", + "angzarr;": "\u237c", + "aogon;": "\u0105", + "aopf;": "\U0001d552", + "ap;": "\u2248", + "apE;": "\u2a70", + "apacir;": "\u2a6f", + "ape;": "\u224a", + "apid;": "\u224b", + "apos;": "'", + "approx;": "\u2248", + "approxeq;": "\u224a", + "aring": "\xe5", + "aring;": "\xe5", + "ascr;": "\U0001d4b6", + "ast;": "*", + "asymp;": "\u2248", + "asympeq;": "\u224d", + "atilde": "\xe3", + "atilde;": "\xe3", + "auml": "\xe4", + "auml;": "\xe4", + "awconint;": "\u2233", + "awint;": "\u2a11", + "bNot;": "\u2aed", + "backcong;": "\u224c", + "backepsilon;": "\u03f6", + "backprime;": "\u2035", + "backsim;": "\u223d", + "backsimeq;": "\u22cd", + "barvee;": "\u22bd", + "barwed;": "\u2305", + "barwedge;": "\u2305", + "bbrk;": "\u23b5", + "bbrktbrk;": "\u23b6", + "bcong;": "\u224c", + "bcy;": "\u0431", + "bdquo;": "\u201e", + "becaus;": "\u2235", + "because;": "\u2235", + "bemptyv;": "\u29b0", + "bepsi;": "\u03f6", + "bernou;": "\u212c", + "beta;": "\u03b2", + "beth;": "\u2136", + "between;": "\u226c", + "bfr;": "\U0001d51f", + "bigcap;": "\u22c2", + "bigcirc;": "\u25ef", + "bigcup;": "\u22c3", + "bigodot;": "\u2a00", + "bigoplus;": "\u2a01", + "bigotimes;": "\u2a02", + "bigsqcup;": "\u2a06", + "bigstar;": "\u2605", + "bigtriangledown;": "\u25bd", + "bigtriangleup;": "\u25b3", + "biguplus;": "\u2a04", + "bigvee;": "\u22c1", + "bigwedge;": "\u22c0", + "bkarow;": "\u290d", + "blacklozenge;": "\u29eb", + "blacksquare;": "\u25aa", + "blacktriangle;": "\u25b4", + "blacktriangledown;": "\u25be", + "blacktriangleleft;": "\u25c2", + "blacktriangleright;": "\u25b8", + "blank;": "\u2423", + "blk12;": "\u2592", + "blk14;": "\u2591", + "blk34;": "\u2593", + "block;": "\u2588", + "bne;": "=\u20e5", + "bnequiv;": "\u2261\u20e5", + "bnot;": "\u2310", + "bopf;": "\U0001d553", + "bot;": "\u22a5", + "bottom;": "\u22a5", + "bowtie;": "\u22c8", + "boxDL;": "\u2557", + "boxDR;": "\u2554", + "boxDl;": "\u2556", + "boxDr;": "\u2553", + "boxH;": "\u2550", + "boxHD;": "\u2566", + "boxHU;": "\u2569", + "boxHd;": "\u2564", + "boxHu;": "\u2567", + "boxUL;": "\u255d", + "boxUR;": "\u255a", + "boxUl;": "\u255c", + "boxUr;": "\u2559", + "boxV;": "\u2551", + "boxVH;": "\u256c", + "boxVL;": "\u2563", + "boxVR;": "\u2560", + "boxVh;": "\u256b", + "boxVl;": "\u2562", + "boxVr;": "\u255f", + "boxbox;": "\u29c9", + "boxdL;": "\u2555", + "boxdR;": "\u2552", + "boxdl;": "\u2510", + "boxdr;": "\u250c", + "boxh;": "\u2500", + "boxhD;": "\u2565", + "boxhU;": "\u2568", + "boxhd;": "\u252c", + "boxhu;": "\u2534", + "boxminus;": "\u229f", + "boxplus;": "\u229e", + "boxtimes;": "\u22a0", + "boxuL;": "\u255b", + "boxuR;": "\u2558", + "boxul;": "\u2518", + "boxur;": "\u2514", + "boxv;": "\u2502", + "boxvH;": "\u256a", + "boxvL;": "\u2561", + "boxvR;": "\u255e", + "boxvh;": "\u253c", + "boxvl;": "\u2524", + "boxvr;": "\u251c", + "bprime;": "\u2035", + "breve;": "\u02d8", + "brvbar": "\xa6", + "brvbar;": "\xa6", + "bscr;": "\U0001d4b7", + "bsemi;": "\u204f", + "bsim;": "\u223d", + "bsime;": "\u22cd", + "bsol;": "\\", + "bsolb;": "\u29c5", + "bsolhsub;": "\u27c8", + "bull;": "\u2022", + "bullet;": "\u2022", + "bump;": "\u224e", + "bumpE;": "\u2aae", + "bumpe;": "\u224f", + "bumpeq;": "\u224f", + "cacute;": "\u0107", + "cap;": "\u2229", + "capand;": "\u2a44", + "capbrcup;": "\u2a49", + "capcap;": "\u2a4b", + "capcup;": "\u2a47", + "capdot;": "\u2a40", + "caps;": "\u2229\ufe00", + "caret;": "\u2041", + "caron;": "\u02c7", + "ccaps;": "\u2a4d", + "ccaron;": "\u010d", + "ccedil": "\xe7", + "ccedil;": "\xe7", + "ccirc;": "\u0109", + "ccups;": "\u2a4c", + "ccupssm;": "\u2a50", + "cdot;": "\u010b", + "cedil": "\xb8", + "cedil;": "\xb8", + "cemptyv;": "\u29b2", + "cent": "\xa2", + "cent;": "\xa2", + "centerdot;": "\xb7", + "cfr;": "\U0001d520", + "chcy;": "\u0447", + "check;": "\u2713", + "checkmark;": "\u2713", + "chi;": "\u03c7", + "cir;": "\u25cb", + "cirE;": "\u29c3", + "circ;": "\u02c6", + "circeq;": "\u2257", + "circlearrowleft;": "\u21ba", + "circlearrowright;": "\u21bb", + "circledR;": "\xae", + "circledS;": "\u24c8", + "circledast;": "\u229b", + "circledcirc;": "\u229a", + "circleddash;": "\u229d", + "cire;": "\u2257", + "cirfnint;": "\u2a10", + "cirmid;": "\u2aef", + "cirscir;": "\u29c2", + "clubs;": "\u2663", + "clubsuit;": "\u2663", + "colon;": ":", + "colone;": "\u2254", + "coloneq;": "\u2254", + "comma;": ",", + "commat;": "@", + "comp;": "\u2201", + "compfn;": "\u2218", + "complement;": "\u2201", + "complexes;": "\u2102", + "cong;": "\u2245", + "congdot;": "\u2a6d", + "conint;": "\u222e", + "copf;": "\U0001d554", + "coprod;": "\u2210", + "copy": "\xa9", + "copy;": "\xa9", + "copysr;": "\u2117", + "crarr;": "\u21b5", + "cross;": "\u2717", + "cscr;": "\U0001d4b8", + "csub;": "\u2acf", + "csube;": "\u2ad1", + "csup;": "\u2ad0", + "csupe;": "\u2ad2", + "ctdot;": "\u22ef", + "cudarrl;": "\u2938", + "cudarrr;": "\u2935", + "cuepr;": "\u22de", + "cuesc;": "\u22df", + "cularr;": "\u21b6", + "cularrp;": "\u293d", + "cup;": "\u222a", + "cupbrcap;": "\u2a48", + "cupcap;": "\u2a46", + "cupcup;": "\u2a4a", + "cupdot;": "\u228d", + "cupor;": "\u2a45", + "cups;": "\u222a\ufe00", + "curarr;": "\u21b7", + "curarrm;": "\u293c", + "curlyeqprec;": "\u22de", + "curlyeqsucc;": "\u22df", + "curlyvee;": "\u22ce", + "curlywedge;": "\u22cf", + "curren": "\xa4", + "curren;": "\xa4", + "curvearrowleft;": "\u21b6", + "curvearrowright;": "\u21b7", + "cuvee;": "\u22ce", + "cuwed;": "\u22cf", + "cwconint;": "\u2232", + "cwint;": "\u2231", + "cylcty;": "\u232d", + "dArr;": "\u21d3", + "dHar;": "\u2965", + "dagger;": "\u2020", + "daleth;": "\u2138", + "darr;": "\u2193", + "dash;": "\u2010", + "dashv;": "\u22a3", + "dbkarow;": "\u290f", + "dblac;": "\u02dd", + "dcaron;": "\u010f", + "dcy;": "\u0434", + "dd;": "\u2146", + "ddagger;": "\u2021", + "ddarr;": "\u21ca", + "ddotseq;": "\u2a77", + "deg": "\xb0", + "deg;": "\xb0", + "delta;": "\u03b4", + "demptyv;": "\u29b1", + "dfisht;": "\u297f", + "dfr;": "\U0001d521", + "dharl;": "\u21c3", + "dharr;": "\u21c2", + "diam;": "\u22c4", + "diamond;": "\u22c4", + "diamondsuit;": "\u2666", + "diams;": "\u2666", + "die;": "\xa8", + "digamma;": "\u03dd", + "disin;": "\u22f2", + "div;": "\xf7", + "divide": "\xf7", + "divide;": "\xf7", + "divideontimes;": "\u22c7", + "divonx;": "\u22c7", + "djcy;": "\u0452", + "dlcorn;": "\u231e", + "dlcrop;": "\u230d", + "dollar;": "$", + "dopf;": "\U0001d555", + "dot;": "\u02d9", + "doteq;": "\u2250", + "doteqdot;": "\u2251", + "dotminus;": "\u2238", + "dotplus;": "\u2214", + "dotsquare;": "\u22a1", + "doublebarwedge;": "\u2306", + "downarrow;": "\u2193", + "downdownarrows;": "\u21ca", + "downharpoonleft;": "\u21c3", + "downharpoonright;": "\u21c2", + "drbkarow;": "\u2910", + "drcorn;": "\u231f", + "drcrop;": "\u230c", + "dscr;": "\U0001d4b9", + "dscy;": "\u0455", + "dsol;": "\u29f6", + "dstrok;": "\u0111", + "dtdot;": "\u22f1", + "dtri;": "\u25bf", + "dtrif;": "\u25be", + "duarr;": "\u21f5", + "duhar;": "\u296f", + "dwangle;": "\u29a6", + "dzcy;": "\u045f", + "dzigrarr;": "\u27ff", + "eDDot;": "\u2a77", + "eDot;": "\u2251", + "eacute": "\xe9", + "eacute;": "\xe9", + "easter;": "\u2a6e", + "ecaron;": "\u011b", + "ecir;": "\u2256", + "ecirc": "\xea", + "ecirc;": "\xea", + "ecolon;": "\u2255", + "ecy;": "\u044d", + "edot;": "\u0117", + "ee;": "\u2147", + "efDot;": "\u2252", + "efr;": "\U0001d522", + "eg;": "\u2a9a", + "egrave": "\xe8", + "egrave;": "\xe8", + "egs;": "\u2a96", + "egsdot;": "\u2a98", + "el;": "\u2a99", + "elinters;": "\u23e7", + "ell;": "\u2113", + "els;": "\u2a95", + "elsdot;": "\u2a97", + "emacr;": "\u0113", + "empty;": "\u2205", + "emptyset;": "\u2205", + "emptyv;": "\u2205", + "emsp13;": "\u2004", + "emsp14;": "\u2005", + "emsp;": "\u2003", + "eng;": "\u014b", + "ensp;": "\u2002", + "eogon;": "\u0119", + "eopf;": "\U0001d556", + "epar;": "\u22d5", + "eparsl;": "\u29e3", + "eplus;": "\u2a71", + "epsi;": "\u03b5", + "epsilon;": "\u03b5", + "epsiv;": "\u03f5", + "eqcirc;": "\u2256", + "eqcolon;": "\u2255", + "eqsim;": "\u2242", + "eqslantgtr;": "\u2a96", + "eqslantless;": "\u2a95", + "equals;": "=", + "equest;": "\u225f", + "equiv;": "\u2261", + "equivDD;": "\u2a78", + "eqvparsl;": "\u29e5", + "erDot;": "\u2253", + "erarr;": "\u2971", + "escr;": "\u212f", + "esdot;": "\u2250", + "esim;": "\u2242", + "eta;": "\u03b7", + "eth": "\xf0", + "eth;": "\xf0", + "euml": "\xeb", + "euml;": "\xeb", + "euro;": "\u20ac", + "excl;": "!", + "exist;": "\u2203", + "expectation;": "\u2130", + "exponentiale;": "\u2147", + "fallingdotseq;": "\u2252", + "fcy;": "\u0444", + "female;": "\u2640", + "ffilig;": "\ufb03", + "fflig;": "\ufb00", + "ffllig;": "\ufb04", + "ffr;": "\U0001d523", + "filig;": "\ufb01", + "fjlig;": "fj", + "flat;": "\u266d", + "fllig;": "\ufb02", + "fltns;": "\u25b1", + "fnof;": "\u0192", + "fopf;": "\U0001d557", + "forall;": "\u2200", + "fork;": "\u22d4", + "forkv;": "\u2ad9", + "fpartint;": "\u2a0d", + "frac12": "\xbd", + "frac12;": "\xbd", + "frac13;": "\u2153", + "frac14": "\xbc", + "frac14;": "\xbc", + "frac15;": "\u2155", + "frac16;": "\u2159", + "frac18;": "\u215b", + "frac23;": "\u2154", + "frac25;": "\u2156", + "frac34": "\xbe", + "frac34;": "\xbe", + "frac35;": "\u2157", + "frac38;": "\u215c", + "frac45;": "\u2158", + "frac56;": "\u215a", + "frac58;": "\u215d", + "frac78;": "\u215e", + "frasl;": "\u2044", + "frown;": "\u2322", + "fscr;": "\U0001d4bb", + "gE;": "\u2267", + "gEl;": "\u2a8c", + "gacute;": "\u01f5", + "gamma;": "\u03b3", + "gammad;": "\u03dd", + "gap;": "\u2a86", + "gbreve;": "\u011f", + "gcirc;": "\u011d", + "gcy;": "\u0433", + "gdot;": "\u0121", + "ge;": "\u2265", + "gel;": "\u22db", + "geq;": "\u2265", + "geqq;": "\u2267", + "geqslant;": "\u2a7e", + "ges;": "\u2a7e", + "gescc;": "\u2aa9", + "gesdot;": "\u2a80", + "gesdoto;": "\u2a82", + "gesdotol;": "\u2a84", + "gesl;": "\u22db\ufe00", + "gesles;": "\u2a94", + "gfr;": "\U0001d524", + "gg;": "\u226b", + "ggg;": "\u22d9", + "gimel;": "\u2137", + "gjcy;": "\u0453", + "gl;": "\u2277", + "glE;": "\u2a92", + "gla;": "\u2aa5", + "glj;": "\u2aa4", + "gnE;": "\u2269", + "gnap;": "\u2a8a", + "gnapprox;": "\u2a8a", + "gne;": "\u2a88", + "gneq;": "\u2a88", + "gneqq;": "\u2269", + "gnsim;": "\u22e7", + "gopf;": "\U0001d558", + "grave;": "`", + "gscr;": "\u210a", + "gsim;": "\u2273", + "gsime;": "\u2a8e", + "gsiml;": "\u2a90", + "gt": ">", + "gt;": ">", + "gtcc;": "\u2aa7", + "gtcir;": "\u2a7a", + "gtdot;": "\u22d7", + "gtlPar;": "\u2995", + "gtquest;": "\u2a7c", + "gtrapprox;": "\u2a86", + "gtrarr;": "\u2978", + "gtrdot;": "\u22d7", + "gtreqless;": "\u22db", + "gtreqqless;": "\u2a8c", + "gtrless;": "\u2277", + "gtrsim;": "\u2273", + "gvertneqq;": "\u2269\ufe00", + "gvnE;": "\u2269\ufe00", + "hArr;": "\u21d4", + "hairsp;": "\u200a", + "half;": "\xbd", + "hamilt;": "\u210b", + "hardcy;": "\u044a", + "harr;": "\u2194", + "harrcir;": "\u2948", + "harrw;": "\u21ad", + "hbar;": "\u210f", + "hcirc;": "\u0125", + "hearts;": "\u2665", + "heartsuit;": "\u2665", + "hellip;": "\u2026", + "hercon;": "\u22b9", + "hfr;": "\U0001d525", + "hksearow;": "\u2925", + "hkswarow;": "\u2926", + "hoarr;": "\u21ff", + "homtht;": "\u223b", + "hookleftarrow;": "\u21a9", + "hookrightarrow;": "\u21aa", + "hopf;": "\U0001d559", + "horbar;": "\u2015", + "hscr;": "\U0001d4bd", + "hslash;": "\u210f", + "hstrok;": "\u0127", + "hybull;": "\u2043", + "hyphen;": "\u2010", + "iacute": "\xed", + "iacute;": "\xed", + "ic;": "\u2063", + "icirc": "\xee", + "icirc;": "\xee", + "icy;": "\u0438", + "iecy;": "\u0435", + "iexcl": "\xa1", + "iexcl;": "\xa1", + "iff;": "\u21d4", + "ifr;": "\U0001d526", + "igrave": "\xec", + "igrave;": "\xec", + "ii;": "\u2148", + "iiiint;": "\u2a0c", + "iiint;": "\u222d", + "iinfin;": "\u29dc", + "iiota;": "\u2129", + "ijlig;": "\u0133", + "imacr;": "\u012b", + "image;": "\u2111", + "imagline;": "\u2110", + "imagpart;": "\u2111", + "imath;": "\u0131", + "imof;": "\u22b7", + "imped;": "\u01b5", + "in;": "\u2208", + "incare;": "\u2105", + "infin;": "\u221e", + "infintie;": "\u29dd", + "inodot;": "\u0131", + "int;": "\u222b", + "intcal;": "\u22ba", + "integers;": "\u2124", + "intercal;": "\u22ba", + "intlarhk;": "\u2a17", + "intprod;": "\u2a3c", + "iocy;": "\u0451", + "iogon;": "\u012f", + "iopf;": "\U0001d55a", + "iota;": "\u03b9", + "iprod;": "\u2a3c", + "iquest": "\xbf", + "iquest;": "\xbf", + "iscr;": "\U0001d4be", + "isin;": "\u2208", + "isinE;": "\u22f9", + "isindot;": "\u22f5", + "isins;": "\u22f4", + "isinsv;": "\u22f3", + "isinv;": "\u2208", + "it;": "\u2062", + "itilde;": "\u0129", + "iukcy;": "\u0456", + "iuml": "\xef", + "iuml;": "\xef", + "jcirc;": "\u0135", + "jcy;": "\u0439", + "jfr;": "\U0001d527", + "jmath;": "\u0237", + "jopf;": "\U0001d55b", + "jscr;": "\U0001d4bf", + "jsercy;": "\u0458", + "jukcy;": "\u0454", + "kappa;": "\u03ba", + "kappav;": "\u03f0", + "kcedil;": "\u0137", + "kcy;": "\u043a", + "kfr;": "\U0001d528", + "kgreen;": "\u0138", + "khcy;": "\u0445", + "kjcy;": "\u045c", + "kopf;": "\U0001d55c", + "kscr;": "\U0001d4c0", + "lAarr;": "\u21da", + "lArr;": "\u21d0", + "lAtail;": "\u291b", + "lBarr;": "\u290e", + "lE;": "\u2266", + "lEg;": "\u2a8b", + "lHar;": "\u2962", + "lacute;": "\u013a", + "laemptyv;": "\u29b4", + "lagran;": "\u2112", + "lambda;": "\u03bb", + "lang;": "\u27e8", + "langd;": "\u2991", + "langle;": "\u27e8", + "lap;": "\u2a85", + "laquo": "\xab", + "laquo;": "\xab", + "larr;": "\u2190", + "larrb;": "\u21e4", + "larrbfs;": "\u291f", + "larrfs;": "\u291d", + "larrhk;": "\u21a9", + "larrlp;": "\u21ab", + "larrpl;": "\u2939", + "larrsim;": "\u2973", + "larrtl;": "\u21a2", + "lat;": "\u2aab", + "latail;": "\u2919", + "late;": "\u2aad", + "lates;": "\u2aad\ufe00", + "lbarr;": "\u290c", + "lbbrk;": "\u2772", + "lbrace;": "{", + "lbrack;": "[", + "lbrke;": "\u298b", + "lbrksld;": "\u298f", + "lbrkslu;": "\u298d", + "lcaron;": "\u013e", + "lcedil;": "\u013c", + "lceil;": "\u2308", + "lcub;": "{", + "lcy;": "\u043b", + "ldca;": "\u2936", + "ldquo;": "\u201c", + "ldquor;": "\u201e", + "ldrdhar;": "\u2967", + "ldrushar;": "\u294b", + "ldsh;": "\u21b2", + "le;": "\u2264", + "leftarrow;": "\u2190", + "leftarrowtail;": "\u21a2", + "leftharpoondown;": "\u21bd", + "leftharpoonup;": "\u21bc", + "leftleftarrows;": "\u21c7", + "leftrightarrow;": "\u2194", + "leftrightarrows;": "\u21c6", + "leftrightharpoons;": "\u21cb", + "leftrightsquigarrow;": "\u21ad", + "leftthreetimes;": "\u22cb", + "leg;": "\u22da", + "leq;": "\u2264", + "leqq;": "\u2266", + "leqslant;": "\u2a7d", + "les;": "\u2a7d", + "lescc;": "\u2aa8", + "lesdot;": "\u2a7f", + "lesdoto;": "\u2a81", + "lesdotor;": "\u2a83", + "lesg;": "\u22da\ufe00", + "lesges;": "\u2a93", + "lessapprox;": "\u2a85", + "lessdot;": "\u22d6", + "lesseqgtr;": "\u22da", + "lesseqqgtr;": "\u2a8b", + "lessgtr;": "\u2276", + "lesssim;": "\u2272", + "lfisht;": "\u297c", + "lfloor;": "\u230a", + "lfr;": "\U0001d529", + "lg;": "\u2276", + "lgE;": "\u2a91", + "lhard;": "\u21bd", + "lharu;": "\u21bc", + "lharul;": "\u296a", + "lhblk;": "\u2584", + "ljcy;": "\u0459", + "ll;": "\u226a", + "llarr;": "\u21c7", + "llcorner;": "\u231e", + "llhard;": "\u296b", + "lltri;": "\u25fa", + "lmidot;": "\u0140", + "lmoust;": "\u23b0", + "lmoustache;": "\u23b0", + "lnE;": "\u2268", + "lnap;": "\u2a89", + "lnapprox;": "\u2a89", + "lne;": "\u2a87", + "lneq;": "\u2a87", + "lneqq;": "\u2268", + "lnsim;": "\u22e6", + "loang;": "\u27ec", + "loarr;": "\u21fd", + "lobrk;": "\u27e6", + "longleftarrow;": "\u27f5", + "longleftrightarrow;": "\u27f7", + "longmapsto;": "\u27fc", + "longrightarrow;": "\u27f6", + "looparrowleft;": "\u21ab", + "looparrowright;": "\u21ac", + "lopar;": "\u2985", + "lopf;": "\U0001d55d", + "loplus;": "\u2a2d", + "lotimes;": "\u2a34", + "lowast;": "\u2217", + "lowbar;": "_", + "loz;": "\u25ca", + "lozenge;": "\u25ca", + "lozf;": "\u29eb", + "lpar;": "(", + "lparlt;": "\u2993", + "lrarr;": "\u21c6", + "lrcorner;": "\u231f", + "lrhar;": "\u21cb", + "lrhard;": "\u296d", + "lrm;": "\u200e", + "lrtri;": "\u22bf", + "lsaquo;": "\u2039", + "lscr;": "\U0001d4c1", + "lsh;": "\u21b0", + "lsim;": "\u2272", + "lsime;": "\u2a8d", + "lsimg;": "\u2a8f", + "lsqb;": "[", + "lsquo;": "\u2018", + "lsquor;": "\u201a", + "lstrok;": "\u0142", + "lt": "<", + "lt;": "<", + "ltcc;": "\u2aa6", + "ltcir;": "\u2a79", + "ltdot;": "\u22d6", + "lthree;": "\u22cb", + "ltimes;": "\u22c9", + "ltlarr;": "\u2976", + "ltquest;": "\u2a7b", + "ltrPar;": "\u2996", + "ltri;": "\u25c3", + "ltrie;": "\u22b4", + "ltrif;": "\u25c2", + "lurdshar;": "\u294a", + "luruhar;": "\u2966", + "lvertneqq;": "\u2268\ufe00", + "lvnE;": "\u2268\ufe00", + "mDDot;": "\u223a", + "macr": "\xaf", + "macr;": "\xaf", + "male;": "\u2642", + "malt;": "\u2720", + "maltese;": "\u2720", + "map;": "\u21a6", + "mapsto;": "\u21a6", + "mapstodown;": "\u21a7", + "mapstoleft;": "\u21a4", + "mapstoup;": "\u21a5", + "marker;": "\u25ae", + "mcomma;": "\u2a29", + "mcy;": "\u043c", + "mdash;": "\u2014", + "measuredangle;": "\u2221", + "mfr;": "\U0001d52a", + "mho;": "\u2127", + "micro": "\xb5", + "micro;": "\xb5", + "mid;": "\u2223", + "midast;": "*", + "midcir;": "\u2af0", + "middot": "\xb7", + "middot;": "\xb7", + "minus;": "\u2212", + "minusb;": "\u229f", + "minusd;": "\u2238", + "minusdu;": "\u2a2a", + "mlcp;": "\u2adb", + "mldr;": "\u2026", + "mnplus;": "\u2213", + "models;": "\u22a7", + "mopf;": "\U0001d55e", + "mp;": "\u2213", + "mscr;": "\U0001d4c2", + "mstpos;": "\u223e", + "mu;": "\u03bc", + "multimap;": "\u22b8", + "mumap;": "\u22b8", + "nGg;": "\u22d9\u0338", + "nGt;": "\u226b\u20d2", + "nGtv;": "\u226b\u0338", + "nLeftarrow;": "\u21cd", + "nLeftrightarrow;": "\u21ce", + "nLl;": "\u22d8\u0338", + "nLt;": "\u226a\u20d2", + "nLtv;": "\u226a\u0338", + "nRightarrow;": "\u21cf", + "nVDash;": "\u22af", + "nVdash;": "\u22ae", + "nabla;": "\u2207", + "nacute;": "\u0144", + "nang;": "\u2220\u20d2", + "nap;": "\u2249", + "napE;": "\u2a70\u0338", + "napid;": "\u224b\u0338", + "napos;": "\u0149", + "napprox;": "\u2249", + "natur;": "\u266e", + "natural;": "\u266e", + "naturals;": "\u2115", + "nbsp": "\xa0", + "nbsp;": "\xa0", + "nbump;": "\u224e\u0338", + "nbumpe;": "\u224f\u0338", + "ncap;": "\u2a43", + "ncaron;": "\u0148", + "ncedil;": "\u0146", + "ncong;": "\u2247", + "ncongdot;": "\u2a6d\u0338", + "ncup;": "\u2a42", + "ncy;": "\u043d", + "ndash;": "\u2013", + "ne;": "\u2260", + "neArr;": "\u21d7", + "nearhk;": "\u2924", + "nearr;": "\u2197", + "nearrow;": "\u2197", + "nedot;": "\u2250\u0338", + "nequiv;": "\u2262", + "nesear;": "\u2928", + "nesim;": "\u2242\u0338", + "nexist;": "\u2204", + "nexists;": "\u2204", + "nfr;": "\U0001d52b", + "ngE;": "\u2267\u0338", + "nge;": "\u2271", + "ngeq;": "\u2271", + "ngeqq;": "\u2267\u0338", + "ngeqslant;": "\u2a7e\u0338", + "nges;": "\u2a7e\u0338", + "ngsim;": "\u2275", + "ngt;": "\u226f", + "ngtr;": "\u226f", + "nhArr;": "\u21ce", + "nharr;": "\u21ae", + "nhpar;": "\u2af2", + "ni;": "\u220b", + "nis;": "\u22fc", + "nisd;": "\u22fa", + "niv;": "\u220b", + "njcy;": "\u045a", + "nlArr;": "\u21cd", + "nlE;": "\u2266\u0338", + "nlarr;": "\u219a", + "nldr;": "\u2025", + "nle;": "\u2270", + "nleftarrow;": "\u219a", + "nleftrightarrow;": "\u21ae", + "nleq;": "\u2270", + "nleqq;": "\u2266\u0338", + "nleqslant;": "\u2a7d\u0338", + "nles;": "\u2a7d\u0338", + "nless;": "\u226e", + "nlsim;": "\u2274", + "nlt;": "\u226e", + "nltri;": "\u22ea", + "nltrie;": "\u22ec", + "nmid;": "\u2224", + "nopf;": "\U0001d55f", + "not": "\xac", + "not;": "\xac", + "notin;": "\u2209", + "notinE;": "\u22f9\u0338", + "notindot;": "\u22f5\u0338", + "notinva;": "\u2209", + "notinvb;": "\u22f7", + "notinvc;": "\u22f6", + "notni;": "\u220c", + "notniva;": "\u220c", + "notnivb;": "\u22fe", + "notnivc;": "\u22fd", + "npar;": "\u2226", + "nparallel;": "\u2226", + "nparsl;": "\u2afd\u20e5", + "npart;": "\u2202\u0338", + "npolint;": "\u2a14", + "npr;": "\u2280", + "nprcue;": "\u22e0", + "npre;": "\u2aaf\u0338", + "nprec;": "\u2280", + "npreceq;": "\u2aaf\u0338", + "nrArr;": "\u21cf", + "nrarr;": "\u219b", + "nrarrc;": "\u2933\u0338", + "nrarrw;": "\u219d\u0338", + "nrightarrow;": "\u219b", + "nrtri;": "\u22eb", + "nrtrie;": "\u22ed", + "nsc;": "\u2281", + "nsccue;": "\u22e1", + "nsce;": "\u2ab0\u0338", + "nscr;": "\U0001d4c3", + "nshortmid;": "\u2224", + "nshortparallel;": "\u2226", + "nsim;": "\u2241", + "nsime;": "\u2244", + "nsimeq;": "\u2244", + "nsmid;": "\u2224", + "nspar;": "\u2226", + "nsqsube;": "\u22e2", + "nsqsupe;": "\u22e3", + "nsub;": "\u2284", + "nsubE;": "\u2ac5\u0338", + "nsube;": "\u2288", + "nsubset;": "\u2282\u20d2", + "nsubseteq;": "\u2288", + "nsubseteqq;": "\u2ac5\u0338", + "nsucc;": "\u2281", + "nsucceq;": "\u2ab0\u0338", + "nsup;": "\u2285", + "nsupE;": "\u2ac6\u0338", + "nsupe;": "\u2289", + "nsupset;": "\u2283\u20d2", + "nsupseteq;": "\u2289", + "nsupseteqq;": "\u2ac6\u0338", + "ntgl;": "\u2279", + "ntilde": "\xf1", + "ntilde;": "\xf1", + "ntlg;": "\u2278", + "ntriangleleft;": "\u22ea", + "ntrianglelefteq;": "\u22ec", + "ntriangleright;": "\u22eb", + "ntrianglerighteq;": "\u22ed", + "nu;": "\u03bd", + "num;": "#", + "numero;": "\u2116", + "numsp;": "\u2007", + "nvDash;": "\u22ad", + "nvHarr;": "\u2904", + "nvap;": "\u224d\u20d2", + "nvdash;": "\u22ac", + "nvge;": "\u2265\u20d2", + "nvgt;": ">\u20d2", + "nvinfin;": "\u29de", + "nvlArr;": "\u2902", + "nvle;": "\u2264\u20d2", + "nvlt;": "<\u20d2", + "nvltrie;": "\u22b4\u20d2", + "nvrArr;": "\u2903", + "nvrtrie;": "\u22b5\u20d2", + "nvsim;": "\u223c\u20d2", + "nwArr;": "\u21d6", + "nwarhk;": "\u2923", + "nwarr;": "\u2196", + "nwarrow;": "\u2196", + "nwnear;": "\u2927", + "oS;": "\u24c8", + "oacute": "\xf3", + "oacute;": "\xf3", + "oast;": "\u229b", + "ocir;": "\u229a", + "ocirc": "\xf4", + "ocirc;": "\xf4", + "ocy;": "\u043e", + "odash;": "\u229d", + "odblac;": "\u0151", + "odiv;": "\u2a38", + "odot;": "\u2299", + "odsold;": "\u29bc", + "oelig;": "\u0153", + "ofcir;": "\u29bf", + "ofr;": "\U0001d52c", + "ogon;": "\u02db", + "ograve": "\xf2", + "ograve;": "\xf2", + "ogt;": "\u29c1", + "ohbar;": "\u29b5", + "ohm;": "\u03a9", + "oint;": "\u222e", + "olarr;": "\u21ba", + "olcir;": "\u29be", + "olcross;": "\u29bb", + "oline;": "\u203e", + "olt;": "\u29c0", + "omacr;": "\u014d", + "omega;": "\u03c9", + "omicron;": "\u03bf", + "omid;": "\u29b6", + "ominus;": "\u2296", + "oopf;": "\U0001d560", + "opar;": "\u29b7", + "operp;": "\u29b9", + "oplus;": "\u2295", + "or;": "\u2228", + "orarr;": "\u21bb", + "ord;": "\u2a5d", + "order;": "\u2134", + "orderof;": "\u2134", + "ordf": "\xaa", + "ordf;": "\xaa", + "ordm": "\xba", + "ordm;": "\xba", + "origof;": "\u22b6", + "oror;": "\u2a56", + "orslope;": "\u2a57", + "orv;": "\u2a5b", + "oscr;": "\u2134", + "oslash": "\xf8", + "oslash;": "\xf8", + "osol;": "\u2298", + "otilde": "\xf5", + "otilde;": "\xf5", + "otimes;": "\u2297", + "otimesas;": "\u2a36", + "ouml": "\xf6", + "ouml;": "\xf6", + "ovbar;": "\u233d", + "par;": "\u2225", + "para": "\xb6", + "para;": "\xb6", + "parallel;": "\u2225", + "parsim;": "\u2af3", + "parsl;": "\u2afd", + "part;": "\u2202", + "pcy;": "\u043f", + "percnt;": "%", + "period;": ".", + "permil;": "\u2030", + "perp;": "\u22a5", + "pertenk;": "\u2031", + "pfr;": "\U0001d52d", + "phi;": "\u03c6", + "phiv;": "\u03d5", + "phmmat;": "\u2133", + "phone;": "\u260e", + "pi;": "\u03c0", + "pitchfork;": "\u22d4", + "piv;": "\u03d6", + "planck;": "\u210f", + "planckh;": "\u210e", + "plankv;": "\u210f", + "plus;": "+", + "plusacir;": "\u2a23", + "plusb;": "\u229e", + "pluscir;": "\u2a22", + "plusdo;": "\u2214", + "plusdu;": "\u2a25", + "pluse;": "\u2a72", + "plusmn": "\xb1", + "plusmn;": "\xb1", + "plussim;": "\u2a26", + "plustwo;": "\u2a27", + "pm;": "\xb1", + "pointint;": "\u2a15", + "popf;": "\U0001d561", + "pound": "\xa3", + "pound;": "\xa3", + "pr;": "\u227a", + "prE;": "\u2ab3", + "prap;": "\u2ab7", + "prcue;": "\u227c", + "pre;": "\u2aaf", + "prec;": "\u227a", + "precapprox;": "\u2ab7", + "preccurlyeq;": "\u227c", + "preceq;": "\u2aaf", + "precnapprox;": "\u2ab9", + "precneqq;": "\u2ab5", + "precnsim;": "\u22e8", + "precsim;": "\u227e", + "prime;": "\u2032", + "primes;": "\u2119", + "prnE;": "\u2ab5", + "prnap;": "\u2ab9", + "prnsim;": "\u22e8", + "prod;": "\u220f", + "profalar;": "\u232e", + "profline;": "\u2312", + "profsurf;": "\u2313", + "prop;": "\u221d", + "propto;": "\u221d", + "prsim;": "\u227e", + "prurel;": "\u22b0", + "pscr;": "\U0001d4c5", + "psi;": "\u03c8", + "puncsp;": "\u2008", + "qfr;": "\U0001d52e", + "qint;": "\u2a0c", + "qopf;": "\U0001d562", + "qprime;": "\u2057", + "qscr;": "\U0001d4c6", + "quaternions;": "\u210d", + "quatint;": "\u2a16", + "quest;": "?", + "questeq;": "\u225f", + "quot": "\"", + "quot;": "\"", + "rAarr;": "\u21db", + "rArr;": "\u21d2", + "rAtail;": "\u291c", + "rBarr;": "\u290f", + "rHar;": "\u2964", + "race;": "\u223d\u0331", + "racute;": "\u0155", + "radic;": "\u221a", + "raemptyv;": "\u29b3", + "rang;": "\u27e9", + "rangd;": "\u2992", + "range;": "\u29a5", + "rangle;": "\u27e9", + "raquo": "\xbb", + "raquo;": "\xbb", + "rarr;": "\u2192", + "rarrap;": "\u2975", + "rarrb;": "\u21e5", + "rarrbfs;": "\u2920", + "rarrc;": "\u2933", + "rarrfs;": "\u291e", + "rarrhk;": "\u21aa", + "rarrlp;": "\u21ac", + "rarrpl;": "\u2945", + "rarrsim;": "\u2974", + "rarrtl;": "\u21a3", + "rarrw;": "\u219d", + "ratail;": "\u291a", + "ratio;": "\u2236", + "rationals;": "\u211a", + "rbarr;": "\u290d", + "rbbrk;": "\u2773", + "rbrace;": "}", + "rbrack;": "]", + "rbrke;": "\u298c", + "rbrksld;": "\u298e", + "rbrkslu;": "\u2990", + "rcaron;": "\u0159", + "rcedil;": "\u0157", + "rceil;": "\u2309", + "rcub;": "}", + "rcy;": "\u0440", + "rdca;": "\u2937", + "rdldhar;": "\u2969", + "rdquo;": "\u201d", + "rdquor;": "\u201d", + "rdsh;": "\u21b3", + "real;": "\u211c", + "realine;": "\u211b", + "realpart;": "\u211c", + "reals;": "\u211d", + "rect;": "\u25ad", + "reg": "\xae", + "reg;": "\xae", + "rfisht;": "\u297d", + "rfloor;": "\u230b", + "rfr;": "\U0001d52f", + "rhard;": "\u21c1", + "rharu;": "\u21c0", + "rharul;": "\u296c", + "rho;": "\u03c1", + "rhov;": "\u03f1", + "rightarrow;": "\u2192", + "rightarrowtail;": "\u21a3", + "rightharpoondown;": "\u21c1", + "rightharpoonup;": "\u21c0", + "rightleftarrows;": "\u21c4", + "rightleftharpoons;": "\u21cc", + "rightrightarrows;": "\u21c9", + "rightsquigarrow;": "\u219d", + "rightthreetimes;": "\u22cc", + "ring;": "\u02da", + "risingdotseq;": "\u2253", + "rlarr;": "\u21c4", + "rlhar;": "\u21cc", + "rlm;": "\u200f", + "rmoust;": "\u23b1", + "rmoustache;": "\u23b1", + "rnmid;": "\u2aee", + "roang;": "\u27ed", + "roarr;": "\u21fe", + "robrk;": "\u27e7", + "ropar;": "\u2986", + "ropf;": "\U0001d563", + "roplus;": "\u2a2e", + "rotimes;": "\u2a35", + "rpar;": ")", + "rpargt;": "\u2994", + "rppolint;": "\u2a12", + "rrarr;": "\u21c9", + "rsaquo;": "\u203a", + "rscr;": "\U0001d4c7", + "rsh;": "\u21b1", + "rsqb;": "]", + "rsquo;": "\u2019", + "rsquor;": "\u2019", + "rthree;": "\u22cc", + "rtimes;": "\u22ca", + "rtri;": "\u25b9", + "rtrie;": "\u22b5", + "rtrif;": "\u25b8", + "rtriltri;": "\u29ce", + "ruluhar;": "\u2968", + "rx;": "\u211e", + "sacute;": "\u015b", + "sbquo;": "\u201a", + "sc;": "\u227b", + "scE;": "\u2ab4", + "scap;": "\u2ab8", + "scaron;": "\u0161", + "sccue;": "\u227d", + "sce;": "\u2ab0", + "scedil;": "\u015f", + "scirc;": "\u015d", + "scnE;": "\u2ab6", + "scnap;": "\u2aba", + "scnsim;": "\u22e9", + "scpolint;": "\u2a13", + "scsim;": "\u227f", + "scy;": "\u0441", + "sdot;": "\u22c5", + "sdotb;": "\u22a1", + "sdote;": "\u2a66", + "seArr;": "\u21d8", + "searhk;": "\u2925", + "searr;": "\u2198", + "searrow;": "\u2198", + "sect": "\xa7", + "sect;": "\xa7", + "semi;": ";", + "seswar;": "\u2929", + "setminus;": "\u2216", + "setmn;": "\u2216", + "sext;": "\u2736", + "sfr;": "\U0001d530", + "sfrown;": "\u2322", + "sharp;": "\u266f", + "shchcy;": "\u0449", + "shcy;": "\u0448", + "shortmid;": "\u2223", + "shortparallel;": "\u2225", + "shy": "\xad", + "shy;": "\xad", + "sigma;": "\u03c3", + "sigmaf;": "\u03c2", + "sigmav;": "\u03c2", + "sim;": "\u223c", + "simdot;": "\u2a6a", + "sime;": "\u2243", + "simeq;": "\u2243", + "simg;": "\u2a9e", + "simgE;": "\u2aa0", + "siml;": "\u2a9d", + "simlE;": "\u2a9f", + "simne;": "\u2246", + "simplus;": "\u2a24", + "simrarr;": "\u2972", + "slarr;": "\u2190", + "smallsetminus;": "\u2216", + "smashp;": "\u2a33", + "smeparsl;": "\u29e4", + "smid;": "\u2223", + "smile;": "\u2323", + "smt;": "\u2aaa", + "smte;": "\u2aac", + "smtes;": "\u2aac\ufe00", + "softcy;": "\u044c", + "sol;": "/", + "solb;": "\u29c4", + "solbar;": "\u233f", + "sopf;": "\U0001d564", + "spades;": "\u2660", + "spadesuit;": "\u2660", + "spar;": "\u2225", + "sqcap;": "\u2293", + "sqcaps;": "\u2293\ufe00", + "sqcup;": "\u2294", + "sqcups;": "\u2294\ufe00", + "sqsub;": "\u228f", + "sqsube;": "\u2291", + "sqsubset;": "\u228f", + "sqsubseteq;": "\u2291", + "sqsup;": "\u2290", + "sqsupe;": "\u2292", + "sqsupset;": "\u2290", + "sqsupseteq;": "\u2292", + "squ;": "\u25a1", + "square;": "\u25a1", + "squarf;": "\u25aa", + "squf;": "\u25aa", + "srarr;": "\u2192", + "sscr;": "\U0001d4c8", + "ssetmn;": "\u2216", + "ssmile;": "\u2323", + "sstarf;": "\u22c6", + "star;": "\u2606", + "starf;": "\u2605", + "straightepsilon;": "\u03f5", + "straightphi;": "\u03d5", + "strns;": "\xaf", + "sub;": "\u2282", + "subE;": "\u2ac5", + "subdot;": "\u2abd", + "sube;": "\u2286", + "subedot;": "\u2ac3", + "submult;": "\u2ac1", + "subnE;": "\u2acb", + "subne;": "\u228a", + "subplus;": "\u2abf", + "subrarr;": "\u2979", + "subset;": "\u2282", + "subseteq;": "\u2286", + "subseteqq;": "\u2ac5", + "subsetneq;": "\u228a", + "subsetneqq;": "\u2acb", + "subsim;": "\u2ac7", + "subsub;": "\u2ad5", + "subsup;": "\u2ad3", + "succ;": "\u227b", + "succapprox;": "\u2ab8", + "succcurlyeq;": "\u227d", + "succeq;": "\u2ab0", + "succnapprox;": "\u2aba", + "succneqq;": "\u2ab6", + "succnsim;": "\u22e9", + "succsim;": "\u227f", + "sum;": "\u2211", + "sung;": "\u266a", + "sup1": "\xb9", + "sup1;": "\xb9", + "sup2": "\xb2", + "sup2;": "\xb2", + "sup3": "\xb3", + "sup3;": "\xb3", + "sup;": "\u2283", + "supE;": "\u2ac6", + "supdot;": "\u2abe", + "supdsub;": "\u2ad8", + "supe;": "\u2287", + "supedot;": "\u2ac4", + "suphsol;": "\u27c9", + "suphsub;": "\u2ad7", + "suplarr;": "\u297b", + "supmult;": "\u2ac2", + "supnE;": "\u2acc", + "supne;": "\u228b", + "supplus;": "\u2ac0", + "supset;": "\u2283", + "supseteq;": "\u2287", + "supseteqq;": "\u2ac6", + "supsetneq;": "\u228b", + "supsetneqq;": "\u2acc", + "supsim;": "\u2ac8", + "supsub;": "\u2ad4", + "supsup;": "\u2ad6", + "swArr;": "\u21d9", + "swarhk;": "\u2926", + "swarr;": "\u2199", + "swarrow;": "\u2199", + "swnwar;": "\u292a", + "szlig": "\xdf", + "szlig;": "\xdf", + "target;": "\u2316", + "tau;": "\u03c4", + "tbrk;": "\u23b4", + "tcaron;": "\u0165", + "tcedil;": "\u0163", + "tcy;": "\u0442", + "tdot;": "\u20db", + "telrec;": "\u2315", + "tfr;": "\U0001d531", + "there4;": "\u2234", + "therefore;": "\u2234", + "theta;": "\u03b8", + "thetasym;": "\u03d1", + "thetav;": "\u03d1", + "thickapprox;": "\u2248", + "thicksim;": "\u223c", + "thinsp;": "\u2009", + "thkap;": "\u2248", + "thksim;": "\u223c", + "thorn": "\xfe", + "thorn;": "\xfe", + "tilde;": "\u02dc", + "times": "\xd7", + "times;": "\xd7", + "timesb;": "\u22a0", + "timesbar;": "\u2a31", + "timesd;": "\u2a30", + "tint;": "\u222d", + "toea;": "\u2928", + "top;": "\u22a4", + "topbot;": "\u2336", + "topcir;": "\u2af1", + "topf;": "\U0001d565", + "topfork;": "\u2ada", + "tosa;": "\u2929", + "tprime;": "\u2034", + "trade;": "\u2122", + "triangle;": "\u25b5", + "triangledown;": "\u25bf", + "triangleleft;": "\u25c3", + "trianglelefteq;": "\u22b4", + "triangleq;": "\u225c", + "triangleright;": "\u25b9", + "trianglerighteq;": "\u22b5", + "tridot;": "\u25ec", + "trie;": "\u225c", + "triminus;": "\u2a3a", + "triplus;": "\u2a39", + "trisb;": "\u29cd", + "tritime;": "\u2a3b", + "trpezium;": "\u23e2", + "tscr;": "\U0001d4c9", + "tscy;": "\u0446", + "tshcy;": "\u045b", + "tstrok;": "\u0167", + "twixt;": "\u226c", + "twoheadleftarrow;": "\u219e", + "twoheadrightarrow;": "\u21a0", + "uArr;": "\u21d1", + "uHar;": "\u2963", + "uacute": "\xfa", + "uacute;": "\xfa", + "uarr;": "\u2191", + "ubrcy;": "\u045e", + "ubreve;": "\u016d", + "ucirc": "\xfb", + "ucirc;": "\xfb", + "ucy;": "\u0443", + "udarr;": "\u21c5", + "udblac;": "\u0171", + "udhar;": "\u296e", + "ufisht;": "\u297e", + "ufr;": "\U0001d532", + "ugrave": "\xf9", + "ugrave;": "\xf9", + "uharl;": "\u21bf", + "uharr;": "\u21be", + "uhblk;": "\u2580", + "ulcorn;": "\u231c", + "ulcorner;": "\u231c", + "ulcrop;": "\u230f", + "ultri;": "\u25f8", + "umacr;": "\u016b", + "uml": "\xa8", + "uml;": "\xa8", + "uogon;": "\u0173", + "uopf;": "\U0001d566", + "uparrow;": "\u2191", + "updownarrow;": "\u2195", + "upharpoonleft;": "\u21bf", + "upharpoonright;": "\u21be", + "uplus;": "\u228e", + "upsi;": "\u03c5", + "upsih;": "\u03d2", + "upsilon;": "\u03c5", + "upuparrows;": "\u21c8", + "urcorn;": "\u231d", + "urcorner;": "\u231d", + "urcrop;": "\u230e", + "uring;": "\u016f", + "urtri;": "\u25f9", + "uscr;": "\U0001d4ca", + "utdot;": "\u22f0", + "utilde;": "\u0169", + "utri;": "\u25b5", + "utrif;": "\u25b4", + "uuarr;": "\u21c8", + "uuml": "\xfc", + "uuml;": "\xfc", + "uwangle;": "\u29a7", + "vArr;": "\u21d5", + "vBar;": "\u2ae8", + "vBarv;": "\u2ae9", + "vDash;": "\u22a8", + "vangrt;": "\u299c", + "varepsilon;": "\u03f5", + "varkappa;": "\u03f0", + "varnothing;": "\u2205", + "varphi;": "\u03d5", + "varpi;": "\u03d6", + "varpropto;": "\u221d", + "varr;": "\u2195", + "varrho;": "\u03f1", + "varsigma;": "\u03c2", + "varsubsetneq;": "\u228a\ufe00", + "varsubsetneqq;": "\u2acb\ufe00", + "varsupsetneq;": "\u228b\ufe00", + "varsupsetneqq;": "\u2acc\ufe00", + "vartheta;": "\u03d1", + "vartriangleleft;": "\u22b2", + "vartriangleright;": "\u22b3", + "vcy;": "\u0432", + "vdash;": "\u22a2", + "vee;": "\u2228", + "veebar;": "\u22bb", + "veeeq;": "\u225a", + "vellip;": "\u22ee", + "verbar;": "|", + "vert;": "|", + "vfr;": "\U0001d533", + "vltri;": "\u22b2", + "vnsub;": "\u2282\u20d2", + "vnsup;": "\u2283\u20d2", + "vopf;": "\U0001d567", + "vprop;": "\u221d", + "vrtri;": "\u22b3", + "vscr;": "\U0001d4cb", + "vsubnE;": "\u2acb\ufe00", + "vsubne;": "\u228a\ufe00", + "vsupnE;": "\u2acc\ufe00", + "vsupne;": "\u228b\ufe00", + "vzigzag;": "\u299a", + "wcirc;": "\u0175", + "wedbar;": "\u2a5f", + "wedge;": "\u2227", + "wedgeq;": "\u2259", + "weierp;": "\u2118", + "wfr;": "\U0001d534", + "wopf;": "\U0001d568", + "wp;": "\u2118", + "wr;": "\u2240", + "wreath;": "\u2240", + "wscr;": "\U0001d4cc", + "xcap;": "\u22c2", + "xcirc;": "\u25ef", + "xcup;": "\u22c3", + "xdtri;": "\u25bd", + "xfr;": "\U0001d535", + "xhArr;": "\u27fa", + "xharr;": "\u27f7", + "xi;": "\u03be", + "xlArr;": "\u27f8", + "xlarr;": "\u27f5", + "xmap;": "\u27fc", + "xnis;": "\u22fb", + "xodot;": "\u2a00", + "xopf;": "\U0001d569", + "xoplus;": "\u2a01", + "xotime;": "\u2a02", + "xrArr;": "\u27f9", + "xrarr;": "\u27f6", + "xscr;": "\U0001d4cd", + "xsqcup;": "\u2a06", + "xuplus;": "\u2a04", + "xutri;": "\u25b3", + "xvee;": "\u22c1", + "xwedge;": "\u22c0", + "yacute": "\xfd", + "yacute;": "\xfd", + "yacy;": "\u044f", + "ycirc;": "\u0177", + "ycy;": "\u044b", + "yen": "\xa5", + "yen;": "\xa5", + "yfr;": "\U0001d536", + "yicy;": "\u0457", + "yopf;": "\U0001d56a", + "yscr;": "\U0001d4ce", + "yucy;": "\u044e", + "yuml": "\xff", + "yuml;": "\xff", + "zacute;": "\u017a", + "zcaron;": "\u017e", + "zcy;": "\u0437", + "zdot;": "\u017c", + "zeetrf;": "\u2128", + "zeta;": "\u03b6", + "zfr;": "\U0001d537", + "zhcy;": "\u0436", + "zigrarr;": "\u21dd", + "zopf;": "\U0001d56b", + "zscr;": "\U0001d4cf", + "zwj;": "\u200d", + "zwnj;": "\u200c", +} + +replacementCharacters = { + 0x0: "\uFFFD", + 0x0d: "\u000D", + 0x80: "\u20AC", + 0x81: "\u0081", + 0x82: "\u201A", + 0x83: "\u0192", + 0x84: "\u201E", + 0x85: "\u2026", + 0x86: "\u2020", + 0x87: "\u2021", + 0x88: "\u02C6", + 0x89: "\u2030", + 0x8A: "\u0160", + 0x8B: "\u2039", + 0x8C: "\u0152", + 0x8D: "\u008D", + 0x8E: "\u017D", + 0x8F: "\u008F", + 0x90: "\u0090", + 0x91: "\u2018", + 0x92: "\u2019", + 0x93: "\u201C", + 0x94: "\u201D", + 0x95: "\u2022", + 0x96: "\u2013", + 0x97: "\u2014", + 0x98: "\u02DC", + 0x99: "\u2122", + 0x9A: "\u0161", + 0x9B: "\u203A", + 0x9C: "\u0153", + 0x9D: "\u009D", + 0x9E: "\u017E", + 0x9F: "\u0178", +} + +tokenTypes = { + "Doctype": 0, + "Characters": 1, + "SpaceCharacters": 2, + "StartTag": 3, + "EndTag": 4, + "EmptyTag": 5, + "Comment": 6, + "ParseError": 7 +} + +tagTokenTypes = frozenset([tokenTypes["StartTag"], tokenTypes["EndTag"], + tokenTypes["EmptyTag"]]) + + +prefixes = dict([(v, k) for k, v in namespaces.items()]) +prefixes["http://www.w3.org/1998/Math/MathML"] = "math" + + +class DataLossWarning(UserWarning): + """Raised when the current tree is unable to represent the input data""" + pass + + +class _ReparseException(Exception): + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ef167c029ea2178052ab0adb20c0d5ba44c7a6b GIT binary patch literal 209 zcmYL@O$x#=5JppQAwsv_!9^Yaf-Q)M2XJGz5^9rZN}9$b2J}W=$*s3=Wg>_lyf?$Q z7-pNM0~FGf!$X{}s9%z>Yy!3yMA06NlHCKDSpW6DgEqofj)AWX@J>=@EVKrW4I#P3 zYU$~sCfd&?j_0Sw$SKD~0VQamGoh@jq|8i>^SQfJvHU_jQ?xU1cCExx9Dxhz;$=dF V5{{6uzCHV^wxd_c*6}ABKp!`2I8p!r literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..becf4d35a2e2009c827fcaacd9bbfd429947235e GIT binary patch literal 1325 zcmZuxOK%%D5GMB_tz_9T`a%Qru!jPvfX17&HR=>bk+f+G^q>Nb5d({+G_~YfD{~(v zDJ3%GQ*!8~{~<Z{-e1FOPx%S$sWY^d^iX1FI2@Am_-44@Y;O+<jQP<APyP%E`3o1D z5rJ?Y$ovRQ5J45GX-?}P59%-vDG`APRaD1$3^Eas>ec<c4{|JeFG!yJKtx|8FNjEF zJRdv{^MM#VBIDs}ut&zByTPZXRSPRwRd=nnE)mtTGF98S-9=Lst&mJrR%))yYl?TM zi>BO2n74k?LTV`<R)sBa4+qYW1^E`pd<1L_QQ!2`?TFxd72YIe0C7YYfB!7)LN_Ug zuj_Q%>55yKp2<~Ow%V($)zuV2^a=w(R?X>fn8J9l*)r*jFJ;QphS$<`ypXA#ahn!k zb}Ca@*_qVo$;qT`<jF~jhEoG(o727YSbAG<^cGxb>yB%@4fM2y%LQK;zh2z}y{O6( za&ByDSDiGUrlw7wO1Rc6rMBMC8!xuS@MYcE)wQ#<thBLvSHWw9$`KvI^oPflLppi@ zOV9rKEdwx?fJV0DIxAZRXq&9o*>uj>f!S}qT#7FW)-6A~W6OinxmI_}{d@PaqpYjC z+f`#MSL(Jd_76U{=Ny%u*its4)!EF}YF|~;tgI9i*koLFGd`8JD!9T>Jm_YxTe$(l zHG`rg5S<BtkwlMx7btE9>hA-Y4}nRNQ$g}T&^*L0g>H;Q1T~Lc?|bj@;^PM!j~CLU zZ(aIAOC@W-*}Um2#0d#q8UgItua?Z|OX#Ur^dWgNxuk3Ado4KY>BlyFPA-FIpV$br z&~Go}SH$*2^m_njcYg^k!^>zLt%G%VNY1}HCLqDNL$aoip^49Tj^RCFv=bL$smFm! z9$BvK5kGawcUV-EBEc<(w-5q0<G$`eSb7_nOBlmv!<g>lvWI;ug^NL18xI`-5gDmU z7u)tsHZDd0jEk^^UA*LKA>THG-a^ao0(&3G>;fb79Xg^tx<hwiPUyvrD_Hk7o+sb| z!a#eBxgle9D;5gn5o6~IuC90bjES~@NYVU%T>4J*ela85H26PCXheOElkpI(mJ4{m zU{z!Jb%+d)X>1h_h}$Y!rDS2@uVOqLK7ViH|J=Fc@G8=;@r4+)^Ik9tMq#q`FXF{q Aa{vGU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e32207b35aa20854a0744b394edb45fb34bae38 GIT binary patch literal 859 zcmZuv&2H2%5VqrNHuOh}5aJ0q5TrKzt=LKkRUpBw7kY|>tR!}dSI$puClY9H+n3>$ za^=J;aAL;kR$IhKGh@e}=bLYw568y`1Z;iz<m+=v$S>UNEQG~5xP1me5J5GmX-4ZH z3u=}zN<I@22zEmRli`+SGZB6v$?P|vNy5fOUf5RmPI6Uut#M;4)S#?toAF`asInE3 zYvrWLwJq_^&H`ARgWIPNB*~~CSs<tgZb-%i6CvbK%tQovCg#8ykI^Tkp;U=?(J-Tb z1h*)0LpOwj3P96~gpQGIdsE6J7(**{Wg@`*BqoORXGlAvhTO??$W2<cT1aEl+N8yr z^OapTZwK+F<lXS<g{xLqYolLQ%d@leGVN4%q8jURtxrt3T)lSJIezrc2ib_$q~Bbv zms%BR<$Jbikz0A%eIH}aRihl|Gwj++p+6RrveVsJ3D4vW^F4`<Y{;5!=_C<^;c&gM zgqk^^y}BtpfUV~P2<NE!KYae|-bfh${YZ~sG4XBaHrO%FucXVJyCn@g=@>S7E&ruH z<op)P`QaY>qdT>C#}`S2onjTv#{<smR`eRzN1R{xxt>l8zOuo-%mM>y+6ySy;9T*q zw)omHjakh6H>7~VRquKOg$<6?pjLzEF=~soES-n$mGlhLAm2?ry~j84gM7^X0!81! A#{d8T literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cabaee6ff84fab7ef243669bcb1a030a7d163baf GIT binary patch literal 1879 zcmZuyJ8v8}5GJ|LJD;SBEh}=;EDWT$LcY9|*p6)&@e2lmi-8Dsu&_a`mON=s`#O?$ zk%he~POl<G5V(-abU{khsZyoh!c8jwg&+tr<eqHBFb|w1Io}LthBI?tE-bVWjM2u* zlRwTN^q1b83>y|VVam^dFvM_*G92QJge0><3nNCDmD-sTIvCwU%x2Cr#2oI7-0!W> zW$rhq=e-13)U)cPXiFC9L~)vAWg%4Uvt*jcq{!>;Bv0akahfKIizt;Zv6jKLy%k9w zYXv8Rz~UxM835rZ#0-Um;n32iJVT+~7!f+n<+Xb^NkQlS_51mV$4Um9o7Xa~q9ERh zgyib_ox!cIZ{Hu>yRo?$sAxM#a#aL7JYqpH3|J9QGM=m0g4^`aUmcZOFy$%`g+}<0 zRH(v71fvR8)M6O?Cj07^;F01oh=Rt5b~~7ltC83aWHAvjzZ$3=K3@l_*yVX36$oZ; zpm`1vO7iUnf3gFK0K9mO9rSGBf?dJ`Qu~x9d7>z-{Sygz30v}XSi8;rq6NTTkm$hY z?;rZ5NTy(Pe;SGYut*sfvY(0m)`-%}ay|ci%07*0IsN!UHN3n%66r_7^($BU8~rjV z*OFYSC{5Qyyngu;HIDS5nRLo?R*3$N%F^{T+3F9?qsV?@9);=$q4Nj1R6Z3x*rKP@ zp+^29-d}1Wc<IESSSN@cI(fCfF--XaP8puz3XLFLcl{aJMl<UG@BOauh#XoKI>NWn z0e<q^%&u%kE})rHIn3H6;sNaK3+T{3f&_;BSInK^1Dub5@9mNU{6B;bh<{mY=I*@! zxi-i-N9Z<s^6)WvOlIE9pS3CvENF=z$JMy1e53aaNF8h28kx$g{2{r9SZ78aAdO-R zfT*gLK`-hx@Z53r2vx55hb=X7yL#Q#dRFF|*ixe<f5Qu~`nUqy<uS9E(@3*-o?8zQ zl&;5oc2;Xi@T;?P%wfyViQ$7)<BP`sbH@K;kUte6qZ?uiH&}-*JAZ_=l)3Gvx9Q$n ztu*@A)93>{{`rydpRK^FVdk2f{sfFy*+&?o@x{v4ddC+5hoG$99fW=<IMo$e+v;h_ zYyTS+3AGVz*LEIdytXwj^pd;*`FFBXJvD5dXLoCxMJlSjdA@Dzw|A5(*Z6pnO!qr+ zkt-<pHLbZv1^{ag_RlN6r%VQa@v3)xAbXZrgv=9NO_qUxj5rV9+P#xAxU@%30d&%a zt+J5HnAY=6@x4*6(5;|eowWFli`s#Pn915Ii?Vj3vV=P7wS`Xl+JRzIJZzid85WbA z)t=@<kEk8fNX*UQ`#X`O+C^$yq;rR;iCs%aOqNm1jSICijnWA>&7dI*aFx)F?i@_{ zEf9ol+{QLp!9M)D*e7k=B{qH!b~f(dvp{XU4Ch@~yJQu3i*V8f9&iA?N;=pzCw_y5 zvkp03<0b}!o~s*}wh#i+rZg+qB-QH<rQ=DI&N&{X(5ERiZNu1l%6{F}gmFSQMBOQ* zCfZd0jA@dCo~M-$Cu#zDMTP!{5xUO{-F<5G`gz`_w)U?zX5G+_YZ}%v=~({(QVZi7 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb0692e1998afe5fe4976ebda2f59ecf775dbf73 GIT binary patch literal 2643 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 aDa2Da@0AX|j}1#AvPGi_fnI=7H~$5LQow2e literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5216f960ddfc5ed77004998c9d289a3f2a956a1d GIT binary patch literal 2770 zcmZ`*&2QX96rZuZUT3>$KANTt6tUt<-B#`PE2WjHs-m<-6^amvC|b2x-W_k^#A`b< z-c=KAI6#jG<$ySFqPHS(?uj#p{s9P$5Emq*BL0Gk1HU(GhdmTaGk$*advD&nukm}+ z(=~=?b8Yd#=~ImTK_BJgfVhF7E@Ki*@R;>^oA<4@)wkO=XTlP8?DQ+`3TJnia75)1 z6P2*C>3(UqUE!{>X7xE_S<}`tK}V(WAP@bhpQSR_o`{B#iqb^S4w9&wiqMavJd{DK zo^z7n+UW!;?2>}=u|V9wQ0Fj(tjz^$TY|T3GUX9#J7Xi-72%31zFpyoDZHzq24fCs z_jVLxkKNNBhy8RIsz#dSFd>K=d9bb;J(>0!`9|2t)2%RRs9c6Yzf0E8L;j#a7O4+0 z34HGHJ?r7A5!+<%vj>emdjylVrsT<yHR2<?XMe&t8v!%2_xSegJ<w+T16mhsye=4w z<109^tI~n&hD}F1DvW#WsZ55$C>^Nt|B)AT#hCX4lZRl$i_cq`jD|rTwuXUh_0m{` zQnmWB)!Fp@D{47;cPK7({cL#QT;98~zA5ALz2&P{TWhT>%FaZI%7ZvQBfHC2F6P?- zG0pIYVIor5+Q|FyavXJ9J>xpnDqTh%JDcsm<~YKZ9(iRJ6XPDQo8e&g`0n)B>1W5d z19w&cbuo-Pa}W=c5&ND!CP#Me!(Dq8+==Keu{~$x2y4rdxAAQ+F?AhC4%%6QLr3;w zTg4-bT)kZbvI1le2&+KYkFAOI0(TGLgWKH|?c_UIsJ+!Zkoj7$t{oBNfp(IhA8Pkj zBEW0favB!uxk<`F%JJc|0@8g3Fo}IYm&f44tG3gSzlxE)Rn=Q5#Qn1N42$d*7eO zms-HY_=54A$LGy^mV4IjOyR{6-KA8dhx|x&aT7!Rj%j4e`p71~Wrqd%j>C7ZY``=2 zR&|w9(1C~U8c(_M5)~@wDtH=l-V#cA%UWg0K9E!3J~Wc9{EVsy^dazMfvl58(vWn3 zp2o^|h2C!p#9`7!lF1DqX3Q>Q9lwk$`D`3vvpdnW`z)+|X7(CeGgoRbRXo39+^8MO z%%-KQH`9JUOc06HEa-+eHv$=S;ZOxc7>K4NXW$g=-Rfug4q~|`$<cC-m`*1ZJGTu0 znq1YDQI_k9%6DR9L^qAsWje^T4GL99U}VA@Bw0b52n1feG|jb@OB2yD_*E1K<&Qi{ zTP@P`lF-W|Sa=;nUBbjT;%uX09FJ4w9Oj;DD5q|@+^cxy+nz;zIlOK;eD`>f6_ZJ5 z^0I4_N<5S%2kAi+oL(P0-J}O~tZ{nS6Y1f~j}Sg8q-(&sRAv+e@Q^0iUA)<rx61Z; z@+0Iu1njE<k3u9o@l2{w0zE3^z9{7=kdVzFOUd*T_;u)bQpipl+3{XaOBvuPfsjt} zZ}7;rUkm)q1pdzn{4DTDrhP6OV+l}ncCrur@;v)IJ5fp{zd;5G2jm)fwvoP4BqR0& zf2Ghcw`C)-=aJY?AaleZzdhI|FHj4GAC4N?eXPTS*zxOfN79}2pkdJ<o*ig-T4;de zgrz^1a>)hA95cKAb0G6qAp`z|%!^XS6wvW;0U?u*BRAx$G`)rim9j+iD@5DciX-iz z*_jfMZ_^4Dk|`WhLZ}!^Aoqok_;p~nHP4D-lP5^U30)1a7Agfo=1~_lRS6U>3tj8P zX?JUTkme{eYPah$6516}5U1<f7LlZB2;H&vdQlh)73SKdS_`Fida3MdYvVk|1&oUr zmoSzwE^C(x6DVr~NHm6lwvzy=(pa8`S=vTp)>Zsi(9Mqm4mz;Q8pPTicXpiN4xRHP zodHKgkGEtd8~9wq+MBdSEdVsV<Xa`fP$ZEHjE!+aaLjEW-yzWd_5o`8pJJ%{m=5|t z4fm*pn*d#a?$cQdy`c)aTJW$|tJVyr=G4#;YBqI>+9B|Gjn5P97V8E#&vzGJ(l2mn ztu#ID`98HQ-`6$Y@26rA6J7WH?LiP1D^=eYY1jA7Z77eySkuEK9bn>KqyG{~mz%6& zqDx-UC1|=?&71bF8vaVNN?Y{?`9NYTNnJ`(+mh6?G?OG~kS|lMy=!A5uhajTB9R5F GZvP8zQJlX3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf5db37dd4eb683a026d19f05b60d10db0de2c85 GIT binary patch literal 16445 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54ac910f90e10d5b08d7731549c2805f129dab28 GIT binary patch literal 1363 zcmZ8hOK%%D5GJ_~?aGp67_L*dIS43n5b8vI8BvO$XyU558AfHa!4}41wWREoxet@n z)-mLhgZ_XVdRCA9OT4xh|Am}7BgJtLE@pN)56<i3K5w_11lIIu`}jYXkbiM=yI@a# z1kwdCPB@h$rxDFr#BwKcD9V_0BbPhem0s>gKFB=o%SIkVK^{gS>>G=w2>+&0DBQ&w z4@9_4VApy<c*vWt32zF2+P-$8Hechd*Cbl!Y(#qP8;D7Ij_o94UCNmeah6x5GB)5@ zo$0JB?8dCf(vpi<W=5z)>Vq4KPSm>NM2j1S8)ny4$`g|erN~8LwC(6BNyYwYqLLK+ zv?Z6`?+^6xmnnw4UGIzE1&JUL<s@R9Mvibf<IV{ap75{fJ#tN>26wp!sR!JL)En0S zIg@bm<+J@#%B0dlcmFtr9G8K+;vyB5>1IW@QewAj#Dz(eNOrqP!Mi$D87ReVvJTkT z;MOL^`fy=(NSLx-0ORzEUi@XqlrGpD8vGME{_~2>8D~4>%9%UdIb-VioazC{+#NC} zQ|HV_3HKh8D_R_ajSn_2=M;&11C)Lb9yMqhpsB$#*deOsA$~n2#eLAe0c{hsZ;ZRr zU(=O#&VD77oNxXHFoCYD9VkrRy5>~{6^)=~bCjG|w@7lKJXHC^f}^N2`e;Bd&hIVl z+UDKVdY<yZNv)x05XT6CIJTcGdwi&b7OEC^Gf&@5B3|ls&$X@=auNm5-=(SbOnD{> zwGQX~L)7Q+dOPn|DytJC`gNlElTvbkOFvir@idMHdarm~^Y7BQs=xWlOa>=YCBL5R zJ$ceU>Q`CyFe|i4q<pB-y}`HUJVD`-;#w5ERQ*$v%RQNm`;#SHbpH+{kE&N{8&cQ+ z(w_k%)TNs=fM=67Sqo^3;d_H!c2;P6blZc2UWg6BzCuHqah#WYCh@x!$LF&|zSA_~ zn3pMt!-*;{MWKbUuFSMi0mM`HkYNtXUVOmrqYT^L0@65y0Fv8cOWAvb;;<2+`)Gug zhAb$jfK9yK>_BaS3~py@bogw4IEsH6z8Jo=j-HM2{vzN%4*4lKJiycNUK6Tt-|Jw3 zlbM+*C{UqBImj@yWlAXgy)BVq!?eVSz%O7`V2CE}w9E?INXxv+q)=a=HP*H~{euh; c4+<-{!P8Ygf4~Yg!exsEI0=}^y0f|SKNyK#ZU6uP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 000000000..d9e234a2a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py @@ -0,0 +1,29 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + +from collections import OrderedDict + + +def _attr_key(attr): + """Return an appropriate key for an attribute for sorting + + Attributes have a namespace that can be either ``None`` or a string. We + can't compare the two because they're different types, so we convert + ``None`` to an empty string first. + + """ + return (attr[0][0] or ''), attr[0][1] + + +class Filter(base.Filter): + """Alphabetizes attributes for elements""" + def __iter__(self): + for token in base.Filter.__iter__(self): + if token["type"] in ("StartTag", "EmptyTag"): + attrs = OrderedDict() + for name, value in sorted(token["data"].items(), + key=_attr_key): + attrs[name] = value + token["data"] = attrs + yield token diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 000000000..f5aa523bf --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/base.py @@ -0,0 +1,12 @@ +from __future__ import absolute_import, division, unicode_literals + + +class Filter(object): + def __init__(self, source): + self.source = source + + def __iter__(self): + return iter(self.source) + + def __getattr__(self, name): + return getattr(self.source, name) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 000000000..2f8ec4fd4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Injects ``<meta charset=ENCODING>`` tag into head of document""" + def __init__(self, source, encoding): + """Creates a Filter + + :arg source: the source token stream + + :arg encoding: the encoding to set + + """ + base.Filter.__init__(self, source) + self.encoding = encoding + + def __iter__(self): + state = "pre_head" + meta_found = (self.encoding is None) + pending = [] + + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag": + if token["name"].lower() == "head": + state = "in_head" + + elif type == "EmptyTag": + if token["name"].lower() == "meta": + # replace charset with actual encoding + has_http_equiv_content_type = False + for (namespace, name), value in token["data"].items(): + if namespace is not None: + continue + elif name.lower() == 'charset': + token["data"][(namespace, name)] = self.encoding + meta_found = True + break + elif name == 'http-equiv' and value.lower() == 'content-type': + has_http_equiv_content_type = True + else: + if has_http_equiv_content_type and (None, "content") in token["data"]: + token["data"][(None, "content")] = 'text/html; charset=%s' % self.encoding + meta_found = True + + elif token["name"].lower() == "head" and not meta_found: + # insert meta into empty head + yield {"type": "StartTag", "name": "head", + "data": token["data"]} + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + yield {"type": "EndTag", "name": "head"} + meta_found = True + continue + + elif type == "EndTag": + if token["name"].lower() == "head" and pending: + # insert meta into head (if necessary) and flush pending queue + yield pending.pop(0) + if not meta_found: + yield {"type": "EmptyTag", "name": "meta", + "data": {(None, "charset"): self.encoding}} + while pending: + yield pending.pop(0) + meta_found = True + state = "post_head" + + if state == "in_head": + pending.append(token) + else: + yield token diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 000000000..b5bbd9776 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/lint.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import, division, unicode_literals + +from pip._vendor.six import text_type + +from . import base +from ..constants import namespaces, voidElements + +from ..constants import spaceCharacters +spaceCharacters = "".join(spaceCharacters) + + +class Filter(base.Filter): + """Lints the token stream for errors + + If it finds any errors, it'll raise an ``AssertionError``. + + """ + def __init__(self, source, require_matching_tags=True): + """Creates a Filter + + :arg source: the source token stream + + :arg require_matching_tags: whether or not to require matching tags + + """ + super(Filter, self).__init__(source) + self.require_matching_tags = require_matching_tags + + def __iter__(self): + open_elements = [] + for token in base.Filter.__iter__(self): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(token["data"], dict) + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert type == "EmptyTag" + else: + assert type == "StartTag" + if type == "StartTag" and self.require_matching_tags: + open_elements.append((namespace, name)) + for (namespace, name), value in token["data"].items(): + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + assert isinstance(value, text_type) + + elif type == "EndTag": + namespace = token["namespace"] + name = token["name"] + assert namespace is None or isinstance(namespace, text_type) + assert namespace != "" + assert isinstance(name, text_type) + assert name != "" + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + assert False, "Void element reported as EndTag token: %(tag)s" % {"tag": name} + elif self.require_matching_tags: + start = open_elements.pop() + assert start == (namespace, name) + + elif type == "Comment": + data = token["data"] + assert isinstance(data, text_type) + + elif type in ("Characters", "SpaceCharacters"): + data = token["data"] + assert isinstance(data, text_type) + assert data != "" + if type == "SpaceCharacters": + assert data.strip(spaceCharacters) == "" + + elif type == "Doctype": + name = token["name"] + assert name is None or isinstance(name, text_type) + assert token["publicId"] is None or isinstance(name, text_type) + assert token["systemId"] is None or isinstance(name, text_type) + + elif type == "Entity": + assert isinstance(token["name"], text_type) + + elif type == "SerializerError": + assert isinstance(token["data"], text_type) + + else: + assert False, "Unknown token type: %(type)s" % {"type": type} + + yield token diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 000000000..c8d5e5403 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/optionaltags.py @@ -0,0 +1,207 @@ +from __future__ import absolute_import, division, unicode_literals + +from . import base + + +class Filter(base.Filter): + """Removes optional tags from the token stream""" + def slider(self): + previous1 = previous2 = None + for token in self.source: + if previous1 is not None: + yield previous2, previous1, token + previous2 = previous1 + previous1 = token + if previous1 is not None: + yield previous2, previous1, None + + def __iter__(self): + for previous, token, next in self.slider(): + type = token["type"] + if type == "StartTag": + if (token["data"] or + not self.is_optional_start(token["name"], previous, next)): + yield token + elif type == "EndTag": + if not self.is_optional_end(token["name"], next): + yield token + else: + yield token + + def is_optional_start(self, tagname, previous, next): + type = next and next["type"] or None + if tagname in 'html': + # An html element's start tag may be omitted if the first thing + # inside the html element is not a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname == 'head': + # A head element's start tag may be omitted if the first thing + # inside the head element is an element. + # XXX: we also omit the start tag if the head element is empty + if type in ("StartTag", "EmptyTag"): + return True + elif type == "EndTag": + return next["name"] == "head" + elif tagname == 'body': + # A body element's start tag may be omitted if the first thing + # inside the body element is not a space character or a comment, + # except if the first thing inside the body element is a script + # or style element and the node immediately preceding the body + # element is a head element whose end tag has been omitted. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we do not look at the preceding event, so we never omit + # the body element's start tag if it's followed by a script or + # a style element. + return next["name"] not in ('script', 'style') + else: + return True + elif tagname == 'colgroup': + # A colgroup element's start tag may be omitted if the first thing + # inside the colgroup element is a col element, and if the element + # is not immediately preceded by another colgroup element whose + # end tag has been omitted. + if type in ("StartTag", "EmptyTag"): + # XXX: we do not look at the preceding event, so instead we never + # omit the colgroup element's end tag when it is immediately + # followed by another colgroup element. See is_optional_end. + return next["name"] == "col" + else: + return False + elif tagname == 'tbody': + # A tbody element's start tag may be omitted if the first thing + # inside the tbody element is a tr element, and if the element is + # not immediately preceded by a tbody, thead, or tfoot element + # whose end tag has been omitted. + if type == "StartTag": + # omit the thead and tfoot elements' end tag when they are + # immediately followed by a tbody element. See is_optional_end. + if previous and previous['type'] == 'EndTag' and \ + previous['name'] in ('tbody', 'thead', 'tfoot'): + return False + return next["name"] == 'tr' + else: + return False + return False + + def is_optional_end(self, tagname, next): + type = next and next["type"] or None + if tagname in ('html', 'head', 'body'): + # An html element's end tag may be omitted if the html element + # is not immediately followed by a space character or a comment. + return type not in ("Comment", "SpaceCharacters") + elif tagname in ('li', 'optgroup', 'tr'): + # A li element's end tag may be omitted if the li element is + # immediately followed by another li element or if there is + # no more content in the parent element. + # An optgroup element's end tag may be omitted if the optgroup + # element is immediately followed by another optgroup element, + # or if there is no more content in the parent element. + # A tr element's end tag may be omitted if the tr element is + # immediately followed by another tr element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] == tagname + else: + return type == "EndTag" or type is None + elif tagname in ('dt', 'dd'): + # A dt element's end tag may be omitted if the dt element is + # immediately followed by another dt element or a dd element. + # A dd element's end tag may be omitted if the dd element is + # immediately followed by another dd element or a dt element, + # or if there is no more content in the parent element. + if type == "StartTag": + return next["name"] in ('dt', 'dd') + elif tagname == 'dd': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'p': + # A p element's end tag may be omitted if the p element is + # immediately followed by an address, article, aside, + # blockquote, datagrid, dialog, dir, div, dl, fieldset, + # footer, form, h1, h2, h3, h4, h5, h6, header, hr, menu, + # nav, ol, p, pre, section, table, or ul, element, or if + # there is no more content in the parent element. + if type in ("StartTag", "EmptyTag"): + return next["name"] in ('address', 'article', 'aside', + 'blockquote', 'datagrid', 'dialog', + 'dir', 'div', 'dl', 'fieldset', 'footer', + 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', + 'header', 'hr', 'menu', 'nav', 'ol', + 'p', 'pre', 'section', 'table', 'ul') + else: + return type == "EndTag" or type is None + elif tagname == 'option': + # An option element's end tag may be omitted if the option + # element is immediately followed by another option element, + # or if it is immediately followed by an <code>optgroup</code> + # element, or if there is no more content in the parent + # element. + if type == "StartTag": + return next["name"] in ('option', 'optgroup') + else: + return type == "EndTag" or type is None + elif tagname in ('rt', 'rp'): + # An rt element's end tag may be omitted if the rt element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + # An rp element's end tag may be omitted if the rp element is + # immediately followed by an rt or rp element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('rt', 'rp') + else: + return type == "EndTag" or type is None + elif tagname == 'colgroup': + # A colgroup element's end tag may be omitted if the colgroup + # element is not immediately followed by a space character or + # a comment. + if type in ("Comment", "SpaceCharacters"): + return False + elif type == "StartTag": + # XXX: we also look for an immediately following colgroup + # element. See is_optional_start. + return next["name"] != 'colgroup' + else: + return True + elif tagname in ('thead', 'tbody'): + # A thead element's end tag may be omitted if the thead element + # is immediately followed by a tbody or tfoot element. + # A tbody element's end tag may be omitted if the tbody element + # is immediately followed by a tbody or tfoot element, or if + # there is no more content in the parent element. + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] in ['tbody', 'tfoot'] + elif tagname == 'tbody': + return type == "EndTag" or type is None + else: + return False + elif tagname == 'tfoot': + # A tfoot element's end tag may be omitted if the tfoot element + # is immediately followed by a tbody element, or if there is no + # more content in the parent element. + # XXX: we never omit the end tag when the following element is + # a tbody. See is_optional_start. + if type == "StartTag": + return next["name"] == 'tbody' + else: + return type == "EndTag" or type is None + elif tagname in ('td', 'th'): + # A td element's end tag may be omitted if the td element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + # A th element's end tag may be omitted if the th element is + # immediately followed by a td or th element, or if there is + # no more content in the parent element. + if type == "StartTag": + return next["name"] in ('td', 'th') + else: + return type == "EndTag" or type is None + return False diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 000000000..c3199a573 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/sanitizer.py @@ -0,0 +1,896 @@ +from __future__ import absolute_import, division, unicode_literals + +import re +from xml.sax.saxutils import escape, unescape + +from pip._vendor.six.moves import urllib_parse as urlparse + +from . import base +from ..constants import namespaces, prefixes + +__all__ = ["Filter"] + + +allowed_elements = frozenset(( + (namespaces['html'], 'a'), + (namespaces['html'], 'abbr'), + (namespaces['html'], 'acronym'), + (namespaces['html'], 'address'), + (namespaces['html'], 'area'), + (namespaces['html'], 'article'), + (namespaces['html'], 'aside'), + (namespaces['html'], 'audio'), + (namespaces['html'], 'b'), + (namespaces['html'], 'big'), + (namespaces['html'], 'blockquote'), + (namespaces['html'], 'br'), + (namespaces['html'], 'button'), + (namespaces['html'], 'canvas'), + (namespaces['html'], 'caption'), + (namespaces['html'], 'center'), + (namespaces['html'], 'cite'), + (namespaces['html'], 'code'), + (namespaces['html'], 'col'), + (namespaces['html'], 'colgroup'), + (namespaces['html'], 'command'), + (namespaces['html'], 'datagrid'), + (namespaces['html'], 'datalist'), + (namespaces['html'], 'dd'), + (namespaces['html'], 'del'), + (namespaces['html'], 'details'), + (namespaces['html'], 'dfn'), + (namespaces['html'], 'dialog'), + (namespaces['html'], 'dir'), + (namespaces['html'], 'div'), + (namespaces['html'], 'dl'), + (namespaces['html'], 'dt'), + (namespaces['html'], 'em'), + (namespaces['html'], 'event-source'), + (namespaces['html'], 'fieldset'), + (namespaces['html'], 'figcaption'), + (namespaces['html'], 'figure'), + (namespaces['html'], 'footer'), + (namespaces['html'], 'font'), + (namespaces['html'], 'form'), + (namespaces['html'], 'header'), + (namespaces['html'], 'h1'), + (namespaces['html'], 'h2'), + (namespaces['html'], 'h3'), + (namespaces['html'], 'h4'), + (namespaces['html'], 'h5'), + (namespaces['html'], 'h6'), + (namespaces['html'], 'hr'), + (namespaces['html'], 'i'), + (namespaces['html'], 'img'), + (namespaces['html'], 'input'), + (namespaces['html'], 'ins'), + (namespaces['html'], 'keygen'), + (namespaces['html'], 'kbd'), + (namespaces['html'], 'label'), + (namespaces['html'], 'legend'), + (namespaces['html'], 'li'), + (namespaces['html'], 'm'), + (namespaces['html'], 'map'), + (namespaces['html'], 'menu'), + (namespaces['html'], 'meter'), + (namespaces['html'], 'multicol'), + (namespaces['html'], 'nav'), + (namespaces['html'], 'nextid'), + (namespaces['html'], 'ol'), + (namespaces['html'], 'output'), + (namespaces['html'], 'optgroup'), + (namespaces['html'], 'option'), + (namespaces['html'], 'p'), + (namespaces['html'], 'pre'), + (namespaces['html'], 'progress'), + (namespaces['html'], 'q'), + (namespaces['html'], 's'), + (namespaces['html'], 'samp'), + (namespaces['html'], 'section'), + (namespaces['html'], 'select'), + (namespaces['html'], 'small'), + (namespaces['html'], 'sound'), + (namespaces['html'], 'source'), + (namespaces['html'], 'spacer'), + (namespaces['html'], 'span'), + (namespaces['html'], 'strike'), + (namespaces['html'], 'strong'), + (namespaces['html'], 'sub'), + (namespaces['html'], 'sup'), + (namespaces['html'], 'table'), + (namespaces['html'], 'tbody'), + (namespaces['html'], 'td'), + (namespaces['html'], 'textarea'), + (namespaces['html'], 'time'), + (namespaces['html'], 'tfoot'), + (namespaces['html'], 'th'), + (namespaces['html'], 'thead'), + (namespaces['html'], 'tr'), + (namespaces['html'], 'tt'), + (namespaces['html'], 'u'), + (namespaces['html'], 'ul'), + (namespaces['html'], 'var'), + (namespaces['html'], 'video'), + (namespaces['mathml'], 'maction'), + (namespaces['mathml'], 'math'), + (namespaces['mathml'], 'merror'), + (namespaces['mathml'], 'mfrac'), + (namespaces['mathml'], 'mi'), + (namespaces['mathml'], 'mmultiscripts'), + (namespaces['mathml'], 'mn'), + (namespaces['mathml'], 'mo'), + (namespaces['mathml'], 'mover'), + (namespaces['mathml'], 'mpadded'), + (namespaces['mathml'], 'mphantom'), + (namespaces['mathml'], 'mprescripts'), + (namespaces['mathml'], 'mroot'), + (namespaces['mathml'], 'mrow'), + (namespaces['mathml'], 'mspace'), + (namespaces['mathml'], 'msqrt'), + (namespaces['mathml'], 'mstyle'), + (namespaces['mathml'], 'msub'), + (namespaces['mathml'], 'msubsup'), + (namespaces['mathml'], 'msup'), + (namespaces['mathml'], 'mtable'), + (namespaces['mathml'], 'mtd'), + (namespaces['mathml'], 'mtext'), + (namespaces['mathml'], 'mtr'), + (namespaces['mathml'], 'munder'), + (namespaces['mathml'], 'munderover'), + (namespaces['mathml'], 'none'), + (namespaces['svg'], 'a'), + (namespaces['svg'], 'animate'), + (namespaces['svg'], 'animateColor'), + (namespaces['svg'], 'animateMotion'), + (namespaces['svg'], 'animateTransform'), + (namespaces['svg'], 'clipPath'), + (namespaces['svg'], 'circle'), + (namespaces['svg'], 'defs'), + (namespaces['svg'], 'desc'), + (namespaces['svg'], 'ellipse'), + (namespaces['svg'], 'font-face'), + (namespaces['svg'], 'font-face-name'), + (namespaces['svg'], 'font-face-src'), + (namespaces['svg'], 'g'), + (namespaces['svg'], 'glyph'), + (namespaces['svg'], 'hkern'), + (namespaces['svg'], 'linearGradient'), + (namespaces['svg'], 'line'), + (namespaces['svg'], 'marker'), + (namespaces['svg'], 'metadata'), + (namespaces['svg'], 'missing-glyph'), + (namespaces['svg'], 'mpath'), + (namespaces['svg'], 'path'), + (namespaces['svg'], 'polygon'), + (namespaces['svg'], 'polyline'), + (namespaces['svg'], 'radialGradient'), + (namespaces['svg'], 'rect'), + (namespaces['svg'], 'set'), + (namespaces['svg'], 'stop'), + (namespaces['svg'], 'svg'), + (namespaces['svg'], 'switch'), + (namespaces['svg'], 'text'), + (namespaces['svg'], 'title'), + (namespaces['svg'], 'tspan'), + (namespaces['svg'], 'use'), +)) + +allowed_attributes = frozenset(( + # HTML attributes + (None, 'abbr'), + (None, 'accept'), + (None, 'accept-charset'), + (None, 'accesskey'), + (None, 'action'), + (None, 'align'), + (None, 'alt'), + (None, 'autocomplete'), + (None, 'autofocus'), + (None, 'axis'), + (None, 'background'), + (None, 'balance'), + (None, 'bgcolor'), + (None, 'bgproperties'), + (None, 'border'), + (None, 'bordercolor'), + (None, 'bordercolordark'), + (None, 'bordercolorlight'), + (None, 'bottompadding'), + (None, 'cellpadding'), + (None, 'cellspacing'), + (None, 'ch'), + (None, 'challenge'), + (None, 'char'), + (None, 'charoff'), + (None, 'choff'), + (None, 'charset'), + (None, 'checked'), + (None, 'cite'), + (None, 'class'), + (None, 'clear'), + (None, 'color'), + (None, 'cols'), + (None, 'colspan'), + (None, 'compact'), + (None, 'contenteditable'), + (None, 'controls'), + (None, 'coords'), + (None, 'data'), + (None, 'datafld'), + (None, 'datapagesize'), + (None, 'datasrc'), + (None, 'datetime'), + (None, 'default'), + (None, 'delay'), + (None, 'dir'), + (None, 'disabled'), + (None, 'draggable'), + (None, 'dynsrc'), + (None, 'enctype'), + (None, 'end'), + (None, 'face'), + (None, 'for'), + (None, 'form'), + (None, 'frame'), + (None, 'galleryimg'), + (None, 'gutter'), + (None, 'headers'), + (None, 'height'), + (None, 'hidefocus'), + (None, 'hidden'), + (None, 'high'), + (None, 'href'), + (None, 'hreflang'), + (None, 'hspace'), + (None, 'icon'), + (None, 'id'), + (None, 'inputmode'), + (None, 'ismap'), + (None, 'keytype'), + (None, 'label'), + (None, 'leftspacing'), + (None, 'lang'), + (None, 'list'), + (None, 'longdesc'), + (None, 'loop'), + (None, 'loopcount'), + (None, 'loopend'), + (None, 'loopstart'), + (None, 'low'), + (None, 'lowsrc'), + (None, 'max'), + (None, 'maxlength'), + (None, 'media'), + (None, 'method'), + (None, 'min'), + (None, 'multiple'), + (None, 'name'), + (None, 'nohref'), + (None, 'noshade'), + (None, 'nowrap'), + (None, 'open'), + (None, 'optimum'), + (None, 'pattern'), + (None, 'ping'), + (None, 'point-size'), + (None, 'poster'), + (None, 'pqg'), + (None, 'preload'), + (None, 'prompt'), + (None, 'radiogroup'), + (None, 'readonly'), + (None, 'rel'), + (None, 'repeat-max'), + (None, 'repeat-min'), + (None, 'replace'), + (None, 'required'), + (None, 'rev'), + (None, 'rightspacing'), + (None, 'rows'), + (None, 'rowspan'), + (None, 'rules'), + (None, 'scope'), + (None, 'selected'), + (None, 'shape'), + (None, 'size'), + (None, 'span'), + (None, 'src'), + (None, 'start'), + (None, 'step'), + (None, 'style'), + (None, 'summary'), + (None, 'suppress'), + (None, 'tabindex'), + (None, 'target'), + (None, 'template'), + (None, 'title'), + (None, 'toppadding'), + (None, 'type'), + (None, 'unselectable'), + (None, 'usemap'), + (None, 'urn'), + (None, 'valign'), + (None, 'value'), + (None, 'variable'), + (None, 'volume'), + (None, 'vspace'), + (None, 'vrml'), + (None, 'width'), + (None, 'wrap'), + (namespaces['xml'], 'lang'), + # MathML attributes + (None, 'actiontype'), + (None, 'align'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnalign'), + (None, 'columnlines'), + (None, 'columnspacing'), + (None, 'columnspan'), + (None, 'depth'), + (None, 'display'), + (None, 'displaystyle'), + (None, 'equalcolumns'), + (None, 'equalrows'), + (None, 'fence'), + (None, 'fontstyle'), + (None, 'fontweight'), + (None, 'frame'), + (None, 'height'), + (None, 'linethickness'), + (None, 'lspace'), + (None, 'mathbackground'), + (None, 'mathcolor'), + (None, 'mathvariant'), + (None, 'mathvariant'), + (None, 'maxsize'), + (None, 'minsize'), + (None, 'other'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowalign'), + (None, 'rowlines'), + (None, 'rowspacing'), + (None, 'rowspan'), + (None, 'rspace'), + (None, 'scriptlevel'), + (None, 'selection'), + (None, 'separator'), + (None, 'stretchy'), + (None, 'width'), + (None, 'width'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'type'), + # SVG attributes + (None, 'accent-height'), + (None, 'accumulate'), + (None, 'additive'), + (None, 'alphabetic'), + (None, 'arabic-form'), + (None, 'ascent'), + (None, 'attributeName'), + (None, 'attributeType'), + (None, 'baseProfile'), + (None, 'bbox'), + (None, 'begin'), + (None, 'by'), + (None, 'calcMode'), + (None, 'cap-height'), + (None, 'class'), + (None, 'clip-path'), + (None, 'color'), + (None, 'color-rendering'), + (None, 'content'), + (None, 'cx'), + (None, 'cy'), + (None, 'd'), + (None, 'dx'), + (None, 'dy'), + (None, 'descent'), + (None, 'display'), + (None, 'dur'), + (None, 'end'), + (None, 'fill'), + (None, 'fill-opacity'), + (None, 'fill-rule'), + (None, 'font-family'), + (None, 'font-size'), + (None, 'font-stretch'), + (None, 'font-style'), + (None, 'font-variant'), + (None, 'font-weight'), + (None, 'from'), + (None, 'fx'), + (None, 'fy'), + (None, 'g1'), + (None, 'g2'), + (None, 'glyph-name'), + (None, 'gradientUnits'), + (None, 'hanging'), + (None, 'height'), + (None, 'horiz-adv-x'), + (None, 'horiz-origin-x'), + (None, 'id'), + (None, 'ideographic'), + (None, 'k'), + (None, 'keyPoints'), + (None, 'keySplines'), + (None, 'keyTimes'), + (None, 'lang'), + (None, 'marker-end'), + (None, 'marker-mid'), + (None, 'marker-start'), + (None, 'markerHeight'), + (None, 'markerUnits'), + (None, 'markerWidth'), + (None, 'mathematical'), + (None, 'max'), + (None, 'min'), + (None, 'name'), + (None, 'offset'), + (None, 'opacity'), + (None, 'orient'), + (None, 'origin'), + (None, 'overline-position'), + (None, 'overline-thickness'), + (None, 'panose-1'), + (None, 'path'), + (None, 'pathLength'), + (None, 'points'), + (None, 'preserveAspectRatio'), + (None, 'r'), + (None, 'refX'), + (None, 'refY'), + (None, 'repeatCount'), + (None, 'repeatDur'), + (None, 'requiredExtensions'), + (None, 'requiredFeatures'), + (None, 'restart'), + (None, 'rotate'), + (None, 'rx'), + (None, 'ry'), + (None, 'slope'), + (None, 'stemh'), + (None, 'stemv'), + (None, 'stop-color'), + (None, 'stop-opacity'), + (None, 'strikethrough-position'), + (None, 'strikethrough-thickness'), + (None, 'stroke'), + (None, 'stroke-dasharray'), + (None, 'stroke-dashoffset'), + (None, 'stroke-linecap'), + (None, 'stroke-linejoin'), + (None, 'stroke-miterlimit'), + (None, 'stroke-opacity'), + (None, 'stroke-width'), + (None, 'systemLanguage'), + (None, 'target'), + (None, 'text-anchor'), + (None, 'to'), + (None, 'transform'), + (None, 'type'), + (None, 'u1'), + (None, 'u2'), + (None, 'underline-position'), + (None, 'underline-thickness'), + (None, 'unicode'), + (None, 'unicode-range'), + (None, 'units-per-em'), + (None, 'values'), + (None, 'version'), + (None, 'viewBox'), + (None, 'visibility'), + (None, 'width'), + (None, 'widths'), + (None, 'x'), + (None, 'x-height'), + (None, 'x1'), + (None, 'x2'), + (namespaces['xlink'], 'actuate'), + (namespaces['xlink'], 'arcrole'), + (namespaces['xlink'], 'href'), + (namespaces['xlink'], 'role'), + (namespaces['xlink'], 'show'), + (namespaces['xlink'], 'title'), + (namespaces['xlink'], 'type'), + (namespaces['xml'], 'base'), + (namespaces['xml'], 'lang'), + (namespaces['xml'], 'space'), + (None, 'y'), + (None, 'y1'), + (None, 'y2'), + (None, 'zoomAndPan'), +)) + +attr_val_is_uri = frozenset(( + (None, 'href'), + (None, 'src'), + (None, 'cite'), + (None, 'action'), + (None, 'longdesc'), + (None, 'poster'), + (None, 'background'), + (None, 'datasrc'), + (None, 'dynsrc'), + (None, 'lowsrc'), + (None, 'ping'), + (namespaces['xlink'], 'href'), + (namespaces['xml'], 'base'), +)) + +svg_attr_val_allows_ref = frozenset(( + (None, 'clip-path'), + (None, 'color-profile'), + (None, 'cursor'), + (None, 'fill'), + (None, 'filter'), + (None, 'marker'), + (None, 'marker-start'), + (None, 'marker-mid'), + (None, 'marker-end'), + (None, 'mask'), + (None, 'stroke'), +)) + +svg_allow_local_href = frozenset(( + (None, 'altGlyph'), + (None, 'animate'), + (None, 'animateColor'), + (None, 'animateMotion'), + (None, 'animateTransform'), + (None, 'cursor'), + (None, 'feImage'), + (None, 'filter'), + (None, 'linearGradient'), + (None, 'pattern'), + (None, 'radialGradient'), + (None, 'textpath'), + (None, 'tref'), + (None, 'set'), + (None, 'use') +)) + +allowed_css_properties = frozenset(( + 'azimuth', + 'background-color', + 'border-bottom-color', + 'border-collapse', + 'border-color', + 'border-left-color', + 'border-right-color', + 'border-top-color', + 'clear', + 'color', + 'cursor', + 'direction', + 'display', + 'elevation', + 'float', + 'font', + 'font-family', + 'font-size', + 'font-style', + 'font-variant', + 'font-weight', + 'height', + 'letter-spacing', + 'line-height', + 'overflow', + 'pause', + 'pause-after', + 'pause-before', + 'pitch', + 'pitch-range', + 'richness', + 'speak', + 'speak-header', + 'speak-numeral', + 'speak-punctuation', + 'speech-rate', + 'stress', + 'text-align', + 'text-decoration', + 'text-indent', + 'unicode-bidi', + 'vertical-align', + 'voice-family', + 'volume', + 'white-space', + 'width', +)) + +allowed_css_keywords = frozenset(( + 'auto', + 'aqua', + 'black', + 'block', + 'blue', + 'bold', + 'both', + 'bottom', + 'brown', + 'center', + 'collapse', + 'dashed', + 'dotted', + 'fuchsia', + 'gray', + 'green', + '!important', + 'italic', + 'left', + 'lime', + 'maroon', + 'medium', + 'none', + 'navy', + 'normal', + 'nowrap', + 'olive', + 'pointer', + 'purple', + 'red', + 'right', + 'solid', + 'silver', + 'teal', + 'top', + 'transparent', + 'underline', + 'white', + 'yellow', +)) + +allowed_svg_properties = frozenset(( + 'fill', + 'fill-opacity', + 'fill-rule', + 'stroke', + 'stroke-width', + 'stroke-linecap', + 'stroke-linejoin', + 'stroke-opacity', +)) + +allowed_protocols = frozenset(( + 'ed2k', + 'ftp', + 'http', + 'https', + 'irc', + 'mailto', + 'news', + 'gopher', + 'nntp', + 'telnet', + 'webcal', + 'xmpp', + 'callto', + 'feed', + 'urn', + 'aim', + 'rsync', + 'tag', + 'ssh', + 'sftp', + 'rtsp', + 'afs', + 'data', +)) + +allowed_content_types = frozenset(( + 'image/png', + 'image/jpeg', + 'image/gif', + 'image/webp', + 'image/bmp', + 'text/plain', +)) + + +data_content_type = re.compile(r''' + ^ + # Match a content type <application>/<type> + (?P<content_type>[-a-zA-Z0-9.]+/[-a-zA-Z0-9.]+) + # Match any character set and encoding + (?:(?:;charset=(?:[-a-zA-Z0-9]+)(?:;(?:base64))?) + |(?:;(?:base64))?(?:;charset=(?:[-a-zA-Z0-9]+))?) + # Assume the rest is data + ,.* + $ + ''', + re.VERBOSE) + + +class Filter(base.Filter): + """Sanitizes token stream of XHTML+MathML+SVG and of inline style attributes""" + def __init__(self, + source, + allowed_elements=allowed_elements, + allowed_attributes=allowed_attributes, + allowed_css_properties=allowed_css_properties, + allowed_css_keywords=allowed_css_keywords, + allowed_svg_properties=allowed_svg_properties, + allowed_protocols=allowed_protocols, + allowed_content_types=allowed_content_types, + attr_val_is_uri=attr_val_is_uri, + svg_attr_val_allows_ref=svg_attr_val_allows_ref, + svg_allow_local_href=svg_allow_local_href): + """Creates a Filter + + :arg allowed_elements: set of elements to allow--everything else will + be escaped + + :arg allowed_attributes: set of attributes to allow in + elements--everything else will be stripped + + :arg allowed_css_properties: set of CSS properties to allow--everything + else will be stripped + + :arg allowed_css_keywords: set of CSS keywords to allow--everything + else will be stripped + + :arg allowed_svg_properties: set of SVG properties to allow--everything + else will be removed + + :arg allowed_protocols: set of allowed protocols for URIs + + :arg allowed_content_types: set of allowed content types for ``data`` URIs. + + :arg attr_val_is_uri: set of attributes that have URI values--values + that have a scheme not listed in ``allowed_protocols`` are removed + + :arg svg_attr_val_allows_ref: set of SVG attributes that can have + references + + :arg svg_allow_local_href: set of SVG elements that can have local + hrefs--these are removed + + """ + super(Filter, self).__init__(source) + self.allowed_elements = allowed_elements + self.allowed_attributes = allowed_attributes + self.allowed_css_properties = allowed_css_properties + self.allowed_css_keywords = allowed_css_keywords + self.allowed_svg_properties = allowed_svg_properties + self.allowed_protocols = allowed_protocols + self.allowed_content_types = allowed_content_types + self.attr_val_is_uri = attr_val_is_uri + self.svg_attr_val_allows_ref = svg_attr_val_allows_ref + self.svg_allow_local_href = svg_allow_local_href + + def __iter__(self): + for token in base.Filter.__iter__(self): + token = self.sanitize_token(token) + if token: + yield token + + # Sanitize the +html+, escaping all elements not in ALLOWED_ELEMENTS, and + # stripping out all attributes not in ALLOWED_ATTRIBUTES. Style attributes + # are parsed, and a restricted set, specified by ALLOWED_CSS_PROPERTIES and + # ALLOWED_CSS_KEYWORDS, are allowed through. attributes in ATTR_VAL_IS_URI + # are scanned, and only URI schemes specified in ALLOWED_PROTOCOLS are + # allowed. + # + # sanitize_html('<script> do_nasty_stuff() </script>') + # => <script> do_nasty_stuff() </script> + # sanitize_html('<a href="javascript: sucker();">Click here for $100</a>') + # => <a>Click here for $100</a> + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "</%s>" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 000000000..24bb0de05 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 000000000..b185971b2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('<html><body><p>This is a doc</p></body></html>') + <Element u'{http://www.w3.org/1999/xhtml}html' at 0x7feac4909db0> + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('<b>this is a fragment</b>') + <Element u'DOCUMENT_FRAGMENT' at 0x7feac484b090> + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of <pre>, <listing>, and <textarea> blocks) we + # want to drop leading newlines + data = token["data"] + self.processSpaceCharacters = self.processSpaceCharactersNonPre + if (data.startswith("\n") and + self.tree.openElements[-1].name in ("pre", "listing", "textarea") and + not self.tree.openElements[-1].hasContent()): + data = data[1:] + if data: + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(data) + + def processCharacters(self, token): + if token["data"] == "\u0000": + # The tokenizer should always emit null on its own + return + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + # This must be bad for performance + if (self.parser.framesetOK and + any([char not in spaceCharacters + for char in token["data"]])): + self.parser.framesetOK = False + + def processSpaceCharactersNonPre(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertText(token["data"]) + + def startTagProcessInHead(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagBody(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "body"}) + if (len(self.tree.openElements) == 1 or + self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + else: + self.parser.framesetOK = False + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[1].attributes: + self.tree.openElements[1].attributes[attr] = value + + def startTagFrameset(self, token): + self.parser.parseError("unexpected-start-tag", {"name": "frameset"}) + if (len(self.tree.openElements) == 1 or self.tree.openElements[1].name != "body"): + assert self.parser.innerHTML + elif not self.parser.framesetOK: + pass + else: + if self.tree.openElements[1].parent: + self.tree.openElements[1].parent.removeChild(self.tree.openElements[1]) + while self.tree.openElements[-1].name != "html": + self.tree.openElements.pop() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagCloseP(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + + def startTagPreListing(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + + def startTagForm(self, token): + if self.tree.formPointer: + self.parser.parseError("unexpected-start-tag", {"name": "form"}) + else: + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + + def startTagListItem(self, token): + self.parser.framesetOK = False + + stopNamesMap = {"li": ["li"], + "dt": ["dt", "dd"], + "dd": ["dt", "dd"]} + stopNames = stopNamesMap[token["name"]] + for node in reversed(self.tree.openElements): + if node.name in stopNames: + self.parser.phase.processEndTag( + impliedTagToken(node.name, "EndTag")) + break + if (node.nameTuple in specialElements and + node.name not in ("address", "div", "p")): + break + + if self.tree.elementInScope("p", variant="button"): + self.parser.phase.processEndTag( + impliedTagToken("p", "EndTag")) + + self.tree.insertElement(token) + + def startTagPlaintext(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.plaintextState + + def startTagHeading(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + if self.tree.openElements[-1].name in headingElements: + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagA(self, token): + afeAElement = self.tree.elementInActiveFormattingElements("a") + if afeAElement: + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "a", "endName": "a"}) + self.endTagFormatting(impliedTagToken("a")) + if afeAElement in self.tree.openElements: + self.tree.openElements.remove(afeAElement) + if afeAElement in self.tree.activeFormattingElements: + self.tree.activeFormattingElements.remove(afeAElement) + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagNobr(self, token): + self.tree.reconstructActiveFormattingElements() + if self.tree.elementInScope("nobr"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "nobr", "endName": "nobr"}) + self.processEndTag(impliedTagToken("nobr")) + # XXX Need tests that trigger the following + self.tree.reconstructActiveFormattingElements() + self.addFormattingElement(token) + + def startTagButton(self, token): + if self.tree.elementInScope("button"): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "button", "endName": "button"}) + self.processEndTag(impliedTagToken("button")) + return token + else: + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + + def startTagAppletMarqueeObject(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.activeFormattingElements.append(Marker) + self.parser.framesetOK = False + + def startTagXmp(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.reconstructActiveFormattingElements() + self.parser.framesetOK = False + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagTable(self, token): + if self.parser.compatMode != "quirks": + if self.tree.elementInScope("p", variant="button"): + self.processEndTag(impliedTagToken("p")) + self.tree.insertElement(token) + self.parser.framesetOK = False + self.parser.phase = self.parser.phases["inTable"] + + def startTagVoidFormatting(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagInput(self, token): + framesetOK = self.parser.framesetOK + self.startTagVoidFormatting(token) + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + # input type=hidden doesn't change framesetOK + self.parser.framesetOK = framesetOK + + def startTagParamSource(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagHr(self, token): + if self.tree.elementInScope("p", variant="button"): + self.endTagP(impliedTagToken("p")) + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + self.parser.framesetOK = False + + def startTagImage(self, token): + # No really... + self.parser.parseError("unexpected-start-tag-treated-as", + {"originalName": "image", "newName": "img"}) + self.processStartTag(impliedTagToken("img", "StartTag", + attributes=token["data"], + selfClosing=token["selfClosing"])) + + def startTagIsIndex(self, token): + self.parser.parseError("deprecated-tag", {"name": "isindex"}) + if self.tree.formPointer: + return + form_attrs = {} + if "action" in token["data"]: + form_attrs["action"] = token["data"]["action"] + self.processStartTag(impliedTagToken("form", "StartTag", + attributes=form_attrs)) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processStartTag(impliedTagToken("label", "StartTag")) + # XXX Localization ... + if "prompt" in token["data"]: + prompt = token["data"]["prompt"] + else: + prompt = "This is a searchable index. Enter search keywords: " + self.processCharacters( + {"type": tokenTypes["Characters"], "data": prompt}) + attributes = token["data"].copy() + if "action" in attributes: + del attributes["action"] + if "prompt" in attributes: + del attributes["prompt"] + attributes["name"] = "isindex" + self.processStartTag(impliedTagToken("input", "StartTag", + attributes=attributes, + selfClosing=token["selfClosing"])) + self.processEndTag(impliedTagToken("label")) + self.processStartTag(impliedTagToken("hr", "StartTag")) + self.processEndTag(impliedTagToken("form")) + + def startTagTextarea(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.rcdataState + self.processSpaceCharacters = self.processSpaceCharactersDropNewline + self.parser.framesetOK = False + + def startTagIFrame(self, token): + self.parser.framesetOK = False + self.startTagRawtext(token) + + def startTagNoscript(self, token): + if self.parser.scripting: + self.startTagRawtext(token) + else: + self.startTagOther(token) + + def startTagRawtext(self, token): + """iframe, noembed noframes, noscript(if scripting enabled)""" + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagOpt(self, token): + if self.tree.openElements[-1].name == "option": + self.parser.phase.processEndTag(impliedTagToken("option")) + self.tree.reconstructActiveFormattingElements() + self.parser.tree.insertElement(token) + + def startTagSelect(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + self.parser.framesetOK = False + if self.parser.phase in (self.parser.phases["inTable"], + self.parser.phases["inCaption"], + self.parser.phases["inColumnGroup"], + self.parser.phases["inTableBody"], + self.parser.phases["inRow"], + self.parser.phases["inCell"]): + self.parser.phase = self.parser.phases["inSelectInTable"] + else: + self.parser.phase = self.parser.phases["inSelect"] + + def startTagRpRt(self, token): + if self.tree.elementInScope("ruby"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "ruby": + self.parser.parseError() + self.tree.insertElement(token) + + def startTagMath(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustMathMLAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["mathml"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagSvg(self, token): + self.tree.reconstructActiveFormattingElements() + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = namespaces["svg"] + self.tree.insertElement(token) + # Need to get the parse error right for the case where the token + # has a namespace not equal to the xmlns attribute + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMisplaced(self, token): + """ Elements that should be children of other elements that have a + different insertion mode; here they are ignored + "caption", "col", "colgroup", "frame", "frameset", "head", + "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", + "tr", "noscript" + """ + self.parser.parseError("unexpected-start-tag-ignored", {"name": token["name"]}) + + def startTagOther(self, token): + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(token) + + def endTagP(self, token): + if not self.tree.elementInScope("p", variant="button"): + self.startTagCloseP(impliedTagToken("p", "StartTag")) + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + self.endTagP(impliedTagToken("p", "EndTag")) + else: + self.tree.generateImpliedEndTags("p") + if self.tree.openElements[-1].name != "p": + self.parser.parseError("unexpected-end-tag", {"name": "p"}) + node = self.tree.openElements.pop() + while node.name != "p": + node = self.tree.openElements.pop() + + def endTagBody(self, token): + if not self.tree.elementInScope("body"): + self.parser.parseError() + return + elif self.tree.openElements[-1].name != "body": + for node in self.tree.openElements[2:]: + if node.name not in frozenset(("dd", "dt", "li", "optgroup", + "option", "p", "rp", "rt", + "tbody", "td", "tfoot", + "th", "thead", "tr", "body", + "html")): + # Not sure this is the correct name for the parse error + self.parser.parseError( + "expected-one-end-tag-but-got-another", + {"gotName": "body", "expectedName": node.name}) + break + self.parser.phase = self.parser.phases["afterBody"] + + def endTagHtml(self, token): + # We repeat the test for the body end tag token being ignored here + if self.tree.elementInScope("body"): + self.endTagBody(impliedTagToken("body")) + return token + + def endTagBlock(self, token): + # Put us back in the right whitespace handling mode + if token["name"] == "pre": + self.processSpaceCharacters = self.processSpaceCharactersNonPre + inScope = self.tree.elementInScope(token["name"]) + if inScope: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + if inScope: + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagForm(self, token): + node = self.tree.formPointer + self.tree.formPointer = None + if node is None or not self.tree.elementInScope(node): + self.parser.parseError("unexpected-end-tag", + {"name": "form"}) + else: + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1] != node: + self.parser.parseError("end-tag-too-early-ignored", + {"name": "form"}) + self.tree.openElements.remove(node) + + def endTagListItem(self, token): + if token["name"] == "li": + variant = "list" + else: + variant = None + if not self.tree.elementInScope(token["name"], variant=variant): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + else: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError( + "end-tag-too-early", + {"name": token["name"]}) + node = self.tree.openElements.pop() + while node.name != token["name"]: + node = self.tree.openElements.pop() + + def endTagHeading(self, token): + for item in headingElements: + if self.tree.elementInScope(item): + self.tree.generateImpliedEndTags() + break + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + for item in headingElements: + if self.tree.elementInScope(item): + item = self.tree.openElements.pop() + while item.name not in headingElements: + item = self.tree.openElements.pop() + break + + def endTagFormatting(self, token): + """The much-feared adoption agency algorithm""" + # http://svn.whatwg.org/webapps/complete.html#adoptionAgency revision 7867 + # XXX Better parseError messages appreciated. + + # Step 1 + outerLoopCounter = 0 + + # Step 2 + while outerLoopCounter < 8: + + # Step 3 + outerLoopCounter += 1 + + # Step 4: + + # Let the formatting element be the last element in + # the list of active formatting elements that: + # - is between the end of the list and the last scope + # marker in the list, if any, or the start of the list + # otherwise, and + # - has the same tag name as the token. + formattingElement = self.tree.elementInActiveFormattingElements( + token["name"]) + if (not formattingElement or + (formattingElement in self.tree.openElements and + not self.tree.elementInScope(formattingElement.name))): + # If there is no such node, then abort these steps + # and instead act as described in the "any other + # end tag" entry below. + self.endTagOther(token) + return + + # Otherwise, if there is such a node, but that node is + # not in the stack of open elements, then this is a + # parse error; remove the element from the list, and + # abort these steps. + elif formattingElement not in self.tree.openElements: + self.parser.parseError("adoption-agency-1.2", {"name": token["name"]}) + self.tree.activeFormattingElements.remove(formattingElement) + return + + # Otherwise, if there is such a node, and that node is + # also in the stack of open elements, but the element + # is not in scope, then this is a parse error; ignore + # the token, and abort these steps. + elif not self.tree.elementInScope(formattingElement.name): + self.parser.parseError("adoption-agency-4.4", {"name": token["name"]}) + return + + # Otherwise, there is a formatting element and that + # element is in the stack and is in scope. If the + # element is not the current node, this is a parse + # error. In any case, proceed with the algorithm as + # written in the following steps. + else: + if formattingElement != self.tree.openElements[-1]: + self.parser.parseError("adoption-agency-1.3", {"name": token["name"]}) + + # Step 5: + + # Let the furthest block be the topmost node in the + # stack of open elements that is lower in the stack + # than the formatting element, and is an element in + # the special category. There might not be one. + afeIndex = self.tree.openElements.index(formattingElement) + furthestBlock = None + for element in self.tree.openElements[afeIndex:]: + if element.nameTuple in specialElements: + furthestBlock = element + break + + # Step 6: + + # If there is no furthest block, then the UA must + # first pop all the nodes from the bottom of the stack + # of open elements, from the current node up to and + # including the formatting element, then remove the + # formatting element from the list of active + # formatting elements, and finally abort these steps. + if furthestBlock is None: + element = self.tree.openElements.pop() + while element != formattingElement: + element = self.tree.openElements.pop() + self.tree.activeFormattingElements.remove(element) + return + + # Step 7 + commonAncestor = self.tree.openElements[afeIndex - 1] + + # Step 8: + # The bookmark is supposed to help us identify where to reinsert + # nodes in step 15. We have to ensure that we reinsert nodes after + # the node before the active formatting element. Note the bookmark + # can move in step 9.7 + bookmark = self.tree.activeFormattingElements.index(formattingElement) + + # Step 9 + lastNode = node = furthestBlock + innerLoopCounter = 0 + + index = self.tree.openElements.index(node) + while innerLoopCounter < 3: + innerLoopCounter += 1 + # Node is element before node in open elements + index -= 1 + node = self.tree.openElements[index] + if node not in self.tree.activeFormattingElements: + self.tree.openElements.remove(node) + continue + # Step 9.6 + if node == formattingElement: + break + # Step 9.7 + if lastNode == furthestBlock: + bookmark = self.tree.activeFormattingElements.index(node) + 1 + # Step 9.8 + clone = node.cloneNode() + # Replace node with clone + self.tree.activeFormattingElements[ + self.tree.activeFormattingElements.index(node)] = clone + self.tree.openElements[ + self.tree.openElements.index(node)] = clone + node = clone + # Step 9.9 + # Remove lastNode from its parents, if any + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + node.appendChild(lastNode) + # Step 9.10 + lastNode = node + + # Step 10 + # Foster parent lastNode if commonAncestor is a + # table, tbody, tfoot, thead, or tr we need to foster + # parent the lastNode + if lastNode.parent: + lastNode.parent.removeChild(lastNode) + + if commonAncestor.name in frozenset(("table", "tbody", "tfoot", "thead", "tr")): + parent, insertBefore = self.tree.getTableMisnestedNodePosition() + parent.insertBefore(lastNode, insertBefore) + else: + commonAncestor.appendChild(lastNode) + + # Step 11 + clone = formattingElement.cloneNode() + + # Step 12 + furthestBlock.reparentChildren(clone) + + # Step 13 + furthestBlock.appendChild(clone) + + # Step 14 + self.tree.activeFormattingElements.remove(formattingElement) + self.tree.activeFormattingElements.insert(bookmark, clone) + + # Step 15 + self.tree.openElements.remove(formattingElement) + self.tree.openElements.insert( + self.tree.openElements.index(furthestBlock) + 1, clone) + + def endTagAppletMarqueeObject(self, token): + if self.tree.elementInScope(token["name"]): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("end-tag-too-early", {"name": token["name"]}) + + if self.tree.elementInScope(token["name"]): + element = self.tree.openElements.pop() + while element.name != token["name"]: + element = self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + + def endTagBr(self, token): + self.parser.parseError("unexpected-end-tag-treated-as", + {"originalName": "br", "newName": "br element"}) + self.tree.reconstructActiveFormattingElements() + self.tree.insertElement(impliedTagToken("br", "StartTag")) + self.tree.openElements.pop() + + def endTagOther(self, token): + for node in self.tree.openElements[::-1]: + if node.name == token["name"]: + self.tree.generateImpliedEndTags(exclude=token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + while self.tree.openElements.pop() != node: + pass + break + else: + if node.nameTuple in specialElements: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + break + + class TextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([ + ("script", self.endTagScript)]) + self.endTagHandler.default = self.endTagOther + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processEOF(self): + self.parser.parseError("expected-named-closing-tag-but-got-eof", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + return True + + def startTagOther(self, token): + assert False, "Tried to process start tag %s in RCDATA/RAWTEXT mode" % token['name'] + + def endTagScript(self, token): + node = self.tree.openElements.pop() + assert node.name == "script" + self.parser.phase = self.parser.originalPhase + # The rest of this method is all stuff that only happens if + # document.write works + + def endTagOther(self, token): + self.tree.openElements.pop() + self.parser.phase = self.parser.originalPhase + + class InTablePhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("caption", self.startTagCaption), + ("colgroup", self.startTagColgroup), + ("col", self.startTagCol), + (("tbody", "tfoot", "thead"), self.startTagRowGroup), + (("td", "th", "tr"), self.startTagImplyTbody), + ("table", self.startTagTable), + (("style", "script"), self.startTagStyleScript), + ("input", self.startTagInput), + ("form", self.startTagForm) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "tbody", "td", + "tfoot", "th", "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableContext(self): + # "clear the stack back to a table context" + while self.tree.openElements[-1].name not in ("table", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + # When the current node is <html> it's an innerHTML case + + # processing methods + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-table") + else: + assert self.parser.innerHTML + # Stop parsing + + def processSpaceCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processSpaceCharacters(token) + + def processCharacters(self, token): + originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["inTableText"] + self.parser.phase.originalPhase = originalPhase + self.parser.phase.processCharacters(token) + + def insertText(self, token): + # If we get here there must be at least one non-whitespace character + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processCharacters(token) + self.tree.insertFromTable = False + + def startTagCaption(self, token): + self.clearStackToTableContext() + self.tree.activeFormattingElements.append(Marker) + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCaption"] + + def startTagColgroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inColumnGroup"] + + def startTagCol(self, token): + self.startTagColgroup(impliedTagToken("colgroup", "StartTag")) + return token + + def startTagRowGroup(self, token): + self.clearStackToTableContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inTableBody"] + + def startTagImplyTbody(self, token): + self.startTagRowGroup(impliedTagToken("tbody", "StartTag")) + return token + + def startTagTable(self, token): + self.parser.parseError("unexpected-start-tag-implies-end-tag", + {"startName": "table", "endName": "table"}) + self.parser.phase.processEndTag(impliedTagToken("table")) + if not self.parser.innerHTML: + return token + + def startTagStyleScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagInput(self, token): + if ("type" in token["data"] and + token["data"]["type"].translate(asciiUpper2Lower) == "hidden"): + self.parser.parseError("unexpected-hidden-input-in-table") + self.tree.insertElement(token) + # XXX associate with form + self.tree.openElements.pop() + else: + self.startTagOther(token) + + def startTagForm(self, token): + self.parser.parseError("unexpected-form-in-table") + if self.tree.formPointer is None: + self.tree.insertElement(token) + self.tree.formPointer = self.tree.openElements[-1] + self.tree.openElements.pop() + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processStartTag(token) + self.tree.insertFromTable = False + + def endTagTable(self, token): + if self.tree.elementInScope("table", variant="table"): + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "table": + self.parser.parseError("end-tag-too-early-named", + {"gotName": "table", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "table": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-implies-table-voodoo", {"name": token["name"]}) + # Do the table magic! + self.tree.insertFromTable = True + self.parser.phases["inBody"].processEndTag(token) + self.tree.insertFromTable = False + + class InTableTextPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.originalPhase = None + self.characterTokens = [] + + def flushCharacters(self): + data = "".join([item["data"] for item in self.characterTokens]) + if any([item not in spaceCharacters for item in data]): + token = {"type": tokenTypes["Characters"], "data": data} + self.parser.phases["inTable"].insertText(token) + elif data: + self.tree.insertText(data) + self.characterTokens = [] + + def processComment(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEOF(self): + self.flushCharacters() + self.parser.phase = self.originalPhase + return True + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.characterTokens.append(token) + + def processSpaceCharacters(self, token): + # pretty sure we should never reach here + self.characterTokens.append(token) + # assert False + + def processStartTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + def processEndTag(self, token): + self.flushCharacters() + self.parser.phase = self.originalPhase + return token + + class InCaptionPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-caption + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableElement) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("caption", self.endTagCaption), + ("table", self.endTagTable), + (("body", "col", "colgroup", "html", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagCaption(self): + return not self.tree.elementInScope("caption", variant="table") + + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableElement(self, token): + self.parser.parseError() + # XXX Have to duplicate logic here to find out if the tag is ignored + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagCaption(self, token): + if not self.ignoreEndTagCaption(): + # AT this code is quite similar to endTagTable in "InTable" + self.tree.generateImpliedEndTags() + if self.tree.openElements[-1].name != "caption": + self.parser.parseError("expected-one-end-tag-but-got-another", + {"gotName": "caption", + "expectedName": self.tree.openElements[-1].name}) + while self.tree.openElements[-1].name != "caption": + self.tree.openElements.pop() + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inTable"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + self.parser.parseError() + ignoreEndTag = self.ignoreEndTagCaption() + self.parser.phase.processEndTag(impliedTagToken("caption")) + if not ignoreEndTag: + return token + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InColumnGroupPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-column + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("col", self.startTagCol) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("colgroup", self.endTagColgroup), + ("col", self.endTagCol) + ]) + self.endTagHandler.default = self.endTagOther + + def ignoreEndTagColgroup(self): + return self.tree.openElements[-1].name == "html" + + def processEOF(self): + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + return + else: + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return True + + def processCharacters(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def startTagCol(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + def endTagColgroup(self, token): + if self.ignoreEndTagColgroup(): + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + else: + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + + def endTagCol(self, token): + self.parser.parseError("no-end-tag", {"name": "col"}) + + def endTagOther(self, token): + ignoreEndTag = self.ignoreEndTagColgroup() + self.endTagColgroup(impliedTagToken("colgroup")) + if not ignoreEndTag: + return token + + class InTableBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-table0 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("tr", self.startTagTr), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead"), + self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + ("table", self.endTagTable), + (("body", "caption", "col", "colgroup", "html", "td", "th", + "tr"), self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods + def clearStackToTableBodyContext(self): + while self.tree.openElements[-1].name not in ("tbody", "tfoot", + "thead", "html"): + # self.parser.parseError("unexpected-implied-end-tag-in-table", + # {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "html": + assert self.parser.innerHTML + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTr(self, token): + self.clearStackToTableBodyContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inRow"] + + def startTagTableCell(self, token): + self.parser.parseError("unexpected-cell-in-table-body", + {"name": token["name"]}) + self.startTagTr(impliedTagToken("tr", "StartTag")) + return token + + def startTagTableOther(self, token): + # XXX AT Any ideas on how to share this with endTagTable? + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.clearStackToTableBodyContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTable"] + else: + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagTable(self, token): + if (self.tree.elementInScope("tbody", variant="table") or + self.tree.elementInScope("thead", variant="table") or + self.tree.elementInScope("tfoot", variant="table")): + self.clearStackToTableBodyContext() + self.endTagTableRowGroup( + impliedTagToken(self.tree.openElements[-1].name)) + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-body", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InRowPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-row + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("td", "th"), self.startTagTableCell), + (("caption", "col", "colgroup", "tbody", "tfoot", "thead", + "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("tr", self.endTagTr), + ("table", self.endTagTable), + (("tbody", "tfoot", "thead"), self.endTagTableRowGroup), + (("body", "caption", "col", "colgroup", "html", "td", "th"), + self.endTagIgnore) + ]) + self.endTagHandler.default = self.endTagOther + + # helper methods (XXX unify this with other table helper methods) + def clearStackToTableRowContext(self): + while self.tree.openElements[-1].name not in ("tr", "html"): + self.parser.parseError("unexpected-implied-end-tag-in-table-row", + {"name": self.tree.openElements[-1].name}) + self.tree.openElements.pop() + + def ignoreEndTagTr(self): + return not self.tree.elementInScope("tr", variant="table") + + # the rest + def processEOF(self): + self.parser.phases["inTable"].processEOF() + + def processSpaceCharacters(self, token): + return self.parser.phases["inTable"].processSpaceCharacters(token) + + def processCharacters(self, token): + return self.parser.phases["inTable"].processCharacters(token) + + def startTagTableCell(self, token): + self.clearStackToTableRowContext() + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inCell"] + self.tree.activeFormattingElements.append(Marker) + + def startTagTableOther(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def startTagOther(self, token): + return self.parser.phases["inTable"].processStartTag(token) + + def endTagTr(self, token): + if not self.ignoreEndTagTr(): + self.clearStackToTableRowContext() + self.tree.openElements.pop() + self.parser.phase = self.parser.phases["inTableBody"] + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagTable(self, token): + ignoreEndTag = self.ignoreEndTagTr() + self.endTagTr(impliedTagToken("tr")) + # Reprocess the current tag if the tr end tag was not ignored + # XXX how are we sure it's always ignored in the innerHTML case? + if not ignoreEndTag: + return token + + def endTagTableRowGroup(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagTr(impliedTagToken("tr")) + return token + else: + self.parser.parseError() + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag-in-table-row", + {"name": token["name"]}) + + def endTagOther(self, token): + return self.parser.phases["inTable"].processEndTag(token) + + class InCellPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-cell + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("caption", "col", "colgroup", "tbody", "td", "tfoot", "th", + "thead", "tr"), self.startTagTableOther) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("td", "th"), self.endTagTableCell), + (("body", "caption", "col", "colgroup", "html"), self.endTagIgnore), + (("table", "tbody", "tfoot", "thead", "tr"), self.endTagImply) + ]) + self.endTagHandler.default = self.endTagOther + + # helper + def closeCell(self): + if self.tree.elementInScope("td", variant="table"): + self.endTagTableCell(impliedTagToken("td")) + elif self.tree.elementInScope("th", variant="table"): + self.endTagTableCell(impliedTagToken("th")) + + # the rest + def processEOF(self): + self.parser.phases["inBody"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inBody"].processCharacters(token) + + def startTagTableOther(self, token): + if (self.tree.elementInScope("td", variant="table") or + self.tree.elementInScope("th", variant="table")): + self.closeCell() + return token + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def startTagOther(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def endTagTableCell(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.tree.generateImpliedEndTags(token["name"]) + if self.tree.openElements[-1].name != token["name"]: + self.parser.parseError("unexpected-cell-end-tag", + {"name": token["name"]}) + while True: + node = self.tree.openElements.pop() + if node.name == token["name"]: + break + else: + self.tree.openElements.pop() + self.tree.clearActiveFormattingElements() + self.parser.phase = self.parser.phases["inRow"] + else: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagIgnore(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def endTagImply(self, token): + if self.tree.elementInScope(token["name"], variant="table"): + self.closeCell() + return token + else: + # sometimes innerHTML case + self.parser.parseError() + + def endTagOther(self, token): + return self.parser.phases["inBody"].processEndTag(token) + + class InSelectPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("option", self.startTagOption), + ("optgroup", self.startTagOptgroup), + ("select", self.startTagSelect), + (("input", "keygen", "textarea"), self.startTagInput), + ("script", self.startTagScript) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("option", self.endTagOption), + ("optgroup", self.endTagOptgroup), + ("select", self.endTagSelect) + ]) + self.endTagHandler.default = self.endTagOther + + # http://www.whatwg.org/specs/web-apps/current-work/#in-select + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-select") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + if token["data"] == "\u0000": + return + self.tree.insertText(token["data"]) + + def startTagOption(self, token): + # We need to imply </option> if <option> is the current node. + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagOptgroup(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + self.tree.insertElement(token) + + def startTagSelect(self, token): + self.parser.parseError("unexpected-select-in-select") + self.endTagSelect(impliedTagToken("select")) + + def startTagInput(self, token): + self.parser.parseError("unexpected-input-in-select") + if self.tree.elementInScope("select", variant="select"): + self.endTagSelect(impliedTagToken("select")) + return token + else: + assert self.parser.innerHTML + + def startTagScript(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-select", + {"name": token["name"]}) + + def endTagOption(self, token): + if self.tree.openElements[-1].name == "option": + self.tree.openElements.pop() + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "option"}) + + def endTagOptgroup(self, token): + # </optgroup> implicitly closes <option> + if (self.tree.openElements[-1].name == "option" and + self.tree.openElements[-2].name == "optgroup"): + self.tree.openElements.pop() + # It also closes </optgroup> + if self.tree.openElements[-1].name == "optgroup": + self.tree.openElements.pop() + # But nothing else + else: + self.parser.parseError("unexpected-end-tag-in-select", + {"name": "optgroup"}) + + def endTagSelect(self, token): + if self.tree.elementInScope("select", variant="select"): + node = self.tree.openElements.pop() + while node.name != "select": + node = self.tree.openElements.pop() + self.parser.resetInsertionMode() + else: + # innerHTML case + assert self.parser.innerHTML + self.parser.parseError() + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-select", + {"name": token["name"]}) + + class InSelectInTablePhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.startTagTable) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("caption", "table", "tbody", "tfoot", "thead", "tr", "td", "th"), + self.endTagTable) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.phases["inSelect"].processEOF() + + def processCharacters(self, token): + return self.parser.phases["inSelect"].processCharacters(token) + + def startTagTable(self, token): + self.parser.parseError("unexpected-table-element-start-tag-in-select-in-table", {"name": token["name"]}) + self.endTagOther(impliedTagToken("select")) + return token + + def startTagOther(self, token): + return self.parser.phases["inSelect"].processStartTag(token) + + def endTagTable(self, token): + self.parser.parseError("unexpected-table-element-end-tag-in-select-in-table", {"name": token["name"]}) + if self.tree.elementInScope(token["name"], variant="table"): + self.endTagOther(impliedTagToken("select")) + return token + + def endTagOther(self, token): + return self.parser.phases["inSelect"].processEndTag(token) + + class InForeignContentPhase(Phase): + breakoutElements = frozenset(["b", "big", "blockquote", "body", "br", + "center", "code", "dd", "div", "dl", "dt", + "em", "embed", "h1", "h2", "h3", + "h4", "h5", "h6", "head", "hr", "i", "img", + "li", "listing", "menu", "meta", "nobr", + "ol", "p", "pre", "ruby", "s", "small", + "span", "strong", "strike", "sub", "sup", + "table", "tt", "u", "ul", "var"]) + + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + def adjustSVGTagNames(self, token): + replacements = {"altglyph": "altGlyph", + "altglyphdef": "altGlyphDef", + "altglyphitem": "altGlyphItem", + "animatecolor": "animateColor", + "animatemotion": "animateMotion", + "animatetransform": "animateTransform", + "clippath": "clipPath", + "feblend": "feBlend", + "fecolormatrix": "feColorMatrix", + "fecomponenttransfer": "feComponentTransfer", + "fecomposite": "feComposite", + "feconvolvematrix": "feConvolveMatrix", + "fediffuselighting": "feDiffuseLighting", + "fedisplacementmap": "feDisplacementMap", + "fedistantlight": "feDistantLight", + "feflood": "feFlood", + "fefunca": "feFuncA", + "fefuncb": "feFuncB", + "fefuncg": "feFuncG", + "fefuncr": "feFuncR", + "fegaussianblur": "feGaussianBlur", + "feimage": "feImage", + "femerge": "feMerge", + "femergenode": "feMergeNode", + "femorphology": "feMorphology", + "feoffset": "feOffset", + "fepointlight": "fePointLight", + "fespecularlighting": "feSpecularLighting", + "fespotlight": "feSpotLight", + "fetile": "feTile", + "feturbulence": "feTurbulence", + "foreignobject": "foreignObject", + "glyphref": "glyphRef", + "lineargradient": "linearGradient", + "radialgradient": "radialGradient", + "textpath": "textPath"} + + if token["name"] in replacements: + token["name"] = replacements[token["name"]] + + def processCharacters(self, token): + if token["data"] == "\u0000": + token["data"] = "\uFFFD" + elif (self.parser.framesetOK and + any(char not in spaceCharacters for char in token["data"])): + self.parser.framesetOK = False + Phase.processCharacters(self, token) + + def processStartTag(self, token): + currentNode = self.tree.openElements[-1] + if (token["name"] in self.breakoutElements or + (token["name"] == "font" and + set(token["data"].keys()) & set(["color", "face", "size"]))): + self.parser.parseError("unexpected-html-element-in-foreign-content", + {"name": token["name"]}) + while (self.tree.openElements[-1].namespace != + self.tree.defaultNamespace and + not self.parser.isHTMLIntegrationPoint(self.tree.openElements[-1]) and + not self.parser.isMathMLTextIntegrationPoint(self.tree.openElements[-1])): + self.tree.openElements.pop() + return token + + else: + if currentNode.namespace == namespaces["mathml"]: + self.parser.adjustMathMLAttributes(token) + elif currentNode.namespace == namespaces["svg"]: + self.adjustSVGTagNames(token) + self.parser.adjustSVGAttributes(token) + self.parser.adjustForeignAttributes(token) + token["namespace"] = currentNode.namespace + self.tree.insertElement(token) + if token["selfClosing"]: + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def processEndTag(self, token): + nodeIndex = len(self.tree.openElements) - 1 + node = self.tree.openElements[-1] + if node.name.translate(asciiUpper2Lower) != token["name"]: + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + while True: + if node.name.translate(asciiUpper2Lower) == token["name"]: + # XXX this isn't in the spec but it seems necessary + if self.parser.phase == self.parser.phases["inTableText"]: + self.parser.phase.flushCharacters() + self.parser.phase = self.parser.phase.originalPhase + while self.tree.openElements.pop() != node: + assert self.tree.openElements + new_token = None + break + nodeIndex -= 1 + + node = self.tree.openElements[nodeIndex] + if node.namespace != self.tree.defaultNamespace: + continue + else: + new_token = self.parser.phase.processEndTag(token) + break + return new_token + + class AfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([("html", self.endTagHtml)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processComment(self, token): + # This is needed because data is to be appended to the <html> element + # here and not to whatever is currently open. + self.tree.insertComment(token, self.tree.openElements[0]) + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-body") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def endTagHtml(self, name): + if self.parser.innerHTML: + self.parser.parseError("unexpected-end-tag-after-body-innerhtml") + else: + self.parser.phase = self.parser.phases["afterAfterBody"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-body", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class InFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#in-frameset + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("frameset", self.startTagFrameset), + ("frame", self.startTagFrame), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("frameset", self.endTagFrameset) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + if self.tree.openElements[-1].name != "html": + self.parser.parseError("eof-in-frameset") + else: + assert self.parser.innerHTML + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-in-frameset") + + def startTagFrameset(self, token): + self.tree.insertElement(token) + + def startTagFrame(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + + def startTagNoframes(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-in-frameset", + {"name": token["name"]}) + + def endTagFrameset(self, token): + if self.tree.openElements[-1].name == "html": + # innerHTML case + self.parser.parseError("unexpected-frameset-in-frameset-innerhtml") + else: + self.tree.openElements.pop() + if (not self.parser.innerHTML and + self.tree.openElements[-1].name != "frameset"): + # If we're not in innerHTML mode and the current node is not a + # "frameset" element (anymore) then switch. + self.parser.phase = self.parser.phases["afterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-in-frameset", + {"name": token["name"]}) + + class AfterFramesetPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#after3 + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoframes) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("html", self.endTagHtml) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + # Stop parsing + pass + + def processCharacters(self, token): + self.parser.parseError("unexpected-char-after-frameset") + + def startTagNoframes(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("unexpected-start-tag-after-frameset", + {"name": token["name"]}) + + def endTagHtml(self, token): + self.parser.phase = self.parser.phases["afterAfterFrameset"] + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag-after-frameset", + {"name": token["name"]}) + + class AfterAfterBodyPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + self.parser.phase = self.parser.phases["inBody"] + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + self.parser.phase = self.parser.phases["inBody"] + return token + + class AfterAfterFramesetPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("noframes", self.startTagNoFrames) + ]) + self.startTagHandler.default = self.startTagOther + + def processEOF(self): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + return self.parser.phases["inBody"].processSpaceCharacters(token) + + def processCharacters(self, token): + self.parser.parseError("expected-eof-but-got-char") + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagNoFrames(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagOther(self, token): + self.parser.parseError("expected-eof-but-got-start-tag", + {"name": token["name"]}) + + def processEndTag(self, token): + self.parser.parseError("expected-eof-but-got-end-tag", + {"name": token["name"]}) + # pylint:enable=unused-argument + + return { + "initial": InitialPhase, + "beforeHtml": BeforeHtmlPhase, + "beforeHead": BeforeHeadPhase, + "inHead": InHeadPhase, + "inHeadNoscript": InHeadNoscriptPhase, + "afterHead": AfterHeadPhase, + "inBody": InBodyPhase, + "text": TextPhase, + "inTable": InTablePhase, + "inTableText": InTableTextPhase, + "inCaption": InCaptionPhase, + "inColumnGroup": InColumnGroupPhase, + "inTableBody": InTableBodyPhase, + "inRow": InRowPhase, + "inCell": InCellPhase, + "inSelect": InSelectPhase, + "inSelectInTable": InSelectInTablePhase, + "inForeignContent": InForeignContentPhase, + "afterBody": AfterBodyPhase, + "inFrameset": InFramesetPhase, + "afterFrameset": AfterFramesetPhase, + "afterAfterBody": AfterAfterBodyPhase, + "afterAfterFrameset": AfterAfterFramesetPhase, + # XXX after after frameset + } + + +def adjust_attributes(token, replacements): + needs_adjustment = viewkeys(token['data']) & viewkeys(replacements) + if needs_adjustment: + token['data'] = OrderedDict((replacements.get(k, k), v) + for k, v in token['data'].items()) + + +def impliedTagToken(name, type="EndTag", attributes=None, + selfClosing=False): + if attributes is None: + attributes = {} + return {"type": tokenTypes[type], "name": name, "data": attributes, + "selfClosing": selfClosing} + + +class ParseError(Exception): + """Error in parsed document""" + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py new file mode 100644 index 000000000..641323e93 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/serializer.py @@ -0,0 +1,409 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +import re + +from codecs import register_error, xmlcharrefreplace_errors + +from .constants import voidElements, booleanAttributes, spaceCharacters +from .constants import rcdataElements, entities, xmlEntities +from . import treewalkers, _utils +from xml.sax.saxutils import escape + +_quoteAttributeSpecChars = "".join(spaceCharacters) + "\"'=<>`" +_quoteAttributeSpec = re.compile("[" + _quoteAttributeSpecChars + "]") +_quoteAttributeLegacy = re.compile("[" + _quoteAttributeSpecChars + + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n" + "\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15" + "\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" + "\x20\x2f\x60\xa0\u1680\u180e\u180f\u2000" + "\u2001\u2002\u2003\u2004\u2005\u2006\u2007" + "\u2008\u2009\u200a\u2028\u2029\u202f\u205f" + "\u3000]") + + +_encode_entity_map = {} +_is_ucs4 = len("\U0010FFFF") == 1 +for k, v in list(entities.items()): + # skip multi-character entities + if ((_is_ucs4 and len(v) > 1) or + (not _is_ucs4 and len(v) > 2)): + continue + if v != "&": + if len(v) == 2: + v = _utils.surrogatePairToCodepoint(v) + else: + v = ord(v) + if v not in _encode_entity_map or k.islower(): + # prefer < over < and similarly for &, >, etc. + _encode_entity_map[v] = k + + +def htmlentityreplace_errors(exc): + if isinstance(exc, (UnicodeEncodeError, UnicodeTranslateError)): + res = [] + codepoints = [] + skip = False + for i, c in enumerate(exc.object[exc.start:exc.end]): + if skip: + skip = False + continue + index = i + exc.start + if _utils.isSurrogatePair(exc.object[index:min([exc.end, index + 2])]): + codepoint = _utils.surrogatePairToCodepoint(exc.object[index:index + 2]) + skip = True + else: + codepoint = ord(c) + codepoints.append(codepoint) + for cp in codepoints: + e = _encode_entity_map.get(cp) + if e: + res.append("&") + res.append(e) + if not e.endswith(";"): + res.append(";") + else: + res.append("&#x%s;" % (hex(cp)[2:])) + return ("".join(res), exc.end) + else: + return xmlcharrefreplace_errors(exc) + + +register_error("htmlentityreplace", htmlentityreplace_errors) + + +def serialize(input, tree="etree", encoding=None, **serializer_opts): + """Serializes the input token stream using the specified treewalker + + :arg input: the token stream to serialize + + :arg tree: the treewalker to use + + :arg encoding: the encoding to use + + :arg serializer_opts: any options to pass to the + :py:class:`html5lib.serializer.HTMLSerializer` that gets created + + :returns: the tree serialized as a string + + Example: + + >>> from html5lib.html5parser import parse + >>> from html5lib.serializer import serialize + >>> token_stream = parse('<html><body><p>Hi!</p></body></html>') + >>> serialize(token_stream, omit_optional_tags=False) + '<html><head></head><body><p>Hi!</p></body></html>' + + """ + # XXX: Should we cache this? + walker = treewalkers.getTreeWalker(tree) + s = HTMLSerializer(**serializer_opts) + return s.render(walker(input), encoding) + + +class HTMLSerializer(object): + + # attribute quoting options + quote_attr_values = "legacy" # be secure by default + quote_char = '"' + use_best_quote_char = True + + # tag syntax options + omit_optional_tags = True + minimize_boolean_attributes = True + use_trailing_solidus = False + space_before_trailing_solidus = True + + # escaping options + escape_lt_in_attrs = False + escape_rcdata = False + resolve_entities = True + + # miscellaneous options + alphabetical_attributes = False + inject_meta_charset = True + strip_whitespace = False + sanitize = False + + options = ("quote_attr_values", "quote_char", "use_best_quote_char", + "omit_optional_tags", "minimize_boolean_attributes", + "use_trailing_solidus", "space_before_trailing_solidus", + "escape_lt_in_attrs", "escape_rcdata", "resolve_entities", + "alphabetical_attributes", "inject_meta_charset", + "strip_whitespace", "sanitize") + + def __init__(self, **kwargs): + """Initialize HTMLSerializer + + :arg inject_meta_charset: Whether or not to inject the meta charset. + + Defaults to ``True``. + + :arg quote_attr_values: Whether to quote attribute values that don't + require quoting per legacy browser behavior (``"legacy"``), when + required by the standard (``"spec"``), or always (``"always"``). + + Defaults to ``"legacy"``. + + :arg quote_char: Use given quote character for attribute quoting. + + Defaults to ``"`` which will use double quotes unless attribute + value contains a double quote, in which case single quotes are + used. + + :arg escape_lt_in_attrs: Whether or not to escape ``<`` in attribute + values. + + Defaults to ``False``. + + :arg escape_rcdata: Whether to escape characters that need to be + escaped within normal elements within rcdata elements such as + style. + + Defaults to ``False``. + + :arg resolve_entities: Whether to resolve named character entities that + appear in the source tree. The XML predefined entities < > + & " ' are unaffected by this setting. + + Defaults to ``True``. + + :arg strip_whitespace: Whether to remove semantically meaningless + whitespace. (This compresses all whitespace to a single space + except within ``pre``.) + + Defaults to ``False``. + + :arg minimize_boolean_attributes: Shortens boolean attributes to give + just the attribute value, for example:: + + <input disabled="disabled"> + + becomes:: + + <input disabled> + + Defaults to ``True``. + + :arg use_trailing_solidus: Includes a close-tag slash at the end of the + start tag of void elements (empty elements whose end tag is + forbidden). E.g. ``<hr/>``. + + Defaults to ``False``. + + :arg space_before_trailing_solidus: Places a space immediately before + the closing slash in a tag using a trailing solidus. E.g. + ``<hr />``. Requires ``use_trailing_solidus=True``. + + Defaults to ``True``. + + :arg sanitize: Strip all unsafe or unknown constructs from output. + See :py:class:`html5lib.filters.sanitizer.Filter`. + + Defaults to ``False``. + + :arg omit_optional_tags: Omit start/end tags that are optional. + + Defaults to ``True``. + + :arg alphabetical_attributes: Reorder attributes to be in alphabetical order. + + Defaults to ``False``. + + """ + unexpected_args = frozenset(kwargs) - frozenset(self.options) + if len(unexpected_args) > 0: + raise TypeError("__init__() got an unexpected keyword argument '%s'" % next(iter(unexpected_args))) + if 'quote_char' in kwargs: + self.use_best_quote_char = False + for attr in self.options: + setattr(self, attr, kwargs.get(attr, getattr(self, attr))) + self.errors = [] + self.strict = False + + def encode(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "htmlentityreplace") + else: + return string + + def encodeStrict(self, string): + assert(isinstance(string, text_type)) + if self.encoding: + return string.encode(self.encoding, "strict") + else: + return string + + def serialize(self, treewalker, encoding=None): + # pylint:disable=too-many-nested-blocks + self.encoding = encoding + in_cdata = False + self.errors = [] + + if encoding and self.inject_meta_charset: + from .filters.inject_meta_charset import Filter + treewalker = Filter(treewalker, encoding) + # Alphabetical attributes is here under the assumption that none of + # the later filters add or change order of attributes; it needs to be + # before the sanitizer so escaped elements come out correctly + if self.alphabetical_attributes: + from .filters.alphabeticalattributes import Filter + treewalker = Filter(treewalker) + # WhitespaceFilter should be used before OptionalTagFilter + # for maximum efficiently of this latter filter + if self.strip_whitespace: + from .filters.whitespace import Filter + treewalker = Filter(treewalker) + if self.sanitize: + from .filters.sanitizer import Filter + treewalker = Filter(treewalker) + if self.omit_optional_tags: + from .filters.optionaltags import Filter + treewalker = Filter(treewalker) + + for token in treewalker: + type = token["type"] + if type == "Doctype": + doctype = "<!DOCTYPE %s" % token["name"] + + if token["publicId"]: + doctype += ' PUBLIC "%s"' % token["publicId"] + elif token["systemId"]: + doctype += " SYSTEM" + if token["systemId"]: + if token["systemId"].find('"') >= 0: + if token["systemId"].find("'") >= 0: + self.serializeError("System identifer contains both single and double quote characters") + quote_char = "'" + else: + quote_char = '"' + doctype += " %s%s%s" % (quote_char, token["systemId"], quote_char) + + doctype += ">" + yield self.encodeStrict(doctype) + + elif type in ("Characters", "SpaceCharacters"): + if type == "SpaceCharacters" or in_cdata: + if in_cdata and token["data"].find("</") >= 0: + self.serializeError("Unexpected </ in CDATA") + yield self.encode(token["data"]) + else: + yield self.encode(escape(token["data"])) + + elif type in ("StartTag", "EmptyTag"): + name = token["name"] + yield self.encodeStrict("<%s" % name) + if name in rcdataElements and not self.escape_rcdata: + in_cdata = True + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + for (_, attr_name), attr_value in token["data"].items(): + # TODO: Add namespace support here + k = attr_name + v = attr_value + yield self.encodeStrict(' ') + + yield self.encodeStrict(k) + if not self.minimize_boolean_attributes or \ + (k not in booleanAttributes.get(name, tuple()) and + k not in booleanAttributes.get("", tuple())): + yield self.encodeStrict("=") + if self.quote_attr_values == "always" or len(v) == 0: + quote_attr = True + elif self.quote_attr_values == "spec": + quote_attr = _quoteAttributeSpec.search(v) is not None + elif self.quote_attr_values == "legacy": + quote_attr = _quoteAttributeLegacy.search(v) is not None + else: + raise ValueError("quote_attr_values must be one of: " + "'always', 'spec', or 'legacy'") + v = v.replace("&", "&") + if self.escape_lt_in_attrs: + v = v.replace("<", "<") + if quote_attr: + quote_char = self.quote_char + if self.use_best_quote_char: + if "'" in v and '"' not in v: + quote_char = '"' + elif '"' in v and "'" not in v: + quote_char = "'" + if quote_char == "'": + v = v.replace("'", "'") + else: + v = v.replace('"', """) + yield self.encodeStrict(quote_char) + yield self.encode(v) + yield self.encodeStrict(quote_char) + else: + yield self.encode(v) + if name in voidElements and self.use_trailing_solidus: + if self.space_before_trailing_solidus: + yield self.encodeStrict(" /") + else: + yield self.encodeStrict("/") + yield self.encode(">") + + elif type == "EndTag": + name = token["name"] + if name in rcdataElements: + in_cdata = False + elif in_cdata: + self.serializeError("Unexpected child element of a CDATA element") + yield self.encodeStrict("</%s>" % name) + + elif type == "Comment": + data = token["data"] + if data.find("--") >= 0: + self.serializeError("Comment contains --") + yield self.encodeStrict("<!--%s-->" % token["data"]) + + elif type == "Entity": + name = token["name"] + key = name + ";" + if key not in entities: + self.serializeError("Entity %s not recognized" % name) + if self.resolve_entities and key not in xmlEntities: + data = entities[key] + else: + data = "&%s;" % name + yield self.encodeStrict(data) + + else: + self.serializeError(token["data"]) + + def render(self, treewalker, encoding=None): + """Serializes the stream from the treewalker into a string + + :arg treewalker: the treewalker to serialize + + :arg encoding: the string encoding to use + + :returns: the serialized tree + + Example: + + >>> from html5lib import parse, getTreeWalker + >>> from html5lib.serializer import HTMLSerializer + >>> token_stream = parse('<html><body>Hi!</body></html>') + >>> walker = getTreeWalker('etree') + >>> serializer = HTMLSerializer(omit_optional_tags=False) + >>> serializer.render(walker(token_stream)) + '<html><head></head><body>Hi!</body></html>' + + """ + if encoding: + return b"".join(list(self.serialize(treewalker, encoding))) + else: + return "".join(list(self.serialize(treewalker))) + + def serializeError(self, data="XXX ERROR MESSAGE NEEDED"): + # XXX The idea is to make data mandatory. + self.errors.append(data) + if self.strict: + raise SerializeError + + +class SerializeError(Exception): + """Error in serialized tree""" + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 000000000..8767fb0cd --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py @@ -0,0 +1,30 @@ +"""Tree adapters let you convert from one tree structure to another + +Example: + +.. code-block:: python + + from pip._vendor import html5lib + from pip._vendor.html5lib.treeadapters import genshi + + doc = '<html><body>Hi!</body></html>' + treebuilder = html5lib.getTreeBuilder('etree') + parser = html5lib.HTMLParser(tree=treebuilder) + tree = parser.parse(doc) + TreeWalker = html5lib.getTreeWalker('etree') + + genshi_tree = genshi.to_genshi(TreeWalker(tree)) + +""" +from __future__ import absolute_import, division, unicode_literals + +from . import sax + +__all__ = ["sax"] + +try: + from . import genshi # noqa +except ImportError: + pass +else: + __all__.append("genshi") diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b72853e259fe92604e04418c1090d6060a2acd3 GIT binary patch literal 948 zcmZuv&2Q5%6nD}t?XnLlG;ubkHispARcuo?p-Gd51QQaK29dyWYq$00#KCc*^~Apd zNB$7*oO9*0e}NOvNw+ZxM}B!<zu&X{-tpF!k6>MlAAS1iBJ|rDH>(TEE7<vG5DdkL zIn0$#;>K>$id#uLZaavzSX-_oUhILsHh1FAvIjm7eBHR~pmUV&v=Lvw^!1s8?Dr9+ zn;#JGeDhi7y9221dlanGUk*ZJ%{iuwW`^q=OK$K|6?m%Bl52x!S|wPe92=XK8(mCI zp}|y`rphe1_WhG9nq-n6_<k4ykn!D#RMX3Y1Dq|*LZ!ZsaYK}eEF>jQnbKG!nSuff zlgObIlmF#}H^I<Wzdhp$Ip=A<5H&edQ+$Z~Bb$FTnkcqBIu(ycQLT-l+TFJmEYGA6 zl5q`yTlzUS_8E?w$e_<{UO%vijOzS;^6B{Pn|HN$VABr&;j9tX2J!|N*1rK9u#Sx( zc24Exea2P!CU95XmTxXeR-BC$8bumyaK~4lB?x@~8U_ait?B`t<VqHXljgmuE)%85 zg-WYlkqX-<A_X*^%KRGU00mCf%ITH%8r^G3=nj}?!A8{~1a3h{<r6Y1><|#5VSJHp zS<wbjp&D#csgw}5*lOc--RTppm99LRWzhd0NN-z|6@R`)nHD8AJSwS<X3BOaj}jeC zE(qDnhw00by_k}$eD=i5_U0E_KAjEs_oHzH^Rz3{+(5NmJss{nH(#iA)_XN*b@%Or tMfMSIhA1LLq{0vqX3MHON)#(3KY9qq$$KE$&W^k3dampAoNdQ*{{nsCA3gv8 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f90cc8d253bc985d87048804519f5acf00a66e25 GIT binary patch literal 1545 zcmah}OK%%D5GJ_~t=94*N@~Dq0|*6jP|;XvYNL)}7)@;*0whXX3vIfnv7ncfyw<)< zQfll<C+7#ahu-aD@A);n_T+m{xwONTY^Ug<6gV0VXFkphKkhg4^FD%c)Lq`cauNE| zEUpIu<!hMo1qg;1PEd*ioRWZ~R$yUcBZ-|lfs?v{TdplwSAt6F1zuVWs;M9N>0B@e zdp2|4qM*jyJ=CmR0U~NzdXXN;JQ*q;#%YlYr9BppVj1U|UK(a`lrtVCvEqUzvPrb_ zU5BPzJI|C7vgv4Nulwx#uD05pU2S*Uue-Xk^Xlcxb_bN*S3BLGzHLX?90dcaD`y1% z@-<ldXoAo2o3%08Mdx_`vk4g!hF8$U8e5DET=8U#FA&(Q6?BO)%I=S`c%d+}FUS~Q zV&?R$9}q5aAi{-+ci>%FK|(NZs)4MopdML96FW0DSWRqYF`v!7onc?tmyp33KEo47 zIm#W|XL#)N$TdD-*9JtqWAkNZ^PvAVJ4gS|Ih85eHPUenuoed79E&AovVqF}wYLb^ zHC3JF336%0<ah@vux|a1Yd@kfbWU{t+Y45Q+r4}G`%a#XxKIt+P=fP@%0cV%OdiIi z!S@?5HmT@0exb>Li_L~Q1UK-Vu1&;HmVw4_vuo_p3_Dgc7{S$0WOCD-08CN2Xym=? z<1(O-oH}Y-ofI5s<nJ6(K_j4*)Qfusjra!!n^8qIkh633Hw<wH_yRHBo}xl^X<vKo zv`{BTt7gDPY2r`aUmwcJL#b_Jy5XD!u@1~V!?`sOeKbb<pZ`oIctR9(ks-JNJgACK z8E|SDWiHs@R)7JdM}8y6HuTdLhQpofGp@|4iG=}%Cqz~sYn#G@(9Vb^L;eR6_hIM# zq*aJ`L=|t1sA%=_gh9EjRJ0C`!f->bXJ3ujS`-$eCy!NcqkkllFM8`wpSHTKA}$`q znN&1M9*Jmu<4bi+jj^2Jh-WMptwWV2>q&gjGM7dfElf9C(>q=*PTu=lNi0>Ar^WUI zNJpBFiHlDks63oGZ6$dG&w6|H)>GUCFYUH7X4+fX$<vf)3f^)anXA)YF+51(=sDA# zJduj0&snGGYnK)UWF@L5+CIwTOqkcM9r$vjQdB@MyCpoMnGc?r1JQJ~JEa>igTGPQ zQTc#pqGlXE0-+t#S6TLRDn2&W>P-y>S#E(qo{bl<2frn3<2ts9(U(hE$M-<Lv5-3P zaUFIRaNV+ri$xRSJI#6Rhhc9BROVqQOuK}kkFY@mbF-dBx!}`MOo7wN%A!o^x0RKU dAEa#vA<Epntu$xDgl`)XNdt0^Ea6YAe*lOhh`ay* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..765afde91a10e5e748e99e314e2dc118eae0c4a7 GIT binary patch literal 1495 zcmah}OK)Q}6t?d>&xWdi%Ib=j$fA?*D0He(Md@?|3o4{^RCG0?D<^i^+xR|WJDIdf zHVi+2pU|*F{13#6AK(=dtKkQ*V8!uGr!CSTeC6ZgbH4MmufJ$CstCsU@f%Oy_7VES zY+eorn9pI#GawXE%u$LXoLZ5U+L4Wo%;HY!MlSF+b-0)Mk)H-pfKh^?%ItmSUsadr zA$t1O6FaI!^{ByW)E!mC9&4})t35#Dy%R(|>VJ=-CUtwL9lU^OsBP;t(w8}(C>AGa zkqe~*noJX!<e6?wvSg4`7V|_gLAY#V-P%`5Bz?fkquy6(!CzR$kEP!v^n4=Kqg=4$ zG`mIV%}Mqjs-uCiH3NErJeUVC<p&s{Ile+mgwZTi_{u74+jwFvtc494dv49`rG?RW z{RGW^o14miSvYft;!U)0=PtEImiThq9e07ZN1pgm8LhL4l>6LTc;Lf>y}OBkdYfoy zt=74>gnomK5B7fn%6}EAjBGpyfco`+Q5A^)JD>va1sN<c<ZZ00VEyN~OKY;LDzyF_ ze}~6isOMD`SLc?o`vH%g6VscT=?!hbIW{kUJ|LWjz5Q>ucrs$)AkP%bRCq=*%9#lJ zL^2xYS*QeK&j=rZY_(LYA&gxjPOk;Kp*mxCaVifd5+r#ExX~H`gqbp-!bIJ1a~*Tn zWOI|i%E=0)9d%JK?LW*1hJkAn^b`^5n4Ie1FfG)D;T%d7(Upv(OcrFov}0INhs&Y8 z!;At3EUO1+M34d8OsUs;26so`ALMBYZFqFK{x}<D`7@|LA2Fa1_NZOg4Qb*+9uou8 z%|ftYGK*7E6iIffUAXb7)axbcn^O1nN+n!KLj)$5W~n{o%(yt}={n2k?XEhw&9AvH zC3FjZszV`ip<96bmsec_$;)iozV=o}r2XrbYHyXGXqv!oS&OKYJb@ol{)EIku>1S6 zQ;1|r6zfch=nQjCp*@{cbo%FUyd$@>&!+T~L0n8f>Z;++>ABz^4!7^$?;LlEq}WO_ zsEG3|G1%VuSdEDhmNTA0db#MFsg!T?q~9@@iBM9Q?sp`a-77A%r}7xs2IL_>1%iSA zuj7_g#Q}UyNj;Ew@EJ}0hPHsStd<36EZzgl_L{E7@o=Ihg2k~g&xEiIF^^^R+AQVw zOi)+_q`^daD7pfd5(>za6y`xG4@tZZoc5-KPnZ;;F|Y7^K=_flQl^__z_NRH$h*cW bc#!6F!r2}?NJtv&hE<0&9lQYv*X@4*OTwzZ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 000000000..73c70c651 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName, Attrs +from genshi.core import START, END, TEXT, COMMENT, DOCTYPE + + +def to_genshi(walker): + """Convert a tree to a genshi tree + + :arg walker: the treewalker to use to walk the tree to convert it + + :returns: generator of genshi nodes + + """ + text = [] + for token in walker: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + text.append(token["data"]) + elif text: + yield TEXT, "".join(text), (None, -1, -1) + text = [] + + if type in ("StartTag", "EmptyTag"): + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value) + for attr, value in token["data"].items()]) + yield (START, (QName(name), attrs), (None, -1, -1)) + if type == "EmptyTag": + type = "EndTag" + + if type == "EndTag": + if token["namespace"]: + name = "{%s}%s" % (token["namespace"], token["name"]) + else: + name = token["name"] + + yield END, QName(name), (None, -1, -1) + + elif type == "Comment": + yield COMMENT, token["data"], (None, -1, -1) + + elif type == "Doctype": + yield DOCTYPE, (token["name"], token["publicId"], + token["systemId"]), (None, -1, -1) + + else: + pass # FIXME: What to do? + + if text: + yield TEXT, "".join(text), (None, -1, -1) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 000000000..1f06d13c6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treeadapters/sax.py @@ -0,0 +1,50 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.sax.xmlreader import AttributesNSImpl + +from ..constants import adjustForeignAttributes, unadjustForeignAttributes + +prefix_mapping = {} +for prefix, localName, namespace in adjustForeignAttributes.values(): + if prefix is not None: + prefix_mapping[prefix] = namespace + + +def to_sax(walker, handler): + """Call SAX-like content handler based on treewalker walker + + :arg walker: the treewalker to use to walk the tree to convert it + + :arg handler: SAX handler to use + + """ + handler.startDocument() + for prefix, namespace in prefix_mapping.items(): + handler.startPrefixMapping(prefix, namespace) + + for token in walker: + type = token["type"] + if type == "Doctype": + continue + elif type in ("StartTag", "EmptyTag"): + attrs = AttributesNSImpl(token["data"], + unadjustForeignAttributes) + handler.startElementNS((token["namespace"], token["name"]), + token["name"], + attrs) + if type == "EmptyTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type == "EndTag": + handler.endElementNS((token["namespace"], token["name"]), + token["name"]) + elif type in ("Characters", "SpaceCharacters"): + handler.characters(token["data"]) + elif type == "Comment": + pass + else: + assert False, "Unknown token type" + + for prefix, namespace in prefix_mapping.items(): + handler.endPrefixMapping(prefix) + handler.endDocument() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 000000000..2ce5c8706 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py @@ -0,0 +1,88 @@ +"""A collection of modules for building different kinds of trees from HTML +documents. + +To create a treebuilder for a new type of tree, you need to do +implement several things: + +1. A set of classes for various types of elements: Document, Doctype, Comment, + Element. These must implement the interface of ``base.treebuilders.Node`` + (although comment nodes have a different signature for their constructor, + see ``treebuilders.etree.Comment``) Textual content may also be implemented + as another node type, or not, as your tree implementation requires. + +2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits + from ``treebuilders.base.TreeBuilder``. This has 4 required attributes: + + * ``documentClass`` - the class to use for the bottommost node of a document + * ``elementClass`` - the class to use for HTML Elements + * ``commentClass`` - the class to use for comments + * ``doctypeClass`` - the class to use for doctypes + + It also has one required method: + + * ``getDocument`` - Returns the root node of the complete document tree + +3. If you wish to run the unit tests, you must also create a ``testSerializer`` + method on your treebuilder which accepts a node and returns a string + containing Node and its children serialized according to the format used in + the unittests + +""" + +from __future__ import absolute_import, division, unicode_literals + +from .._utils import default_etree + +treeBuilderCache = {} + + +def getTreeBuilder(treeType, implementation=None, **kwargs): + """Get a TreeBuilder class for various types of trees with built-in support + + :arg treeType: the name of the tree type required (case-insensitive). Supported + values are: + + * "dom" - A generic builder for DOM implementations, defaulting to a + xml.dom.minidom based implementation. + * "etree" - A generic builder for tree implementations exposing an + ElementTree-like interface, defaulting to xml.etree.cElementTree if + available and xml.etree.ElementTree if not. + * "lxml" - A etree-based builder for lxml.etree, handling limitations + of lxml's implementation. + + :arg implementation: (Currently applies to the "etree" and "dom" tree + types). A module implementing the tree type e.g. xml.etree.ElementTree + or xml.etree.cElementTree. + + :arg kwargs: Any additional options to pass to the TreeBuilder when + creating it. + + Example: + + >>> from html5lib.treebuilders import getTreeBuilder + >>> builder = getTreeBuilder('etree') + + """ + + treeType = treeType.lower() + if treeType not in treeBuilderCache: + if treeType == "dom": + from . import dom + # Come up with a sane default (pref. from the stdlib) + if implementation is None: + from xml.dom import minidom + implementation = minidom + # NEVER cache here, caching is done in the dom submodule + return dom.getDomModule(implementation, **kwargs).TreeBuilder + elif treeType == "lxml": + from . import etree_lxml + treeBuilderCache[treeType] = etree_lxml.TreeBuilder + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeBuilder + else: + raise ValueError("""Unrecognised treebuilder "%s" """ % treeType) + return treeBuilderCache.get(treeType) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..252da3693c75293dc778178e721db6e537a5dfde GIT binary patch literal 3329 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3399718ce17ccfde5c73efced5c7611e66e4cbd GIT binary patch literal 11252 zcma)COLH4ndhHj01_(YRQ50p%a*u7<f=43#k}WHWN)~O7HD#e(63ebI@gPmy1_=s4 zgSQ(bg@HDfCz(vDQb}r7$t=ias`3N!1G303$fCDdd7qUx$vO8n8V`}ODD_2m-}m=C z-*@}o>}<)v-|oiJcYnNP82`hE;h&3}ySSpCPzXbqEu(F2nr&;-YTKK($#+)EY3DX` zxVMGV%C`%fg|@rtwu_rZyvuEtf|;Q3%oO>C#k-&!6h+~pA>4+wZ9X&a87I^g(N?!A zp_Mh!O202;EoO9!bbMV~&T41V+PQ`$=Kqx2oc)y{7Q~q!3~?ryduDIW<N2&Ohv##_ z0-n#{c~P9l^LbT&R^%QTm8BoCf1_e2^Zr&8wt8_;Yqq<gj1yNh_nT2O>?8}lPO~10 zpw?=}f%IEZ#Y~EEa2VI(C*9yjD;*%Jhuvmp`-@i44mxp^T!{UxR&c))1u}ks?pZ~t z<F|vT>(_&*x}G>Yal4h|w|a4mxva32SiM$~Q=Jnx?8e(N>~)ho?y#7RO0FtrFk|Ah zno%t0c$<%cR#1=YxX=D<+}*_$ZJ`K^O;Z?~mM}MMVF~*OW783i$l*69@}hv>yl_Pk zzXfqY%!u+2=B6uV#T?!g#k^R+Z%LdHXYo5D&WT0*mc@Cogx^_F0wI?Zr;1JXFFy>r zGKfe4&+mAkSlerMym%+@Vi^Q=Qj355<+X+@x{6|84vZQE5v8e0t7+ig-e&2jGAB&T zWc44e$-s{TOyF_OQprpIZuxTCBXw_i8=TPBPo5t|VZDhi!aHcjJ8CtZiJsL;K5^JH z$#;E;)hD@qztszpk{`#i3GM_@QmXGXTY^(YNxs%-`P)&&N*qwXAs4ZQe>3E(`1$F# zt6kaL$8@XvzFcjDEfL6QwJle-c5Ahp(T&b0`{JW|t-JrhdvW9D_O5Kb-?;JVr>h&Q z-DdZCvlGRBt94!0Z`}Ma-t+lVUA6t7BSN`Kfw|FYZmp7_TRkj^!*BUfu+n{!xV2id z(~N7ii==EBg;B^`>Ytsr`m<dA%CJq{WIg`KiX1M*4j2nC;s_RiqB1ac%_HmB_#FCt zY(6yyro1K`ytM~r!&)*P!4~jI-QlT{ul{6u*~k<`j{FE$bO{An`Q74QSx?QUmLS_L zj`B~|o`b$-zi=h`^Ea+UZzxhiF|C#N6mjJe`l^?@;7~u6Zc_{DVY_>0h2wJ@d9$y? z0-J<_)M_iYTVWkqdj~he#{I(WE0K34y3==XbEo1Y&TiQ3$P4J7<S4X}nzUlcSNLjn zBn6LRIkk$Ukj`|SOHek~ELjVtW6oLqa!PNtl#D1OdnWztL5bfrNWzL$O&4YAC75an z({qB&5}H=4eauNYmSJYh)io2k#u*iJY58O0d+3<brN7h$%A-0!PoPpt$i1+kw4~mX z)CN^Ot!L<QD^n#e4x#6?b)#lg7|L_iFuvdJYNHs4FQg3Rkg5(Ro!;1t-|a%q*Qjcr zVy${_`Tl|;<XC03PSN5Ye^1$;e-9Pu7KI=C+#*f)&?b%V@0!;Qqb98^?8H{k2qjF& zPLNp_sHKca7)2|+*?YQKD7k+cIV^ohJ2rbqPq#86in38$il&`f)Csgx&Bo_|Nt3<6 zYc{+mVb448!IZ3<nptgYv~10?p=IQ+kEN|c5l$PV8GC*M9xmhQXwl%Ld>d4**jgVP zE;}iYuWy=<C0)4zVt<C7nvJFYykg_1?xmP`VZ=m5`xndUwITCl(BNz-uQNW<3Xn%y z&^chV;yv`65j@H_H2O+NN$G5W2-F01GTq3=BFo2RXhbsYi!k_$bwo8w=g}=k%bH@a z+PY@&XqqX`$ag^Nq>v6c#S{51Dj$q7;|$5OGS0=9vKc!MgLb$dXgz4iu&pFUtsBN- zDE==+mdVXZHSP(U(`Hz0ZfZ}-jPA5Xd+`_9-iG#KtTNjg&4q(&jji88akxz5`?>Mm z+*4~{9>F6Wo2Ieneye;HL5VVz|NDTOhHL)W?UHew;NWY8BvvwE+1P1D9{zWNK)}RA zv=~0r7;YS9g0~{<yc2s-tV|Eh6eL{<sHX@%ZjC0aSO_a!k6{&_jEJWNaJY&|DO98B zop3#n0vM`{fpIt*r3z!c3>rydw4wSJv&|(r-HW(KbB2C7S%3#pn^$asQ22No<xv>L zvN>n=&nwBBZZ+W_q4OtttUo*q;-2h48>1a;Aw2K^yq}yTbzXBNSV24PZv^}zpuCJF zgnY^{jvTxPu%}yhLQn6)gMC-~)Xd0wXUcc7k1p0*@Fm=7huc?9+Ud`!t!Gs)wdeJ8 z&vEJkXm-@Db|4@b-{^%PG}pX_vhpEX$pe_RmtAiOqpgLV7!E(q7Hp>`dsJ63tCcz8 zOcJkFOG>p`I~2VZ@5{B?Ue9l(H2_8;tOKdMhT$YtO<rL^S(3kGL5n1bo8)^e-e>Uv zi;+O7J4%&2hk^(#A{2CiuiQnq=-RGZD!XOZb!XkYYEwsb_D8DU#ig+4C=e1BLKmBn zEq)OSLBsRO@@Mt9xgV^DvJH6{3+6K0LA#OR<OUuDQ0%~rjmNh9=J3k_<7VLI-`N*w zPd<KX4{X#~^4+h2dSO|BnU5`bX8>gViGiM$a8P>*b=JV9)%n`kyY#IQ+ebjyY|BU- zYeUpWefaVJ@b{y-v+-ETCHV)wd>qK6L~)3|An}vDwtDgmnk0D*nJSKkk;*@m0=8QV zdx&!ih#eWQj!|3@`wlw)7MCKnL1LSWxGb}b(ltvaaQ5q`(Q8FdI^o>Oh&2vKIT)C` z#=zPIX`%(1S3JY)?wWY^_$(}J+ODo|Aiye8nl^gCkP4p<jZls|em_w^A55?QHs<&} zC)04eY&sUN{+p++ctpQyB_}^bU-=P>8!Si+$uY;~8Oh}*sOaO0C><cqtmK;sDI~Y< z;)?zo#YhSnjzjt^gy9xKa0}tLg}_@&Wl<nFhjf<2FGWGP2+3zeQIznetU`2#-a15| zOGEVeG(=wz*Hn;hZk|bl^s@--m(lZ_xF}x1?_zL1I2SBFvo@E+tKt&gToA8`%lKUu z*Tw6?!)zDDFT@*o^NLszZ;H3@=2dY;yp1=P#5>|DeqR$6@h*NZD|W3WGaGPa_jE++ zpMjX(Lr|*xTN<W%NUmsc^NF*yn|T**uim2!uC)-Ud)KvpRrheDJq!UXu3m11$da_% zApo2*e?W15)?1mmcfC}eUpUs68xOwnh6$OpAEL;gT|?R?O1og)OaZ-cs<cg{_gc*? z3DqG}iOYCETwPX)52FJ~U^0Xj;~0^RR)&6Cr#-OaF*1)lwf6T=6_r}z4u>1O<sIw< zbO!We1hRxD!-k%sMM|`Em5dhpmv-W~duw&|;NW28;KP+rZm+)oDY6uY%s&7YBnu*F z_`OzK9S)V`nE8o^;obRcj`78eX^^rrbPfNGD`H@3<Y8wlSeC`HEk2*EpaINi$G~5u zhm6>K2Ab8FRY2lMm5!n)@)Jk-W4<jYYid>3D{fK_5oiu+q*OLp_D^vD$;?jRi?5L* zK!B9YKpxw}hk1>k*MWmKnDI+yC&U?v#8kQwLot~!O@MX0`wv_?R|B)^+If@tn*Nz_ zA}G>k2DN|=v^Hz(_|GU}$d53eS@by32QjiVvGvT7Z^f`M7g5(hzD2!to>{2ReQ(D3 z0cwzkah~Q5*W&^(u=~t}*Sh&MKd|L*2KfQZvHXp&VV>=%JIL=A)tjz*lT**m<NRla z{Ix*tX7AVE8p4VGfnyJS)@N9mqzT?wuauGkFa&W{QbJ;tS*}h!ko2aqhypoJ+W2Jd zvxsQ~m<JVyCG(8ehHQG^cN13z`^b0&LVn4<oTF0EacLeQ`gQ=PhQwPFA#zd-4#CnY zJVjC-A1BE-I~XKBF{GGFwc&o}5uj!8pO`?Q2g51B50>Bo=d3akJn$&Mvb<cY|H?SC zCI`qM9`{PlDX#q&ZWwn&B~lB#!96nO=CXkt8}0|@MTHPz3r_K)0W89<{Wvdgvi0G| z0}JnM*-76QaAyj%l$*kSY65Lwq?;2X?cMs;IDE+WKpqn_9684Z<i<G4A+Kleg8RD# zT&~Fd$w9`?88F+25pNs%P5|9tCJC$}!E@r1d{r`8qd<zhiMzyo#B|Aqzs=+tt)$9k zX=ko1l&qjxr6}*SwcQFj^3OPe;wf=pGOHCUWxY-Ue#a)nfbh{OGiNrF9MQ`YL?T4n z@-AB_-<&z<<V{3JAp}nL>hWm+AVI%~w#3NiO~;-CpU>hKn8$K}dR%MHvMkpwDfM)~ z^|D<;tN!XZ-(O;$Oc*8{z%|TEBGceMH4gy@cMbVAl^9HZdsMSmP6-YSZl|Q{hFwLv z)b2_jV@*@wwR$V?<!O6&VNi8+hFve1{mS^BUf45pXEr9y3=#$4@B^+|K-@Aoe3^hZ zrcrqVqH`8_56~G;xP$pPi=DyLRGj|5tnCE#$4tQB1R+%=FF1r5h>+Te4+10^7y*st z+O*xy0v+0Cjo^p<c^V;9FW`#UYb(^e;@xlHhyn;Ah^`^qqvFaY0;m94vTU&Qy$Y(T zO1Rfk+G~kr>OTdgTE-nFkf%BDi_9jR#)VmOK_%>SOE$wB$eP)|KF*7u9b<wY<cTsh zOx;1fp~6sS8WJS*b&>=33^i23Ln$)kDwoXG)d9;;^OQ;|2wcTL6PbWq96pBT-sSr# zrArfl55q8ibzHv6W`AjXPg={_EL%Ji1zD8E1UIdgvW5^Q{342?4T5FjrVu#|oMZbb zPa(Lm9OEdp8K<fl;&yvmt!DkcNZja21m@fqI9Vu<!#6qFT3);9Cig_%%Ev5PD3U_j zWqPlvsrp>wL66(jfd@k+m=3dl@%b&Mtuvoac5&y5WekiF9U6~asE1M{?F|q^GFDV{ zI0ie@o!VM3wN16P5xvS4m&al4P)gO-&ZGL2eXMCHe09V&27D*&A#Is)j$F&k07Lo_ z=Xjn(4jmJta1V@lfj%@Z2Tl!KRO-Jn#JMBoXG%ur#<a9hY5mR<z*?#Oid2q4c@!tH z0RiL}YWJzaD1<)lH{^)Bs^?v_o+5_a!Mp1jD=im(zWf{+CNw3p?dUZ+kswdWLTnD& zWhM(apd-S`5aY?fFgaJlKJHI8y}|X+bKtb+^>L9pp>4*L2~Xp3H4q|%7dT)dLkO8W zF7Ch<fM=cTj2_{nw62dz8@&!-aoAxf1{*p&=oz=p!z^%SG&{7wEe{@<9cZoF&8QPV z`7i=uvZ|s@-tuAV{cXS5sUk_i#8Yxs6DYMm3RTM*E6z<+RMi|qx5uQ=6bnH@#3NHA zyh#$eXlwvy!^m1wgnYh7M#u^2-ogk&=?40SV*|3j99xiboM%2WzXt|CLWT*1byAtn zjmf+NRPNOBs4a-xMdQeY4TCoG`KXxQQy+k=XoUJpDK&6vsbaYFqlA&*E6-FZ0hNIc zT&aA>Lb9MT$cP28)5tui#6}9GUPdJj(0h&aTfmJ0+qRS{1;Own9Z%rY$#nc{j5O(- zXzO>a*nV7)Z=nVj;+QES;L~HqD>e}+u&ygVAJ|8TVo0}68TSRy7qnJXG(k~SLvT^C z``4ehDwICGOxhEKc3MzlBry~*t3anT0-9dR6;N&@sgS$|<y4aSU?|s&GQLhv5Os=^ zM*Mja-{o6neO3LW+m!pLeLxbQ#f@PRkChze+{(ycfykG~wSI!gYBiZRp%u<7@i%yY zH!(ABLNBVUv0Q<~nerA&*yoJyw+5D`J1C3Ok(BbZ-0D3oH#`qbh21}+6-=M2@?da9 zJEKZo6YeWat{thOp33_^!MkBfl2-e4da(I-naIHkmp}(*AIqT1Nl1bxj+r5z&{&cd z`C4EJe0g9#wGXeVU5`W5MatGL&;?-W<$=RUYVY#5G?fA=N=tsl5|l&ly$*ZxI$~DW z6wb0is&-0hROmF}?!azP{__3kR{;_)u!9X`uaJsKPZm-Kbxpz3s0o<T*&Z{o>2aTz z{#``^rwW@|VMYgE*C^+}9{zLYmHDw06wHypS$GDrf5{h0o+*a-;GrXe!(l{KBtTZO zl$7;a^*NTx)hBk)nufNL%xsZGOk**H!+%R)k^?q5%w`~;;h2jM=E>0Fg({R;3*sVP z3Kuc7&|HJ863ikF7Wj?~kuhUr6XDWFnkUSh4Xwu{N<!|(5&~D8Sgod{EtB&o60@6F zl2;63WJF4e@NWG8w2q}<v!(3-fhNB1;fD=PeALhph;yS9T_K}>Sa0?4WrL#dlzRUT z1N;qXrSTz^8X|4?-xycxlgH158r@Gu7ya|Yb0W%FvjYcAV+MRdbbAWSm;o06MO6a! zAGtCGFRcEB$rWX7vSqMc#uw)DKy8EJE9eiMf=>fKluy%;;^K3QYe;`vojq_zK;*N- z7aFfA4iH2RGm7r8e%jA-59{e*f8-vBxeNqR2xh1EF>IH~7x%#hDEXp^8v8uv?;Zt6 zB(<7-^(lxK^|nY*9yY4{bNXeQ4mS}%?)93IACElo;GUuGz&m3p)ssF6P{8S6r%9+4 z;^dc~m;fBAIic92^lo<6_=2<WIZl|ZSpI9q&HQ9~YO<L^r5IlQe|`Gs<6{s+@}mKb zAG*A2v-mv=W^d&>i%k}F76FTG7P~A$7JDpqSoByNqDb7XM0QQaPo(k?^s37H>61Yk z6-jN8f6L+zEdHLwNTJl7N+N%b3T8nguGV!O$Fb9Y7ET7sr6qU8&AD^9+!8LF85T>H zTXGjl^X@C9lIyqy$uTPDc$(ShArXMnOi9U*6mdyUn#|)%yp{ATyp^bVs8Ci?RH-E- z8zafwo}>h+gr?38{J@?zZ3n-A!*`rpyEv*>=alMzP9>hz<R|Scac}Fh)jO0>m4#dc Z5?IVRcFDX1@m>NZIE!o9S*R~8|34*gzvln| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..027965a0accd4bba2f435a5dbd88a6b7267ff983 GIT binary patch literal 9282 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8d7321234d58f9cdb4075887c58893eaadb4eec GIT binary patch literal 11861 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 E1x@CnlK=n! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aade047cce9e4cf86c0f55e5905ebf5715952611 GIT binary patch literal 11801 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 bO=EBAh>#!TZxwBar-AlFZldJA<Iev-lT+K+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 000000000..ed32fcbf8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/base.py @@ -0,0 +1,417 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from ..constants import scopingElements, tableInsertModeElements, namespaces + +# The scope markers are inserted when entering object elements, +# marquees, table cells, and table captions, and are used to prevent formatting +# from "leaking" into tables, object elements, and marquees. +Marker = None + +listElementsMap = { + None: (frozenset(scopingElements), False), + "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False), + "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"), + (namespaces["html"], "ul")])), False), + "table": (frozenset([(namespaces["html"], "html"), + (namespaces["html"], "table")]), False), + "select": (frozenset([(namespaces["html"], "optgroup"), + (namespaces["html"], "option")]), True) +} + + +class Node(object): + """Represents an item in the tree""" + def __init__(self, name): + """Creates a Node + + :arg name: The tag name associated with the node + + """ + # The tag name assocaited with the node + self.name = name + # The parent of the current node (or None for the document node) + self.parent = None + # The value of the current node (applies to text nodes and comments) + self.value = None + # A dict holding name -> value pairs for attributes of the node + self.attributes = {} + # A list of child nodes of the current node. This must include all + # elements but not necessarily other node types. + self.childNodes = [] + # A list of miscellaneous flags that can be set on the node. + self._flags = [] + + def __str__(self): + attributesStr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in + self.attributes.items()]) + if attributesStr: + return "<%s %s>" % (self.name, attributesStr) + else: + return "<%s>" % (self.name) + + def __repr__(self): + return "<%s>" % (self.name) + + def appendChild(self, node): + """Insert node as a child of the current node + + :arg node: the node to insert + + """ + raise NotImplementedError + + def insertText(self, data, insertBefore=None): + """Insert data as text in the current node, positioned before the + start of node insertBefore or to the end of the node's text. + + :arg data: the data to insert + + :arg insertBefore: True if you want to insert the text before the node + and False if you want to insert it after the node + + """ + raise NotImplementedError + + def insertBefore(self, node, refNode): + """Insert node as a child of the current node, before refNode in the + list of child nodes. Raises ValueError if refNode is not a child of + the current node + + :arg node: the node to insert + + :arg refNode: the child node to insert the node before + + """ + raise NotImplementedError + + def removeChild(self, node): + """Remove node from the children of the current node + + :arg node: the child node to remove + + """ + raise NotImplementedError + + def reparentChildren(self, newParent): + """Move all the children of the current node to newParent. + This is needed so that trees that don't store text as nodes move the + text in the correct way + + :arg newParent: the node to move all this node's children to + + """ + # XXX - should this method be made more general? + for child in self.childNodes: + newParent.appendChild(child) + self.childNodes = [] + + def cloneNode(self): + """Return a shallow copy of the current node i.e. a node with the same + name and attributes but with no parent or child nodes + """ + raise NotImplementedError + + def hasContent(self): + """Return true if the node has children or text, false otherwise + """ + raise NotImplementedError + + +class ActiveFormattingElements(list): + def append(self, node): + equalCount = 0 + if node != Marker: + for element in self[::-1]: + if element == Marker: + break + if self.nodesEqual(element, node): + equalCount += 1 + if equalCount == 3: + self.remove(element) + break + list.append(self, node) + + def nodesEqual(self, node1, node2): + if not node1.nameTuple == node2.nameTuple: + return False + + if not node1.attributes == node2.attributes: + return False + + return True + + +class TreeBuilder(object): + """Base treebuilder implementation + + * documentClass - the class to use for the bottommost node of a document + * elementClass - the class to use for HTML Elements + * commentClass - the class to use for comments + * doctypeClass - the class to use for doctypes + + """ + # pylint:disable=not-callable + + # Document class + documentClass = None + + # The class to use for creating a node + elementClass = None + + # The class to use for creating comments + commentClass = None + + # The class to use for creating doctypes + doctypeClass = None + + # Fragment class + fragmentClass = None + + def __init__(self, namespaceHTMLElements): + """Create a TreeBuilder + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + """ + if namespaceHTMLElements: + self.defaultNamespace = "http://www.w3.org/1999/xhtml" + else: + self.defaultNamespace = None + self.reset() + + def reset(self): + self.openElements = [] + self.activeFormattingElements = ActiveFormattingElements() + + # XXX - rename these to headElement, formElement + self.headPointer = None + self.formPointer = None + + self.insertFromTable = False + + self.document = self.documentClass() + + def elementInScope(self, target, variant=None): + + # If we pass a node in we match that. if we pass a string + # match any node with that name + exactNode = hasattr(target, "nameTuple") + if not exactNode: + if isinstance(target, text_type): + target = (namespaces["html"], target) + assert isinstance(target, tuple) + + listElements, invert = listElementsMap[variant] + + for node in reversed(self.openElements): + if exactNode and node == target: + return True + elif not exactNode and node.nameTuple == target: + return True + elif (invert ^ (node.nameTuple in listElements)): + return False + + assert False # We should never reach this point + + def reconstructActiveFormattingElements(self): + # Within this algorithm the order of steps described in the + # specification is not quite the same as the order of steps in the + # code. It should still do the same though. + + # Step 1: stop the algorithm when there's nothing to do. + if not self.activeFormattingElements: + return + + # Step 2 and step 3: we start with the last element. So i is -1. + i = len(self.activeFormattingElements) - 1 + entry = self.activeFormattingElements[i] + if entry == Marker or entry in self.openElements: + return + + # Step 6 + while entry != Marker and entry not in self.openElements: + if i == 0: + # This will be reset to 0 below + i = -1 + break + i -= 1 + # Step 5: let entry be one earlier in the list. + entry = self.activeFormattingElements[i] + + while True: + # Step 7 + i += 1 + + # Step 8 + entry = self.activeFormattingElements[i] + clone = entry.cloneNode() # Mainly to get a new copy of the attributes + + # Step 9 + element = self.insertElement({"type": "StartTag", + "name": clone.name, + "namespace": clone.namespace, + "data": clone.attributes}) + + # Step 10 + self.activeFormattingElements[i] = element + + # Step 11 + if element == self.activeFormattingElements[-1]: + break + + def clearActiveFormattingElements(self): + entry = self.activeFormattingElements.pop() + while self.activeFormattingElements and entry != Marker: + entry = self.activeFormattingElements.pop() + + def elementInActiveFormattingElements(self, name): + """Check if an element exists between the end of the active + formatting elements and the last marker. If it does, return it, else + return false""" + + for item in self.activeFormattingElements[::-1]: + # Check for Marker first because if it's a Marker it doesn't have a + # name attribute. + if item == Marker: + break + elif item.name == name: + return item + return False + + def insertRoot(self, token): + element = self.createElement(token) + self.openElements.append(element) + self.document.appendChild(element) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + doctype = self.doctypeClass(name, publicId, systemId) + self.document.appendChild(doctype) + + def insertComment(self, token, parent=None): + if parent is None: + parent = self.openElements[-1] + parent.appendChild(self.commentClass(token["data"])) + + def createElement(self, token): + """Create an element but don't insert it anywhere""" + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + return element + + def _getInsertFromTable(self): + return self._insertFromTable + + def _setInsertFromTable(self, value): + """Switch the function used to insert an element from the + normal one to the misnested table one and back again""" + self._insertFromTable = value + if value: + self.insertElement = self.insertElementTable + else: + self.insertElement = self.insertElementNormal + + insertFromTable = property(_getInsertFromTable, _setInsertFromTable) + + def insertElementNormal(self, token): + name = token["name"] + assert isinstance(name, text_type), "Element %s not unicode" % name + namespace = token.get("namespace", self.defaultNamespace) + element = self.elementClass(name, namespace) + element.attributes = token["data"] + self.openElements[-1].appendChild(element) + self.openElements.append(element) + return element + + def insertElementTable(self, token): + """Create an element and insert it into the tree""" + element = self.createElement(token) + if self.openElements[-1].name not in tableInsertModeElements: + return self.insertElementNormal(token) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + if insertBefore is None: + parent.appendChild(element) + else: + parent.insertBefore(element, insertBefore) + self.openElements.append(element) + return element + + def insertText(self, data, parent=None): + """Insert text data.""" + if parent is None: + parent = self.openElements[-1] + + if (not self.insertFromTable or (self.insertFromTable and + self.openElements[-1].name + not in tableInsertModeElements)): + parent.insertText(data) + else: + # We should be in the InTable mode. This means we want to do + # special magic element rearranging + parent, insertBefore = self.getTableMisnestedNodePosition() + parent.insertText(data, insertBefore) + + def getTableMisnestedNodePosition(self): + """Get the foster parent element, and sibling to insert before + (or None) when inserting a misnested table node""" + # The foster parent element is the one which comes before the most + # recently opened table element + # XXX - this is really inelegant + lastTable = None + fosterParent = None + insertBefore = None + for elm in self.openElements[::-1]: + if elm.name == "table": + lastTable = elm + break + if lastTable: + # XXX - we should really check that this parent is actually a + # node here + if lastTable.parent: + fosterParent = lastTable.parent + insertBefore = lastTable + else: + fosterParent = self.openElements[ + self.openElements.index(lastTable) - 1] + else: + fosterParent = self.openElements[0] + return fosterParent, insertBefore + + def generateImpliedEndTags(self, exclude=None): + name = self.openElements[-1].name + # XXX td, th and tr are not actually needed + if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and + name != exclude): + self.openElements.pop() + # XXX This is not entirely what the specification says. We should + # investigate it more closely. + self.generateImpliedEndTags(exclude) + + def getDocument(self): + """Return the final tree""" + return self.document + + def getFragment(self): + """Return the final fragment""" + # assert self.innerHTML + fragment = self.fragmentClass() + self.openElements[0].reparentChildren(fragment) + return fragment + + def testSerializer(self, node): + """Serialize the subtree of node in the format required by unit tests + + :arg node: the node from which to start serializing + + """ + raise NotImplementedError diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 000000000..8117b2d5e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/dom.py @@ -0,0 +1,236 @@ +from __future__ import absolute_import, division, unicode_literals + + +from collections import MutableMapping +from xml.dom import minidom, Node +import weakref + +from . import base +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + + +def getDomBuilder(DomImplementation): + Dom = DomImplementation + + class AttrList(MutableMapping): + def __init__(self, element): + self.element = element + + def __iter__(self): + return iter(self.element.attributes.keys()) + + def __setitem__(self, name, value): + if isinstance(name, tuple): + raise NotImplementedError + else: + attr = self.element.ownerDocument.createAttribute(name) + attr.value = value + self.element.attributes[name] = attr + + def __len__(self): + return len(self.element.attributes) + + def items(self): + return list(self.element.attributes.items()) + + def values(self): + return list(self.element.attributes.values()) + + def __getitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + return self.element.attributes[name].value + + def __delitem__(self, name): + if isinstance(name, tuple): + raise NotImplementedError + else: + del self.element.attributes[name] + + class NodeBuilder(base.Node): + def __init__(self, element): + base.Node.__init__(self, element.nodeName) + self.element = element + + namespace = property(lambda self: hasattr(self.element, "namespaceURI") and + self.element.namespaceURI or None) + + def appendChild(self, node): + node.parent = self + self.element.appendChild(node.element) + + def insertText(self, data, insertBefore=None): + text = self.element.ownerDocument.createTextNode(data) + if insertBefore: + self.element.insertBefore(text, insertBefore.element) + else: + self.element.appendChild(text) + + def insertBefore(self, node, refNode): + self.element.insertBefore(node.element, refNode.element) + node.parent = self + + def removeChild(self, node): + if node.element.parentNode == self.element: + self.element.removeChild(node.element) + node.parent = None + + def reparentChildren(self, newParent): + while self.element.hasChildNodes(): + child = self.element.firstChild + self.element.removeChild(child) + newParent.element.appendChild(child) + self.childNodes = [] + + def getAttributes(self): + return AttrList(self.element) + + def setAttributes(self, attributes): + if attributes: + for name, value in list(attributes.items()): + if isinstance(name, tuple): + if name[0] is not None: + qualifiedName = (name[0] + ":" + name[1]) + else: + qualifiedName = name[1] + self.element.setAttributeNS(name[2], qualifiedName, + value) + else: + self.element.setAttribute( + name, value) + attributes = property(getAttributes, setAttributes) + + def cloneNode(self): + return NodeBuilder(self.element.cloneNode(False)) + + def hasContent(self): + return self.element.hasChildNodes() + + def getNameTuple(self): + if self.namespace is None: + return namespaces["html"], self.name + else: + return self.namespace, self.name + + nameTuple = property(getNameTuple) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + def documentClass(self): + self.dom = Dom.getDOMImplementation().createDocument(None, None, None) + return weakref.proxy(self) + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + domimpl = Dom.getDOMImplementation() + doctype = domimpl.createDocumentType(name, publicId, systemId) + self.document.appendChild(NodeBuilder(doctype)) + if Dom == minidom: + doctype.ownerDocument = self.dom + + def elementClass(self, name, namespace=None): + if namespace is None and self.defaultNamespace is None: + node = self.dom.createElement(name) + else: + node = self.dom.createElementNS(namespace, name) + + return NodeBuilder(node) + + def commentClass(self, data): + return NodeBuilder(self.dom.createComment(data)) + + def fragmentClass(self): + return NodeBuilder(self.dom.createDocumentFragment()) + + def appendChild(self, node): + self.dom.appendChild(node.element) + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + return self.dom + + def getFragment(self): + return base.TreeBuilder.getFragment(self).element + + def insertText(self, data, parent=None): + data = data + if parent != self: + base.TreeBuilder.insertText(self, data, parent) + else: + # HACK: allow text nodes as children of the document node + if hasattr(self.dom, '_child_node_types'): + # pylint:disable=protected-access + if Node.TEXT_NODE not in self.dom._child_node_types: + self.dom._child_node_types = list(self.dom._child_node_types) + self.dom._child_node_types.append(Node.TEXT_NODE) + self.dom.appendChild(self.dom.createTextNode(data)) + + implementation = DomImplementation + name = None + + def testSerializer(element): + element.normalize() + rv = [] + + def serializeElement(element, indent=0): + if element.nodeType == Node.DOCUMENT_TYPE_NODE: + if element.name: + if element.publicId or element.systemId: + publicId = element.publicId or "" + systemId = element.systemId or "" + rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" % + (' ' * indent, element.name, publicId, systemId)) + else: + rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name)) + else: + rv.append("|%s<!DOCTYPE >" % (' ' * indent,)) + elif element.nodeType == Node.DOCUMENT_NODE: + rv.append("#document") + elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE: + rv.append("#document-fragment") + elif element.nodeType == Node.COMMENT_NODE: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue)) + elif element.nodeType == Node.TEXT_NODE: + rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue)) + else: + if (hasattr(element, "namespaceURI") and + element.namespaceURI is not None): + name = "%s %s" % (constants.prefixes[element.namespaceURI], + element.nodeName) + else: + name = element.nodeName + rv.append("|%s<%s>" % (' ' * indent, name)) + if element.hasAttributes(): + attributes = [] + for i in range(len(element.attributes)): + attr = element.attributes.item(i) + name = attr.nodeName + value = attr.value + ns = attr.namespaceURI + if ns: + name = "%s %s" % (constants.prefixes[ns], attr.localName) + else: + name = attr.nodeName + attributes.append((name, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + indent += 2 + for child in element.childNodes: + serializeElement(child, indent) + serializeElement(element, 0) + + return "\n".join(rv) + + return locals() + + +# The actual means to get a module! +getDomModule = moduleFactoryFactory(getDomBuilder) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 000000000..9a4aa95e5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree.py @@ -0,0 +1,340 @@ +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +from pip._vendor.six import text_type + +import re + +from . import base +from .. import _ihatexml +from .. import constants +from ..constants import namespaces +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation, fullTree=False): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class Element(base.Node): + def __init__(self, name, namespace=None): + self._name = name + self._namespace = namespace + self._element = ElementTree.Element(self._getETreeTag(name, + namespace)) + if namespace is None: + self.nameTuple = namespaces["html"], self._name + else: + self.nameTuple = self._namespace, self._name + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getETreeTag(self, name, namespace): + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + return etree_tag + + def _setName(self, name): + self._name = name + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getName(self): + return self._name + + name = property(_getName, _setName) + + def _setNamespace(self, namespace): + self._namespace = namespace + self._element.tag = self._getETreeTag(self._name, self._namespace) + + def _getNamespace(self): + return self._namespace + + namespace = property(_getNamespace, _setNamespace) + + def _getAttributes(self): + return self._element.attrib + + def _setAttributes(self, attributes): + # Delete existing attributes first + # XXX - there may be a better way to do this... + for key in list(self._element.attrib.keys()): + del self._element.attrib[key] + for key, value in attributes.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], key[1]) + else: + name = key + self._element.set(name, value) + + attributes = property(_getAttributes, _setAttributes) + + def _getChildNodes(self): + return self._childNodes + + def _setChildNodes(self, value): + del self._element[:] + self._childNodes = [] + for element in value: + self.insertChild(element) + + childNodes = property(_getChildNodes, _setChildNodes) + + def hasContent(self): + """Return true if the node has children or text""" + return bool(self._element.text or len(self._element)) + + def appendChild(self, node): + self._childNodes.append(node) + self._element.append(node._element) + node.parent = self + + def insertBefore(self, node, refNode): + index = list(self._element).index(refNode._element) + self._element.insert(index, node._element) + node.parent = self + + def removeChild(self, node): + self._childNodes.remove(node) + self._element.remove(node._element) + node.parent = None + + def insertText(self, data, insertBefore=None): + if not(len(self._element)): + if not self._element.text: + self._element.text = "" + self._element.text += data + elif insertBefore is None: + # Insert the text as the tail of the last child element + if not self._element[-1].tail: + self._element[-1].tail = "" + self._element[-1].tail += data + else: + # Insert the text before the specified node + children = list(self._element) + index = children.index(insertBefore._element) + if index > 0: + if not self._element[index - 1].tail: + self._element[index - 1].tail = "" + self._element[index - 1].tail += data + else: + if not self._element.text: + self._element.text = "" + self._element.text += data + + def cloneNode(self): + element = type(self)(self.name, self.namespace) + for name, value in self.attributes.items(): + element.attributes[name] = value + return element + + def reparentChildren(self, newParent): + if newParent.childNodes: + newParent.childNodes[-1]._element.tail += self._element.text + else: + if not newParent._element.text: + newParent._element.text = "" + if self._element.text is not None: + newParent._element.text += self._element.text + self._element.text = "" + base.Node.reparentChildren(self, newParent) + + class Comment(Element): + def __init__(self, data): + # Use the superclass constructor to set all properties on the + # wrapper element + self._element = ElementTree.Comment(data) + self.parent = None + self._childNodes = [] + self._flags = [] + + def _getData(self): + return self._element.text + + def _setData(self, value): + self._element.text = value + + data = property(_getData, _setData) + + class DocumentType(Element): + def __init__(self, name, publicId, systemId): + Element.__init__(self, "<!DOCTYPE>") + self._element.text = name + self.publicId = publicId + self.systemId = systemId + + def _getPublicId(self): + return self._element.get("publicId", "") + + def _setPublicId(self, value): + if value is not None: + self._element.set("publicId", value) + + publicId = property(_getPublicId, _setPublicId) + + def _getSystemId(self): + return self._element.get("systemId", "") + + def _setSystemId(self, value): + if value is not None: + self._element.set("systemId", value) + + systemId = property(_getSystemId, _setSystemId) + + class Document(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_ROOT") + + class DocumentFragment(Element): + def __init__(self): + Element.__init__(self, "DOCUMENT_FRAGMENT") + + def testSerializer(element): + rv = [] + + def serializeElement(element, indent=0): + if not(hasattr(element, "tag")): + element = element.getroot() + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + rv.append("#document") + if element.text is not None: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + elif element.tag == ElementTreeCommentType: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + else: + assert isinstance(element.tag, text_type), \ + "Expected unicode, got %s, %s" % (type(element.tag), element.tag) + nsmatch = tag_regexp.match(element.tag) + + if nsmatch is None: + name = element.tag + else: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + name = "%s %s" % (prefix, name) + rv.append("|%s<%s>" % (' ' * indent, name)) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = name + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + def tostring(element): # pylint:disable=unused-variable + """Serialize an element and its child nodes to a string""" + rv = [] + filter = _ihatexml.InfosetFilter() + + def serializeElement(element): + if isinstance(element, ElementTree.ElementTree): + element = element.getroot() + + if element.tag == "<!DOCTYPE>": + if element.get("publicId") or element.get("systemId"): + publicId = element.get("publicId") or "" + systemId = element.get("systemId") or "" + rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" % + (element.text, publicId, systemId)) + else: + rv.append("<!DOCTYPE %s>" % (element.text,)) + elif element.tag == "DOCUMENT_ROOT": + if element.text is not None: + rv.append(element.text) + if element.tail is not None: + raise TypeError("Document node cannot have tail") + if hasattr(element, "attrib") and len(element.attrib): + raise TypeError("Document node cannot have attributes") + + for child in element: + serializeElement(child) + + elif element.tag == ElementTreeCommentType: + rv.append("<!--%s-->" % (element.text,)) + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (filter.fromXmlName(element.tag),)) + else: + attr = " ".join(["%s=\"%s\"" % ( + filter.fromXmlName(name), value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + class TreeBuilder(base.TreeBuilder): # pylint:disable=unused-variable + documentClass = Document + doctypeClass = DocumentType + elementClass = Element + commentClass = Comment + fragmentClass = DocumentFragment + implementation = ElementTreeImplementation + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._element + else: + if self.defaultNamespace is not None: + return self.document._element.find( + "{%s}html" % self.defaultNamespace) + else: + return self.document._element.find("html") + + def getFragment(self): + return base.TreeBuilder.getFragment(self)._element + + return locals() + + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 000000000..66a9ba3b8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py @@ -0,0 +1,366 @@ +"""Module for supporting the lxml.etree library. The idea here is to use as much +of the native library as possible, without using fragile hacks like custom element +names that break between releases. The downside of this is that we cannot represent +all possible trees; specifically the following are known to cause problems: + +Text or comments as siblings of the root element +Docypes with no name + +When any of these things occur, we emit a DataLossWarning +""" + +from __future__ import absolute_import, division, unicode_literals +# pylint:disable=protected-access + +import warnings +import re +import sys + +from . import base +from ..constants import DataLossWarning +from .. import constants +from . import etree as etree_builders +from .. import _ihatexml + +import lxml.etree as etree + + +fullTree = True +tag_regexp = re.compile("{([^}]*)}(.*)") + +comment_type = etree.Comment("asd").tag + + +class DocumentType(object): + def __init__(self, name, publicId, systemId): + self.name = name + self.publicId = publicId + self.systemId = systemId + + +class Document(object): + def __init__(self): + self._elementTree = None + self._childNodes = [] + + def appendChild(self, element): + self._elementTree.getroot().addnext(element._element) + + def _getChildNodes(self): + return self._childNodes + + childNodes = property(_getChildNodes) + + +def testSerializer(element): + rv = [] + infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + + def serializeElement(element, indent=0): + if not hasattr(element, "tag"): + if hasattr(element, "getroot"): + # Full tree case + rv.append("#document") + if element.docinfo.internalDTD: + if not (element.docinfo.public_id or + element.docinfo.system_url): + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + else: + dtd_str = """<!DOCTYPE %s "%s" "%s">""" % ( + element.docinfo.root_name, + element.docinfo.public_id, + element.docinfo.system_url) + rv.append("|%s%s" % (' ' * (indent + 2), dtd_str)) + next_element = element.getroot() + while next_element.getprevious() is not None: + next_element = next_element.getprevious() + while next_element is not None: + serializeElement(next_element, indent + 2) + next_element = next_element.getnext() + elif isinstance(element, str) or isinstance(element, bytes): + # Text in a fragment + assert isinstance(element, str) or sys.version_info[0] == 2 + rv.append("|%s\"%s\"" % (' ' * indent, element)) + else: + # Fragment case + rv.append("#document-fragment") + for next_element in element: + serializeElement(next_element, indent + 2) + elif element.tag == comment_type: + rv.append("|%s<!-- %s -->" % (' ' * indent, element.text)) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * indent, element.tail)) + else: + assert isinstance(element, etree._Element) + nsmatch = etree_builders.tag_regexp.match(element.tag) + if nsmatch is not None: + ns = nsmatch.group(1) + tag = nsmatch.group(2) + prefix = constants.prefixes[ns] + rv.append("|%s<%s %s>" % (' ' * indent, prefix, + infosetFilter.fromXmlName(tag))) + else: + rv.append("|%s<%s>" % (' ' * indent, + infosetFilter.fromXmlName(element.tag))) + + if hasattr(element, "attrib"): + attributes = [] + for name, value in element.attrib.items(): + nsmatch = tag_regexp.match(name) + if nsmatch is not None: + ns, name = nsmatch.groups() + name = infosetFilter.fromXmlName(name) + prefix = constants.prefixes[ns] + attr_string = "%s %s" % (prefix, name) + else: + attr_string = infosetFilter.fromXmlName(name) + attributes.append((attr_string, value)) + + for name, value in sorted(attributes): + rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value)) + + if element.text: + rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text)) + indent += 2 + for child in element: + serializeElement(child, indent) + if hasattr(element, "tail") and element.tail: + rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail)) + serializeElement(element, 0) + + return "\n".join(rv) + + +def tostring(element): + """Serialize an element and its child nodes to a string""" + rv = [] + + def serializeElement(element): + if not hasattr(element, "tag"): + if element.docinfo.internalDTD: + if element.docinfo.doctype: + dtd_str = element.docinfo.doctype + else: + dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name + rv.append(dtd_str) + serializeElement(element.getroot()) + + elif element.tag == comment_type: + rv.append("<!--%s-->" % (element.text,)) + + else: + # This is assumed to be an ordinary element + if not element.attrib: + rv.append("<%s>" % (element.tag,)) + else: + attr = " ".join(["%s=\"%s\"" % (name, value) + for name, value in element.attrib.items()]) + rv.append("<%s %s>" % (element.tag, attr)) + if element.text: + rv.append(element.text) + + for child in element: + serializeElement(child) + + rv.append("</%s>" % (element.tag,)) + + if hasattr(element, "tail") and element.tail: + rv.append(element.tail) + + serializeElement(element) + + return "".join(rv) + + +class TreeBuilder(base.TreeBuilder): + documentClass = Document + doctypeClass = DocumentType + elementClass = None + commentClass = None + fragmentClass = Document + implementation = etree + + def __init__(self, namespaceHTMLElements, fullTree=False): + builder = etree_builders.getETreeModule(etree, fullTree=fullTree) + infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True) + self.namespaceHTMLElements = namespaceHTMLElements + + class Attributes(dict): + def __init__(self, element, value=None): + if value is None: + value = {} + self._element = element + dict.__init__(self, value) # pylint:disable=non-parent-init-called + for key, value in self.items(): + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + def __setitem__(self, key, value): + dict.__setitem__(self, key, value) + if isinstance(key, tuple): + name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1])) + else: + name = infosetFilter.coerceAttribute(key) + self._element._element.attrib[name] = value + + class Element(builder.Element): + def __init__(self, name, namespace): + name = infosetFilter.coerceElement(name) + builder.Element.__init__(self, name, namespace=namespace) + self._attributes = Attributes(self) + + def _setName(self, name): + self._name = infosetFilter.coerceElement(name) + self._element.tag = self._getETreeTag( + self._name, self._namespace) + + def _getName(self): + return infosetFilter.fromXmlName(self._name) + + name = property(_getName, _setName) + + def _getAttributes(self): + return self._attributes + + def _setAttributes(self, attributes): + self._attributes = Attributes(self, attributes) + + attributes = property(_getAttributes, _setAttributes) + + def insertText(self, data, insertBefore=None): + data = infosetFilter.coerceCharacters(data) + builder.Element.insertText(self, data, insertBefore) + + def appendChild(self, child): + builder.Element.appendChild(self, child) + + class Comment(builder.Comment): + def __init__(self, data): + data = infosetFilter.coerceComment(data) + builder.Comment.__init__(self, data) + + def _setData(self, data): + data = infosetFilter.coerceComment(data) + self._element.text = data + + def _getData(self): + return self._element.text + + data = property(_getData, _setData) + + self.elementClass = Element + self.commentClass = Comment + # self.fragmentClass = builder.DocumentFragment + base.TreeBuilder.__init__(self, namespaceHTMLElements) + + def reset(self): + base.TreeBuilder.reset(self) + self.insertComment = self.insertCommentInitial + self.initial_comments = [] + self.doctype = None + + def testSerializer(self, element): + return testSerializer(element) + + def getDocument(self): + if fullTree: + return self.document._elementTree + else: + return self.document._elementTree.getroot() + + def getFragment(self): + fragment = [] + element = self.openElements[0]._element + if element.text: + fragment.append(element.text) + fragment.extend(list(element)) + if element.tail: + fragment.append(element.tail) + return fragment + + def insertDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + + if not name: + warnings.warn("lxml cannot represent empty doctype", DataLossWarning) + self.doctype = None + else: + coercedName = self.infosetFilter.coerceElement(name) + if coercedName != name: + warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning) + + doctype = self.doctypeClass(coercedName, publicId, systemId) + self.doctype = doctype + + def insertCommentInitial(self, data, parent=None): + assert parent is None or parent is self.document + assert self.document._elementTree is None + self.initial_comments.append(data) + + def insertCommentMain(self, data, parent=None): + if (parent == self.document and + self.document._elementTree.getroot()[-1].tag == comment_type): + warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning) + super(TreeBuilder, self).insertComment(data, parent) + + def insertRoot(self, token): + # Because of the way libxml2 works, it doesn't seem to be possible to + # alter information like the doctype after the tree has been parsed. + # Therefore we need to use the built-in parser to create our initial + # tree, after which we can add elements like normal + docStr = "" + if self.doctype: + assert self.doctype.name + docStr += "<!DOCTYPE %s" % self.doctype.name + if (self.doctype.publicId is not None or + self.doctype.systemId is not None): + docStr += (' PUBLIC "%s" ' % + (self.infosetFilter.coercePubid(self.doctype.publicId or ""))) + if self.doctype.systemId: + sysid = self.doctype.systemId + if sysid.find("'") >= 0 and sysid.find('"') >= 0: + warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning) + sysid = sysid.replace("'", 'U00027') + if sysid.find("'") >= 0: + docStr += '"%s"' % sysid + else: + docStr += "'%s'" % sysid + else: + docStr += "''" + docStr += ">" + if self.doctype.name != token["name"]: + warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning) + docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>" + root = etree.fromstring(docStr) + + # Append the initial comments: + for comment_token in self.initial_comments: + comment = self.commentClass(comment_token["data"]) + root.addprevious(comment._element) + + # Create the root document and add the ElementTree to it + self.document = self.documentClass() + self.document._elementTree = root.getroottree() + + # Give the root element the right name + name = token["name"] + namespace = token.get("namespace", self.defaultNamespace) + if namespace is None: + etree_tag = name + else: + etree_tag = "{%s}%s" % (namespace, name) + root.tag = etree_tag + + # Add the root element to the internal child/open data structures + root_element = self.elementClass(name, namespace) + root_element._element = root + self.document._childNodes.append(root_element) + self.openElements.append(root_element) + + # Reset to the default insert comment function + self.insertComment = self.insertCommentMain diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 000000000..31a173d0a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py @@ -0,0 +1,154 @@ +"""A collection of modules for iterating through different kinds of +tree, generating tokens identical to those produced by the tokenizer +module. + +To create a tree walker for a new type of tree, you need to do +implement a tree walker object (called TreeWalker by convention) that +implements a 'serialize' method taking a tree as sole argument and +returning an iterator generating tokens. +""" + +from __future__ import absolute_import, division, unicode_literals + +from .. import constants +from .._utils import default_etree + +__all__ = ["getTreeWalker", "pprint"] + +treeWalkerCache = {} + + +def getTreeWalker(treeType, implementation=None, **kwargs): + """Get a TreeWalker class for various types of tree with built-in support + + :arg str treeType: the name of the tree type required (case-insensitive). + Supported values are: + + * "dom": The xml.dom.minidom DOM implementation + * "etree": A generic walker for tree implementations exposing an + elementtree-like interface (known to work with ElementTree, + cElementTree and lxml.etree). + * "lxml": Optimized walker for lxml.etree + * "genshi": a Genshi stream + + :arg implementation: A module implementing the tree type e.g. + xml.etree.ElementTree or cElementTree (Currently applies to the "etree" + tree type only). + + :arg kwargs: keyword arguments passed to the etree walker--for other + walkers, this has no effect + + :returns: a TreeWalker class + + """ + + treeType = treeType.lower() + if treeType not in treeWalkerCache: + if treeType == "dom": + from . import dom + treeWalkerCache[treeType] = dom.TreeWalker + elif treeType == "genshi": + from . import genshi + treeWalkerCache[treeType] = genshi.TreeWalker + elif treeType == "lxml": + from . import etree_lxml + treeWalkerCache[treeType] = etree_lxml.TreeWalker + elif treeType == "etree": + from . import etree + if implementation is None: + implementation = default_etree + # XXX: NEVER cache here, caching is done in the etree submodule + return etree.getETreeModule(implementation, **kwargs).TreeWalker + return treeWalkerCache.get(treeType) + + +def concatenateCharacterTokens(tokens): + pendingCharacters = [] + for token in tokens: + type = token["type"] + if type in ("Characters", "SpaceCharacters"): + pendingCharacters.append(token["data"]) + else: + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + pendingCharacters = [] + yield token + if pendingCharacters: + yield {"type": "Characters", "data": "".join(pendingCharacters)} + + +def pprint(walker): + """Pretty printer for tree walkers + + Takes a TreeWalker instance and pretty prints the output of walking the tree. + + :arg walker: a TreeWalker instance + + """ + output = [] + indent = 0 + for token in concatenateCharacterTokens(walker): + type = token["type"] + if type in ("StartTag", "EmptyTag"): + # tag name + if token["namespace"] and token["namespace"] != constants.namespaces["html"]: + if token["namespace"] in constants.prefixes: + ns = constants.prefixes[token["namespace"]] + else: + ns = token["namespace"] + name = "%s %s" % (ns, token["name"]) + else: + name = token["name"] + output.append("%s<%s>" % (" " * indent, name)) + indent += 2 + # attributes (sorted for consistent ordering) + attrs = token["data"] + for (namespace, localname), value in sorted(attrs.items()): + if namespace: + if namespace in constants.prefixes: + ns = constants.prefixes[namespace] + else: + ns = namespace + name = "%s %s" % (ns, localname) + else: + name = localname + output.append("%s%s=\"%s\"" % (" " * indent, name, value)) + # self-closing + if type == "EmptyTag": + indent -= 2 + + elif type == "EndTag": + indent -= 2 + + elif type == "Comment": + output.append("%s<!-- %s -->" % (" " * indent, token["data"])) + + elif type == "Doctype": + if token["name"]: + if token["publicId"]: + output.append("""%s<!DOCTYPE %s "%s" "%s">""" % + (" " * indent, + token["name"], + token["publicId"], + token["systemId"] if token["systemId"] else "")) + elif token["systemId"]: + output.append("""%s<!DOCTYPE %s "" "%s">""" % + (" " * indent, + token["name"], + token["systemId"])) + else: + output.append("%s<!DOCTYPE %s>" % (" " * indent, + token["name"])) + else: + output.append("%s<!DOCTYPE >" % (" " * indent,)) + + elif type == "Characters": + output.append("%s\"%s\"" % (" " * indent, token["data"])) + + elif type == "SpaceCharacters": + assert False, "concatenateCharacterTokens should have got rid of all Space tokens" + + else: + raise ValueError("Unknown token type, %s" % type) + + return "\n".join(output) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e0cd5bc203fd044c481fb7ab2ed6f89dfedb4957 GIT binary patch literal 4006 zcmZ`+&2t;K6<;iu%jN3Rs-i@S;~;Jon;lDXKRj_%S5rq)KBkTBsa1QbiNmf4kXmuM zO97z1W|`?UId}XA^dR5To_p$_vZu`S<e8pw%=FM70Ft8YDLDWEybnCQ_wak*M^jUw zgU`Xv!n6M@IL^QIWcVpz@EbI_i;g+F4kOG>NXOlEJEh%H$J_OY!%ECc${l~#H{)_r z=>)q0#y+dG+}&#I?1pTLRhj<{*_~h^oA}1ron(`&g5N0?Ja%f+(VvOq+^3B!Nq9rW zSxU1e?PRQ%a7mk)pt0g2QgPa%YF}i%);?u%v&jWd6>Y~UlMo1%;QSVC@pQzSwRtLO z%)k~mqJ*jp@|oncE1<l=8QnX@3I_q4@fjDP-E}n#cQV=#JW`xSRBNWkQPSqZm=n>I zA5(SO<=RlY?`hV<DpX<<mW6SroA8dd@3MHdcYq_(n=mH<^A0pWwTfX%BTJ98tyx-w zS&_QXBBADn<RXp|n0bSCI1YlnBAmW8+#-@xW(f=yt)AUFWuf4zCsM<e4*Up*zUHOX z@Fjxm)Jnxnv<EFc#p^gjCR7oy_$Zbzs+jGiaU)~Ao|u3n@};X~NKu95Qbnnfm`pL= zjCzTxbM2X8s>RjCF$=%j6>+K_G_<JxRM1LjzeSV(K$kn`&I_lHUq#v#ah@aZ+OD|G zTvkeudHoV`^3s8)NbcNo(k|#8=#M}zgI?|<D|2r|e+0S@dKdHx=zhNpdU-^@4SE3j zIp|f;D}7{gPFUCu#B&w&N$ww1bJ8Ta`&V+{J%&~1VeY&j$lQtOS1|n(uA_W$M%qXs zX%qJ-5^>g(CRcQl4pJ#r`*g1tCu${5sqA&NpTm&ivyR|Vsf1zNL58iH1Wluk%{85@ zIvY*$34Yj%1=0xVBsp|R<a?~*BVJoI+O)>URz0|mqNIll6$!p>H`C;w((5eiTwkX< zP<_%#Rxw-c#A%FQy7lmLI?7~Rz$_i9g`9~mB=6gFiW}p1#8`P*R#JY_&7{r6ks?aD zy(wB^C5hXdB0sojMh#AHw$to5)pzPR6K#5|9k*@SwZCtTX=#kD(<o&$(Wfysj(G!S z>vdTDu&d$@E)yHK`a));84|cHazBPlL_aY@9U&fd#zJ=aq}nGINiN)H(Q7<>e6@8E zrjfC$<LAIty>zadn?0dXFFB=Ax0}QWrvWuSjK;`p<9`cLX>tk=7>Y@+_A!!7uG2O@ zg;&`KFC^_EZ{d)EO5?kMcUD$34rc&MG1|f+qP&F+jV0X&{G=J>z~#m;nJxHWtJklG zwWlZ{&0Yfifg(azqQbY%#&l9oJslB%N@$F!>se8@K_y}a91m&}MLEfixhQ7znJt=b zMvZ-5I96q-Q^l?urD7U#Mp$U@DW-u?+nVQdQ*w$D=Cw)@Xm$Du7SorbTlm(4M*Axo z|L%xI==|ZUHNe~v%EuZYV6B-Yj0?He5o>z~_4-|TC;i}v{jyQ-9{v2bYTj)fh~#I@ zJ0E_ywzJlayZR<86o?hkxO4Xx>M+uarqxj&SSHr?RVTTV#CvPn#z7p`>UCUORj;ph zPelMD-awPr(K&AgM1LpoeYFpW=gyLb4uSr7Xl1kpnoQ8OoIW}EUG8i-&$jw*?lQ9I z^h<e(xouyp=H%SLT4@n@NSwnkC*o7)vGO^|$qT~#zqwBwVszwYbQnGbwu=4Nd6)w{ ztvo0^owGH!2sig55j6k=vY2_?1sIGicq~$pxC-;c9J-n--qz!5W?cBV8gNtL9b|D@ z^9tXTcUfG~tGI?^ipqv$rFGm)@Wc{E#S&^-0|89YMiM*bNpT-^iPw_j5RZh$wX?2A z=FH3^;wPYtJUW3%6>SquCa8Maqm1<3=kCc9g(~+o*>aw{&px$Yg?GK&W2LtLoQU_~ zXK&FFU)f(p4p8G3opxz#1)PF`qGJMH$d}W=j{9Zi=Vgp5i%!#BaQeQXVAl5$IgbUb zn!EE(?rW-!AYvJQ;2_Q=HUX~62~*{~a_+w{RzBPL!u`VS2mNY4%meX#9_W3s|958p z!0hei!C>F&U{5cv4)&WI?w5znlHKv}U&siLO|{_<@ulAXF7`j1$J#X3h*-b0He=TQ zWUQYZXfw7BPhcdk7;SU*<k0b7jOG>{jQ(jPe>9SWFDwoHyy5uPj#8Js(e$j1>Bl4L zcSe5U6?sSw&yy}0jyK0ShPI{ihW3`FHOasO`mBq_;=6{vG?GOOhO*{dZyT=Pv#ZZt z`K79`cfKZnA&2uSVApckYG+R!_U<`eEartm&(0qKh1DtEyr!(02dqYo0kBI8#5+-2 zKMlrTF$RQE6k%OVyJJdFbMRKkdaBz~`c0$pXS}+N*BXmWuM~ixX1le}*ki6Bu6^(r z7hCN_ts>a&bk(UIRrTvfY6vJi4SZ+iWl5K1;pz1=e_7sJmK#41Dl~8z5ICzY%VqiN z>&x=Gcpr;}znwCzs<N4N^waok3R3T_tUwK2S=lHmTUkQ`PZ4x`dr92*jGZlNj;)8A zJAZt%t=Y6P(`^)iJe7)fK4S)b&fa{LbHH~tbD6MVcOB~7FaW0QH+H@QJ3l`A=>MY* zmHSyQVJNgmoVGGWMa;DOQ7EVZNYriphv#hJ59#pPgt>Vt-qQXeVJ$S+Bz*0YaO75r zV+-DlPq-BC8h1%NNI5IYc;|OyF?}D;0->LO+d^cb2%qSeq!|keew1L}2D<QVS`<G1 zmBG*A#~_>77H%p<O)D=)N(m`$=y5g4@J~n^Qk2c})B>=9VvWK=Bj+PD$<R502Z)^m z;D+uJnI^MtK<3aENPvFH!0#l0cpB}h8-mL=GX_xmgYUJ`c-EbSmId%>p4rl@TO$u@ z(?z9TXIZ0OFT#4g*~335Uat#aw<Air^K_>xkM*Qq@2NPE_B8=fL<H<tG+ozW>vMgQ gvD1x?SOoX%Q*lFc$XRrrI}f`i-N5xq;jLiie*{ufhX4Qo literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cfdea8d06811c3dc7b2da224179fb41ffe409a9 GIT binary patch literal 7002 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..201616b3f691f97d3160e6dfe4b6fc24e6b20a7c GIT binary patch literal 1731 zcma)6UvCpf5Z}E!`_9IO5ZsUuD)pgKWmMw+iy9<^2#!H%%LOG)Lsz1wvv)5!XYcIn zp4|k6Cs02}^4PbkAEO^(U)vYn`_!k-oUsj2g;;6kW@qMRemgs}531ENfz@j-Jo~*s z$X~dbEC+=9K>7hNPB@h$p^PRLvl5%x6m^z#k^(D$Y;#8z6PLM^JR-cni?0YT3b*II zv{{L}JEZQthB%~dn=4^Q_vJ7XL7WWwDl;CBN3o9kshJz5aktM!AmdD^Q0h80jt`30 z6#s=yC)A>gfhNlW;XaW59GD=Ca>6W5x%G-L8)3oM83SSk?s5<IMP33xWm9e|A@)Lf zC{!2Y;KE}Ufto=2A7H1nM>5*84lVUbX7?P}7l4XDZshDt>>l`(BI~fI?txbstd}Bd zYOTQEf5ha4b^Kjc1>5DbE9c}T-5}4_Uf8GfZ0^)Pry$wAtLj(a^QRWdK-VJcE;;&n ztm6c}g|TLjK%N@Jx(f6W_|vn6a}pJ%Ij=*`Kf!150+uB}dLu{rH&~Y=x`UB!f)_!= zoIq`;U;mhSDOA3FG7t)SgRuFHt>*6ImfsHAKRsy${?<lIxoB{~fGXppVIqt-7<Odb z-Q>p8Cpr_!CTFE~>uEdxh0QlN*4yjBPOI78-15gd2hFU6`F;%LP_RnthgO~nvlvIl zIy2=k%T(Nf#?i((6epU^?Tc)EqQo{~6-1y1VOQ*KZ<@j=4_1=>ZYX`QF!xPdlb<bD zRS!blJcuR70Gd^rTaRa%-8VZ{ogN+$v4!dO;r9BYsXy~3dgJc;-}_s8e%&#S7BYh3 zKzvicLjZpK{6^GusNcUQje&|sVI~@*P&J~y<U;92q8goE5UlCd^xF~trW*`KUwx59 zYx_MVzl>Jz+-bBMgLrT|PIVSad0TZ?*S^k<LR97yj6}-&s&SAda#hBiMh4yfOWy6e z!TZU|;KW>p3gWppL>9(UmjI6b6d0iuTC?V9#i~$;)@Yd)VP69+YARsy?B`3f@mYB{ z&UBh^s&I7kX~MC>E*tk3W#uSVI?HQcx70PTsv0sZ%9t&JWU3JR;nWk+>3mq}^Tl@o z%$z<f|D{wMXFD-8Yr6kF0C|ySuAjYy;9?18ULOXbJP4IY^DB5C0xZFkspqY?09+`+ z%*n62#tQ<RhafQJAV~UrC{eBi!O<|3V~bjXVCn|4Wn?#z%`PC9@D`K@3`yq#^_D%` zvvaMFFKG}&!)&M^zQW5<HZpumjeDHP6==8o5iw-^WGwjobX#<XO2;EHyTv@-|D`wH S-7)@q*i9Ncsb)bd+W!GpJG6fQ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08eb8d48091ed56124b4f1f4b3b1ad56bb0cfb0e GIT binary patch literal 3538 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88841d8aa27aba7ed227edb23e8e650a279e5512 GIT binary patch literal 6647 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 KDweXP7yb{)9c$_U literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e844f054b5a3a07ed25a8b91fa1ebcd6bdfd0fb GIT binary patch literal 1905 zcmZ`(Uysv95Z_%pj^jAFT*w_<OaG`3NRfchmTM0QA+C2(Rn!ZVi#Te5Twm5XocK>} zy$J`ht4i>U_z0ZTm%gKZgno#9?GrEk0992nV{;T$?OHoKJ2N}`^Uj~I8V!rUm<(6% z->4DtJ8n*f4$O6!=`$dla2k?`Iy7Pqi!?{0C}W`>Rh&w}Yrq?h5mlXPWIAS4b83<0 zScOgpUEQfiwqr*Prx7)sX0+riMJ=ZV`U*F~<*4nnfv<8iJQa1EPPF2zQ1Uh5HEum6 z-16I#)hC*>%ImwNYrg_aq^qeVZ$C}Kx%Ay2nk7OilLw0+4U$;3=5a7exbKF6^o19u zU8*YI4ZO(jR#atoxOsc1wEkdQHSX?w>kc+|`n$I_xB9BOeRFI0{jI*zhyA<5uA$7r z)*b9B1I%%)my)gR&Ecl1p|E7xt#4Fy>*mf*e=vMS5g}FjzL)y17;c!d7fHbTp&$9N zOqCS_m~`fi{B(r>b28BQI?VJe5T7`d6Nhoi*;C?ZT;n>dI<LSx7|I$7-{14XsV_!& zBMyvQ1tvO8IS@{Adh|s`CS;r3KcBM<JWgxk^3i)4c|kLpv10}rE7vmZ4x!}m+#bnT zP7iHZOWPk#Y&rRt?d?7A4_N2`eo&VHM;S7i`f=LTm7e<HSeY~7FM?#As*1mWUssjF z;1?o30Caz5y_pCWp7eVQPxQt~$bFIaBGKEQxb8-}9)G#umq+ew@!2Ig-Z+?u@YC`7 zl`FkrZx+lh1aT_8FuWi}>l>fTLl1?;bm1zVh~5Jkh3jFk-$QH<i>FF^2Y~NEaB=oX znXZco;<^odt~L<DbZS$Rwy8x;4cEt~{(0t$C-x%^ZDBNFnlOv^{t2Rx(R*61<$7Mp zG)bmR{FdqWSZ?Ii%$U&J1j_PSKyvG7Bdfy8Ujl7Cx22ZVrT&D8VP<DmR-Z7Kbj+@j z!%HaPB&(M@h)YdYI9)^UFEdjbQ$xHwx&iU5X0^<O)66Eb7a8MhjYxB<6}+}aGGnS8 z>qWF1S)+*d&wC_p!O2>A^0>%>_*cMgg7?2Oy}+y^=C`+M=^w?dRq+>`wD9CHLvQhq zaIQXOGijh*Sow2+TM-YDePjvUZ5Q3E*a{0)xh^zb|&xdwJih20&<*jA=LBgOf1 zAYYbCvMo=^j$Dze<LcCaTV}Bh-cDy)c~6mx`atOzc7Y`!mVtE72m=;X3zLx-V&SRU z+wxNuv<yt6c;pML9I=9=1H>`?XeJ*Gy#rA#wqPYBY?T4oh2j>7Rdtj^SkwahDO7=f zBn327Q1E0VAI*G$2_ou9Y$TX$0ux6p0a4X?JdKlwaknYfQ20Iy^%&eJeHz4E>D-f^ zqOQ`Uci>b#DMhfKf(iVI_ynw-<xvtZd?9`Ao@nV*(S^V+QWRQAKE&-AAb3Z59SFfZ zhtGgdr%l+kS&Ma`2HNo1tj$VYhqjnSn=o4iMXpJi_IUZ7>L^Qp06i883(>i*vRpSx z_&h}3cHP5y83ET7AHnSfn0EkTPY?ylRp9WoQtW7euqjY7=$=N8<GGv*@F=id3amwe zW={Q0X^#@|CYTubB6?*IFfK)${x=+DOo_l|pla~0m>M!I5~55E#PMH{m3g)N(`%S{ QDT41Xo1Uc~Gn=)v*WT&RqW}N^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 000000000..f82984bdd --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/base.py @@ -0,0 +1,252 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node +from ..constants import namespaces, voidElements, spaceCharacters + +__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN", + "TreeWalker", "NonRecursiveTreeWalker"] + +DOCUMENT = Node.DOCUMENT_NODE +DOCTYPE = Node.DOCUMENT_TYPE_NODE +TEXT = Node.TEXT_NODE +ELEMENT = Node.ELEMENT_NODE +COMMENT = Node.COMMENT_NODE +ENTITY = Node.ENTITY_NODE +UNKNOWN = "<#UNKNOWN#>" + +spaceCharacters = "".join(spaceCharacters) + + +class TreeWalker(object): + """Walks a tree yielding tokens + + Tokens are dicts that all have a ``type`` field specifying the type of the + token. + + """ + def __init__(self, tree): + """Creates a TreeWalker + + :arg tree: the tree to walk + + """ + self.tree = tree + + def __iter__(self): + raise NotImplementedError + + def error(self, msg): + """Generates an error token with the given message + + :arg msg: the error message + + :returns: SerializeError token + + """ + return {"type": "SerializeError", "data": msg} + + def emptyTag(self, namespace, name, attrs, hasChildren=False): + """Generates an EmptyTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :arg hasChildren: whether or not to yield a SerializationError because + this tag shouldn't have children + + :returns: EmptyTag token + + """ + yield {"type": "EmptyTag", "name": name, + "namespace": namespace, + "data": attrs} + if hasChildren: + yield self.error("Void element has children") + + def startTag(self, namespace, name, attrs): + """Generates a StartTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :arg attrs: the attributes of the element as a dict + + :returns: StartTag token + + """ + return {"type": "StartTag", + "name": name, + "namespace": namespace, + "data": attrs} + + def endTag(self, namespace, name): + """Generates an EndTag token + + :arg namespace: the namespace of the token--can be ``None`` + + :arg name: the name of the element + + :returns: EndTag token + + """ + return {"type": "EndTag", + "name": name, + "namespace": namespace} + + def text(self, data): + """Generates SpaceCharacters and Characters tokens + + Depending on what's in the data, this generates one or more + ``SpaceCharacters`` and ``Characters`` tokens. + + For example: + + >>> from html5lib.treewalkers.base import TreeWalker + >>> # Give it an empty tree just so it instantiates + >>> walker = TreeWalker([]) + >>> list(walker.text('')) + [] + >>> list(walker.text(' ')) + [{u'data': ' ', u'type': u'SpaceCharacters'}] + >>> list(walker.text(' abc ')) # doctest: +NORMALIZE_WHITESPACE + [{u'data': ' ', u'type': u'SpaceCharacters'}, + {u'data': u'abc', u'type': u'Characters'}, + {u'data': u' ', u'type': u'SpaceCharacters'}] + + :arg data: the text data + + :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens + + """ + data = data + middle = data.lstrip(spaceCharacters) + left = data[:len(data) - len(middle)] + if left: + yield {"type": "SpaceCharacters", "data": left} + data = middle + middle = data.rstrip(spaceCharacters) + right = data[len(middle):] + if middle: + yield {"type": "Characters", "data": middle} + if right: + yield {"type": "SpaceCharacters", "data": right} + + def comment(self, data): + """Generates a Comment token + + :arg data: the comment + + :returns: Comment token + + """ + return {"type": "Comment", "data": data} + + def doctype(self, name, publicId=None, systemId=None): + """Generates a Doctype token + + :arg name: + + :arg publicId: + + :arg systemId: + + :returns: the Doctype token + + """ + return {"type": "Doctype", + "name": name, + "publicId": publicId, + "systemId": systemId} + + def entity(self, name): + """Generates an Entity token + + :arg name: the entity name + + :returns: an Entity token + + """ + return {"type": "Entity", "name": name} + + def unknown(self, nodeType): + """Handles unknown node types""" + return self.error("Unknown node type: " + nodeType) + + +class NonRecursiveTreeWalker(TreeWalker): + def getNodeDetails(self, node): + raise NotImplementedError + + def getFirstChild(self, node): + raise NotImplementedError + + def getNextSibling(self, node): + raise NotImplementedError + + def getParentNode(self, node): + raise NotImplementedError + + def __iter__(self): + currentNode = self.tree + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + hasChildren = False + + if type == DOCTYPE: + yield self.doctype(*details) + + elif type == TEXT: + for token in self.text(*details): + yield token + + elif type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (not namespace or namespace == namespaces["html"]) and name in voidElements: + for token in self.emptyTag(namespace, name, attributes, + hasChildren): + yield token + hasChildren = False + else: + yield self.startTag(namespace, name, attributes) + + elif type == COMMENT: + yield self.comment(details[0]) + + elif type == ENTITY: + yield self.entity(details[0]) + + elif type == DOCUMENT: + hasChildren = True + + else: + yield self.unknown(details[0]) + + if hasChildren: + firstChild = self.getFirstChild(currentNode) + else: + firstChild = None + + if firstChild is not None: + currentNode = firstChild + else: + while currentNode is not None: + details = self.getNodeDetails(currentNode) + type, details = details[0], details[1:] + if type == ELEMENT: + namespace, name, attributes, hasChildren = details + if (namespace and namespace != namespaces["html"]) or name not in voidElements: + yield self.endTag(namespace, name) + if self.tree is currentNode: + currentNode = None + break + nextSibling = self.getNextSibling(currentNode) + if nextSibling is not None: + currentNode = nextSibling + break + else: + currentNode = self.getParentNode(currentNode) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 000000000..b3e275334 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/dom.py @@ -0,0 +1,43 @@ +from __future__ import absolute_import, division, unicode_literals + +from xml.dom import Node + +from . import base + + +class TreeWalker(base.NonRecursiveTreeWalker): + def getNodeDetails(self, node): + if node.nodeType == Node.DOCUMENT_TYPE_NODE: + return base.DOCTYPE, node.name, node.publicId, node.systemId + + elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE): + return base.TEXT, node.nodeValue + + elif node.nodeType == Node.ELEMENT_NODE: + attrs = {} + for attr in list(node.attributes.keys()): + attr = node.getAttributeNode(attr) + if attr.namespaceURI: + attrs[(attr.namespaceURI, attr.localName)] = attr.value + else: + attrs[(None, attr.name)] = attr.value + return (base.ELEMENT, node.namespaceURI, node.nodeName, + attrs, node.hasChildNodes()) + + elif node.nodeType == Node.COMMENT_NODE: + return base.COMMENT, node.nodeValue + + elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE): + return (base.DOCUMENT,) + + else: + return base.UNKNOWN, node.nodeType + + def getFirstChild(self, node): + return node.firstChild + + def getNextSibling(self, node): + return node.nextSibling + + def getParentNode(self, node): + return node.parentNode diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 000000000..1a35add60 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import, division, unicode_literals + +from collections import OrderedDict +import re + +from pip._vendor.six import string_types + +from . import base +from .._utils import moduleFactoryFactory + +tag_regexp = re.compile("{([^}]*)}(.*)") + + +def getETreeBuilder(ElementTreeImplementation): + ElementTree = ElementTreeImplementation + ElementTreeCommentType = ElementTree.Comment("asd").tag + + class TreeWalker(base.NonRecursiveTreeWalker): # pylint:disable=unused-variable + """Given the particular ElementTree representation, this implementation, + to avoid using recursion, returns "nodes" as tuples with the following + content: + + 1. The current element + + 2. The index of the element relative to its parent + + 3. A stack of ancestor elements + + 4. A flag "text", "tail" or None to indicate if the current node is a + text node; either the text or tail of the current element (1) + """ + def getNodeDetails(self, node): + if isinstance(node, tuple): # It might be the root Element + elt, _, _, flag = node + if flag in ("text", "tail"): + return base.TEXT, getattr(elt, flag) + else: + node = elt + + if not(hasattr(node, "tag")): + node = node.getroot() + + if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"): + return (base.DOCUMENT,) + + elif node.tag == "<!DOCTYPE>": + return (base.DOCTYPE, node.text, + node.get("publicId"), node.get("systemId")) + + elif node.tag == ElementTreeCommentType: + return base.COMMENT, node.text + + else: + assert isinstance(node.tag, string_types), type(node.tag) + # This is assumed to be an ordinary element + match = tag_regexp.match(node.tag) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = node.tag + attrs = OrderedDict() + for name, value in list(node.attrib.items()): + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, tag, + attrs, len(node) or node.text) + + def getFirstChild(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + element, key, parents, flag = node, None, [], None + + if flag in ("text", "tail"): + return None + else: + if element.text: + return element, key, parents, "text" + elif len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + + def getNextSibling(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if len(element): + parents.append(element) + return element[0], 0, parents, None + else: + return None + else: + if element.tail and flag != "tail": + return element, key, parents, "tail" + elif key < len(parents[-1]) - 1: + return parents[-1][key + 1], key + 1, parents, None + else: + return None + + def getParentNode(self, node): + if isinstance(node, tuple): + element, key, parents, flag = node + else: + return None + + if flag == "text": + if not parents: + return element + else: + return element, key, parents, None + else: + parent = parents.pop() + if not parents: + return parent + else: + assert list(parents[-1]).count(parent) == 1 + return parent, list(parents[-1]).index(parent), parents, None + + return locals() + +getETreeModule = moduleFactoryFactory(getETreeBuilder) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 000000000..f6f395a50 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py @@ -0,0 +1,213 @@ +from __future__ import absolute_import, division, unicode_literals +from pip._vendor.six import text_type + +from lxml import etree +from ..treebuilders.etree import tag_regexp + +from . import base + +from .. import _ihatexml + + +def ensure_str(s): + if s is None: + return None + elif isinstance(s, text_type): + return s + else: + return s.decode("ascii", "strict") + + +class Root(object): + def __init__(self, et): + self.elementtree = et + self.children = [] + + try: + if et.docinfo.internalDTD: + self.children.append(Doctype(self, + ensure_str(et.docinfo.root_name), + ensure_str(et.docinfo.public_id), + ensure_str(et.docinfo.system_url))) + except AttributeError: + pass + + try: + node = et.getroot() + except AttributeError: + node = et + + while node.getprevious() is not None: + node = node.getprevious() + while node is not None: + self.children.append(node) + node = node.getnext() + + self.text = None + self.tail = None + + def __getitem__(self, key): + return self.children[key] + + def getnext(self): + return None + + def __len__(self): + return 1 + + +class Doctype(object): + def __init__(self, root_node, name, public_id, system_id): + self.root_node = root_node + self.name = name + self.public_id = public_id + self.system_id = system_id + + self.text = None + self.tail = None + + def getnext(self): + return self.root_node.children[1] + + +class FragmentRoot(Root): + def __init__(self, children): + self.children = [FragmentWrapper(self, child) for child in children] + self.text = self.tail = None + + def getnext(self): + return None + + +class FragmentWrapper(object): + def __init__(self, fragment_root, obj): + self.root_node = fragment_root + self.obj = obj + if hasattr(self.obj, 'text'): + self.text = ensure_str(self.obj.text) + else: + self.text = None + if hasattr(self.obj, 'tail'): + self.tail = ensure_str(self.obj.tail) + else: + self.tail = None + + def __getattr__(self, name): + return getattr(self.obj, name) + + def getnext(self): + siblings = self.root_node.children + idx = siblings.index(self) + if idx < len(siblings) - 1: + return siblings[idx + 1] + else: + return None + + def __getitem__(self, key): + return self.obj[key] + + def __bool__(self): + return bool(self.obj) + + def getparent(self): + return None + + def __str__(self): + return str(self.obj) + + def __unicode__(self): + return str(self.obj) + + def __len__(self): + return len(self.obj) + + +class TreeWalker(base.NonRecursiveTreeWalker): + def __init__(self, tree): + # pylint:disable=redefined-variable-type + if isinstance(tree, list): + self.fragmentChildren = set(tree) + tree = FragmentRoot(tree) + else: + self.fragmentChildren = set() + tree = Root(tree) + base.NonRecursiveTreeWalker.__init__(self, tree) + self.filter = _ihatexml.InfosetFilter() + + def getNodeDetails(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + return base.TEXT, ensure_str(getattr(node, key)) + + elif isinstance(node, Root): + return (base.DOCUMENT,) + + elif isinstance(node, Doctype): + return base.DOCTYPE, node.name, node.public_id, node.system_id + + elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"): + return base.TEXT, ensure_str(node.obj) + + elif node.tag == etree.Comment: + return base.COMMENT, ensure_str(node.text) + + elif node.tag == etree.Entity: + return base.ENTITY, ensure_str(node.text)[1:-1] # strip &; + + else: + # This is assumed to be an ordinary element + match = tag_regexp.match(ensure_str(node.tag)) + if match: + namespace, tag = match.groups() + else: + namespace = None + tag = ensure_str(node.tag) + attrs = {} + for name, value in list(node.attrib.items()): + name = ensure_str(name) + value = ensure_str(value) + match = tag_regexp.match(name) + if match: + attrs[(match.group(1), match.group(2))] = value + else: + attrs[(None, name)] = value + return (base.ELEMENT, namespace, self.filter.fromXmlName(tag), + attrs, len(node) > 0 or node.text) + + def getFirstChild(self, node): + assert not isinstance(node, tuple), "Text nodes have no children" + + assert len(node) or node.text, "Node has no children" + if node.text: + return (node, "text") + else: + return node[0] + + def getNextSibling(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + # XXX: we cannot use a "bool(node) and node[0] or None" construct here + # because node[0] might evaluate to False if it has no child element + if len(node): + return node[0] + else: + return None + else: # tail + return node.getnext() + + return (node, "tail") if node.tail else node.getnext() + + def getParentNode(self, node): + if isinstance(node, tuple): # Text node + node, key = node + assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key + if key == "text": + return node + # else: fallback to "normal" processing + elif node in self.fragmentChildren: + return None + + return node.getparent() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 000000000..42cd55932 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py @@ -0,0 +1,69 @@ +from __future__ import absolute_import, division, unicode_literals + +from genshi.core import QName +from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT +from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT + +from . import base + +from ..constants import voidElements, namespaces + + +class TreeWalker(base.TreeWalker): + def __iter__(self): + # Buffer the events so we can pass in the following one + previous = None + for event in self.tree: + if previous is not None: + for token in self.tokens(previous, event): + yield token + previous = event + + # Don't forget the final event! + if previous is not None: + for token in self.tokens(previous, None): + yield token + + def tokens(self, event, next): + kind, data, _ = event + if kind == START: + tag, attribs = data + name = tag.localname + namespace = tag.namespace + converted_attribs = {} + for k, v in attribs: + if isinstance(k, QName): + converted_attribs[(k.namespace, k.localname)] = v + else: + converted_attribs[(None, k)] = v + + if namespace == namespaces["html"] and name in voidElements: + for token in self.emptyTag(namespace, name, converted_attribs, + not next or next[0] != END or + next[1] != tag): + yield token + else: + yield self.startTag(namespace, name, converted_attribs) + + elif kind == END: + name = data.localname + namespace = data.namespace + if namespace != namespaces["html"] or name not in voidElements: + yield self.endTag(namespace, name) + + elif kind == COMMENT: + yield self.comment(data) + + elif kind == TEXT: + for token in self.text(data): + yield token + + elif kind == DOCTYPE: + yield self.doctype(*data) + + elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS, + START_CDATA, END_CDATA, PI): + pass + + else: + yield self.unknown(kind) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py new file mode 100644 index 000000000..4ed56a1d4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acc9ef0fe0571dfee99377e4f90ce2f03160754a GIT binary patch literal 266 zcmXv|%Sr?>5KLwlk#+Yf{=x{m@ijOLi-;fK#W@Mm#7Sn!m`P$!4ERa@(p)|H3!dyO z*ih9~-B8rSYPDcAeRKM<qy3%D{}d$d3F8@&Vv1Wf@Mq4mE^N^-HG5*^{D;%K<kJa2 z(l{FL0Lb$5$8t6;gKXdAUW1ZRVosdqtw;UE@QBQTew_$tl8jm;iK6pXQH~f;y!HU~ zSh?GzZdwTG>LPaazDIl6Roks-L@;4(+!&>`Yiz6fI=;(%Jb>yr<xv>rqyR9^M1W2B SoQ`*cS07g2<>q59wd8*V&qtjA literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5654ee2ff04e9d0deedb5e91a86ef382bc193f5 GIT binary patch literal 3073 zcmc(h&yy2H6vwCMcV@HMCE_B8xWL6w#fG27QYE;;QWlpS1f?8{ni{4j>x9W9yq>JG zPAH3TRR4zTQO_RrAL;VOi4%7(`d-gwv%e73gOlnv-LE_S^YgwvH)dx&4WG{4h5KL3 zYT9!uOdbm}E11L>4c9nJwJ!5nSNHX<;Tv7kH@lW^F^%ioNNwL%Z^w6HXY6uwllhfT zG;VSGna1td?sy}^_t4{T7d<X|X3$ebPlbEv@z67io*H^)cojX>n0#|1)1O1%EU%%j zrhN10o9A<U{+Z?<;>I1Vap(oZX*Mir$63_lv9x(yzQZ(p5U0`}l<&&z)z-(i0DABO z|Dd%7RkU9&J^$|M%U^$d`P=6Gh}@IMz|0CJv4|$te8x3j$0gvBpE2LyxKM6k&g3>u zq9U!EICdm$kwX&Y5&fMWdYhPTViHSe3Z1iu1}x;bdt+AUn{33MvVw^dw3=Kmu$&uY z+d6h^wxELl+F1N76N7%g2YJjFV_L-GS7FA}BwJfN_3gRgsfI2!aIk5^1RGz{Zug)Y z=Acu-NaL(wNK?dVTbew~L)<RvMf{|}Jhu4bVY3g(dYH$}^$?ovUdm$-%`P+_bb?@6 zT+Xhn^Gi|CU%zlJZ!fQPAU)r{eD!McZnK~C&nB73!!$h$(dFff`J<4WDh2Ct#(U6A zcosJ4SfZu=V>KsQmQWDtF01J#Gxd$C+Qg;uApeg&1e(y!ZG;(e&?y4p(l7v{MS~id zIWn|)r8z`7YWWtXSFEf=v(;egR3|S>x<QbI-8cxO7X;lNAEcD82En62n3gqa)5@7l z$5c5ru#1Dz@e88O)jbc$6JgqZh=dhP;xL+Rq#4&SmJAh3rmWx2B8a<jhR1nJ#S=u- zBRzCtqz#JYUoi7JmdD8PCL5aE99o45pBET1M>Vm^Z7Or?nwHfILn!|>japF6nl`k# zGjzVWP?)RQ{WC+iu*YU@748UoV_M<B(*m{RiZ*l#C%4H@`A7U7>dn|G>`hi!N3a)F zYn8PHmQ+Ml-aMkFG^pH*Kk<=lN$~+nbzBu|3KBUV46=j}4|p#Z0mRZ0{WQs?9rpVe z1wi|#D3WHUmt>8~9+srlPO=aMOX-!6)f~cvBAhyuHpF6(<`~1t26nC5?4eKAf(L_k zJBFZ)pc6QtIEO}KlMwS51{#)B(rqeH=rNDglyBasu`1g*xgUe2-F>%EXX>;dq8*4R zI7Q|lHs8jI_b>?}&}Bg7|3v1hQutSp`8)RhIx-8?*pUvGa&v5zjAqA?Bvjp@QeSS4 zbR><9Ep91-6|wLHsdbRxlv|2mXNzFvR|G$y8bz?XhhQgncM$wD5?t9LxUx;~_eiic z_I43mDfSZV{TqU%6^bZH;0W$c$@K!|NHR*4XLg|MB|<5B7RA!pq8i?zrbp3811~u^ zMn#eXg*3d2xqU>#ajK`I2VxQ4C$mWAB$+8IBw<r}OO^ZxePS8SHob<&s)mcKdWzY< zp;+HX@fI@M6i<|RAH^TwfIDV3RoK&5aUIiyVk+;Vm=s}!8qiHK)mOa5by>ZWLmYPR zL6XPN!fRwt>`b>}I$#64S)=~8!iLKKbihyJ5HIpK9PkVd(AhB{m3IwDH^5D5u!ttt zI*hYiA88#!S=8v<&XIGj|KQ-Njg~a&-fuY4q&sYSgUNa_y=F?Sf?dAybU;>-G~BkY z)wWGa=)pDNH<ztGD1@x2&xYF>e(}(yHyuYQ4V)$)Z645q4mw*ovlin(Yk2L!<1RK5 zbP5_OqRwpm>FNg;(buR;GwQ*P#gw|PB7r`<;5-_sqx?HjuiH=3xQrZ{nLKtw>2u8Y u>#LgUfep6M-MbE&&4G(?KP<l>t`m@gKs%0#kKY7(eW8A`-Z*R=HvR(P2$Zz| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f1b7a0cb2a566118c58f0702873862c3e588be6d GIT binary patch literal 626 zcma)4!D`z;5Z#q6TMo&o(6g>CN!LkZ;y?&Z(;j@$CF-RRjG|c=nbq!gv=OxQ)bwZi zOS<;ddrmoZM#fMIg$~TTS?%oO&5Yh09PA0QP5%7$k?<!Ub{0|cn!Gur00N{D`4%N% z1cUG5Lj*&J2?sEOG2sxB8!?^ylJsOMJNcsIjE#{QugRN)LJ(iYgQRMiQRPV6(t)Nd zHpQJbKLo~9^kkIBsx5+6ZGmd-3}|drjp}Z*S}mHnJ!|2#T>1877S@Z88#Kr3`T4oZ zm9P9!Wt&hKbA;u5@hW^O_+#&@R$FkWDzJqrUG0nT(tqy8xx2c#UM`0$lGO@{V~YRX z1?X)T$P9f4+c2VIH_6?5TX6w%?)WGF<lm>8Ky!bP-y{f{RFr)=T)xe&(v#V2k%H4r zYF$Y0LuIN)r?#lIN9|LOF1XSen&z|2g=OuHuC)ys-XS{V#Wa75OLnjMhuCRj1=%$2 qhNVN@#Voz-2ZF2``T7qYUKsYBCKt7Xd!sLT>;1M9nMBDT8T<y7?}yR= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daf82d54b8b412ec0a7c05c45cefe8db82956749 GIT binary patch literal 8892 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 B2HXGu literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64ad93466ea6d4642b055d141f04542e1f0550de GIT binary patch literal 17256 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 RXJCjc_6F<3AIo9~{0ABBAPoQj literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..101f220ab33ce4cf5edaf51ca9e2b75b635ded11 GIT binary patch literal 1806 zcmZuxTTdJ}6t+Dx%Vq#6mo|V}rB*6ctVDK!6qQuuqBKfhA}S?Fl~AK$7<-q2S$nX( z3q-TZ1MORXMDp0bG_QT)FZ6|;<KdD<^~ks5bDQs6p3lz41jhc>-M8@+A%ElLaxgeN zgK3vx5oDVPDp*0csR%^)JK1I;5-r#RF(ulthvJ5aVUGlRLpsyx4N6G-b3T@er@Y9m z<GRmt<>WvbyTpg7kbG1kadA(VvOg+{lMb-jVOkVijfT6@;A^4PfSZxBF<dgOtjtCZ z)PABX)5CJ)BnTT>8fm3+smrxOaknRVUz=gPxM*E!+{zM{O00C2cynL%_tg&XcDtP} z-`Ycel|2IED0(=O)~mXIlv;kwFVx4m^3U4jgIuMB|G}sC!6)wWq2#|T7J9Jwt@pdr z>BeV(A=%6T5<gn70^Z~&nD$Rt9I41DozMZ9FhM85v2oO~ik`yvg1p_GgjFcm9BF6= z#Js9#6)q55k-k6#n<od%ygIxGv;b+%%O7lkOrnZ?2wYf2A^@34P~@K@r|cu8z&8mF z@BK;~aGg?!U6_6aj=sKx@_)j|0Skzf1awp;5oVLBfwVuy9L5FG$+CwwS-!$LX~0hq zeS~|7+flX$K&I|LXnHM|slrnuxjarYSDXNswi3c{E$4%p<b2~XkT)>4aDjkxt04|~ zH}=Y2d-obuD$_y=`~{n<L2;c(7a74fHu%F;UZE~<QE7*~Zd4Z1cD=T<a~NkBOoL0O zRky4*PKrA6IMhKQRozO<5>(W)34jD9ljbe*nm{JPqDboLMl``&-D+^G<06H(Ba=H> z)4ZO|M#ex^H!A)j<|df^NB2sTk5eam<J9!}x)4xVy`kyt?kCB*T~j}d#rIiKj#rmm ze|@lTik1G_qes21UYVB<as|*8#RHSAtv_^!DH8ompk#$My<DiY2T^ET>Xs+<ovT~Y zH+tw@#s*^V!a~|@8p3y*-lX%C(J$!Nw9U+Ic*(Gr;J_WH&-)oTRM1tPKo&nIkaukJ zj04U8T!+<>4{aTQH=fiiw~(U^%QrBsS4{o=s<<#D0ZeZMfkGosab?d)ADdIKY3=~M zK(6!m=kJ3Ho3y6pGgA;fA+Mu%A0#e~&cXTW&#;<9nBM3+IABE!ddeou(GO6`75m60 z0aPYE2+gJonkt=#$~~pOu}KIu8djhpAP3aEtRkrKO%+n2LJ_<n6;?0w0-%l?*(<pg z%0cCikxzv1d(pecFQk)Zm@7!`KHq_`B|E$i(YDw%HP`TP(HooSV&mFrjyqkS)CR%X zdfACQxOHnchsNvb>1Iy~*>?sJFxbmFQ+0?&492u>`3z6$pwzYwkrV17AMClBCZEH5 z>pG>Nx4Se~-+_uIp;%03f;J@5JPp|lq!lKZ;b^Z_PbG=aS(2D}xce;gjy66a&nK2J d2@EDq-QE~#F)HK}^x9(XhOEunU$%pG_%9F{*W&;H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..991b31d8161a9c1d9cdea13efafe49083a6be878 GIT binary patch literal 220 zcmXv|K?=e!5KQ$VidTJuhZ?O`TM!W+;6+b@gxIu_8q>Im0sWC*^6D=<xfL9k+1+7a zcHQl^38LKf4t<>O`uHQjWregY6hZbx1Y0s_JetvPwiyJk4r4wCD=W>|lRyJgKluPP zAU$_E^&DtXDS<J10eUPMOKhy?UQ9D)d^B=Jaw<WMi#Sc`jv8q~sjcHmg^<O`#9eu9 k{)lZ_R6wQBX!7jLPdO9Z@u9iDT8m31ZYp2aUt1*k0ur4(KmY&$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..227c6d33857d166c81c761fb1e00e951cf3e72f0 GIT binary patch literal 164492 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 BhBE*F literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py new file mode 100644 index 000000000..65b06e208 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/codec.py @@ -0,0 +1,118 @@ +from .core import encode, decode, alabel, ulabel, IDNAError +import codecs +import re + +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +class Codec(codecs.Codec): + + def encode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return "", 0 + + return encode(data), len(data) + + def decode(self, data, errors='strict'): + + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return u"", 0 + + return decode(data), len(data) + +class IncrementalEncoder(codecs.BufferedIncrementalEncoder): + def _buffer_encode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return ("", 0) + + labels = _unicode_dots_re.split(data) + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = '.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = '.' + + result = [] + size = 0 + for label in labels: + result.append(alabel(label)) + if size: + size += 1 + size += len(label) + + # Join with U+002E + result = ".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + +class IncrementalDecoder(codecs.BufferedIncrementalDecoder): + def _buffer_decode(self, data, errors, final): + if errors != 'strict': + raise IDNAError("Unsupported error handling \"{0}\"".format(errors)) + + if not data: + return (u"", 0) + + # IDNA allows decoding to operate on Unicode strings, too. + if isinstance(data, unicode): + labels = _unicode_dots_re.split(data) + else: + # Must be ASCII string + data = str(data) + unicode(data, "ascii") + labels = data.split(".") + + trailing_dot = u'' + if labels: + if not labels[-1]: + trailing_dot = u'.' + del labels[-1] + elif not final: + # Keep potentially unfinished label until the next call + del labels[-1] + if labels: + trailing_dot = u'.' + + result = [] + size = 0 + for label in labels: + result.append(ulabel(label)) + if size: + size += 1 + size += len(label) + + result = u".".join(result) + trailing_dot + size += len(trailing_dot) + return (result, size) + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + +class StreamReader(Codec, codecs.StreamReader): + pass + +def getregentry(): + return codecs.CodecInfo( + name='idna', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamwriter=StreamWriter, + streamreader=StreamReader, + ) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py new file mode 100644 index 000000000..f4d3f6dea --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/compat.py @@ -0,0 +1,12 @@ +from .core import * +from .codec import * + +def ToASCII(label): + return encode(label) + +def ToUnicode(label): + return decode(label) + +def nameprep(s): + raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/core.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/core.py new file mode 100644 index 000000000..944ff98cd --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/core.py @@ -0,0 +1,387 @@ +from . import idnadata +import bisect +import unicodedata +import re +import sys +from .intranges import intranges_contain + +_virama_combining_class = 9 +_alabel_prefix = b'xn--' +_unicode_dots_re = re.compile(u'[\u002e\u3002\uff0e\uff61]') + +if sys.version_info[0] == 3: + unicode = str + unichr = chr + +class IDNAError(UnicodeError): + """ Base exception for all IDNA-encoding related problems """ + pass + + +class IDNABidiError(IDNAError): + """ Exception when bidirectional requirements are not satisfied """ + pass + + +class InvalidCodepoint(IDNAError): + """ Exception when a disallowed or unallocated codepoint is used """ + pass + + +class InvalidCodepointContext(IDNAError): + """ Exception when the codepoint is not valid in the context it is used """ + pass + + +def _combining_class(cp): + return unicodedata.combining(unichr(cp)) + +def _is_script(cp, script): + return intranges_contain(ord(cp), idnadata.scripts[script]) + +def _punycode(s): + return s.encode('punycode') + +def _unot(s): + return 'U+{0:04X}'.format(s) + + +def valid_label_length(label): + + if len(label) > 63: + return False + return True + + +def valid_string_length(label, trailing_dot): + + if len(label) > (254 if trailing_dot else 253): + return False + return True + + +def check_bidi(label, check_ltr=False): + + # Bidi rules should only be applied if string contains RTL characters + bidi_label = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + if direction == '': + # String likely comes from a newer version of Unicode + raise IDNABidiError('Unknown directionality in label {0} at position {1}'.format(repr(label), idx)) + if direction in ['R', 'AL', 'AN']: + bidi_label = True + break + if not bidi_label and not check_ltr: + return True + + # Bidi rule 1 + direction = unicodedata.bidirectional(label[0]) + if direction in ['R', 'AL']: + rtl = True + elif direction == 'L': + rtl = False + else: + raise IDNABidiError('First codepoint in label {0} must be directionality L, R or AL'.format(repr(label))) + + valid_ending = False + number_type = False + for (idx, cp) in enumerate(label, 1): + direction = unicodedata.bidirectional(cp) + + if rtl: + # Bidi rule 2 + if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a right-to-left label'.format(idx)) + # Bidi rule 3 + if direction in ['R', 'AL', 'EN', 'AN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + # Bidi rule 4 + if direction in ['AN', 'EN']: + if not number_type: + number_type = direction + else: + if number_type != direction: + raise IDNABidiError('Can not mix numeral types in a right-to-left label') + else: + # Bidi rule 5 + if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']: + raise IDNABidiError('Invalid direction for codepoint at position {0} in a left-to-right label'.format(idx)) + # Bidi rule 6 + if direction in ['L', 'EN']: + valid_ending = True + elif direction != 'NSM': + valid_ending = False + + if not valid_ending: + raise IDNABidiError('Label ends with illegal codepoint directionality') + + return True + + +def check_initial_combiner(label): + + if unicodedata.category(label[0])[0] == 'M': + raise IDNAError('Label begins with an illegal combining character') + return True + + +def check_hyphen_ok(label): + + if label[2:4] == '--': + raise IDNAError('Label has disallowed hyphens in 3rd and 4th position') + if label[0] == '-' or label[-1] == '-': + raise IDNAError('Label must not start or end with a hyphen') + return True + + +def check_nfc(label): + + if unicodedata.normalize('NFC', label) != label: + raise IDNAError('Label must be in Normalization Form C') + + +def valid_contextj(label, pos): + + cp_value = ord(label[pos]) + + if cp_value == 0x200c: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + + ok = False + for i in range(pos-1, -1, -1): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('L'), ord('D')]: + ok = True + break + + if not ok: + return False + + ok = False + for i in range(pos+1, len(label)): + joining_type = idnadata.joining_types.get(ord(label[i])) + if joining_type == ord('T'): + continue + if joining_type in [ord('R'), ord('D')]: + ok = True + break + return ok + + if cp_value == 0x200d: + + if pos > 0: + if _combining_class(ord(label[pos - 1])) == _virama_combining_class: + return True + return False + + else: + + return False + + +def valid_contexto(label, pos, exception=False): + + cp_value = ord(label[pos]) + + if cp_value == 0x00b7: + if 0 < pos < len(label)-1: + if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c: + return True + return False + + elif cp_value == 0x0375: + if pos < len(label)-1 and len(label) > 1: + return _is_script(label[pos + 1], 'Greek') + return False + + elif cp_value == 0x05f3 or cp_value == 0x05f4: + if pos > 0: + return _is_script(label[pos - 1], 'Hebrew') + return False + + elif cp_value == 0x30fb: + for cp in label: + if cp == u'\u30fb': + continue + if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'): + return True + return False + + elif 0x660 <= cp_value <= 0x669: + for cp in label: + if 0x6f0 <= ord(cp) <= 0x06f9: + return False + return True + + elif 0x6f0 <= cp_value <= 0x6f9: + for cp in label: + if 0x660 <= ord(cp) <= 0x0669: + return False + return True + + +def check_label(label): + + if isinstance(label, (bytes, bytearray)): + label = label.decode('utf-8') + if len(label) == 0: + raise IDNAError('Empty Label') + + check_nfc(label) + check_hyphen_ok(label) + check_initial_combiner(label) + + for (pos, cp) in enumerate(label): + cp_value = ord(cp) + if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']): + continue + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']): + if not valid_contextj(label, pos): + raise InvalidCodepointContext('Joiner {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']): + if not valid_contexto(label, pos): + raise InvalidCodepointContext('Codepoint {0} not allowed at position {1} in {2}'.format(_unot(cp_value), pos+1, repr(label))) + else: + raise InvalidCodepoint('Codepoint {0} at position {1} of {2} not allowed'.format(_unot(cp_value), pos+1, repr(label))) + + check_bidi(label) + + +def alabel(label): + + try: + label = label.encode('ascii') + try: + ulabel(label) + except IDNAError: + raise IDNAError('The label {0} is not a valid A-label'.format(label)) + if not valid_label_length(label): + raise IDNAError('Label too long') + return label + except UnicodeEncodeError: + pass + + if not label: + raise IDNAError('No Input') + + label = unicode(label) + check_label(label) + label = _punycode(label) + label = _alabel_prefix + label + + if not valid_label_length(label): + raise IDNAError('Label too long') + + return label + + +def ulabel(label): + + if not isinstance(label, (bytes, bytearray)): + try: + label = label.encode('ascii') + except UnicodeEncodeError: + check_label(label) + return label + + label = label.lower() + if label.startswith(_alabel_prefix): + label = label[len(_alabel_prefix):] + else: + check_label(label) + return label.decode('ascii') + + label = label.decode('punycode') + check_label(label) + return label + + +def uts46_remap(domain, std3_rules=True, transitional=False): + """Re-map the characters in the string according to UTS46 processing.""" + from .uts46data import uts46data + output = u"" + try: + for pos, char in enumerate(domain): + code_point = ord(char) + uts46row = uts46data[code_point if code_point < 256 else + bisect.bisect_left(uts46data, (code_point, "Z")) - 1] + status = uts46row[1] + replacement = uts46row[2] if len(uts46row) == 3 else None + if (status == "V" or + (status == "D" and not transitional) or + (status == "3" and std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and std3_rules) or + (status == "D" and transitional)): + output += replacement + elif status != "I": + raise IndexError() + return unicodedata.normalize("NFC", output) + except IndexError: + raise InvalidCodepoint( + "Codepoint {0} not allowed at position {1} in {2}".format( + _unot(code_point), pos + 1, repr(domain))) + + +def encode(s, strict=False, uts46=False, std3_rules=False, transitional=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, transitional) + trailing_dot = False + result = [] + if strict: + labels = s.split('.') + else: + labels = _unicode_dots_re.split(s) + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + result.append(alabel(label)) + if trailing_dot: + result.append(b'') + s = b'.'.join(result) + if not valid_string_length(s, trailing_dot): + raise IDNAError('Domain too long') + return s + + +def decode(s, strict=False, uts46=False, std3_rules=False): + + if isinstance(s, (bytes, bytearray)): + s = s.decode("ascii") + if uts46: + s = uts46_remap(s, std3_rules, False) + trailing_dot = False + result = [] + if not strict: + labels = _unicode_dots_re.split(s) + else: + labels = s.split(u'.') + while labels and not labels[0]: + del labels[0] + if not labels: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + result.append(ulabel(label)) + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py new file mode 100644 index 000000000..c197a693a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1585 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "6.3.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x38400000385, + 0x38600000387, + 0x3880000038b, + 0x38c0000038d, + 0x38e000003a2, + 0x3a3000003e2, + 0x3f000000400, + 0x1d2600001d2b, + 0x1d5d00001d62, + 0x1d6600001d6b, + 0x1dbf00001dc0, + 0x1f0000001f16, + 0x1f1800001f1e, + 0x1f2000001f46, + 0x1f4800001f4e, + 0x1f5000001f58, + 0x1f5900001f5a, + 0x1f5b00001f5c, + 0x1f5d00001f5e, + 0x1f5f00001f7e, + 0x1f8000001fb5, + 0x1fb600001fc5, + 0x1fc600001fd4, + 0x1fd600001fdc, + 0x1fdd00001ff0, + 0x1ff200001ff5, + 0x1ff600001fff, + 0x212600002127, + 0x101400001018b, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009fcd, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5f0000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b002, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x608: 85, + 0x60b: 85, + 0x620: 68, + 0x621: 85, + 0x622: 82, + 0x623: 82, + 0x624: 82, + 0x625: 82, + 0x626: 68, + 0x627: 82, + 0x628: 68, + 0x629: 82, + 0x62a: 68, + 0x62b: 68, + 0x62c: 68, + 0x62d: 68, + 0x62e: 68, + 0x62f: 82, + 0x630: 82, + 0x631: 82, + 0x632: 82, + 0x633: 68, + 0x634: 68, + 0x635: 68, + 0x636: 68, + 0x637: 68, + 0x638: 68, + 0x639: 68, + 0x63a: 68, + 0x63b: 68, + 0x63c: 68, + 0x63d: 68, + 0x63e: 68, + 0x63f: 68, + 0x640: 67, + 0x641: 68, + 0x642: 68, + 0x643: 68, + 0x644: 68, + 0x645: 68, + 0x646: 68, + 0x647: 68, + 0x648: 82, + 0x649: 68, + 0x64a: 68, + 0x66e: 68, + 0x66f: 68, + 0x671: 82, + 0x672: 82, + 0x673: 82, + 0x674: 85, + 0x675: 82, + 0x676: 82, + 0x677: 82, + 0x678: 68, + 0x679: 68, + 0x67a: 68, + 0x67b: 68, + 0x67c: 68, + 0x67d: 68, + 0x67e: 68, + 0x67f: 68, + 0x680: 68, + 0x681: 68, + 0x682: 68, + 0x683: 68, + 0x684: 68, + 0x685: 68, + 0x686: 68, + 0x687: 68, + 0x688: 82, + 0x689: 82, + 0x68a: 82, + 0x68b: 82, + 0x68c: 82, + 0x68d: 82, + 0x68e: 82, + 0x68f: 82, + 0x690: 82, + 0x691: 82, + 0x692: 82, + 0x693: 82, + 0x694: 82, + 0x695: 82, + 0x696: 82, + 0x697: 82, + 0x698: 82, + 0x699: 82, + 0x69a: 68, + 0x69b: 68, + 0x69c: 68, + 0x69d: 68, + 0x69e: 68, + 0x69f: 68, + 0x6a0: 68, + 0x6a1: 68, + 0x6a2: 68, + 0x6a3: 68, + 0x6a4: 68, + 0x6a5: 68, + 0x6a6: 68, + 0x6a7: 68, + 0x6a8: 68, + 0x6a9: 68, + 0x6aa: 68, + 0x6ab: 68, + 0x6ac: 68, + 0x6ad: 68, + 0x6ae: 68, + 0x6af: 68, + 0x6b0: 68, + 0x6b1: 68, + 0x6b2: 68, + 0x6b3: 68, + 0x6b4: 68, + 0x6b5: 68, + 0x6b6: 68, + 0x6b7: 68, + 0x6b8: 68, + 0x6b9: 68, + 0x6ba: 68, + 0x6bb: 68, + 0x6bc: 68, + 0x6bd: 68, + 0x6be: 68, + 0x6bf: 68, + 0x6c0: 82, + 0x6c1: 68, + 0x6c2: 68, + 0x6c3: 82, + 0x6c4: 82, + 0x6c5: 82, + 0x6c6: 82, + 0x6c7: 82, + 0x6c8: 82, + 0x6c9: 82, + 0x6ca: 82, + 0x6cb: 82, + 0x6cc: 68, + 0x6cd: 82, + 0x6ce: 68, + 0x6cf: 82, + 0x6d0: 68, + 0x6d1: 68, + 0x6d2: 82, + 0x6d3: 82, + 0x6d5: 82, + 0x6dd: 85, + 0x6ee: 82, + 0x6ef: 82, + 0x6fa: 68, + 0x6fb: 68, + 0x6fc: 68, + 0x6ff: 68, + 0x710: 82, + 0x712: 68, + 0x713: 68, + 0x714: 68, + 0x715: 82, + 0x716: 82, + 0x717: 82, + 0x718: 82, + 0x719: 82, + 0x71a: 68, + 0x71b: 68, + 0x71c: 68, + 0x71d: 68, + 0x71e: 82, + 0x71f: 68, + 0x720: 68, + 0x721: 68, + 0x722: 68, + 0x723: 68, + 0x724: 68, + 0x725: 68, + 0x726: 68, + 0x727: 68, + 0x728: 82, + 0x729: 68, + 0x72a: 82, + 0x72b: 68, + 0x72c: 82, + 0x72d: 68, + 0x72e: 68, + 0x72f: 82, + 0x74d: 82, + 0x74e: 68, + 0x74f: 68, + 0x750: 68, + 0x751: 68, + 0x752: 68, + 0x753: 68, + 0x754: 68, + 0x755: 68, + 0x756: 68, + 0x757: 68, + 0x758: 68, + 0x759: 82, + 0x75a: 82, + 0x75b: 82, + 0x75c: 68, + 0x75d: 68, + 0x75e: 68, + 0x75f: 68, + 0x760: 68, + 0x761: 68, + 0x762: 68, + 0x763: 68, + 0x764: 68, + 0x765: 68, + 0x766: 68, + 0x767: 68, + 0x768: 68, + 0x769: 68, + 0x76a: 68, + 0x76b: 82, + 0x76c: 82, + 0x76d: 68, + 0x76e: 68, + 0x76f: 68, + 0x770: 68, + 0x771: 82, + 0x772: 68, + 0x773: 82, + 0x774: 82, + 0x775: 68, + 0x776: 68, + 0x777: 68, + 0x778: 82, + 0x779: 82, + 0x77a: 68, + 0x77b: 68, + 0x77c: 68, + 0x77d: 68, + 0x77e: 68, + 0x77f: 68, + 0x7ca: 68, + 0x7cb: 68, + 0x7cc: 68, + 0x7cd: 68, + 0x7ce: 68, + 0x7cf: 68, + 0x7d0: 68, + 0x7d1: 68, + 0x7d2: 68, + 0x7d3: 68, + 0x7d4: 68, + 0x7d5: 68, + 0x7d6: 68, + 0x7d7: 68, + 0x7d8: 68, + 0x7d9: 68, + 0x7da: 68, + 0x7db: 68, + 0x7dc: 68, + 0x7dd: 68, + 0x7de: 68, + 0x7df: 68, + 0x7e0: 68, + 0x7e1: 68, + 0x7e2: 68, + 0x7e3: 68, + 0x7e4: 68, + 0x7e5: 68, + 0x7e6: 68, + 0x7e7: 68, + 0x7e8: 68, + 0x7e9: 68, + 0x7ea: 68, + 0x7fa: 67, + 0x840: 82, + 0x841: 68, + 0x842: 68, + 0x843: 68, + 0x844: 68, + 0x845: 68, + 0x846: 82, + 0x847: 68, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 82, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x8a0: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x1806: 85, + 0x1807: 68, + 0x180a: 67, + 0x180e: 85, + 0x1820: 68, + 0x1821: 68, + 0x1822: 68, + 0x1823: 68, + 0x1824: 68, + 0x1825: 68, + 0x1826: 68, + 0x1827: 68, + 0x1828: 68, + 0x1829: 68, + 0x182a: 68, + 0x182b: 68, + 0x182c: 68, + 0x182d: 68, + 0x182e: 68, + 0x182f: 68, + 0x1830: 68, + 0x1831: 68, + 0x1832: 68, + 0x1833: 68, + 0x1834: 68, + 0x1835: 68, + 0x1836: 68, + 0x1837: 68, + 0x1838: 68, + 0x1839: 68, + 0x183a: 68, + 0x183b: 68, + 0x183c: 68, + 0x183d: 68, + 0x183e: 68, + 0x183f: 68, + 0x1840: 68, + 0x1841: 68, + 0x1842: 68, + 0x1843: 68, + 0x1844: 68, + 0x1845: 68, + 0x1846: 68, + 0x1847: 68, + 0x1848: 68, + 0x1849: 68, + 0x184a: 68, + 0x184b: 68, + 0x184c: 68, + 0x184d: 68, + 0x184e: 68, + 0x184f: 68, + 0x1850: 68, + 0x1851: 68, + 0x1852: 68, + 0x1853: 68, + 0x1854: 68, + 0x1855: 68, + 0x1856: 68, + 0x1857: 68, + 0x1858: 68, + 0x1859: 68, + 0x185a: 68, + 0x185b: 68, + 0x185c: 68, + 0x185d: 68, + 0x185e: 68, + 0x185f: 68, + 0x1860: 68, + 0x1861: 68, + 0x1862: 68, + 0x1863: 68, + 0x1864: 68, + 0x1865: 68, + 0x1866: 68, + 0x1867: 68, + 0x1868: 68, + 0x1869: 68, + 0x186a: 68, + 0x186b: 68, + 0x186c: 68, + 0x186d: 68, + 0x186e: 68, + 0x186f: 68, + 0x1870: 68, + 0x1871: 68, + 0x1872: 68, + 0x1873: 68, + 0x1874: 68, + 0x1875: 68, + 0x1876: 68, + 0x1877: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 85, + 0x1886: 85, + 0x1887: 68, + 0x1888: 68, + 0x1889: 68, + 0x188a: 68, + 0x188b: 68, + 0x188c: 68, + 0x188d: 68, + 0x188e: 68, + 0x188f: 68, + 0x1890: 68, + 0x1891: 68, + 0x1892: 68, + 0x1893: 68, + 0x1894: 68, + 0x1895: 68, + 0x1896: 68, + 0x1897: 68, + 0x1898: 68, + 0x1899: 68, + 0x189a: 68, + 0x189b: 68, + 0x189c: 68, + 0x189d: 68, + 0x189e: 68, + 0x189f: 68, + 0x18a0: 68, + 0x18a1: 68, + 0x18a2: 68, + 0x18a3: 68, + 0x18a4: 68, + 0x18a5: 68, + 0x18a6: 68, + 0x18a7: 68, + 0x18a8: 68, + 0x18aa: 68, + 0x200c: 85, + 0x200d: 67, + 0x2066: 85, + 0x2067: 85, + 0x2068: 85, + 0x2069: 85, + 0xa840: 68, + 0xa841: 68, + 0xa842: 68, + 0xa843: 68, + 0xa844: 68, + 0xa845: 68, + 0xa846: 68, + 0xa847: 68, + 0xa848: 68, + 0xa849: 68, + 0xa84a: 68, + 0xa84b: 68, + 0xa84c: 68, + 0xa84d: 68, + 0xa84e: 68, + 0xa84f: 68, + 0xa850: 68, + 0xa851: 68, + 0xa852: 68, + 0xa853: 68, + 0xa854: 68, + 0xa855: 68, + 0xa856: 68, + 0xa857: 68, + 0xa858: 68, + 0xa859: 68, + 0xa85a: 68, + 0xa85b: 68, + 0xa85c: 68, + 0xa85d: 68, + 0xa85e: 68, + 0xa85f: 68, + 0xa860: 68, + 0xa861: 68, + 0xa862: 68, + 0xa863: 68, + 0xa864: 68, + 0xa865: 68, + 0xa866: 68, + 0xa867: 68, + 0xa868: 68, + 0xa869: 68, + 0xa86a: 68, + 0xa86b: 68, + 0xa86c: 68, + 0xa86d: 68, + 0xa86e: 68, + 0xa86f: 68, + 0xa870: 68, + 0xa871: 68, + 0xa872: 76, + 0xa873: 85, +} +codepoint_classes = { + 'PVALID': ( + 0x2d0000002e, + 0x300000003a, + 0x610000007b, + 0xdf000000f7, + 0xf800000100, + 0x10100000102, + 0x10300000104, + 0x10500000106, + 0x10700000108, + 0x1090000010a, + 0x10b0000010c, + 0x10d0000010e, + 0x10f00000110, + 0x11100000112, + 0x11300000114, + 0x11500000116, + 0x11700000118, + 0x1190000011a, + 0x11b0000011c, + 0x11d0000011e, + 0x11f00000120, + 0x12100000122, + 0x12300000124, + 0x12500000126, + 0x12700000128, + 0x1290000012a, + 0x12b0000012c, + 0x12d0000012e, + 0x12f00000130, + 0x13100000132, + 0x13500000136, + 0x13700000139, + 0x13a0000013b, + 0x13c0000013d, + 0x13e0000013f, + 0x14200000143, + 0x14400000145, + 0x14600000147, + 0x14800000149, + 0x14b0000014c, + 0x14d0000014e, + 0x14f00000150, + 0x15100000152, + 0x15300000154, + 0x15500000156, + 0x15700000158, + 0x1590000015a, + 0x15b0000015c, + 0x15d0000015e, + 0x15f00000160, + 0x16100000162, + 0x16300000164, + 0x16500000166, + 0x16700000168, + 0x1690000016a, + 0x16b0000016c, + 0x16d0000016e, + 0x16f00000170, + 0x17100000172, + 0x17300000174, + 0x17500000176, + 0x17700000178, + 0x17a0000017b, + 0x17c0000017d, + 0x17e0000017f, + 0x18000000181, + 0x18300000184, + 0x18500000186, + 0x18800000189, + 0x18c0000018e, + 0x19200000193, + 0x19500000196, + 0x1990000019c, + 0x19e0000019f, + 0x1a1000001a2, + 0x1a3000001a4, + 0x1a5000001a6, + 0x1a8000001a9, + 0x1aa000001ac, + 0x1ad000001ae, + 0x1b0000001b1, + 0x1b4000001b5, + 0x1b6000001b7, + 0x1b9000001bc, + 0x1bd000001c4, + 0x1ce000001cf, + 0x1d0000001d1, + 0x1d2000001d3, + 0x1d4000001d5, + 0x1d6000001d7, + 0x1d8000001d9, + 0x1da000001db, + 0x1dc000001de, + 0x1df000001e0, + 0x1e1000001e2, + 0x1e3000001e4, + 0x1e5000001e6, + 0x1e7000001e8, + 0x1e9000001ea, + 0x1eb000001ec, + 0x1ed000001ee, + 0x1ef000001f1, + 0x1f5000001f6, + 0x1f9000001fa, + 0x1fb000001fc, + 0x1fd000001fe, + 0x1ff00000200, + 0x20100000202, + 0x20300000204, + 0x20500000206, + 0x20700000208, + 0x2090000020a, + 0x20b0000020c, + 0x20d0000020e, + 0x20f00000210, + 0x21100000212, + 0x21300000214, + 0x21500000216, + 0x21700000218, + 0x2190000021a, + 0x21b0000021c, + 0x21d0000021e, + 0x21f00000220, + 0x22100000222, + 0x22300000224, + 0x22500000226, + 0x22700000228, + 0x2290000022a, + 0x22b0000022c, + 0x22d0000022e, + 0x22f00000230, + 0x23100000232, + 0x2330000023a, + 0x23c0000023d, + 0x23f00000241, + 0x24200000243, + 0x24700000248, + 0x2490000024a, + 0x24b0000024c, + 0x24d0000024e, + 0x24f000002b0, + 0x2b9000002c2, + 0x2c6000002d2, + 0x2ec000002ed, + 0x2ee000002ef, + 0x30000000340, + 0x34200000343, + 0x3460000034f, + 0x35000000370, + 0x37100000372, + 0x37300000374, + 0x37700000378, + 0x37b0000037e, + 0x39000000391, + 0x3ac000003cf, + 0x3d7000003d8, + 0x3d9000003da, + 0x3db000003dc, + 0x3dd000003de, + 0x3df000003e0, + 0x3e1000003e2, + 0x3e3000003e4, + 0x3e5000003e6, + 0x3e7000003e8, + 0x3e9000003ea, + 0x3eb000003ec, + 0x3ed000003ee, + 0x3ef000003f0, + 0x3f3000003f4, + 0x3f8000003f9, + 0x3fb000003fd, + 0x43000000460, + 0x46100000462, + 0x46300000464, + 0x46500000466, + 0x46700000468, + 0x4690000046a, + 0x46b0000046c, + 0x46d0000046e, + 0x46f00000470, + 0x47100000472, + 0x47300000474, + 0x47500000476, + 0x47700000478, + 0x4790000047a, + 0x47b0000047c, + 0x47d0000047e, + 0x47f00000480, + 0x48100000482, + 0x48300000488, + 0x48b0000048c, + 0x48d0000048e, + 0x48f00000490, + 0x49100000492, + 0x49300000494, + 0x49500000496, + 0x49700000498, + 0x4990000049a, + 0x49b0000049c, + 0x49d0000049e, + 0x49f000004a0, + 0x4a1000004a2, + 0x4a3000004a4, + 0x4a5000004a6, + 0x4a7000004a8, + 0x4a9000004aa, + 0x4ab000004ac, + 0x4ad000004ae, + 0x4af000004b0, + 0x4b1000004b2, + 0x4b3000004b4, + 0x4b5000004b6, + 0x4b7000004b8, + 0x4b9000004ba, + 0x4bb000004bc, + 0x4bd000004be, + 0x4bf000004c0, + 0x4c2000004c3, + 0x4c4000004c5, + 0x4c6000004c7, + 0x4c8000004c9, + 0x4ca000004cb, + 0x4cc000004cd, + 0x4ce000004d0, + 0x4d1000004d2, + 0x4d3000004d4, + 0x4d5000004d6, + 0x4d7000004d8, + 0x4d9000004da, + 0x4db000004dc, + 0x4dd000004de, + 0x4df000004e0, + 0x4e1000004e2, + 0x4e3000004e4, + 0x4e5000004e6, + 0x4e7000004e8, + 0x4e9000004ea, + 0x4eb000004ec, + 0x4ed000004ee, + 0x4ef000004f0, + 0x4f1000004f2, + 0x4f3000004f4, + 0x4f5000004f6, + 0x4f7000004f8, + 0x4f9000004fa, + 0x4fb000004fc, + 0x4fd000004fe, + 0x4ff00000500, + 0x50100000502, + 0x50300000504, + 0x50500000506, + 0x50700000508, + 0x5090000050a, + 0x50b0000050c, + 0x50d0000050e, + 0x50f00000510, + 0x51100000512, + 0x51300000514, + 0x51500000516, + 0x51700000518, + 0x5190000051a, + 0x51b0000051c, + 0x51d0000051e, + 0x51f00000520, + 0x52100000522, + 0x52300000524, + 0x52500000526, + 0x52700000528, + 0x5590000055a, + 0x56100000587, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5f0000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x8000000082e, + 0x8400000085c, + 0x8a0000008a1, + 0x8a2000008ad, + 0x8e4000008ff, + 0x90000000958, + 0x96000000964, + 0x96600000970, + 0x97100000978, + 0x97900000980, + 0x98100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0xa0100000a04, + 0xa0500000a0b, + 0xa0f00000a11, + 0xa1300000a29, + 0xa2a00000a31, + 0xa3200000a33, + 0xa3500000a36, + 0xa3800000a3a, + 0xa3c00000a3d, + 0xa3e00000a43, + 0xa4700000a49, + 0xa4b00000a4e, + 0xa5100000a52, + 0xa5c00000a5d, + 0xa6600000a76, + 0xa8100000a84, + 0xa8500000a8e, + 0xa8f00000a92, + 0xa9300000aa9, + 0xaaa00000ab1, + 0xab200000ab4, + 0xab500000aba, + 0xabc00000ac6, + 0xac700000aca, + 0xacb00000ace, + 0xad000000ad1, + 0xae000000ae4, + 0xae600000af0, + 0xb0100000b04, + 0xb0500000b0d, + 0xb0f00000b11, + 0xb1300000b29, + 0xb2a00000b31, + 0xb3200000b34, + 0xb3500000b3a, + 0xb3c00000b45, + 0xb4700000b49, + 0xb4b00000b4e, + 0xb5600000b58, + 0xb5f00000b64, + 0xb6600000b70, + 0xb7100000b72, + 0xb8200000b84, + 0xb8500000b8b, + 0xb8e00000b91, + 0xb9200000b96, + 0xb9900000b9b, + 0xb9c00000b9d, + 0xb9e00000ba0, + 0xba300000ba5, + 0xba800000bab, + 0xbae00000bba, + 0xbbe00000bc3, + 0xbc600000bc9, + 0xbca00000bce, + 0xbd000000bd1, + 0xbd700000bd8, + 0xbe600000bf0, + 0xc0100000c04, + 0xc0500000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c34, + 0xc3500000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5a, + 0xc6000000c64, + 0xc6600000c70, + 0xc8200000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0200000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d3b, + 0xd3d00000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5700000d58, + 0xd6000000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xdf200000df4, + 0xe0100000e33, + 0xe3400000e3b, + 0xe4000000e4f, + 0xe5000000e5a, + 0xe8100000e83, + 0xe8400000e85, + 0xe8700000e89, + 0xe8a00000e8b, + 0xe8d00000e8e, + 0xe9400000e98, + 0xe9900000ea0, + 0xea100000ea4, + 0xea500000ea6, + 0xea700000ea8, + 0xeaa00000eac, + 0xead00000eb3, + 0xeb400000eba, + 0xebb00000ebe, + 0xec000000ec5, + 0xec600000ec7, + 0xec800000ece, + 0xed000000eda, + 0xede00000ee0, + 0xf0000000f01, + 0xf0b00000f0c, + 0xf1800000f1a, + 0xf2000000f2a, + 0xf3500000f36, + 0xf3700000f38, + 0xf3900000f3a, + 0xf3e00000f43, + 0xf4400000f48, + 0xf4900000f4d, + 0xf4e00000f52, + 0xf5300000f57, + 0xf5800000f5c, + 0xf5d00000f69, + 0xf6a00000f6d, + 0xf7100000f73, + 0xf7400000f75, + 0xf7a00000f81, + 0xf8200000f85, + 0xf8600000f93, + 0xf9400000f98, + 0xf9900000f9d, + 0xf9e00000fa2, + 0xfa300000fa7, + 0xfa800000fac, + 0xfad00000fb9, + 0xfba00000fbd, + 0xfc600000fc7, + 0x10000000104a, + 0x10500000109e, + 0x10d0000010fb, + 0x10fd00001100, + 0x120000001249, + 0x124a0000124e, + 0x125000001257, + 0x125800001259, + 0x125a0000125e, + 0x126000001289, + 0x128a0000128e, + 0x1290000012b1, + 0x12b2000012b6, + 0x12b8000012bf, + 0x12c0000012c1, + 0x12c2000012c6, + 0x12c8000012d7, + 0x12d800001311, + 0x131200001316, + 0x13180000135b, + 0x135d00001360, + 0x138000001390, + 0x13a0000013f5, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001878, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191d, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cf7, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001de7, + 0x1dfc00001e00, + 0x1e0100001e02, + 0x1e0300001e04, + 0x1e0500001e06, + 0x1e0700001e08, + 0x1e0900001e0a, + 0x1e0b00001e0c, + 0x1e0d00001e0e, + 0x1e0f00001e10, + 0x1e1100001e12, + 0x1e1300001e14, + 0x1e1500001e16, + 0x1e1700001e18, + 0x1e1900001e1a, + 0x1e1b00001e1c, + 0x1e1d00001e1e, + 0x1e1f00001e20, + 0x1e2100001e22, + 0x1e2300001e24, + 0x1e2500001e26, + 0x1e2700001e28, + 0x1e2900001e2a, + 0x1e2b00001e2c, + 0x1e2d00001e2e, + 0x1e2f00001e30, + 0x1e3100001e32, + 0x1e3300001e34, + 0x1e3500001e36, + 0x1e3700001e38, + 0x1e3900001e3a, + 0x1e3b00001e3c, + 0x1e3d00001e3e, + 0x1e3f00001e40, + 0x1e4100001e42, + 0x1e4300001e44, + 0x1e4500001e46, + 0x1e4700001e48, + 0x1e4900001e4a, + 0x1e4b00001e4c, + 0x1e4d00001e4e, + 0x1e4f00001e50, + 0x1e5100001e52, + 0x1e5300001e54, + 0x1e5500001e56, + 0x1e5700001e58, + 0x1e5900001e5a, + 0x1e5b00001e5c, + 0x1e5d00001e5e, + 0x1e5f00001e60, + 0x1e6100001e62, + 0x1e6300001e64, + 0x1e6500001e66, + 0x1e6700001e68, + 0x1e6900001e6a, + 0x1e6b00001e6c, + 0x1e6d00001e6e, + 0x1e6f00001e70, + 0x1e7100001e72, + 0x1e7300001e74, + 0x1e7500001e76, + 0x1e7700001e78, + 0x1e7900001e7a, + 0x1e7b00001e7c, + 0x1e7d00001e7e, + 0x1e7f00001e80, + 0x1e8100001e82, + 0x1e8300001e84, + 0x1e8500001e86, + 0x1e8700001e88, + 0x1e8900001e8a, + 0x1e8b00001e8c, + 0x1e8d00001e8e, + 0x1e8f00001e90, + 0x1e9100001e92, + 0x1e9300001e94, + 0x1e9500001e9a, + 0x1e9c00001e9e, + 0x1e9f00001ea0, + 0x1ea100001ea2, + 0x1ea300001ea4, + 0x1ea500001ea6, + 0x1ea700001ea8, + 0x1ea900001eaa, + 0x1eab00001eac, + 0x1ead00001eae, + 0x1eaf00001eb0, + 0x1eb100001eb2, + 0x1eb300001eb4, + 0x1eb500001eb6, + 0x1eb700001eb8, + 0x1eb900001eba, + 0x1ebb00001ebc, + 0x1ebd00001ebe, + 0x1ebf00001ec0, + 0x1ec100001ec2, + 0x1ec300001ec4, + 0x1ec500001ec6, + 0x1ec700001ec8, + 0x1ec900001eca, + 0x1ecb00001ecc, + 0x1ecd00001ece, + 0x1ecf00001ed0, + 0x1ed100001ed2, + 0x1ed300001ed4, + 0x1ed500001ed6, + 0x1ed700001ed8, + 0x1ed900001eda, + 0x1edb00001edc, + 0x1edd00001ede, + 0x1edf00001ee0, + 0x1ee100001ee2, + 0x1ee300001ee4, + 0x1ee500001ee6, + 0x1ee700001ee8, + 0x1ee900001eea, + 0x1eeb00001eec, + 0x1eed00001eee, + 0x1eef00001ef0, + 0x1ef100001ef2, + 0x1ef300001ef4, + 0x1ef500001ef6, + 0x1ef700001ef8, + 0x1ef900001efa, + 0x1efb00001efc, + 0x1efd00001efe, + 0x1eff00001f08, + 0x1f1000001f16, + 0x1f2000001f28, + 0x1f3000001f38, + 0x1f4000001f46, + 0x1f5000001f58, + 0x1f6000001f68, + 0x1f7000001f71, + 0x1f7200001f73, + 0x1f7400001f75, + 0x1f7600001f77, + 0x1f7800001f79, + 0x1f7a00001f7b, + 0x1f7c00001f7d, + 0x1fb000001fb2, + 0x1fb600001fb7, + 0x1fc600001fc7, + 0x1fd000001fd3, + 0x1fd600001fd8, + 0x1fe000001fe3, + 0x1fe400001fe8, + 0x1ff600001ff7, + 0x214e0000214f, + 0x218400002185, + 0x2c3000002c5f, + 0x2c6100002c62, + 0x2c6500002c67, + 0x2c6800002c69, + 0x2c6a00002c6b, + 0x2c6c00002c6d, + 0x2c7100002c72, + 0x2c7300002c75, + 0x2c7600002c7c, + 0x2c8100002c82, + 0x2c8300002c84, + 0x2c8500002c86, + 0x2c8700002c88, + 0x2c8900002c8a, + 0x2c8b00002c8c, + 0x2c8d00002c8e, + 0x2c8f00002c90, + 0x2c9100002c92, + 0x2c9300002c94, + 0x2c9500002c96, + 0x2c9700002c98, + 0x2c9900002c9a, + 0x2c9b00002c9c, + 0x2c9d00002c9e, + 0x2c9f00002ca0, + 0x2ca100002ca2, + 0x2ca300002ca4, + 0x2ca500002ca6, + 0x2ca700002ca8, + 0x2ca900002caa, + 0x2cab00002cac, + 0x2cad00002cae, + 0x2caf00002cb0, + 0x2cb100002cb2, + 0x2cb300002cb4, + 0x2cb500002cb6, + 0x2cb700002cb8, + 0x2cb900002cba, + 0x2cbb00002cbc, + 0x2cbd00002cbe, + 0x2cbf00002cc0, + 0x2cc100002cc2, + 0x2cc300002cc4, + 0x2cc500002cc6, + 0x2cc700002cc8, + 0x2cc900002cca, + 0x2ccb00002ccc, + 0x2ccd00002cce, + 0x2ccf00002cd0, + 0x2cd100002cd2, + 0x2cd300002cd4, + 0x2cd500002cd6, + 0x2cd700002cd8, + 0x2cd900002cda, + 0x2cdb00002cdc, + 0x2cdd00002cde, + 0x2cdf00002ce0, + 0x2ce100002ce2, + 0x2ce300002ce5, + 0x2cec00002ced, + 0x2cee00002cf2, + 0x2cf300002cf4, + 0x2d0000002d26, + 0x2d2700002d28, + 0x2d2d00002d2e, + 0x2d3000002d68, + 0x2d7f00002d97, + 0x2da000002da7, + 0x2da800002daf, + 0x2db000002db7, + 0x2db800002dbf, + 0x2dc000002dc7, + 0x2dc800002dcf, + 0x2dd000002dd7, + 0x2dd800002ddf, + 0x2de000002e00, + 0x2e2f00002e30, + 0x300500003008, + 0x302a0000302e, + 0x303c0000303d, + 0x304100003097, + 0x30990000309b, + 0x309d0000309f, + 0x30a1000030fb, + 0x30fc000030ff, + 0x31050000312e, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009fcd, + 0xa0000000a48d, + 0xa4d00000a4fe, + 0xa5000000a60d, + 0xa6100000a62c, + 0xa6410000a642, + 0xa6430000a644, + 0xa6450000a646, + 0xa6470000a648, + 0xa6490000a64a, + 0xa64b0000a64c, + 0xa64d0000a64e, + 0xa64f0000a650, + 0xa6510000a652, + 0xa6530000a654, + 0xa6550000a656, + 0xa6570000a658, + 0xa6590000a65a, + 0xa65b0000a65c, + 0xa65d0000a65e, + 0xa65f0000a660, + 0xa6610000a662, + 0xa6630000a664, + 0xa6650000a666, + 0xa6670000a668, + 0xa6690000a66a, + 0xa66b0000a66c, + 0xa66d0000a670, + 0xa6740000a67e, + 0xa67f0000a680, + 0xa6810000a682, + 0xa6830000a684, + 0xa6850000a686, + 0xa6870000a688, + 0xa6890000a68a, + 0xa68b0000a68c, + 0xa68d0000a68e, + 0xa68f0000a690, + 0xa6910000a692, + 0xa6930000a694, + 0xa6950000a696, + 0xa6970000a698, + 0xa69f0000a6e6, + 0xa6f00000a6f2, + 0xa7170000a720, + 0xa7230000a724, + 0xa7250000a726, + 0xa7270000a728, + 0xa7290000a72a, + 0xa72b0000a72c, + 0xa72d0000a72e, + 0xa72f0000a732, + 0xa7330000a734, + 0xa7350000a736, + 0xa7370000a738, + 0xa7390000a73a, + 0xa73b0000a73c, + 0xa73d0000a73e, + 0xa73f0000a740, + 0xa7410000a742, + 0xa7430000a744, + 0xa7450000a746, + 0xa7470000a748, + 0xa7490000a74a, + 0xa74b0000a74c, + 0xa74d0000a74e, + 0xa74f0000a750, + 0xa7510000a752, + 0xa7530000a754, + 0xa7550000a756, + 0xa7570000a758, + 0xa7590000a75a, + 0xa75b0000a75c, + 0xa75d0000a75e, + 0xa75f0000a760, + 0xa7610000a762, + 0xa7630000a764, + 0xa7650000a766, + 0xa7670000a768, + 0xa7690000a76a, + 0xa76b0000a76c, + 0xa76d0000a76e, + 0xa76f0000a770, + 0xa7710000a779, + 0xa77a0000a77b, + 0xa77c0000a77d, + 0xa77f0000a780, + 0xa7810000a782, + 0xa7830000a784, + 0xa7850000a786, + 0xa7870000a789, + 0xa78c0000a78d, + 0xa78e0000a78f, + 0xa7910000a792, + 0xa7930000a794, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c5, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa9000000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aa7c, + 0xaa800000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe27, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x103000001031f, + 0x1033000010341, + 0x103420001034a, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a34, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10c0000010c49, + 0x1100000011047, + 0x1106600011070, + 0x11080000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x11180000111c5, + 0x111d0000111da, + 0x11680000116b8, + 0x116c0000116ca, + 0x120000001236f, + 0x130000001342f, + 0x1680000016a39, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x1b0000001b002, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py new file mode 100644 index 000000000..8202be801 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/intranges.py @@ -0,0 +1,53 @@ +""" +Given a list of integers, made up of (hopefully) a small number of long runs +of consecutive integers, compute a representation of the form +((start1, end1), (start2, end2) ...). Then answer the question "was x present +in the original list?" in time O(log(# runs)). +""" + +import bisect + +def intranges_from_list(list_): + """Represent a list of integers as a sequence of ranges: + ((start_0, end_0), (start_1, end_1), ...), such that the original + integers are exactly those x such that start_i <= x < end_i for some i. + + Ranges are encoded as single integers (start << 32 | end), not as tuples. + """ + + sorted_list = sorted(list_) + ranges = [] + last_write = -1 + for i in range(len(sorted_list)): + if i+1 < len(sorted_list): + if sorted_list[i] == sorted_list[i+1]-1: + continue + current_range = sorted_list[last_write+1:i+1] + ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) + last_write = i + + return tuple(ranges) + +def _encode_range(start, end): + return (start << 32) | end + +def _decode_range(r): + return (r >> 32), (r & ((1 << 32) - 1)) + + +def intranges_contain(int_, ranges): + """Determine if `int_` falls into one of the ranges in `ranges`.""" + tuple_ = _encode_range(int_, 0) + pos = bisect.bisect_left(ranges, tuple_) + # we could be immediately ahead of a tuple (start, end) + # with start < int_ <= end + if pos > 0: + left, right = _decode_range(ranges[pos-1]) + if left <= int_ < right: + return True + # or we could be immediately behind a tuple (int_, end) + if pos < len(ranges): + left, _ = _decode_range(ranges[pos]) + if left == int_: + return True + return False diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py new file mode 100644 index 000000000..307327101 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.6' + diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py new file mode 100644 index 000000000..fa1d66a0d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/idna/uts46data.py @@ -0,0 +1,7634 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "6.3.0" +def _seg_0(): + return [ + (0x0, '3'), + (0x1, '3'), + (0x2, '3'), + (0x3, '3'), + (0x4, '3'), + (0x5, '3'), + (0x6, '3'), + (0x7, '3'), + (0x8, '3'), + (0x9, '3'), + (0xA, '3'), + (0xB, '3'), + (0xC, '3'), + (0xD, '3'), + (0xE, '3'), + (0xF, '3'), + (0x10, '3'), + (0x11, '3'), + (0x12, '3'), + (0x13, '3'), + (0x14, '3'), + (0x15, '3'), + (0x16, '3'), + (0x17, '3'), + (0x18, '3'), + (0x19, '3'), + (0x1A, '3'), + (0x1B, '3'), + (0x1C, '3'), + (0x1D, '3'), + (0x1E, '3'), + (0x1F, '3'), + (0x20, '3'), + (0x21, '3'), + (0x22, '3'), + (0x23, '3'), + (0x24, '3'), + (0x25, '3'), + (0x26, '3'), + (0x27, '3'), + (0x28, '3'), + (0x29, '3'), + (0x2A, '3'), + (0x2B, '3'), + (0x2C, '3'), + (0x2D, 'V'), + (0x2E, 'V'), + (0x2F, '3'), + (0x30, 'V'), + (0x31, 'V'), + (0x32, 'V'), + (0x33, 'V'), + (0x34, 'V'), + (0x35, 'V'), + (0x36, 'V'), + (0x37, 'V'), + (0x38, 'V'), + (0x39, 'V'), + (0x3A, '3'), + (0x3B, '3'), + (0x3C, '3'), + (0x3D, '3'), + (0x3E, '3'), + (0x3F, '3'), + (0x40, '3'), + (0x41, 'M', u'a'), + (0x42, 'M', u'b'), + (0x43, 'M', u'c'), + (0x44, 'M', u'd'), + (0x45, 'M', u'e'), + (0x46, 'M', u'f'), + (0x47, 'M', u'g'), + (0x48, 'M', u'h'), + (0x49, 'M', u'i'), + (0x4A, 'M', u'j'), + (0x4B, 'M', u'k'), + (0x4C, 'M', u'l'), + (0x4D, 'M', u'm'), + (0x4E, 'M', u'n'), + (0x4F, 'M', u'o'), + (0x50, 'M', u'p'), + (0x51, 'M', u'q'), + (0x52, 'M', u'r'), + (0x53, 'M', u's'), + (0x54, 'M', u't'), + (0x55, 'M', u'u'), + (0x56, 'M', u'v'), + (0x57, 'M', u'w'), + (0x58, 'M', u'x'), + (0x59, 'M', u'y'), + (0x5A, 'M', u'z'), + (0x5B, '3'), + (0x5C, '3'), + (0x5D, '3'), + (0x5E, '3'), + (0x5F, '3'), + (0x60, '3'), + (0x61, 'V'), + (0x62, 'V'), + (0x63, 'V'), + ] + +def _seg_1(): + return [ + (0x64, 'V'), + (0x65, 'V'), + (0x66, 'V'), + (0x67, 'V'), + (0x68, 'V'), + (0x69, 'V'), + (0x6A, 'V'), + (0x6B, 'V'), + (0x6C, 'V'), + (0x6D, 'V'), + (0x6E, 'V'), + (0x6F, 'V'), + (0x70, 'V'), + (0x71, 'V'), + (0x72, 'V'), + (0x73, 'V'), + (0x74, 'V'), + (0x75, 'V'), + (0x76, 'V'), + (0x77, 'V'), + (0x78, 'V'), + (0x79, 'V'), + (0x7A, 'V'), + (0x7B, '3'), + (0x7C, '3'), + (0x7D, '3'), + (0x7E, '3'), + (0x7F, '3'), + (0x80, 'X'), + (0x81, 'X'), + (0x82, 'X'), + (0x83, 'X'), + (0x84, 'X'), + (0x85, 'X'), + (0x86, 'X'), + (0x87, 'X'), + (0x88, 'X'), + (0x89, 'X'), + (0x8A, 'X'), + (0x8B, 'X'), + (0x8C, 'X'), + (0x8D, 'X'), + (0x8E, 'X'), + (0x8F, 'X'), + (0x90, 'X'), + (0x91, 'X'), + (0x92, 'X'), + (0x93, 'X'), + (0x94, 'X'), + (0x95, 'X'), + (0x96, 'X'), + (0x97, 'X'), + (0x98, 'X'), + (0x99, 'X'), + (0x9A, 'X'), + (0x9B, 'X'), + (0x9C, 'X'), + (0x9D, 'X'), + (0x9E, 'X'), + (0x9F, 'X'), + (0xA0, '3', u' '), + (0xA1, 'V'), + (0xA2, 'V'), + (0xA3, 'V'), + (0xA4, 'V'), + (0xA5, 'V'), + (0xA6, 'V'), + (0xA7, 'V'), + (0xA8, '3', u' ̈'), + (0xA9, 'V'), + (0xAA, 'M', u'a'), + (0xAB, 'V'), + (0xAC, 'V'), + (0xAD, 'I'), + (0xAE, 'V'), + (0xAF, '3', u' ̄'), + (0xB0, 'V'), + (0xB1, 'V'), + (0xB2, 'M', u'2'), + (0xB3, 'M', u'3'), + (0xB4, '3', u' ́'), + (0xB5, 'M', u'μ'), + (0xB6, 'V'), + (0xB7, 'V'), + (0xB8, '3', u' ̧'), + (0xB9, 'M', u'1'), + (0xBA, 'M', u'o'), + (0xBB, 'V'), + (0xBC, 'M', u'1⁄4'), + (0xBD, 'M', u'1⁄2'), + (0xBE, 'M', u'3⁄4'), + (0xBF, 'V'), + (0xC0, 'M', u'à'), + (0xC1, 'M', u'á'), + (0xC2, 'M', u'â'), + (0xC3, 'M', u'ã'), + (0xC4, 'M', u'ä'), + (0xC5, 'M', u'å'), + (0xC6, 'M', u'æ'), + (0xC7, 'M', u'ç'), + ] + +def _seg_2(): + return [ + (0xC8, 'M', u'è'), + (0xC9, 'M', u'é'), + (0xCA, 'M', u'ê'), + (0xCB, 'M', u'ë'), + (0xCC, 'M', u'ì'), + (0xCD, 'M', u'í'), + (0xCE, 'M', u'î'), + (0xCF, 'M', u'ï'), + (0xD0, 'M', u'ð'), + (0xD1, 'M', u'ñ'), + (0xD2, 'M', u'ò'), + (0xD3, 'M', u'ó'), + (0xD4, 'M', u'ô'), + (0xD5, 'M', u'õ'), + (0xD6, 'M', u'ö'), + (0xD7, 'V'), + (0xD8, 'M', u'ø'), + (0xD9, 'M', u'ù'), + (0xDA, 'M', u'ú'), + (0xDB, 'M', u'û'), + (0xDC, 'M', u'ü'), + (0xDD, 'M', u'ý'), + (0xDE, 'M', u'þ'), + (0xDF, 'D', u'ss'), + (0xE0, 'V'), + (0xE1, 'V'), + (0xE2, 'V'), + (0xE3, 'V'), + (0xE4, 'V'), + (0xE5, 'V'), + (0xE6, 'V'), + (0xE7, 'V'), + (0xE8, 'V'), + (0xE9, 'V'), + (0xEA, 'V'), + (0xEB, 'V'), + (0xEC, 'V'), + (0xED, 'V'), + (0xEE, 'V'), + (0xEF, 'V'), + (0xF0, 'V'), + (0xF1, 'V'), + (0xF2, 'V'), + (0xF3, 'V'), + (0xF4, 'V'), + (0xF5, 'V'), + (0xF6, 'V'), + (0xF7, 'V'), + (0xF8, 'V'), + (0xF9, 'V'), + (0xFA, 'V'), + (0xFB, 'V'), + (0xFC, 'V'), + (0xFD, 'V'), + (0xFE, 'V'), + (0xFF, 'V'), + (0x100, 'M', u'ā'), + (0x101, 'V'), + (0x102, 'M', u'ă'), + (0x103, 'V'), + (0x104, 'M', u'ą'), + (0x105, 'V'), + (0x106, 'M', u'ć'), + (0x107, 'V'), + (0x108, 'M', u'ĉ'), + (0x109, 'V'), + (0x10A, 'M', u'ċ'), + (0x10B, 'V'), + (0x10C, 'M', u'č'), + (0x10D, 'V'), + (0x10E, 'M', u'ď'), + (0x10F, 'V'), + (0x110, 'M', u'đ'), + (0x111, 'V'), + (0x112, 'M', u'ē'), + (0x113, 'V'), + (0x114, 'M', u'ĕ'), + (0x115, 'V'), + (0x116, 'M', u'ė'), + (0x117, 'V'), + (0x118, 'M', u'ę'), + (0x119, 'V'), + (0x11A, 'M', u'ě'), + (0x11B, 'V'), + (0x11C, 'M', u'ĝ'), + (0x11D, 'V'), + (0x11E, 'M', u'ğ'), + (0x11F, 'V'), + (0x120, 'M', u'ġ'), + (0x121, 'V'), + (0x122, 'M', u'ģ'), + (0x123, 'V'), + (0x124, 'M', u'ĥ'), + (0x125, 'V'), + (0x126, 'M', u'ħ'), + (0x127, 'V'), + (0x128, 'M', u'ĩ'), + (0x129, 'V'), + (0x12A, 'M', u'ī'), + (0x12B, 'V'), + ] + +def _seg_3(): + return [ + (0x12C, 'M', u'ĭ'), + (0x12D, 'V'), + (0x12E, 'M', u'į'), + (0x12F, 'V'), + (0x130, 'M', u'i̇'), + (0x131, 'V'), + (0x132, 'M', u'ij'), + (0x134, 'M', u'ĵ'), + (0x135, 'V'), + (0x136, 'M', u'ķ'), + (0x137, 'V'), + (0x139, 'M', u'ĺ'), + (0x13A, 'V'), + (0x13B, 'M', u'ļ'), + (0x13C, 'V'), + (0x13D, 'M', u'ľ'), + (0x13E, 'V'), + (0x13F, 'M', u'l·'), + (0x141, 'M', u'ł'), + (0x142, 'V'), + (0x143, 'M', u'ń'), + (0x144, 'V'), + (0x145, 'M', u'ņ'), + (0x146, 'V'), + (0x147, 'M', u'ň'), + (0x148, 'V'), + (0x149, 'M', u'ʼn'), + (0x14A, 'M', u'ŋ'), + (0x14B, 'V'), + (0x14C, 'M', u'ō'), + (0x14D, 'V'), + (0x14E, 'M', u'ŏ'), + (0x14F, 'V'), + (0x150, 'M', u'ő'), + (0x151, 'V'), + (0x152, 'M', u'œ'), + (0x153, 'V'), + (0x154, 'M', u'ŕ'), + (0x155, 'V'), + (0x156, 'M', u'ŗ'), + (0x157, 'V'), + (0x158, 'M', u'ř'), + (0x159, 'V'), + (0x15A, 'M', u'ś'), + (0x15B, 'V'), + (0x15C, 'M', u'ŝ'), + (0x15D, 'V'), + (0x15E, 'M', u'ş'), + (0x15F, 'V'), + (0x160, 'M', u'š'), + (0x161, 'V'), + (0x162, 'M', u'ţ'), + (0x163, 'V'), + (0x164, 'M', u'ť'), + (0x165, 'V'), + (0x166, 'M', u'ŧ'), + (0x167, 'V'), + (0x168, 'M', u'ũ'), + (0x169, 'V'), + (0x16A, 'M', u'ū'), + (0x16B, 'V'), + (0x16C, 'M', u'ŭ'), + (0x16D, 'V'), + (0x16E, 'M', u'ů'), + (0x16F, 'V'), + (0x170, 'M', u'ű'), + (0x171, 'V'), + (0x172, 'M', u'ų'), + (0x173, 'V'), + (0x174, 'M', u'ŵ'), + (0x175, 'V'), + (0x176, 'M', u'ŷ'), + (0x177, 'V'), + (0x178, 'M', u'ÿ'), + (0x179, 'M', u'ź'), + (0x17A, 'V'), + (0x17B, 'M', u'ż'), + (0x17C, 'V'), + (0x17D, 'M', u'ž'), + (0x17E, 'V'), + (0x17F, 'M', u's'), + (0x180, 'V'), + (0x181, 'M', u'ɓ'), + (0x182, 'M', u'ƃ'), + (0x183, 'V'), + (0x184, 'M', u'ƅ'), + (0x185, 'V'), + (0x186, 'M', u'ɔ'), + (0x187, 'M', u'ƈ'), + (0x188, 'V'), + (0x189, 'M', u'ɖ'), + (0x18A, 'M', u'ɗ'), + (0x18B, 'M', u'ƌ'), + (0x18C, 'V'), + (0x18E, 'M', u'ǝ'), + (0x18F, 'M', u'ə'), + (0x190, 'M', u'ɛ'), + (0x191, 'M', u'ƒ'), + (0x192, 'V'), + (0x193, 'M', u'ɠ'), + ] + +def _seg_4(): + return [ + (0x194, 'M', u'ɣ'), + (0x195, 'V'), + (0x196, 'M', u'ɩ'), + (0x197, 'M', u'ɨ'), + (0x198, 'M', u'ƙ'), + (0x199, 'V'), + (0x19C, 'M', u'ɯ'), + (0x19D, 'M', u'ɲ'), + (0x19E, 'V'), + (0x19F, 'M', u'ɵ'), + (0x1A0, 'M', u'ơ'), + (0x1A1, 'V'), + (0x1A2, 'M', u'ƣ'), + (0x1A3, 'V'), + (0x1A4, 'M', u'ƥ'), + (0x1A5, 'V'), + (0x1A6, 'M', u'ʀ'), + (0x1A7, 'M', u'ƨ'), + (0x1A8, 'V'), + (0x1A9, 'M', u'ʃ'), + (0x1AA, 'V'), + (0x1AC, 'M', u'ƭ'), + (0x1AD, 'V'), + (0x1AE, 'M', u'ʈ'), + (0x1AF, 'M', u'ư'), + (0x1B0, 'V'), + (0x1B1, 'M', u'ʊ'), + (0x1B2, 'M', u'ʋ'), + (0x1B3, 'M', u'ƴ'), + (0x1B4, 'V'), + (0x1B5, 'M', u'ƶ'), + (0x1B6, 'V'), + (0x1B7, 'M', u'ʒ'), + (0x1B8, 'M', u'ƹ'), + (0x1B9, 'V'), + (0x1BC, 'M', u'ƽ'), + (0x1BD, 'V'), + (0x1C4, 'M', u'dž'), + (0x1C7, 'M', u'lj'), + (0x1CA, 'M', u'nj'), + (0x1CD, 'M', u'ǎ'), + (0x1CE, 'V'), + (0x1CF, 'M', u'ǐ'), + (0x1D0, 'V'), + (0x1D1, 'M', u'ǒ'), + (0x1D2, 'V'), + (0x1D3, 'M', u'ǔ'), + (0x1D4, 'V'), + (0x1D5, 'M', u'ǖ'), + (0x1D6, 'V'), + (0x1D7, 'M', u'ǘ'), + (0x1D8, 'V'), + (0x1D9, 'M', u'ǚ'), + (0x1DA, 'V'), + (0x1DB, 'M', u'ǜ'), + (0x1DC, 'V'), + (0x1DE, 'M', u'ǟ'), + (0x1DF, 'V'), + (0x1E0, 'M', u'ǡ'), + (0x1E1, 'V'), + (0x1E2, 'M', u'ǣ'), + (0x1E3, 'V'), + (0x1E4, 'M', u'ǥ'), + (0x1E5, 'V'), + (0x1E6, 'M', u'ǧ'), + (0x1E7, 'V'), + (0x1E8, 'M', u'ǩ'), + (0x1E9, 'V'), + (0x1EA, 'M', u'ǫ'), + (0x1EB, 'V'), + (0x1EC, 'M', u'ǭ'), + (0x1ED, 'V'), + (0x1EE, 'M', u'ǯ'), + (0x1EF, 'V'), + (0x1F1, 'M', u'dz'), + (0x1F4, 'M', u'ǵ'), + (0x1F5, 'V'), + (0x1F6, 'M', u'ƕ'), + (0x1F7, 'M', u'ƿ'), + (0x1F8, 'M', u'ǹ'), + (0x1F9, 'V'), + (0x1FA, 'M', u'ǻ'), + (0x1FB, 'V'), + (0x1FC, 'M', u'ǽ'), + (0x1FD, 'V'), + (0x1FE, 'M', u'ǿ'), + (0x1FF, 'V'), + (0x200, 'M', u'ȁ'), + (0x201, 'V'), + (0x202, 'M', u'ȃ'), + (0x203, 'V'), + (0x204, 'M', u'ȅ'), + (0x205, 'V'), + (0x206, 'M', u'ȇ'), + (0x207, 'V'), + (0x208, 'M', u'ȉ'), + (0x209, 'V'), + (0x20A, 'M', u'ȋ'), + (0x20B, 'V'), + (0x20C, 'M', u'ȍ'), + ] + +def _seg_5(): + return [ + (0x20D, 'V'), + (0x20E, 'M', u'ȏ'), + (0x20F, 'V'), + (0x210, 'M', u'ȑ'), + (0x211, 'V'), + (0x212, 'M', u'ȓ'), + (0x213, 'V'), + (0x214, 'M', u'ȕ'), + (0x215, 'V'), + (0x216, 'M', u'ȗ'), + (0x217, 'V'), + (0x218, 'M', u'ș'), + (0x219, 'V'), + (0x21A, 'M', u'ț'), + (0x21B, 'V'), + (0x21C, 'M', u'ȝ'), + (0x21D, 'V'), + (0x21E, 'M', u'ȟ'), + (0x21F, 'V'), + (0x220, 'M', u'ƞ'), + (0x221, 'V'), + (0x222, 'M', u'ȣ'), + (0x223, 'V'), + (0x224, 'M', u'ȥ'), + (0x225, 'V'), + (0x226, 'M', u'ȧ'), + (0x227, 'V'), + (0x228, 'M', u'ȩ'), + (0x229, 'V'), + (0x22A, 'M', u'ȫ'), + (0x22B, 'V'), + (0x22C, 'M', u'ȭ'), + (0x22D, 'V'), + (0x22E, 'M', u'ȯ'), + (0x22F, 'V'), + (0x230, 'M', u'ȱ'), + (0x231, 'V'), + (0x232, 'M', u'ȳ'), + (0x233, 'V'), + (0x23A, 'M', u'ⱥ'), + (0x23B, 'M', u'ȼ'), + (0x23C, 'V'), + (0x23D, 'M', u'ƚ'), + (0x23E, 'M', u'ⱦ'), + (0x23F, 'V'), + (0x241, 'M', u'ɂ'), + (0x242, 'V'), + (0x243, 'M', u'ƀ'), + (0x244, 'M', u'ʉ'), + (0x245, 'M', u'ʌ'), + (0x246, 'M', u'ɇ'), + (0x247, 'V'), + (0x248, 'M', u'ɉ'), + (0x249, 'V'), + (0x24A, 'M', u'ɋ'), + (0x24B, 'V'), + (0x24C, 'M', u'ɍ'), + (0x24D, 'V'), + (0x24E, 'M', u'ɏ'), + (0x24F, 'V'), + (0x2B0, 'M', u'h'), + (0x2B1, 'M', u'ɦ'), + (0x2B2, 'M', u'j'), + (0x2B3, 'M', u'r'), + (0x2B4, 'M', u'ɹ'), + (0x2B5, 'M', u'ɻ'), + (0x2B6, 'M', u'ʁ'), + (0x2B7, 'M', u'w'), + (0x2B8, 'M', u'y'), + (0x2B9, 'V'), + (0x2D8, '3', u' ̆'), + (0x2D9, '3', u' ̇'), + (0x2DA, '3', u' ̊'), + (0x2DB, '3', u' ̨'), + (0x2DC, '3', u' ̃'), + (0x2DD, '3', u' ̋'), + (0x2DE, 'V'), + (0x2E0, 'M', u'ɣ'), + (0x2E1, 'M', u'l'), + (0x2E2, 'M', u's'), + (0x2E3, 'M', u'x'), + (0x2E4, 'M', u'ʕ'), + (0x2E5, 'V'), + (0x340, 'M', u'̀'), + (0x341, 'M', u'́'), + (0x342, 'V'), + (0x343, 'M', u'̓'), + (0x344, 'M', u'̈́'), + (0x345, 'M', u'ι'), + (0x346, 'V'), + (0x34F, 'I'), + (0x350, 'V'), + (0x370, 'M', u'ͱ'), + (0x371, 'V'), + (0x372, 'M', u'ͳ'), + (0x373, 'V'), + (0x374, 'M', u'ʹ'), + (0x375, 'V'), + (0x376, 'M', u'ͷ'), + (0x377, 'V'), + ] + +def _seg_6(): + return [ + (0x378, 'X'), + (0x37A, '3', u' ι'), + (0x37B, 'V'), + (0x37E, '3', u';'), + (0x37F, 'X'), + (0x384, '3', u' ́'), + (0x385, '3', u' ̈́'), + (0x386, 'M', u'ά'), + (0x387, 'M', u'·'), + (0x388, 'M', u'έ'), + (0x389, 'M', u'ή'), + (0x38A, 'M', u'ί'), + (0x38B, 'X'), + (0x38C, 'M', u'ό'), + (0x38D, 'X'), + (0x38E, 'M', u'ύ'), + (0x38F, 'M', u'ώ'), + (0x390, 'V'), + (0x391, 'M', u'α'), + (0x392, 'M', u'β'), + (0x393, 'M', u'γ'), + (0x394, 'M', u'δ'), + (0x395, 'M', u'ε'), + (0x396, 'M', u'ζ'), + (0x397, 'M', u'η'), + (0x398, 'M', u'θ'), + (0x399, 'M', u'ι'), + (0x39A, 'M', u'κ'), + (0x39B, 'M', u'λ'), + (0x39C, 'M', u'μ'), + (0x39D, 'M', u'ν'), + (0x39E, 'M', u'ξ'), + (0x39F, 'M', u'ο'), + (0x3A0, 'M', u'π'), + (0x3A1, 'M', u'ρ'), + (0x3A2, 'X'), + (0x3A3, 'M', u'σ'), + (0x3A4, 'M', u'τ'), + (0x3A5, 'M', u'υ'), + (0x3A6, 'M', u'φ'), + (0x3A7, 'M', u'χ'), + (0x3A8, 'M', u'ψ'), + (0x3A9, 'M', u'ω'), + (0x3AA, 'M', u'ϊ'), + (0x3AB, 'M', u'ϋ'), + (0x3AC, 'V'), + (0x3C2, 'D', u'σ'), + (0x3C3, 'V'), + (0x3CF, 'M', u'ϗ'), + (0x3D0, 'M', u'β'), + (0x3D1, 'M', u'θ'), + (0x3D2, 'M', u'υ'), + (0x3D3, 'M', u'ύ'), + (0x3D4, 'M', u'ϋ'), + (0x3D5, 'M', u'φ'), + (0x3D6, 'M', u'π'), + (0x3D7, 'V'), + (0x3D8, 'M', u'ϙ'), + (0x3D9, 'V'), + (0x3DA, 'M', u'ϛ'), + (0x3DB, 'V'), + (0x3DC, 'M', u'ϝ'), + (0x3DD, 'V'), + (0x3DE, 'M', u'ϟ'), + (0x3DF, 'V'), + (0x3E0, 'M', u'ϡ'), + (0x3E1, 'V'), + (0x3E2, 'M', u'ϣ'), + (0x3E3, 'V'), + (0x3E4, 'M', u'ϥ'), + (0x3E5, 'V'), + (0x3E6, 'M', u'ϧ'), + (0x3E7, 'V'), + (0x3E8, 'M', u'ϩ'), + (0x3E9, 'V'), + (0x3EA, 'M', u'ϫ'), + (0x3EB, 'V'), + (0x3EC, 'M', u'ϭ'), + (0x3ED, 'V'), + (0x3EE, 'M', u'ϯ'), + (0x3EF, 'V'), + (0x3F0, 'M', u'κ'), + (0x3F1, 'M', u'ρ'), + (0x3F2, 'M', u'σ'), + (0x3F3, 'V'), + (0x3F4, 'M', u'θ'), + (0x3F5, 'M', u'ε'), + (0x3F6, 'V'), + (0x3F7, 'M', u'ϸ'), + (0x3F8, 'V'), + (0x3F9, 'M', u'σ'), + (0x3FA, 'M', u'ϻ'), + (0x3FB, 'V'), + (0x3FD, 'M', u'ͻ'), + (0x3FE, 'M', u'ͼ'), + (0x3FF, 'M', u'ͽ'), + (0x400, 'M', u'ѐ'), + (0x401, 'M', u'ё'), + (0x402, 'M', u'ђ'), + (0x403, 'M', u'ѓ'), + ] + +def _seg_7(): + return [ + (0x404, 'M', u'є'), + (0x405, 'M', u'ѕ'), + (0x406, 'M', u'і'), + (0x407, 'M', u'ї'), + (0x408, 'M', u'ј'), + (0x409, 'M', u'љ'), + (0x40A, 'M', u'њ'), + (0x40B, 'M', u'ћ'), + (0x40C, 'M', u'ќ'), + (0x40D, 'M', u'ѝ'), + (0x40E, 'M', u'ў'), + (0x40F, 'M', u'џ'), + (0x410, 'M', u'а'), + (0x411, 'M', u'б'), + (0x412, 'M', u'в'), + (0x413, 'M', u'г'), + (0x414, 'M', u'д'), + (0x415, 'M', u'е'), + (0x416, 'M', u'ж'), + (0x417, 'M', u'з'), + (0x418, 'M', u'и'), + (0x419, 'M', u'й'), + (0x41A, 'M', u'к'), + (0x41B, 'M', u'л'), + (0x41C, 'M', u'м'), + (0x41D, 'M', u'н'), + (0x41E, 'M', u'о'), + (0x41F, 'M', u'п'), + (0x420, 'M', u'р'), + (0x421, 'M', u'с'), + (0x422, 'M', u'т'), + (0x423, 'M', u'у'), + (0x424, 'M', u'ф'), + (0x425, 'M', u'х'), + (0x426, 'M', u'ц'), + (0x427, 'M', u'ч'), + (0x428, 'M', u'ш'), + (0x429, 'M', u'щ'), + (0x42A, 'M', u'ъ'), + (0x42B, 'M', u'ы'), + (0x42C, 'M', u'ь'), + (0x42D, 'M', u'э'), + (0x42E, 'M', u'ю'), + (0x42F, 'M', u'я'), + (0x430, 'V'), + (0x460, 'M', u'ѡ'), + (0x461, 'V'), + (0x462, 'M', u'ѣ'), + (0x463, 'V'), + (0x464, 'M', u'ѥ'), + (0x465, 'V'), + (0x466, 'M', u'ѧ'), + (0x467, 'V'), + (0x468, 'M', u'ѩ'), + (0x469, 'V'), + (0x46A, 'M', u'ѫ'), + (0x46B, 'V'), + (0x46C, 'M', u'ѭ'), + (0x46D, 'V'), + (0x46E, 'M', u'ѯ'), + (0x46F, 'V'), + (0x470, 'M', u'ѱ'), + (0x471, 'V'), + (0x472, 'M', u'ѳ'), + (0x473, 'V'), + (0x474, 'M', u'ѵ'), + (0x475, 'V'), + (0x476, 'M', u'ѷ'), + (0x477, 'V'), + (0x478, 'M', u'ѹ'), + (0x479, 'V'), + (0x47A, 'M', u'ѻ'), + (0x47B, 'V'), + (0x47C, 'M', u'ѽ'), + (0x47D, 'V'), + (0x47E, 'M', u'ѿ'), + (0x47F, 'V'), + (0x480, 'M', u'ҁ'), + (0x481, 'V'), + (0x48A, 'M', u'ҋ'), + (0x48B, 'V'), + (0x48C, 'M', u'ҍ'), + (0x48D, 'V'), + (0x48E, 'M', u'ҏ'), + (0x48F, 'V'), + (0x490, 'M', u'ґ'), + (0x491, 'V'), + (0x492, 'M', u'ғ'), + (0x493, 'V'), + (0x494, 'M', u'ҕ'), + (0x495, 'V'), + (0x496, 'M', u'җ'), + (0x497, 'V'), + (0x498, 'M', u'ҙ'), + (0x499, 'V'), + (0x49A, 'M', u'қ'), + (0x49B, 'V'), + (0x49C, 'M', u'ҝ'), + (0x49D, 'V'), + (0x49E, 'M', u'ҟ'), + ] + +def _seg_8(): + return [ + (0x49F, 'V'), + (0x4A0, 'M', u'ҡ'), + (0x4A1, 'V'), + (0x4A2, 'M', u'ң'), + (0x4A3, 'V'), + (0x4A4, 'M', u'ҥ'), + (0x4A5, 'V'), + (0x4A6, 'M', u'ҧ'), + (0x4A7, 'V'), + (0x4A8, 'M', u'ҩ'), + (0x4A9, 'V'), + (0x4AA, 'M', u'ҫ'), + (0x4AB, 'V'), + (0x4AC, 'M', u'ҭ'), + (0x4AD, 'V'), + (0x4AE, 'M', u'ү'), + (0x4AF, 'V'), + (0x4B0, 'M', u'ұ'), + (0x4B1, 'V'), + (0x4B2, 'M', u'ҳ'), + (0x4B3, 'V'), + (0x4B4, 'M', u'ҵ'), + (0x4B5, 'V'), + (0x4B6, 'M', u'ҷ'), + (0x4B7, 'V'), + (0x4B8, 'M', u'ҹ'), + (0x4B9, 'V'), + (0x4BA, 'M', u'һ'), + (0x4BB, 'V'), + (0x4BC, 'M', u'ҽ'), + (0x4BD, 'V'), + (0x4BE, 'M', u'ҿ'), + (0x4BF, 'V'), + (0x4C0, 'X'), + (0x4C1, 'M', u'ӂ'), + (0x4C2, 'V'), + (0x4C3, 'M', u'ӄ'), + (0x4C4, 'V'), + (0x4C5, 'M', u'ӆ'), + (0x4C6, 'V'), + (0x4C7, 'M', u'ӈ'), + (0x4C8, 'V'), + (0x4C9, 'M', u'ӊ'), + (0x4CA, 'V'), + (0x4CB, 'M', u'ӌ'), + (0x4CC, 'V'), + (0x4CD, 'M', u'ӎ'), + (0x4CE, 'V'), + (0x4D0, 'M', u'ӑ'), + (0x4D1, 'V'), + (0x4D2, 'M', u'ӓ'), + (0x4D3, 'V'), + (0x4D4, 'M', u'ӕ'), + (0x4D5, 'V'), + (0x4D6, 'M', u'ӗ'), + (0x4D7, 'V'), + (0x4D8, 'M', u'ә'), + (0x4D9, 'V'), + (0x4DA, 'M', u'ӛ'), + (0x4DB, 'V'), + (0x4DC, 'M', u'ӝ'), + (0x4DD, 'V'), + (0x4DE, 'M', u'ӟ'), + (0x4DF, 'V'), + (0x4E0, 'M', u'ӡ'), + (0x4E1, 'V'), + (0x4E2, 'M', u'ӣ'), + (0x4E3, 'V'), + (0x4E4, 'M', u'ӥ'), + (0x4E5, 'V'), + (0x4E6, 'M', u'ӧ'), + (0x4E7, 'V'), + (0x4E8, 'M', u'ө'), + (0x4E9, 'V'), + (0x4EA, 'M', u'ӫ'), + (0x4EB, 'V'), + (0x4EC, 'M', u'ӭ'), + (0x4ED, 'V'), + (0x4EE, 'M', u'ӯ'), + (0x4EF, 'V'), + (0x4F0, 'M', u'ӱ'), + (0x4F1, 'V'), + (0x4F2, 'M', u'ӳ'), + (0x4F3, 'V'), + (0x4F4, 'M', u'ӵ'), + (0x4F5, 'V'), + (0x4F6, 'M', u'ӷ'), + (0x4F7, 'V'), + (0x4F8, 'M', u'ӹ'), + (0x4F9, 'V'), + (0x4FA, 'M', u'ӻ'), + (0x4FB, 'V'), + (0x4FC, 'M', u'ӽ'), + (0x4FD, 'V'), + (0x4FE, 'M', u'ӿ'), + (0x4FF, 'V'), + (0x500, 'M', u'ԁ'), + (0x501, 'V'), + (0x502, 'M', u'ԃ'), + (0x503, 'V'), + ] + +def _seg_9(): + return [ + (0x504, 'M', u'ԅ'), + (0x505, 'V'), + (0x506, 'M', u'ԇ'), + (0x507, 'V'), + (0x508, 'M', u'ԉ'), + (0x509, 'V'), + (0x50A, 'M', u'ԋ'), + (0x50B, 'V'), + (0x50C, 'M', u'ԍ'), + (0x50D, 'V'), + (0x50E, 'M', u'ԏ'), + (0x50F, 'V'), + (0x510, 'M', u'ԑ'), + (0x511, 'V'), + (0x512, 'M', u'ԓ'), + (0x513, 'V'), + (0x514, 'M', u'ԕ'), + (0x515, 'V'), + (0x516, 'M', u'ԗ'), + (0x517, 'V'), + (0x518, 'M', u'ԙ'), + (0x519, 'V'), + (0x51A, 'M', u'ԛ'), + (0x51B, 'V'), + (0x51C, 'M', u'ԝ'), + (0x51D, 'V'), + (0x51E, 'M', u'ԟ'), + (0x51F, 'V'), + (0x520, 'M', u'ԡ'), + (0x521, 'V'), + (0x522, 'M', u'ԣ'), + (0x523, 'V'), + (0x524, 'M', u'ԥ'), + (0x525, 'V'), + (0x526, 'M', u'ԧ'), + (0x527, 'V'), + (0x528, 'X'), + (0x531, 'M', u'ա'), + (0x532, 'M', u'բ'), + (0x533, 'M', u'գ'), + (0x534, 'M', u'դ'), + (0x535, 'M', u'ե'), + (0x536, 'M', u'զ'), + (0x537, 'M', u'է'), + (0x538, 'M', u'ը'), + (0x539, 'M', u'թ'), + (0x53A, 'M', u'ժ'), + (0x53B, 'M', u'ի'), + (0x53C, 'M', u'լ'), + (0x53D, 'M', u'խ'), + (0x53E, 'M', u'ծ'), + (0x53F, 'M', u'կ'), + (0x540, 'M', u'հ'), + (0x541, 'M', u'ձ'), + (0x542, 'M', u'ղ'), + (0x543, 'M', u'ճ'), + (0x544, 'M', u'մ'), + (0x545, 'M', u'յ'), + (0x546, 'M', u'ն'), + (0x547, 'M', u'շ'), + (0x548, 'M', u'ո'), + (0x549, 'M', u'չ'), + (0x54A, 'M', u'պ'), + (0x54B, 'M', u'ջ'), + (0x54C, 'M', u'ռ'), + (0x54D, 'M', u'ս'), + (0x54E, 'M', u'վ'), + (0x54F, 'M', u'տ'), + (0x550, 'M', u'ր'), + (0x551, 'M', u'ց'), + (0x552, 'M', u'ւ'), + (0x553, 'M', u'փ'), + (0x554, 'M', u'ք'), + (0x555, 'M', u'օ'), + (0x556, 'M', u'ֆ'), + (0x557, 'X'), + (0x559, 'V'), + (0x560, 'X'), + (0x561, 'V'), + (0x587, 'M', u'եւ'), + (0x588, 'X'), + (0x589, 'V'), + (0x58B, 'X'), + (0x58F, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5F0, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + ] + +def _seg_10(): + return [ + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x800, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x8A0, 'V'), + (0x8A1, 'X'), + (0x8A2, 'V'), + (0x8AD, 'X'), + (0x8E4, 'V'), + (0x8FF, 'X'), + (0x900, 'V'), + (0x958, 'M', u'क़'), + (0x959, 'M', u'ख़'), + (0x95A, 'M', u'ग़'), + (0x95B, 'M', u'ज़'), + (0x95C, 'M', u'ड़'), + (0x95D, 'M', u'ढ़'), + (0x95E, 'M', u'फ़'), + (0x95F, 'M', u'य़'), + (0x960, 'V'), + (0x978, 'X'), + (0x979, 'V'), + (0x980, 'X'), + (0x981, 'V'), + (0x984, 'X'), + (0x985, 'V'), + (0x98D, 'X'), + (0x98F, 'V'), + (0x991, 'X'), + (0x993, 'V'), + (0x9A9, 'X'), + (0x9AA, 'V'), + (0x9B1, 'X'), + (0x9B2, 'V'), + (0x9B3, 'X'), + (0x9B6, 'V'), + (0x9BA, 'X'), + (0x9BC, 'V'), + (0x9C5, 'X'), + (0x9C7, 'V'), + (0x9C9, 'X'), + (0x9CB, 'V'), + (0x9CF, 'X'), + (0x9D7, 'V'), + (0x9D8, 'X'), + (0x9DC, 'M', u'ড়'), + (0x9DD, 'M', u'ঢ়'), + (0x9DE, 'X'), + (0x9DF, 'M', u'য়'), + (0x9E0, 'V'), + (0x9E4, 'X'), + (0x9E6, 'V'), + (0x9FC, 'X'), + (0xA01, 'V'), + (0xA04, 'X'), + (0xA05, 'V'), + (0xA0B, 'X'), + (0xA0F, 'V'), + (0xA11, 'X'), + (0xA13, 'V'), + (0xA29, 'X'), + (0xA2A, 'V'), + (0xA31, 'X'), + (0xA32, 'V'), + (0xA33, 'M', u'ਲ਼'), + (0xA34, 'X'), + (0xA35, 'V'), + (0xA36, 'M', u'ਸ਼'), + (0xA37, 'X'), + (0xA38, 'V'), + (0xA3A, 'X'), + (0xA3C, 'V'), + (0xA3D, 'X'), + (0xA3E, 'V'), + (0xA43, 'X'), + (0xA47, 'V'), + (0xA49, 'X'), + (0xA4B, 'V'), + (0xA4E, 'X'), + (0xA51, 'V'), + (0xA52, 'X'), + (0xA59, 'M', u'ਖ਼'), + (0xA5A, 'M', u'ਗ਼'), + (0xA5B, 'M', u'ਜ਼'), + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + ] + +def _seg_11(): + return [ + (0xA66, 'V'), + (0xA76, 'X'), + (0xA81, 'V'), + (0xA84, 'X'), + (0xA85, 'V'), + (0xA8E, 'X'), + (0xA8F, 'V'), + (0xA92, 'X'), + (0xA93, 'V'), + (0xAA9, 'X'), + (0xAAA, 'V'), + (0xAB1, 'X'), + (0xAB2, 'V'), + (0xAB4, 'X'), + (0xAB5, 'V'), + (0xABA, 'X'), + (0xABC, 'V'), + (0xAC6, 'X'), + (0xAC7, 'V'), + (0xACA, 'X'), + (0xACB, 'V'), + (0xACE, 'X'), + (0xAD0, 'V'), + (0xAD1, 'X'), + (0xAE0, 'V'), + (0xAE4, 'X'), + (0xAE6, 'V'), + (0xAF2, 'X'), + (0xB01, 'V'), + (0xB04, 'X'), + (0xB05, 'V'), + (0xB0D, 'X'), + (0xB0F, 'V'), + (0xB11, 'X'), + (0xB13, 'V'), + (0xB29, 'X'), + (0xB2A, 'V'), + (0xB31, 'X'), + (0xB32, 'V'), + (0xB34, 'X'), + (0xB35, 'V'), + (0xB3A, 'X'), + (0xB3C, 'V'), + (0xB45, 'X'), + (0xB47, 'V'), + (0xB49, 'X'), + (0xB4B, 'V'), + (0xB4E, 'X'), + (0xB56, 'V'), + (0xB58, 'X'), + (0xB5C, 'M', u'ଡ଼'), + (0xB5D, 'M', u'ଢ଼'), + (0xB5E, 'X'), + (0xB5F, 'V'), + (0xB64, 'X'), + (0xB66, 'V'), + (0xB78, 'X'), + (0xB82, 'V'), + (0xB84, 'X'), + (0xB85, 'V'), + (0xB8B, 'X'), + (0xB8E, 'V'), + (0xB91, 'X'), + (0xB92, 'V'), + (0xB96, 'X'), + (0xB99, 'V'), + (0xB9B, 'X'), + (0xB9C, 'V'), + (0xB9D, 'X'), + (0xB9E, 'V'), + (0xBA0, 'X'), + (0xBA3, 'V'), + (0xBA5, 'X'), + (0xBA8, 'V'), + (0xBAB, 'X'), + (0xBAE, 'V'), + (0xBBA, 'X'), + (0xBBE, 'V'), + (0xBC3, 'X'), + (0xBC6, 'V'), + (0xBC9, 'X'), + (0xBCA, 'V'), + (0xBCE, 'X'), + (0xBD0, 'V'), + (0xBD1, 'X'), + (0xBD7, 'V'), + (0xBD8, 'X'), + (0xBE6, 'V'), + (0xBFB, 'X'), + (0xC01, 'V'), + (0xC04, 'X'), + (0xC05, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC34, 'X'), + (0xC35, 'V'), + ] + +def _seg_12(): + return [ + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5A, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, 'V'), + (0xC80, 'X'), + (0xC82, 'V'), + (0xC84, 'X'), + (0xC85, 'V'), + (0xC8D, 'X'), + (0xC8E, 'V'), + (0xC91, 'X'), + (0xC92, 'V'), + (0xCA9, 'X'), + (0xCAA, 'V'), + (0xCB4, 'X'), + (0xCB5, 'V'), + (0xCBA, 'X'), + (0xCBC, 'V'), + (0xCC5, 'X'), + (0xCC6, 'V'), + (0xCC9, 'X'), + (0xCCA, 'V'), + (0xCCE, 'X'), + (0xCD5, 'V'), + (0xCD7, 'X'), + (0xCDE, 'V'), + (0xCDF, 'X'), + (0xCE0, 'V'), + (0xCE4, 'X'), + (0xCE6, 'V'), + (0xCF0, 'X'), + (0xCF1, 'V'), + (0xCF3, 'X'), + (0xD02, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD3B, 'X'), + (0xD3D, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD4F, 'X'), + (0xD57, 'V'), + (0xD58, 'X'), + (0xD60, 'V'), + (0xD64, 'X'), + (0xD66, 'V'), + (0xD76, 'X'), + (0xD79, 'V'), + (0xD80, 'X'), + (0xD82, 'V'), + (0xD84, 'X'), + (0xD85, 'V'), + (0xD97, 'X'), + (0xD9A, 'V'), + (0xDB2, 'X'), + (0xDB3, 'V'), + (0xDBC, 'X'), + (0xDBD, 'V'), + (0xDBE, 'X'), + (0xDC0, 'V'), + (0xDC7, 'X'), + (0xDCA, 'V'), + (0xDCB, 'X'), + (0xDCF, 'V'), + (0xDD5, 'X'), + (0xDD6, 'V'), + (0xDD7, 'X'), + (0xDD8, 'V'), + (0xDE0, 'X'), + (0xDF2, 'V'), + (0xDF5, 'X'), + (0xE01, 'V'), + (0xE33, 'M', u'ํา'), + (0xE34, 'V'), + (0xE3B, 'X'), + (0xE3F, 'V'), + (0xE5C, 'X'), + (0xE81, 'V'), + (0xE83, 'X'), + (0xE84, 'V'), + (0xE85, 'X'), + (0xE87, 'V'), + ] + +def _seg_13(): + return [ + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + (0xE98, 'X'), + (0xE99, 'V'), + (0xEA0, 'X'), + (0xEA1, 'V'), + (0xEA4, 'X'), + (0xEA5, 'V'), + (0xEA6, 'X'), + (0xEA7, 'V'), + (0xEA8, 'X'), + (0xEAA, 'V'), + (0xEAC, 'X'), + (0xEAD, 'V'), + (0xEB3, 'M', u'ໍາ'), + (0xEB4, 'V'), + (0xEBA, 'X'), + (0xEBB, 'V'), + (0xEBE, 'X'), + (0xEC0, 'V'), + (0xEC5, 'X'), + (0xEC6, 'V'), + (0xEC7, 'X'), + (0xEC8, 'V'), + (0xECE, 'X'), + (0xED0, 'V'), + (0xEDA, 'X'), + (0xEDC, 'M', u'ຫນ'), + (0xEDD, 'M', u'ຫມ'), + (0xEDE, 'V'), + (0xEE0, 'X'), + (0xF00, 'V'), + (0xF0C, 'M', u'་'), + (0xF0D, 'V'), + (0xF43, 'M', u'གྷ'), + (0xF44, 'V'), + (0xF48, 'X'), + (0xF49, 'V'), + (0xF4D, 'M', u'ཌྷ'), + (0xF4E, 'V'), + (0xF52, 'M', u'དྷ'), + (0xF53, 'V'), + (0xF57, 'M', u'བྷ'), + (0xF58, 'V'), + (0xF5C, 'M', u'ཛྷ'), + (0xF5D, 'V'), + (0xF69, 'M', u'ཀྵ'), + (0xF6A, 'V'), + (0xF6D, 'X'), + (0xF71, 'V'), + (0xF73, 'M', u'ཱི'), + (0xF74, 'V'), + (0xF75, 'M', u'ཱུ'), + (0xF76, 'M', u'ྲྀ'), + (0xF77, 'M', u'ྲཱྀ'), + (0xF78, 'M', u'ླྀ'), + (0xF79, 'M', u'ླཱྀ'), + (0xF7A, 'V'), + (0xF81, 'M', u'ཱྀ'), + (0xF82, 'V'), + (0xF93, 'M', u'ྒྷ'), + (0xF94, 'V'), + (0xF98, 'X'), + (0xF99, 'V'), + (0xF9D, 'M', u'ྜྷ'), + (0xF9E, 'V'), + (0xFA2, 'M', u'ྡྷ'), + (0xFA3, 'V'), + (0xFA7, 'M', u'ྦྷ'), + (0xFA8, 'V'), + (0xFAC, 'M', u'ྫྷ'), + (0xFAD, 'V'), + (0xFB9, 'M', u'ྐྵ'), + (0xFBA, 'V'), + (0xFBD, 'X'), + (0xFBE, 'V'), + (0xFCD, 'X'), + (0xFCE, 'V'), + (0xFDB, 'X'), + (0x1000, 'V'), + (0x10A0, 'X'), + (0x10C7, 'M', u'ⴧ'), + (0x10C8, 'X'), + (0x10CD, 'M', u'ⴭ'), + (0x10CE, 'X'), + (0x10D0, 'V'), + (0x10FC, 'M', u'ნ'), + (0x10FD, 'V'), + (0x115F, 'X'), + (0x1161, 'V'), + (0x1249, 'X'), + (0x124A, 'V'), + (0x124E, 'X'), + (0x1250, 'V'), + (0x1257, 'X'), + (0x1258, 'V'), + ] + +def _seg_14(): + return [ + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + (0x128E, 'X'), + (0x1290, 'V'), + (0x12B1, 'X'), + (0x12B2, 'V'), + (0x12B6, 'X'), + (0x12B8, 'V'), + (0x12BF, 'X'), + (0x12C0, 'V'), + (0x12C1, 'X'), + (0x12C2, 'V'), + (0x12C6, 'X'), + (0x12C8, 'V'), + (0x12D7, 'X'), + (0x12D8, 'V'), + (0x1311, 'X'), + (0x1312, 'V'), + (0x1316, 'X'), + (0x1318, 'V'), + (0x135B, 'X'), + (0x135D, 'V'), + (0x137D, 'X'), + (0x1380, 'V'), + (0x139A, 'X'), + (0x13A0, 'V'), + (0x13F5, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F1, 'X'), + (0x1700, 'V'), + (0x170D, 'X'), + (0x170E, 'V'), + (0x1715, 'X'), + (0x1720, 'V'), + (0x1737, 'X'), + (0x1740, 'V'), + (0x1754, 'X'), + (0x1760, 'V'), + (0x176D, 'X'), + (0x176E, 'V'), + (0x1771, 'X'), + (0x1772, 'V'), + (0x1774, 'X'), + (0x1780, 'V'), + (0x17B4, 'X'), + (0x17B6, 'V'), + (0x17DE, 'X'), + (0x17E0, 'V'), + (0x17EA, 'X'), + (0x17F0, 'V'), + (0x17FA, 'X'), + (0x1800, 'V'), + (0x1806, 'X'), + (0x1807, 'V'), + (0x180B, 'I'), + (0x180E, 'X'), + (0x1810, 'V'), + (0x181A, 'X'), + (0x1820, 'V'), + (0x1878, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191D, 'X'), + (0x1920, 'V'), + (0x192C, 'X'), + (0x1930, 'V'), + (0x193C, 'X'), + (0x1940, 'V'), + (0x1941, 'X'), + (0x1944, 'V'), + (0x196E, 'X'), + (0x1970, 'V'), + (0x1975, 'X'), + (0x1980, 'V'), + (0x19AC, 'X'), + (0x19B0, 'V'), + (0x19CA, 'X'), + (0x19D0, 'V'), + (0x19DB, 'X'), + (0x19DE, 'V'), + (0x1A1C, 'X'), + (0x1A1E, 'V'), + (0x1A5F, 'X'), + (0x1A60, 'V'), + (0x1A7D, 'X'), + (0x1A7F, 'V'), + (0x1A8A, 'X'), + (0x1A90, 'V'), + (0x1A9A, 'X'), + ] + +def _seg_15(): + return [ + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CF7, 'X'), + (0x1D00, 'V'), + (0x1D2C, 'M', u'a'), + (0x1D2D, 'M', u'æ'), + (0x1D2E, 'M', u'b'), + (0x1D2F, 'V'), + (0x1D30, 'M', u'd'), + (0x1D31, 'M', u'e'), + (0x1D32, 'M', u'ǝ'), + (0x1D33, 'M', u'g'), + (0x1D34, 'M', u'h'), + (0x1D35, 'M', u'i'), + (0x1D36, 'M', u'j'), + (0x1D37, 'M', u'k'), + (0x1D38, 'M', u'l'), + (0x1D39, 'M', u'm'), + (0x1D3A, 'M', u'n'), + (0x1D3B, 'V'), + (0x1D3C, 'M', u'o'), + (0x1D3D, 'M', u'ȣ'), + (0x1D3E, 'M', u'p'), + (0x1D3F, 'M', u'r'), + (0x1D40, 'M', u't'), + (0x1D41, 'M', u'u'), + (0x1D42, 'M', u'w'), + (0x1D43, 'M', u'a'), + (0x1D44, 'M', u'ɐ'), + (0x1D45, 'M', u'ɑ'), + (0x1D46, 'M', u'ᴂ'), + (0x1D47, 'M', u'b'), + (0x1D48, 'M', u'd'), + (0x1D49, 'M', u'e'), + (0x1D4A, 'M', u'ə'), + (0x1D4B, 'M', u'ɛ'), + (0x1D4C, 'M', u'ɜ'), + (0x1D4D, 'M', u'g'), + (0x1D4E, 'V'), + (0x1D4F, 'M', u'k'), + (0x1D50, 'M', u'm'), + (0x1D51, 'M', u'ŋ'), + (0x1D52, 'M', u'o'), + (0x1D53, 'M', u'ɔ'), + (0x1D54, 'M', u'ᴖ'), + (0x1D55, 'M', u'ᴗ'), + (0x1D56, 'M', u'p'), + (0x1D57, 'M', u't'), + (0x1D58, 'M', u'u'), + (0x1D59, 'M', u'ᴝ'), + (0x1D5A, 'M', u'ɯ'), + (0x1D5B, 'M', u'v'), + (0x1D5C, 'M', u'ᴥ'), + (0x1D5D, 'M', u'β'), + (0x1D5E, 'M', u'γ'), + (0x1D5F, 'M', u'δ'), + (0x1D60, 'M', u'φ'), + (0x1D61, 'M', u'χ'), + (0x1D62, 'M', u'i'), + (0x1D63, 'M', u'r'), + (0x1D64, 'M', u'u'), + (0x1D65, 'M', u'v'), + (0x1D66, 'M', u'β'), + (0x1D67, 'M', u'γ'), + (0x1D68, 'M', u'ρ'), + (0x1D69, 'M', u'φ'), + (0x1D6A, 'M', u'χ'), + (0x1D6B, 'V'), + (0x1D78, 'M', u'н'), + (0x1D79, 'V'), + (0x1D9B, 'M', u'ɒ'), + (0x1D9C, 'M', u'c'), + (0x1D9D, 'M', u'ɕ'), + (0x1D9E, 'M', u'ð'), + (0x1D9F, 'M', u'ɜ'), + (0x1DA0, 'M', u'f'), + (0x1DA1, 'M', u'ɟ'), + (0x1DA2, 'M', u'ɡ'), + (0x1DA3, 'M', u'ɥ'), + (0x1DA4, 'M', u'ɨ'), + (0x1DA5, 'M', u'ɩ'), + (0x1DA6, 'M', u'ɪ'), + (0x1DA7, 'M', u'ᵻ'), + (0x1DA8, 'M', u'ʝ'), + (0x1DA9, 'M', u'ɭ'), + ] + +def _seg_16(): + return [ + (0x1DAA, 'M', u'ᶅ'), + (0x1DAB, 'M', u'ʟ'), + (0x1DAC, 'M', u'ɱ'), + (0x1DAD, 'M', u'ɰ'), + (0x1DAE, 'M', u'ɲ'), + (0x1DAF, 'M', u'ɳ'), + (0x1DB0, 'M', u'ɴ'), + (0x1DB1, 'M', u'ɵ'), + (0x1DB2, 'M', u'ɸ'), + (0x1DB3, 'M', u'ʂ'), + (0x1DB4, 'M', u'ʃ'), + (0x1DB5, 'M', u'ƫ'), + (0x1DB6, 'M', u'ʉ'), + (0x1DB7, 'M', u'ʊ'), + (0x1DB8, 'M', u'ᴜ'), + (0x1DB9, 'M', u'ʋ'), + (0x1DBA, 'M', u'ʌ'), + (0x1DBB, 'M', u'z'), + (0x1DBC, 'M', u'ʐ'), + (0x1DBD, 'M', u'ʑ'), + (0x1DBE, 'M', u'ʒ'), + (0x1DBF, 'M', u'θ'), + (0x1DC0, 'V'), + (0x1DE7, 'X'), + (0x1DFC, 'V'), + (0x1E00, 'M', u'ḁ'), + (0x1E01, 'V'), + (0x1E02, 'M', u'ḃ'), + (0x1E03, 'V'), + (0x1E04, 'M', u'ḅ'), + (0x1E05, 'V'), + (0x1E06, 'M', u'ḇ'), + (0x1E07, 'V'), + (0x1E08, 'M', u'ḉ'), + (0x1E09, 'V'), + (0x1E0A, 'M', u'ḋ'), + (0x1E0B, 'V'), + (0x1E0C, 'M', u'ḍ'), + (0x1E0D, 'V'), + (0x1E0E, 'M', u'ḏ'), + (0x1E0F, 'V'), + (0x1E10, 'M', u'ḑ'), + (0x1E11, 'V'), + (0x1E12, 'M', u'ḓ'), + (0x1E13, 'V'), + (0x1E14, 'M', u'ḕ'), + (0x1E15, 'V'), + (0x1E16, 'M', u'ḗ'), + (0x1E17, 'V'), + (0x1E18, 'M', u'ḙ'), + (0x1E19, 'V'), + (0x1E1A, 'M', u'ḛ'), + (0x1E1B, 'V'), + (0x1E1C, 'M', u'ḝ'), + (0x1E1D, 'V'), + (0x1E1E, 'M', u'ḟ'), + (0x1E1F, 'V'), + (0x1E20, 'M', u'ḡ'), + (0x1E21, 'V'), + (0x1E22, 'M', u'ḣ'), + (0x1E23, 'V'), + (0x1E24, 'M', u'ḥ'), + (0x1E25, 'V'), + (0x1E26, 'M', u'ḧ'), + (0x1E27, 'V'), + (0x1E28, 'M', u'ḩ'), + (0x1E29, 'V'), + (0x1E2A, 'M', u'ḫ'), + (0x1E2B, 'V'), + (0x1E2C, 'M', u'ḭ'), + (0x1E2D, 'V'), + (0x1E2E, 'M', u'ḯ'), + (0x1E2F, 'V'), + (0x1E30, 'M', u'ḱ'), + (0x1E31, 'V'), + (0x1E32, 'M', u'ḳ'), + (0x1E33, 'V'), + (0x1E34, 'M', u'ḵ'), + (0x1E35, 'V'), + (0x1E36, 'M', u'ḷ'), + (0x1E37, 'V'), + (0x1E38, 'M', u'ḹ'), + (0x1E39, 'V'), + (0x1E3A, 'M', u'ḻ'), + (0x1E3B, 'V'), + (0x1E3C, 'M', u'ḽ'), + (0x1E3D, 'V'), + (0x1E3E, 'M', u'ḿ'), + (0x1E3F, 'V'), + (0x1E40, 'M', u'ṁ'), + (0x1E41, 'V'), + (0x1E42, 'M', u'ṃ'), + (0x1E43, 'V'), + (0x1E44, 'M', u'ṅ'), + (0x1E45, 'V'), + (0x1E46, 'M', u'ṇ'), + (0x1E47, 'V'), + (0x1E48, 'M', u'ṉ'), + (0x1E49, 'V'), + (0x1E4A, 'M', u'ṋ'), + ] + +def _seg_17(): + return [ + (0x1E4B, 'V'), + (0x1E4C, 'M', u'ṍ'), + (0x1E4D, 'V'), + (0x1E4E, 'M', u'ṏ'), + (0x1E4F, 'V'), + (0x1E50, 'M', u'ṑ'), + (0x1E51, 'V'), + (0x1E52, 'M', u'ṓ'), + (0x1E53, 'V'), + (0x1E54, 'M', u'ṕ'), + (0x1E55, 'V'), + (0x1E56, 'M', u'ṗ'), + (0x1E57, 'V'), + (0x1E58, 'M', u'ṙ'), + (0x1E59, 'V'), + (0x1E5A, 'M', u'ṛ'), + (0x1E5B, 'V'), + (0x1E5C, 'M', u'ṝ'), + (0x1E5D, 'V'), + (0x1E5E, 'M', u'ṟ'), + (0x1E5F, 'V'), + (0x1E60, 'M', u'ṡ'), + (0x1E61, 'V'), + (0x1E62, 'M', u'ṣ'), + (0x1E63, 'V'), + (0x1E64, 'M', u'ṥ'), + (0x1E65, 'V'), + (0x1E66, 'M', u'ṧ'), + (0x1E67, 'V'), + (0x1E68, 'M', u'ṩ'), + (0x1E69, 'V'), + (0x1E6A, 'M', u'ṫ'), + (0x1E6B, 'V'), + (0x1E6C, 'M', u'ṭ'), + (0x1E6D, 'V'), + (0x1E6E, 'M', u'ṯ'), + (0x1E6F, 'V'), + (0x1E70, 'M', u'ṱ'), + (0x1E71, 'V'), + (0x1E72, 'M', u'ṳ'), + (0x1E73, 'V'), + (0x1E74, 'M', u'ṵ'), + (0x1E75, 'V'), + (0x1E76, 'M', u'ṷ'), + (0x1E77, 'V'), + (0x1E78, 'M', u'ṹ'), + (0x1E79, 'V'), + (0x1E7A, 'M', u'ṻ'), + (0x1E7B, 'V'), + (0x1E7C, 'M', u'ṽ'), + (0x1E7D, 'V'), + (0x1E7E, 'M', u'ṿ'), + (0x1E7F, 'V'), + (0x1E80, 'M', u'ẁ'), + (0x1E81, 'V'), + (0x1E82, 'M', u'ẃ'), + (0x1E83, 'V'), + (0x1E84, 'M', u'ẅ'), + (0x1E85, 'V'), + (0x1E86, 'M', u'ẇ'), + (0x1E87, 'V'), + (0x1E88, 'M', u'ẉ'), + (0x1E89, 'V'), + (0x1E8A, 'M', u'ẋ'), + (0x1E8B, 'V'), + (0x1E8C, 'M', u'ẍ'), + (0x1E8D, 'V'), + (0x1E8E, 'M', u'ẏ'), + (0x1E8F, 'V'), + (0x1E90, 'M', u'ẑ'), + (0x1E91, 'V'), + (0x1E92, 'M', u'ẓ'), + (0x1E93, 'V'), + (0x1E94, 'M', u'ẕ'), + (0x1E95, 'V'), + (0x1E9A, 'M', u'aʾ'), + (0x1E9B, 'M', u'ṡ'), + (0x1E9C, 'V'), + (0x1E9E, 'M', u'ss'), + (0x1E9F, 'V'), + (0x1EA0, 'M', u'ạ'), + (0x1EA1, 'V'), + (0x1EA2, 'M', u'ả'), + (0x1EA3, 'V'), + (0x1EA4, 'M', u'ấ'), + (0x1EA5, 'V'), + (0x1EA6, 'M', u'ầ'), + (0x1EA7, 'V'), + (0x1EA8, 'M', u'ẩ'), + (0x1EA9, 'V'), + (0x1EAA, 'M', u'ẫ'), + (0x1EAB, 'V'), + (0x1EAC, 'M', u'ậ'), + (0x1EAD, 'V'), + (0x1EAE, 'M', u'ắ'), + (0x1EAF, 'V'), + (0x1EB0, 'M', u'ằ'), + (0x1EB1, 'V'), + (0x1EB2, 'M', u'ẳ'), + (0x1EB3, 'V'), + ] + +def _seg_18(): + return [ + (0x1EB4, 'M', u'ẵ'), + (0x1EB5, 'V'), + (0x1EB6, 'M', u'ặ'), + (0x1EB7, 'V'), + (0x1EB8, 'M', u'ẹ'), + (0x1EB9, 'V'), + (0x1EBA, 'M', u'ẻ'), + (0x1EBB, 'V'), + (0x1EBC, 'M', u'ẽ'), + (0x1EBD, 'V'), + (0x1EBE, 'M', u'ế'), + (0x1EBF, 'V'), + (0x1EC0, 'M', u'ề'), + (0x1EC1, 'V'), + (0x1EC2, 'M', u'ể'), + (0x1EC3, 'V'), + (0x1EC4, 'M', u'ễ'), + (0x1EC5, 'V'), + (0x1EC6, 'M', u'ệ'), + (0x1EC7, 'V'), + (0x1EC8, 'M', u'ỉ'), + (0x1EC9, 'V'), + (0x1ECA, 'M', u'ị'), + (0x1ECB, 'V'), + (0x1ECC, 'M', u'ọ'), + (0x1ECD, 'V'), + (0x1ECE, 'M', u'ỏ'), + (0x1ECF, 'V'), + (0x1ED0, 'M', u'ố'), + (0x1ED1, 'V'), + (0x1ED2, 'M', u'ồ'), + (0x1ED3, 'V'), + (0x1ED4, 'M', u'ổ'), + (0x1ED5, 'V'), + (0x1ED6, 'M', u'ỗ'), + (0x1ED7, 'V'), + (0x1ED8, 'M', u'ộ'), + (0x1ED9, 'V'), + (0x1EDA, 'M', u'ớ'), + (0x1EDB, 'V'), + (0x1EDC, 'M', u'ờ'), + (0x1EDD, 'V'), + (0x1EDE, 'M', u'ở'), + (0x1EDF, 'V'), + (0x1EE0, 'M', u'ỡ'), + (0x1EE1, 'V'), + (0x1EE2, 'M', u'ợ'), + (0x1EE3, 'V'), + (0x1EE4, 'M', u'ụ'), + (0x1EE5, 'V'), + (0x1EE6, 'M', u'ủ'), + (0x1EE7, 'V'), + (0x1EE8, 'M', u'ứ'), + (0x1EE9, 'V'), + (0x1EEA, 'M', u'ừ'), + (0x1EEB, 'V'), + (0x1EEC, 'M', u'ử'), + (0x1EED, 'V'), + (0x1EEE, 'M', u'ữ'), + (0x1EEF, 'V'), + (0x1EF0, 'M', u'ự'), + (0x1EF1, 'V'), + (0x1EF2, 'M', u'ỳ'), + (0x1EF3, 'V'), + (0x1EF4, 'M', u'ỵ'), + (0x1EF5, 'V'), + (0x1EF6, 'M', u'ỷ'), + (0x1EF7, 'V'), + (0x1EF8, 'M', u'ỹ'), + (0x1EF9, 'V'), + (0x1EFA, 'M', u'ỻ'), + (0x1EFB, 'V'), + (0x1EFC, 'M', u'ỽ'), + (0x1EFD, 'V'), + (0x1EFE, 'M', u'ỿ'), + (0x1EFF, 'V'), + (0x1F08, 'M', u'ἀ'), + (0x1F09, 'M', u'ἁ'), + (0x1F0A, 'M', u'ἂ'), + (0x1F0B, 'M', u'ἃ'), + (0x1F0C, 'M', u'ἄ'), + (0x1F0D, 'M', u'ἅ'), + (0x1F0E, 'M', u'ἆ'), + (0x1F0F, 'M', u'ἇ'), + (0x1F10, 'V'), + (0x1F16, 'X'), + (0x1F18, 'M', u'ἐ'), + (0x1F19, 'M', u'ἑ'), + (0x1F1A, 'M', u'ἒ'), + (0x1F1B, 'M', u'ἓ'), + (0x1F1C, 'M', u'ἔ'), + (0x1F1D, 'M', u'ἕ'), + (0x1F1E, 'X'), + (0x1F20, 'V'), + (0x1F28, 'M', u'ἠ'), + (0x1F29, 'M', u'ἡ'), + (0x1F2A, 'M', u'ἢ'), + (0x1F2B, 'M', u'ἣ'), + (0x1F2C, 'M', u'ἤ'), + (0x1F2D, 'M', u'ἥ'), + ] + +def _seg_19(): + return [ + (0x1F2E, 'M', u'ἦ'), + (0x1F2F, 'M', u'ἧ'), + (0x1F30, 'V'), + (0x1F38, 'M', u'ἰ'), + (0x1F39, 'M', u'ἱ'), + (0x1F3A, 'M', u'ἲ'), + (0x1F3B, 'M', u'ἳ'), + (0x1F3C, 'M', u'ἴ'), + (0x1F3D, 'M', u'ἵ'), + (0x1F3E, 'M', u'ἶ'), + (0x1F3F, 'M', u'ἷ'), + (0x1F40, 'V'), + (0x1F46, 'X'), + (0x1F48, 'M', u'ὀ'), + (0x1F49, 'M', u'ὁ'), + (0x1F4A, 'M', u'ὂ'), + (0x1F4B, 'M', u'ὃ'), + (0x1F4C, 'M', u'ὄ'), + (0x1F4D, 'M', u'ὅ'), + (0x1F4E, 'X'), + (0x1F50, 'V'), + (0x1F58, 'X'), + (0x1F59, 'M', u'ὑ'), + (0x1F5A, 'X'), + (0x1F5B, 'M', u'ὓ'), + (0x1F5C, 'X'), + (0x1F5D, 'M', u'ὕ'), + (0x1F5E, 'X'), + (0x1F5F, 'M', u'ὗ'), + (0x1F60, 'V'), + (0x1F68, 'M', u'ὠ'), + (0x1F69, 'M', u'ὡ'), + (0x1F6A, 'M', u'ὢ'), + (0x1F6B, 'M', u'ὣ'), + (0x1F6C, 'M', u'ὤ'), + (0x1F6D, 'M', u'ὥ'), + (0x1F6E, 'M', u'ὦ'), + (0x1F6F, 'M', u'ὧ'), + (0x1F70, 'V'), + (0x1F71, 'M', u'ά'), + (0x1F72, 'V'), + (0x1F73, 'M', u'έ'), + (0x1F74, 'V'), + (0x1F75, 'M', u'ή'), + (0x1F76, 'V'), + (0x1F77, 'M', u'ί'), + (0x1F78, 'V'), + (0x1F79, 'M', u'ό'), + (0x1F7A, 'V'), + (0x1F7B, 'M', u'ύ'), + (0x1F7C, 'V'), + (0x1F7D, 'M', u'ώ'), + (0x1F7E, 'X'), + (0x1F80, 'M', u'ἀι'), + (0x1F81, 'M', u'ἁι'), + (0x1F82, 'M', u'ἂι'), + (0x1F83, 'M', u'ἃι'), + (0x1F84, 'M', u'ἄι'), + (0x1F85, 'M', u'ἅι'), + (0x1F86, 'M', u'ἆι'), + (0x1F87, 'M', u'ἇι'), + (0x1F88, 'M', u'ἀι'), + (0x1F89, 'M', u'ἁι'), + (0x1F8A, 'M', u'ἂι'), + (0x1F8B, 'M', u'ἃι'), + (0x1F8C, 'M', u'ἄι'), + (0x1F8D, 'M', u'ἅι'), + (0x1F8E, 'M', u'ἆι'), + (0x1F8F, 'M', u'ἇι'), + (0x1F90, 'M', u'ἠι'), + (0x1F91, 'M', u'ἡι'), + (0x1F92, 'M', u'ἢι'), + (0x1F93, 'M', u'ἣι'), + (0x1F94, 'M', u'ἤι'), + (0x1F95, 'M', u'ἥι'), + (0x1F96, 'M', u'ἦι'), + (0x1F97, 'M', u'ἧι'), + (0x1F98, 'M', u'ἠι'), + (0x1F99, 'M', u'ἡι'), + (0x1F9A, 'M', u'ἢι'), + (0x1F9B, 'M', u'ἣι'), + (0x1F9C, 'M', u'ἤι'), + (0x1F9D, 'M', u'ἥι'), + (0x1F9E, 'M', u'ἦι'), + (0x1F9F, 'M', u'ἧι'), + (0x1FA0, 'M', u'ὠι'), + (0x1FA1, 'M', u'ὡι'), + (0x1FA2, 'M', u'ὢι'), + (0x1FA3, 'M', u'ὣι'), + (0x1FA4, 'M', u'ὤι'), + (0x1FA5, 'M', u'ὥι'), + (0x1FA6, 'M', u'ὦι'), + (0x1FA7, 'M', u'ὧι'), + (0x1FA8, 'M', u'ὠι'), + (0x1FA9, 'M', u'ὡι'), + (0x1FAA, 'M', u'ὢι'), + (0x1FAB, 'M', u'ὣι'), + (0x1FAC, 'M', u'ὤι'), + (0x1FAD, 'M', u'ὥι'), + (0x1FAE, 'M', u'ὦι'), + ] + +def _seg_20(): + return [ + (0x1FAF, 'M', u'ὧι'), + (0x1FB0, 'V'), + (0x1FB2, 'M', u'ὰι'), + (0x1FB3, 'M', u'αι'), + (0x1FB4, 'M', u'άι'), + (0x1FB5, 'X'), + (0x1FB6, 'V'), + (0x1FB7, 'M', u'ᾶι'), + (0x1FB8, 'M', u'ᾰ'), + (0x1FB9, 'M', u'ᾱ'), + (0x1FBA, 'M', u'ὰ'), + (0x1FBB, 'M', u'ά'), + (0x1FBC, 'M', u'αι'), + (0x1FBD, '3', u' ̓'), + (0x1FBE, 'M', u'ι'), + (0x1FBF, '3', u' ̓'), + (0x1FC0, '3', u' ͂'), + (0x1FC1, '3', u' ̈͂'), + (0x1FC2, 'M', u'ὴι'), + (0x1FC3, 'M', u'ηι'), + (0x1FC4, 'M', u'ήι'), + (0x1FC5, 'X'), + (0x1FC6, 'V'), + (0x1FC7, 'M', u'ῆι'), + (0x1FC8, 'M', u'ὲ'), + (0x1FC9, 'M', u'έ'), + (0x1FCA, 'M', u'ὴ'), + (0x1FCB, 'M', u'ή'), + (0x1FCC, 'M', u'ηι'), + (0x1FCD, '3', u' ̓̀'), + (0x1FCE, '3', u' ̓́'), + (0x1FCF, '3', u' ̓͂'), + (0x1FD0, 'V'), + (0x1FD3, 'M', u'ΐ'), + (0x1FD4, 'X'), + (0x1FD6, 'V'), + (0x1FD8, 'M', u'ῐ'), + (0x1FD9, 'M', u'ῑ'), + (0x1FDA, 'M', u'ὶ'), + (0x1FDB, 'M', u'ί'), + (0x1FDC, 'X'), + (0x1FDD, '3', u' ̔̀'), + (0x1FDE, '3', u' ̔́'), + (0x1FDF, '3', u' ̔͂'), + (0x1FE0, 'V'), + (0x1FE3, 'M', u'ΰ'), + (0x1FE4, 'V'), + (0x1FE8, 'M', u'ῠ'), + (0x1FE9, 'M', u'ῡ'), + (0x1FEA, 'M', u'ὺ'), + (0x1FEB, 'M', u'ύ'), + (0x1FEC, 'M', u'ῥ'), + (0x1FED, '3', u' ̈̀'), + (0x1FEE, '3', u' ̈́'), + (0x1FEF, '3', u'`'), + (0x1FF0, 'X'), + (0x1FF2, 'M', u'ὼι'), + (0x1FF3, 'M', u'ωι'), + (0x1FF4, 'M', u'ώι'), + (0x1FF5, 'X'), + (0x1FF6, 'V'), + (0x1FF7, 'M', u'ῶι'), + (0x1FF8, 'M', u'ὸ'), + (0x1FF9, 'M', u'ό'), + (0x1FFA, 'M', u'ὼ'), + (0x1FFB, 'M', u'ώ'), + (0x1FFC, 'M', u'ωι'), + (0x1FFD, '3', u' ́'), + (0x1FFE, '3', u' ̔'), + (0x1FFF, 'X'), + (0x2000, '3', u' '), + (0x200B, 'I'), + (0x200C, 'D', u''), + (0x200E, 'X'), + (0x2010, 'V'), + (0x2011, 'M', u'‐'), + (0x2012, 'V'), + (0x2017, '3', u' ̳'), + (0x2018, 'V'), + (0x2024, 'X'), + (0x2027, 'V'), + (0x2028, 'X'), + (0x202F, '3', u' '), + (0x2030, 'V'), + (0x2033, 'M', u'′′'), + (0x2034, 'M', u'′′′'), + (0x2035, 'V'), + (0x2036, 'M', u'‵‵'), + (0x2037, 'M', u'‵‵‵'), + (0x2038, 'V'), + (0x203C, '3', u'!!'), + (0x203D, 'V'), + (0x203E, '3', u' ̅'), + (0x203F, 'V'), + (0x2047, '3', u'??'), + (0x2048, '3', u'?!'), + (0x2049, '3', u'!?'), + (0x204A, 'V'), + (0x2057, 'M', u'′′′′'), + (0x2058, 'V'), + ] + +def _seg_21(): + return [ + (0x205F, '3', u' '), + (0x2060, 'I'), + (0x2061, 'X'), + (0x2064, 'I'), + (0x2065, 'X'), + (0x2070, 'M', u'0'), + (0x2071, 'M', u'i'), + (0x2072, 'X'), + (0x2074, 'M', u'4'), + (0x2075, 'M', u'5'), + (0x2076, 'M', u'6'), + (0x2077, 'M', u'7'), + (0x2078, 'M', u'8'), + (0x2079, 'M', u'9'), + (0x207A, '3', u'+'), + (0x207B, 'M', u'−'), + (0x207C, '3', u'='), + (0x207D, '3', u'('), + (0x207E, '3', u')'), + (0x207F, 'M', u'n'), + (0x2080, 'M', u'0'), + (0x2081, 'M', u'1'), + (0x2082, 'M', u'2'), + (0x2083, 'M', u'3'), + (0x2084, 'M', u'4'), + (0x2085, 'M', u'5'), + (0x2086, 'M', u'6'), + (0x2087, 'M', u'7'), + (0x2088, 'M', u'8'), + (0x2089, 'M', u'9'), + (0x208A, '3', u'+'), + (0x208B, 'M', u'−'), + (0x208C, '3', u'='), + (0x208D, '3', u'('), + (0x208E, '3', u')'), + (0x208F, 'X'), + (0x2090, 'M', u'a'), + (0x2091, 'M', u'e'), + (0x2092, 'M', u'o'), + (0x2093, 'M', u'x'), + (0x2094, 'M', u'ə'), + (0x2095, 'M', u'h'), + (0x2096, 'M', u'k'), + (0x2097, 'M', u'l'), + (0x2098, 'M', u'm'), + (0x2099, 'M', u'n'), + (0x209A, 'M', u'p'), + (0x209B, 'M', u's'), + (0x209C, 'M', u't'), + (0x209D, 'X'), + (0x20A0, 'V'), + (0x20A8, 'M', u'rs'), + (0x20A9, 'V'), + (0x20BB, 'X'), + (0x20D0, 'V'), + (0x20F1, 'X'), + (0x2100, '3', u'a/c'), + (0x2101, '3', u'a/s'), + (0x2102, 'M', u'c'), + (0x2103, 'M', u'°c'), + (0x2104, 'V'), + (0x2105, '3', u'c/o'), + (0x2106, '3', u'c/u'), + (0x2107, 'M', u'ɛ'), + (0x2108, 'V'), + (0x2109, 'M', u'°f'), + (0x210A, 'M', u'g'), + (0x210B, 'M', u'h'), + (0x210F, 'M', u'ħ'), + (0x2110, 'M', u'i'), + (0x2112, 'M', u'l'), + (0x2114, 'V'), + (0x2115, 'M', u'n'), + (0x2116, 'M', u'no'), + (0x2117, 'V'), + (0x2119, 'M', u'p'), + (0x211A, 'M', u'q'), + (0x211B, 'M', u'r'), + (0x211E, 'V'), + (0x2120, 'M', u'sm'), + (0x2121, 'M', u'tel'), + (0x2122, 'M', u'tm'), + (0x2123, 'V'), + (0x2124, 'M', u'z'), + (0x2125, 'V'), + (0x2126, 'M', u'ω'), + (0x2127, 'V'), + (0x2128, 'M', u'z'), + (0x2129, 'V'), + (0x212A, 'M', u'k'), + (0x212B, 'M', u'å'), + (0x212C, 'M', u'b'), + (0x212D, 'M', u'c'), + (0x212E, 'V'), + (0x212F, 'M', u'e'), + (0x2131, 'M', u'f'), + (0x2132, 'X'), + (0x2133, 'M', u'm'), + (0x2134, 'M', u'o'), + (0x2135, 'M', u'א'), + ] + +def _seg_22(): + return [ + (0x2136, 'M', u'ב'), + (0x2137, 'M', u'ג'), + (0x2138, 'M', u'ד'), + (0x2139, 'M', u'i'), + (0x213A, 'V'), + (0x213B, 'M', u'fax'), + (0x213C, 'M', u'π'), + (0x213D, 'M', u'γ'), + (0x213F, 'M', u'π'), + (0x2140, 'M', u'∑'), + (0x2141, 'V'), + (0x2145, 'M', u'd'), + (0x2147, 'M', u'e'), + (0x2148, 'M', u'i'), + (0x2149, 'M', u'j'), + (0x214A, 'V'), + (0x2150, 'M', u'1⁄7'), + (0x2151, 'M', u'1⁄9'), + (0x2152, 'M', u'1⁄10'), + (0x2153, 'M', u'1⁄3'), + (0x2154, 'M', u'2⁄3'), + (0x2155, 'M', u'1⁄5'), + (0x2156, 'M', u'2⁄5'), + (0x2157, 'M', u'3⁄5'), + (0x2158, 'M', u'4⁄5'), + (0x2159, 'M', u'1⁄6'), + (0x215A, 'M', u'5⁄6'), + (0x215B, 'M', u'1⁄8'), + (0x215C, 'M', u'3⁄8'), + (0x215D, 'M', u'5⁄8'), + (0x215E, 'M', u'7⁄8'), + (0x215F, 'M', u'1⁄'), + (0x2160, 'M', u'i'), + (0x2161, 'M', u'ii'), + (0x2162, 'M', u'iii'), + (0x2163, 'M', u'iv'), + (0x2164, 'M', u'v'), + (0x2165, 'M', u'vi'), + (0x2166, 'M', u'vii'), + (0x2167, 'M', u'viii'), + (0x2168, 'M', u'ix'), + (0x2169, 'M', u'x'), + (0x216A, 'M', u'xi'), + (0x216B, 'M', u'xii'), + (0x216C, 'M', u'l'), + (0x216D, 'M', u'c'), + (0x216E, 'M', u'd'), + (0x216F, 'M', u'm'), + (0x2170, 'M', u'i'), + (0x2171, 'M', u'ii'), + (0x2172, 'M', u'iii'), + (0x2173, 'M', u'iv'), + (0x2174, 'M', u'v'), + (0x2175, 'M', u'vi'), + (0x2176, 'M', u'vii'), + (0x2177, 'M', u'viii'), + (0x2178, 'M', u'ix'), + (0x2179, 'M', u'x'), + (0x217A, 'M', u'xi'), + (0x217B, 'M', u'xii'), + (0x217C, 'M', u'l'), + (0x217D, 'M', u'c'), + (0x217E, 'M', u'd'), + (0x217F, 'M', u'm'), + (0x2180, 'V'), + (0x2183, 'X'), + (0x2184, 'V'), + (0x2189, 'M', u'0⁄3'), + (0x218A, 'X'), + (0x2190, 'V'), + (0x222C, 'M', u'∫∫'), + (0x222D, 'M', u'∫∫∫'), + (0x222E, 'V'), + (0x222F, 'M', u'∮∮'), + (0x2230, 'M', u'∮∮∮'), + (0x2231, 'V'), + (0x2260, '3'), + (0x2261, 'V'), + (0x226E, '3'), + (0x2270, 'V'), + (0x2329, 'M', u'〈'), + (0x232A, 'M', u'〉'), + (0x232B, 'V'), + (0x23F4, 'X'), + (0x2400, 'V'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + (0x2462, 'M', u'3'), + (0x2463, 'M', u'4'), + (0x2464, 'M', u'5'), + (0x2465, 'M', u'6'), + (0x2466, 'M', u'7'), + (0x2467, 'M', u'8'), + (0x2468, 'M', u'9'), + (0x2469, 'M', u'10'), + (0x246A, 'M', u'11'), + (0x246B, 'M', u'12'), + ] + +def _seg_23(): + return [ + (0x246C, 'M', u'13'), + (0x246D, 'M', u'14'), + (0x246E, 'M', u'15'), + (0x246F, 'M', u'16'), + (0x2470, 'M', u'17'), + (0x2471, 'M', u'18'), + (0x2472, 'M', u'19'), + (0x2473, 'M', u'20'), + (0x2474, '3', u'(1)'), + (0x2475, '3', u'(2)'), + (0x2476, '3', u'(3)'), + (0x2477, '3', u'(4)'), + (0x2478, '3', u'(5)'), + (0x2479, '3', u'(6)'), + (0x247A, '3', u'(7)'), + (0x247B, '3', u'(8)'), + (0x247C, '3', u'(9)'), + (0x247D, '3', u'(10)'), + (0x247E, '3', u'(11)'), + (0x247F, '3', u'(12)'), + (0x2480, '3', u'(13)'), + (0x2481, '3', u'(14)'), + (0x2482, '3', u'(15)'), + (0x2483, '3', u'(16)'), + (0x2484, '3', u'(17)'), + (0x2485, '3', u'(18)'), + (0x2486, '3', u'(19)'), + (0x2487, '3', u'(20)'), + (0x2488, 'X'), + (0x249C, '3', u'(a)'), + (0x249D, '3', u'(b)'), + (0x249E, '3', u'(c)'), + (0x249F, '3', u'(d)'), + (0x24A0, '3', u'(e)'), + (0x24A1, '3', u'(f)'), + (0x24A2, '3', u'(g)'), + (0x24A3, '3', u'(h)'), + (0x24A4, '3', u'(i)'), + (0x24A5, '3', u'(j)'), + (0x24A6, '3', u'(k)'), + (0x24A7, '3', u'(l)'), + (0x24A8, '3', u'(m)'), + (0x24A9, '3', u'(n)'), + (0x24AA, '3', u'(o)'), + (0x24AB, '3', u'(p)'), + (0x24AC, '3', u'(q)'), + (0x24AD, '3', u'(r)'), + (0x24AE, '3', u'(s)'), + (0x24AF, '3', u'(t)'), + (0x24B0, '3', u'(u)'), + (0x24B1, '3', u'(v)'), + (0x24B2, '3', u'(w)'), + (0x24B3, '3', u'(x)'), + (0x24B4, '3', u'(y)'), + (0x24B5, '3', u'(z)'), + (0x24B6, 'M', u'a'), + (0x24B7, 'M', u'b'), + (0x24B8, 'M', u'c'), + (0x24B9, 'M', u'd'), + (0x24BA, 'M', u'e'), + (0x24BB, 'M', u'f'), + (0x24BC, 'M', u'g'), + (0x24BD, 'M', u'h'), + (0x24BE, 'M', u'i'), + (0x24BF, 'M', u'j'), + (0x24C0, 'M', u'k'), + (0x24C1, 'M', u'l'), + (0x24C2, 'M', u'm'), + (0x24C3, 'M', u'n'), + (0x24C4, 'M', u'o'), + (0x24C5, 'M', u'p'), + (0x24C6, 'M', u'q'), + (0x24C7, 'M', u'r'), + (0x24C8, 'M', u's'), + (0x24C9, 'M', u't'), + (0x24CA, 'M', u'u'), + (0x24CB, 'M', u'v'), + (0x24CC, 'M', u'w'), + (0x24CD, 'M', u'x'), + (0x24CE, 'M', u'y'), + (0x24CF, 'M', u'z'), + (0x24D0, 'M', u'a'), + (0x24D1, 'M', u'b'), + (0x24D2, 'M', u'c'), + (0x24D3, 'M', u'd'), + (0x24D4, 'M', u'e'), + (0x24D5, 'M', u'f'), + (0x24D6, 'M', u'g'), + (0x24D7, 'M', u'h'), + (0x24D8, 'M', u'i'), + (0x24D9, 'M', u'j'), + (0x24DA, 'M', u'k'), + (0x24DB, 'M', u'l'), + (0x24DC, 'M', u'm'), + (0x24DD, 'M', u'n'), + (0x24DE, 'M', u'o'), + (0x24DF, 'M', u'p'), + (0x24E0, 'M', u'q'), + (0x24E1, 'M', u'r'), + (0x24E2, 'M', u's'), + ] + +def _seg_24(): + return [ + (0x24E3, 'M', u't'), + (0x24E4, 'M', u'u'), + (0x24E5, 'M', u'v'), + (0x24E6, 'M', u'w'), + (0x24E7, 'M', u'x'), + (0x24E8, 'M', u'y'), + (0x24E9, 'M', u'z'), + (0x24EA, 'M', u'0'), + (0x24EB, 'V'), + (0x2700, 'X'), + (0x2701, 'V'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B4D, 'X'), + (0x2B50, 'V'), + (0x2B5A, 'X'), + (0x2C00, 'M', u'ⰰ'), + (0x2C01, 'M', u'ⰱ'), + (0x2C02, 'M', u'ⰲ'), + (0x2C03, 'M', u'ⰳ'), + (0x2C04, 'M', u'ⰴ'), + (0x2C05, 'M', u'ⰵ'), + (0x2C06, 'M', u'ⰶ'), + (0x2C07, 'M', u'ⰷ'), + (0x2C08, 'M', u'ⰸ'), + (0x2C09, 'M', u'ⰹ'), + (0x2C0A, 'M', u'ⰺ'), + (0x2C0B, 'M', u'ⰻ'), + (0x2C0C, 'M', u'ⰼ'), + (0x2C0D, 'M', u'ⰽ'), + (0x2C0E, 'M', u'ⰾ'), + (0x2C0F, 'M', u'ⰿ'), + (0x2C10, 'M', u'ⱀ'), + (0x2C11, 'M', u'ⱁ'), + (0x2C12, 'M', u'ⱂ'), + (0x2C13, 'M', u'ⱃ'), + (0x2C14, 'M', u'ⱄ'), + (0x2C15, 'M', u'ⱅ'), + (0x2C16, 'M', u'ⱆ'), + (0x2C17, 'M', u'ⱇ'), + (0x2C18, 'M', u'ⱈ'), + (0x2C19, 'M', u'ⱉ'), + (0x2C1A, 'M', u'ⱊ'), + (0x2C1B, 'M', u'ⱋ'), + (0x2C1C, 'M', u'ⱌ'), + (0x2C1D, 'M', u'ⱍ'), + (0x2C1E, 'M', u'ⱎ'), + (0x2C1F, 'M', u'ⱏ'), + (0x2C20, 'M', u'ⱐ'), + (0x2C21, 'M', u'ⱑ'), + (0x2C22, 'M', u'ⱒ'), + (0x2C23, 'M', u'ⱓ'), + (0x2C24, 'M', u'ⱔ'), + (0x2C25, 'M', u'ⱕ'), + (0x2C26, 'M', u'ⱖ'), + (0x2C27, 'M', u'ⱗ'), + (0x2C28, 'M', u'ⱘ'), + (0x2C29, 'M', u'ⱙ'), + (0x2C2A, 'M', u'ⱚ'), + (0x2C2B, 'M', u'ⱛ'), + (0x2C2C, 'M', u'ⱜ'), + (0x2C2D, 'M', u'ⱝ'), + (0x2C2E, 'M', u'ⱞ'), + (0x2C2F, 'X'), + (0x2C30, 'V'), + (0x2C5F, 'X'), + (0x2C60, 'M', u'ⱡ'), + (0x2C61, 'V'), + (0x2C62, 'M', u'ɫ'), + (0x2C63, 'M', u'ᵽ'), + (0x2C64, 'M', u'ɽ'), + (0x2C65, 'V'), + (0x2C67, 'M', u'ⱨ'), + (0x2C68, 'V'), + (0x2C69, 'M', u'ⱪ'), + (0x2C6A, 'V'), + (0x2C6B, 'M', u'ⱬ'), + (0x2C6C, 'V'), + (0x2C6D, 'M', u'ɑ'), + (0x2C6E, 'M', u'ɱ'), + (0x2C6F, 'M', u'ɐ'), + (0x2C70, 'M', u'ɒ'), + (0x2C71, 'V'), + (0x2C72, 'M', u'ⱳ'), + (0x2C73, 'V'), + (0x2C75, 'M', u'ⱶ'), + (0x2C76, 'V'), + (0x2C7C, 'M', u'j'), + (0x2C7D, 'M', u'v'), + (0x2C7E, 'M', u'ȿ'), + (0x2C7F, 'M', u'ɀ'), + (0x2C80, 'M', u'ⲁ'), + (0x2C81, 'V'), + (0x2C82, 'M', u'ⲃ'), + ] + +def _seg_25(): + return [ + (0x2C83, 'V'), + (0x2C84, 'M', u'ⲅ'), + (0x2C85, 'V'), + (0x2C86, 'M', u'ⲇ'), + (0x2C87, 'V'), + (0x2C88, 'M', u'ⲉ'), + (0x2C89, 'V'), + (0x2C8A, 'M', u'ⲋ'), + (0x2C8B, 'V'), + (0x2C8C, 'M', u'ⲍ'), + (0x2C8D, 'V'), + (0x2C8E, 'M', u'ⲏ'), + (0x2C8F, 'V'), + (0x2C90, 'M', u'ⲑ'), + (0x2C91, 'V'), + (0x2C92, 'M', u'ⲓ'), + (0x2C93, 'V'), + (0x2C94, 'M', u'ⲕ'), + (0x2C95, 'V'), + (0x2C96, 'M', u'ⲗ'), + (0x2C97, 'V'), + (0x2C98, 'M', u'ⲙ'), + (0x2C99, 'V'), + (0x2C9A, 'M', u'ⲛ'), + (0x2C9B, 'V'), + (0x2C9C, 'M', u'ⲝ'), + (0x2C9D, 'V'), + (0x2C9E, 'M', u'ⲟ'), + (0x2C9F, 'V'), + (0x2CA0, 'M', u'ⲡ'), + (0x2CA1, 'V'), + (0x2CA2, 'M', u'ⲣ'), + (0x2CA3, 'V'), + (0x2CA4, 'M', u'ⲥ'), + (0x2CA5, 'V'), + (0x2CA6, 'M', u'ⲧ'), + (0x2CA7, 'V'), + (0x2CA8, 'M', u'ⲩ'), + (0x2CA9, 'V'), + (0x2CAA, 'M', u'ⲫ'), + (0x2CAB, 'V'), + (0x2CAC, 'M', u'ⲭ'), + (0x2CAD, 'V'), + (0x2CAE, 'M', u'ⲯ'), + (0x2CAF, 'V'), + (0x2CB0, 'M', u'ⲱ'), + (0x2CB1, 'V'), + (0x2CB2, 'M', u'ⲳ'), + (0x2CB3, 'V'), + (0x2CB4, 'M', u'ⲵ'), + (0x2CB5, 'V'), + (0x2CB6, 'M', u'ⲷ'), + (0x2CB7, 'V'), + (0x2CB8, 'M', u'ⲹ'), + (0x2CB9, 'V'), + (0x2CBA, 'M', u'ⲻ'), + (0x2CBB, 'V'), + (0x2CBC, 'M', u'ⲽ'), + (0x2CBD, 'V'), + (0x2CBE, 'M', u'ⲿ'), + (0x2CBF, 'V'), + (0x2CC0, 'M', u'ⳁ'), + (0x2CC1, 'V'), + (0x2CC2, 'M', u'ⳃ'), + (0x2CC3, 'V'), + (0x2CC4, 'M', u'ⳅ'), + (0x2CC5, 'V'), + (0x2CC6, 'M', u'ⳇ'), + (0x2CC7, 'V'), + (0x2CC8, 'M', u'ⳉ'), + (0x2CC9, 'V'), + (0x2CCA, 'M', u'ⳋ'), + (0x2CCB, 'V'), + (0x2CCC, 'M', u'ⳍ'), + (0x2CCD, 'V'), + (0x2CCE, 'M', u'ⳏ'), + (0x2CCF, 'V'), + (0x2CD0, 'M', u'ⳑ'), + (0x2CD1, 'V'), + (0x2CD2, 'M', u'ⳓ'), + (0x2CD3, 'V'), + (0x2CD4, 'M', u'ⳕ'), + (0x2CD5, 'V'), + (0x2CD6, 'M', u'ⳗ'), + (0x2CD7, 'V'), + (0x2CD8, 'M', u'ⳙ'), + (0x2CD9, 'V'), + (0x2CDA, 'M', u'ⳛ'), + (0x2CDB, 'V'), + (0x2CDC, 'M', u'ⳝ'), + (0x2CDD, 'V'), + (0x2CDE, 'M', u'ⳟ'), + (0x2CDF, 'V'), + (0x2CE0, 'M', u'ⳡ'), + (0x2CE1, 'V'), + (0x2CE2, 'M', u'ⳣ'), + (0x2CE3, 'V'), + (0x2CEB, 'M', u'ⳬ'), + (0x2CEC, 'V'), + (0x2CED, 'M', u'ⳮ'), + ] + +def _seg_26(): + return [ + (0x2CEE, 'V'), + (0x2CF2, 'M', u'ⳳ'), + (0x2CF3, 'V'), + (0x2CF4, 'X'), + (0x2CF9, 'V'), + (0x2D26, 'X'), + (0x2D27, 'V'), + (0x2D28, 'X'), + (0x2D2D, 'V'), + (0x2D2E, 'X'), + (0x2D30, 'V'), + (0x2D68, 'X'), + (0x2D6F, 'M', u'ⵡ'), + (0x2D70, 'V'), + (0x2D71, 'X'), + (0x2D7F, 'V'), + (0x2D97, 'X'), + (0x2DA0, 'V'), + (0x2DA7, 'X'), + (0x2DA8, 'V'), + (0x2DAF, 'X'), + (0x2DB0, 'V'), + (0x2DB7, 'X'), + (0x2DB8, 'V'), + (0x2DBF, 'X'), + (0x2DC0, 'V'), + (0x2DC7, 'X'), + (0x2DC8, 'V'), + (0x2DCF, 'X'), + (0x2DD0, 'V'), + (0x2DD7, 'X'), + (0x2DD8, 'V'), + (0x2DDF, 'X'), + (0x2DE0, 'V'), + (0x2E3C, 'X'), + (0x2E80, 'V'), + (0x2E9A, 'X'), + (0x2E9B, 'V'), + (0x2E9F, 'M', u'母'), + (0x2EA0, 'V'), + (0x2EF3, 'M', u'龟'), + (0x2EF4, 'X'), + (0x2F00, 'M', u'一'), + (0x2F01, 'M', u'丨'), + (0x2F02, 'M', u'丶'), + (0x2F03, 'M', u'丿'), + (0x2F04, 'M', u'乙'), + (0x2F05, 'M', u'亅'), + (0x2F06, 'M', u'二'), + (0x2F07, 'M', u'亠'), + (0x2F08, 'M', u'人'), + (0x2F09, 'M', u'儿'), + (0x2F0A, 'M', u'入'), + (0x2F0B, 'M', u'八'), + (0x2F0C, 'M', u'冂'), + (0x2F0D, 'M', u'冖'), + (0x2F0E, 'M', u'冫'), + (0x2F0F, 'M', u'几'), + (0x2F10, 'M', u'凵'), + (0x2F11, 'M', u'刀'), + (0x2F12, 'M', u'力'), + (0x2F13, 'M', u'勹'), + (0x2F14, 'M', u'匕'), + (0x2F15, 'M', u'匚'), + (0x2F16, 'M', u'匸'), + (0x2F17, 'M', u'十'), + (0x2F18, 'M', u'卜'), + (0x2F19, 'M', u'卩'), + (0x2F1A, 'M', u'厂'), + (0x2F1B, 'M', u'厶'), + (0x2F1C, 'M', u'又'), + (0x2F1D, 'M', u'口'), + (0x2F1E, 'M', u'囗'), + (0x2F1F, 'M', u'土'), + (0x2F20, 'M', u'士'), + (0x2F21, 'M', u'夂'), + (0x2F22, 'M', u'夊'), + (0x2F23, 'M', u'夕'), + (0x2F24, 'M', u'大'), + (0x2F25, 'M', u'女'), + (0x2F26, 'M', u'子'), + (0x2F27, 'M', u'宀'), + (0x2F28, 'M', u'寸'), + (0x2F29, 'M', u'小'), + (0x2F2A, 'M', u'尢'), + (0x2F2B, 'M', u'尸'), + (0x2F2C, 'M', u'屮'), + (0x2F2D, 'M', u'山'), + (0x2F2E, 'M', u'巛'), + (0x2F2F, 'M', u'工'), + (0x2F30, 'M', u'己'), + (0x2F31, 'M', u'巾'), + (0x2F32, 'M', u'干'), + (0x2F33, 'M', u'幺'), + (0x2F34, 'M', u'广'), + (0x2F35, 'M', u'廴'), + (0x2F36, 'M', u'廾'), + (0x2F37, 'M', u'弋'), + (0x2F38, 'M', u'弓'), + (0x2F39, 'M', u'彐'), + ] + +def _seg_27(): + return [ + (0x2F3A, 'M', u'彡'), + (0x2F3B, 'M', u'彳'), + (0x2F3C, 'M', u'心'), + (0x2F3D, 'M', u'戈'), + (0x2F3E, 'M', u'戶'), + (0x2F3F, 'M', u'手'), + (0x2F40, 'M', u'支'), + (0x2F41, 'M', u'攴'), + (0x2F42, 'M', u'文'), + (0x2F43, 'M', u'斗'), + (0x2F44, 'M', u'斤'), + (0x2F45, 'M', u'方'), + (0x2F46, 'M', u'无'), + (0x2F47, 'M', u'日'), + (0x2F48, 'M', u'曰'), + (0x2F49, 'M', u'月'), + (0x2F4A, 'M', u'木'), + (0x2F4B, 'M', u'欠'), + (0x2F4C, 'M', u'止'), + (0x2F4D, 'M', u'歹'), + (0x2F4E, 'M', u'殳'), + (0x2F4F, 'M', u'毋'), + (0x2F50, 'M', u'比'), + (0x2F51, 'M', u'毛'), + (0x2F52, 'M', u'氏'), + (0x2F53, 'M', u'气'), + (0x2F54, 'M', u'水'), + (0x2F55, 'M', u'火'), + (0x2F56, 'M', u'爪'), + (0x2F57, 'M', u'父'), + (0x2F58, 'M', u'爻'), + (0x2F59, 'M', u'爿'), + (0x2F5A, 'M', u'片'), + (0x2F5B, 'M', u'牙'), + (0x2F5C, 'M', u'牛'), + (0x2F5D, 'M', u'犬'), + (0x2F5E, 'M', u'玄'), + (0x2F5F, 'M', u'玉'), + (0x2F60, 'M', u'瓜'), + (0x2F61, 'M', u'瓦'), + (0x2F62, 'M', u'甘'), + (0x2F63, 'M', u'生'), + (0x2F64, 'M', u'用'), + (0x2F65, 'M', u'田'), + (0x2F66, 'M', u'疋'), + (0x2F67, 'M', u'疒'), + (0x2F68, 'M', u'癶'), + (0x2F69, 'M', u'白'), + (0x2F6A, 'M', u'皮'), + (0x2F6B, 'M', u'皿'), + (0x2F6C, 'M', u'目'), + (0x2F6D, 'M', u'矛'), + (0x2F6E, 'M', u'矢'), + (0x2F6F, 'M', u'石'), + (0x2F70, 'M', u'示'), + (0x2F71, 'M', u'禸'), + (0x2F72, 'M', u'禾'), + (0x2F73, 'M', u'穴'), + (0x2F74, 'M', u'立'), + (0x2F75, 'M', u'竹'), + (0x2F76, 'M', u'米'), + (0x2F77, 'M', u'糸'), + (0x2F78, 'M', u'缶'), + (0x2F79, 'M', u'网'), + (0x2F7A, 'M', u'羊'), + (0x2F7B, 'M', u'羽'), + (0x2F7C, 'M', u'老'), + (0x2F7D, 'M', u'而'), + (0x2F7E, 'M', u'耒'), + (0x2F7F, 'M', u'耳'), + (0x2F80, 'M', u'聿'), + (0x2F81, 'M', u'肉'), + (0x2F82, 'M', u'臣'), + (0x2F83, 'M', u'自'), + (0x2F84, 'M', u'至'), + (0x2F85, 'M', u'臼'), + (0x2F86, 'M', u'舌'), + (0x2F87, 'M', u'舛'), + (0x2F88, 'M', u'舟'), + (0x2F89, 'M', u'艮'), + (0x2F8A, 'M', u'色'), + (0x2F8B, 'M', u'艸'), + (0x2F8C, 'M', u'虍'), + (0x2F8D, 'M', u'虫'), + (0x2F8E, 'M', u'血'), + (0x2F8F, 'M', u'行'), + (0x2F90, 'M', u'衣'), + (0x2F91, 'M', u'襾'), + (0x2F92, 'M', u'見'), + (0x2F93, 'M', u'角'), + (0x2F94, 'M', u'言'), + (0x2F95, 'M', u'谷'), + (0x2F96, 'M', u'豆'), + (0x2F97, 'M', u'豕'), + (0x2F98, 'M', u'豸'), + (0x2F99, 'M', u'貝'), + (0x2F9A, 'M', u'赤'), + (0x2F9B, 'M', u'走'), + (0x2F9C, 'M', u'足'), + (0x2F9D, 'M', u'身'), + ] + +def _seg_28(): + return [ + (0x2F9E, 'M', u'車'), + (0x2F9F, 'M', u'辛'), + (0x2FA0, 'M', u'辰'), + (0x2FA1, 'M', u'辵'), + (0x2FA2, 'M', u'邑'), + (0x2FA3, 'M', u'酉'), + (0x2FA4, 'M', u'釆'), + (0x2FA5, 'M', u'里'), + (0x2FA6, 'M', u'金'), + (0x2FA7, 'M', u'長'), + (0x2FA8, 'M', u'門'), + (0x2FA9, 'M', u'阜'), + (0x2FAA, 'M', u'隶'), + (0x2FAB, 'M', u'隹'), + (0x2FAC, 'M', u'雨'), + (0x2FAD, 'M', u'靑'), + (0x2FAE, 'M', u'非'), + (0x2FAF, 'M', u'面'), + (0x2FB0, 'M', u'革'), + (0x2FB1, 'M', u'韋'), + (0x2FB2, 'M', u'韭'), + (0x2FB3, 'M', u'音'), + (0x2FB4, 'M', u'頁'), + (0x2FB5, 'M', u'風'), + (0x2FB6, 'M', u'飛'), + (0x2FB7, 'M', u'食'), + (0x2FB8, 'M', u'首'), + (0x2FB9, 'M', u'香'), + (0x2FBA, 'M', u'馬'), + (0x2FBB, 'M', u'骨'), + (0x2FBC, 'M', u'高'), + (0x2FBD, 'M', u'髟'), + (0x2FBE, 'M', u'鬥'), + (0x2FBF, 'M', u'鬯'), + (0x2FC0, 'M', u'鬲'), + (0x2FC1, 'M', u'鬼'), + (0x2FC2, 'M', u'魚'), + (0x2FC3, 'M', u'鳥'), + (0x2FC4, 'M', u'鹵'), + (0x2FC5, 'M', u'鹿'), + (0x2FC6, 'M', u'麥'), + (0x2FC7, 'M', u'麻'), + (0x2FC8, 'M', u'黃'), + (0x2FC9, 'M', u'黍'), + (0x2FCA, 'M', u'黑'), + (0x2FCB, 'M', u'黹'), + (0x2FCC, 'M', u'黽'), + (0x2FCD, 'M', u'鼎'), + (0x2FCE, 'M', u'鼓'), + (0x2FCF, 'M', u'鼠'), + (0x2FD0, 'M', u'鼻'), + (0x2FD1, 'M', u'齊'), + (0x2FD2, 'M', u'齒'), + (0x2FD3, 'M', u'龍'), + (0x2FD4, 'M', u'龜'), + (0x2FD5, 'M', u'龠'), + (0x2FD6, 'X'), + (0x3000, '3', u' '), + (0x3001, 'V'), + (0x3002, 'M', u'.'), + (0x3003, 'V'), + (0x3036, 'M', u'〒'), + (0x3037, 'V'), + (0x3038, 'M', u'十'), + (0x3039, 'M', u'卄'), + (0x303A, 'M', u'卅'), + (0x303B, 'V'), + (0x3040, 'X'), + (0x3041, 'V'), + (0x3097, 'X'), + (0x3099, 'V'), + (0x309B, '3', u' ゙'), + (0x309C, '3', u' ゚'), + (0x309D, 'V'), + (0x309F, 'M', u'より'), + (0x30A0, 'V'), + (0x30FF, 'M', u'コト'), + (0x3100, 'X'), + (0x3105, 'V'), + (0x312E, 'X'), + (0x3131, 'M', u'ᄀ'), + (0x3132, 'M', u'ᄁ'), + (0x3133, 'M', u'ᆪ'), + (0x3134, 'M', u'ᄂ'), + (0x3135, 'M', u'ᆬ'), + (0x3136, 'M', u'ᆭ'), + (0x3137, 'M', u'ᄃ'), + (0x3138, 'M', u'ᄄ'), + (0x3139, 'M', u'ᄅ'), + (0x313A, 'M', u'ᆰ'), + (0x313B, 'M', u'ᆱ'), + (0x313C, 'M', u'ᆲ'), + (0x313D, 'M', u'ᆳ'), + (0x313E, 'M', u'ᆴ'), + (0x313F, 'M', u'ᆵ'), + (0x3140, 'M', u'ᄚ'), + (0x3141, 'M', u'ᄆ'), + (0x3142, 'M', u'ᄇ'), + (0x3143, 'M', u'ᄈ'), + (0x3144, 'M', u'ᄡ'), + ] + +def _seg_29(): + return [ + (0x3145, 'M', u'ᄉ'), + (0x3146, 'M', u'ᄊ'), + (0x3147, 'M', u'ᄋ'), + (0x3148, 'M', u'ᄌ'), + (0x3149, 'M', u'ᄍ'), + (0x314A, 'M', u'ᄎ'), + (0x314B, 'M', u'ᄏ'), + (0x314C, 'M', u'ᄐ'), + (0x314D, 'M', u'ᄑ'), + (0x314E, 'M', u'ᄒ'), + (0x314F, 'M', u'ᅡ'), + (0x3150, 'M', u'ᅢ'), + (0x3151, 'M', u'ᅣ'), + (0x3152, 'M', u'ᅤ'), + (0x3153, 'M', u'ᅥ'), + (0x3154, 'M', u'ᅦ'), + (0x3155, 'M', u'ᅧ'), + (0x3156, 'M', u'ᅨ'), + (0x3157, 'M', u'ᅩ'), + (0x3158, 'M', u'ᅪ'), + (0x3159, 'M', u'ᅫ'), + (0x315A, 'M', u'ᅬ'), + (0x315B, 'M', u'ᅭ'), + (0x315C, 'M', u'ᅮ'), + (0x315D, 'M', u'ᅯ'), + (0x315E, 'M', u'ᅰ'), + (0x315F, 'M', u'ᅱ'), + (0x3160, 'M', u'ᅲ'), + (0x3161, 'M', u'ᅳ'), + (0x3162, 'M', u'ᅴ'), + (0x3163, 'M', u'ᅵ'), + (0x3164, 'X'), + (0x3165, 'M', u'ᄔ'), + (0x3166, 'M', u'ᄕ'), + (0x3167, 'M', u'ᇇ'), + (0x3168, 'M', u'ᇈ'), + (0x3169, 'M', u'ᇌ'), + (0x316A, 'M', u'ᇎ'), + (0x316B, 'M', u'ᇓ'), + (0x316C, 'M', u'ᇗ'), + (0x316D, 'M', u'ᇙ'), + (0x316E, 'M', u'ᄜ'), + (0x316F, 'M', u'ᇝ'), + (0x3170, 'M', u'ᇟ'), + (0x3171, 'M', u'ᄝ'), + (0x3172, 'M', u'ᄞ'), + (0x3173, 'M', u'ᄠ'), + (0x3174, 'M', u'ᄢ'), + (0x3175, 'M', u'ᄣ'), + (0x3176, 'M', u'ᄧ'), + (0x3177, 'M', u'ᄩ'), + (0x3178, 'M', u'ᄫ'), + (0x3179, 'M', u'ᄬ'), + (0x317A, 'M', u'ᄭ'), + (0x317B, 'M', u'ᄮ'), + (0x317C, 'M', u'ᄯ'), + (0x317D, 'M', u'ᄲ'), + (0x317E, 'M', u'ᄶ'), + (0x317F, 'M', u'ᅀ'), + (0x3180, 'M', u'ᅇ'), + (0x3181, 'M', u'ᅌ'), + (0x3182, 'M', u'ᇱ'), + (0x3183, 'M', u'ᇲ'), + (0x3184, 'M', u'ᅗ'), + (0x3185, 'M', u'ᅘ'), + (0x3186, 'M', u'ᅙ'), + (0x3187, 'M', u'ᆄ'), + (0x3188, 'M', u'ᆅ'), + (0x3189, 'M', u'ᆈ'), + (0x318A, 'M', u'ᆑ'), + (0x318B, 'M', u'ᆒ'), + (0x318C, 'M', u'ᆔ'), + (0x318D, 'M', u'ᆞ'), + (0x318E, 'M', u'ᆡ'), + (0x318F, 'X'), + (0x3190, 'V'), + (0x3192, 'M', u'一'), + (0x3193, 'M', u'二'), + (0x3194, 'M', u'三'), + (0x3195, 'M', u'四'), + (0x3196, 'M', u'上'), + (0x3197, 'M', u'中'), + (0x3198, 'M', u'下'), + (0x3199, 'M', u'甲'), + (0x319A, 'M', u'乙'), + (0x319B, 'M', u'丙'), + (0x319C, 'M', u'丁'), + (0x319D, 'M', u'天'), + (0x319E, 'M', u'地'), + (0x319F, 'M', u'人'), + (0x31A0, 'V'), + (0x31BB, 'X'), + (0x31C0, 'V'), + (0x31E4, 'X'), + (0x31F0, 'V'), + (0x3200, '3', u'(ᄀ)'), + (0x3201, '3', u'(ᄂ)'), + (0x3202, '3', u'(ᄃ)'), + (0x3203, '3', u'(ᄅ)'), + (0x3204, '3', u'(ᄆ)'), + ] + +def _seg_30(): + return [ + (0x3205, '3', u'(ᄇ)'), + (0x3206, '3', u'(ᄉ)'), + (0x3207, '3', u'(ᄋ)'), + (0x3208, '3', u'(ᄌ)'), + (0x3209, '3', u'(ᄎ)'), + (0x320A, '3', u'(ᄏ)'), + (0x320B, '3', u'(ᄐ)'), + (0x320C, '3', u'(ᄑ)'), + (0x320D, '3', u'(ᄒ)'), + (0x320E, '3', u'(가)'), + (0x320F, '3', u'(나)'), + (0x3210, '3', u'(다)'), + (0x3211, '3', u'(라)'), + (0x3212, '3', u'(마)'), + (0x3213, '3', u'(바)'), + (0x3214, '3', u'(사)'), + (0x3215, '3', u'(아)'), + (0x3216, '3', u'(자)'), + (0x3217, '3', u'(차)'), + (0x3218, '3', u'(카)'), + (0x3219, '3', u'(타)'), + (0x321A, '3', u'(파)'), + (0x321B, '3', u'(하)'), + (0x321C, '3', u'(주)'), + (0x321D, '3', u'(오전)'), + (0x321E, '3', u'(오후)'), + (0x321F, 'X'), + (0x3220, '3', u'(一)'), + (0x3221, '3', u'(二)'), + (0x3222, '3', u'(三)'), + (0x3223, '3', u'(四)'), + (0x3224, '3', u'(五)'), + (0x3225, '3', u'(六)'), + (0x3226, '3', u'(七)'), + (0x3227, '3', u'(八)'), + (0x3228, '3', u'(九)'), + (0x3229, '3', u'(十)'), + (0x322A, '3', u'(月)'), + (0x322B, '3', u'(火)'), + (0x322C, '3', u'(水)'), + (0x322D, '3', u'(木)'), + (0x322E, '3', u'(金)'), + (0x322F, '3', u'(土)'), + (0x3230, '3', u'(日)'), + (0x3231, '3', u'(株)'), + (0x3232, '3', u'(有)'), + (0x3233, '3', u'(社)'), + (0x3234, '3', u'(名)'), + (0x3235, '3', u'(特)'), + (0x3236, '3', u'(財)'), + (0x3237, '3', u'(祝)'), + (0x3238, '3', u'(労)'), + (0x3239, '3', u'(代)'), + (0x323A, '3', u'(呼)'), + (0x323B, '3', u'(学)'), + (0x323C, '3', u'(監)'), + (0x323D, '3', u'(企)'), + (0x323E, '3', u'(資)'), + (0x323F, '3', u'(協)'), + (0x3240, '3', u'(祭)'), + (0x3241, '3', u'(休)'), + (0x3242, '3', u'(自)'), + (0x3243, '3', u'(至)'), + (0x3244, 'M', u'問'), + (0x3245, 'M', u'幼'), + (0x3246, 'M', u'文'), + (0x3247, 'M', u'箏'), + (0x3248, 'V'), + (0x3250, 'M', u'pte'), + (0x3251, 'M', u'21'), + (0x3252, 'M', u'22'), + (0x3253, 'M', u'23'), + (0x3254, 'M', u'24'), + (0x3255, 'M', u'25'), + (0x3256, 'M', u'26'), + (0x3257, 'M', u'27'), + (0x3258, 'M', u'28'), + (0x3259, 'M', u'29'), + (0x325A, 'M', u'30'), + (0x325B, 'M', u'31'), + (0x325C, 'M', u'32'), + (0x325D, 'M', u'33'), + (0x325E, 'M', u'34'), + (0x325F, 'M', u'35'), + (0x3260, 'M', u'ᄀ'), + (0x3261, 'M', u'ᄂ'), + (0x3262, 'M', u'ᄃ'), + (0x3263, 'M', u'ᄅ'), + (0x3264, 'M', u'ᄆ'), + (0x3265, 'M', u'ᄇ'), + (0x3266, 'M', u'ᄉ'), + (0x3267, 'M', u'ᄋ'), + (0x3268, 'M', u'ᄌ'), + (0x3269, 'M', u'ᄎ'), + (0x326A, 'M', u'ᄏ'), + (0x326B, 'M', u'ᄐ'), + (0x326C, 'M', u'ᄑ'), + (0x326D, 'M', u'ᄒ'), + (0x326E, 'M', u'가'), + (0x326F, 'M', u'나'), + ] + +def _seg_31(): + return [ + (0x3270, 'M', u'다'), + (0x3271, 'M', u'라'), + (0x3272, 'M', u'마'), + (0x3273, 'M', u'바'), + (0x3274, 'M', u'사'), + (0x3275, 'M', u'아'), + (0x3276, 'M', u'자'), + (0x3277, 'M', u'차'), + (0x3278, 'M', u'카'), + (0x3279, 'M', u'타'), + (0x327A, 'M', u'파'), + (0x327B, 'M', u'하'), + (0x327C, 'M', u'참고'), + (0x327D, 'M', u'주의'), + (0x327E, 'M', u'우'), + (0x327F, 'V'), + (0x3280, 'M', u'一'), + (0x3281, 'M', u'二'), + (0x3282, 'M', u'三'), + (0x3283, 'M', u'四'), + (0x3284, 'M', u'五'), + (0x3285, 'M', u'六'), + (0x3286, 'M', u'七'), + (0x3287, 'M', u'八'), + (0x3288, 'M', u'九'), + (0x3289, 'M', u'十'), + (0x328A, 'M', u'月'), + (0x328B, 'M', u'火'), + (0x328C, 'M', u'水'), + (0x328D, 'M', u'木'), + (0x328E, 'M', u'金'), + (0x328F, 'M', u'土'), + (0x3290, 'M', u'日'), + (0x3291, 'M', u'株'), + (0x3292, 'M', u'有'), + (0x3293, 'M', u'社'), + (0x3294, 'M', u'名'), + (0x3295, 'M', u'特'), + (0x3296, 'M', u'財'), + (0x3297, 'M', u'祝'), + (0x3298, 'M', u'労'), + (0x3299, 'M', u'秘'), + (0x329A, 'M', u'男'), + (0x329B, 'M', u'女'), + (0x329C, 'M', u'適'), + (0x329D, 'M', u'優'), + (0x329E, 'M', u'印'), + (0x329F, 'M', u'注'), + (0x32A0, 'M', u'項'), + (0x32A1, 'M', u'休'), + (0x32A2, 'M', u'写'), + (0x32A3, 'M', u'正'), + (0x32A4, 'M', u'上'), + (0x32A5, 'M', u'中'), + (0x32A6, 'M', u'下'), + (0x32A7, 'M', u'左'), + (0x32A8, 'M', u'右'), + (0x32A9, 'M', u'医'), + (0x32AA, 'M', u'宗'), + (0x32AB, 'M', u'学'), + (0x32AC, 'M', u'監'), + (0x32AD, 'M', u'企'), + (0x32AE, 'M', u'資'), + (0x32AF, 'M', u'協'), + (0x32B0, 'M', u'夜'), + (0x32B1, 'M', u'36'), + (0x32B2, 'M', u'37'), + (0x32B3, 'M', u'38'), + (0x32B4, 'M', u'39'), + (0x32B5, 'M', u'40'), + (0x32B6, 'M', u'41'), + (0x32B7, 'M', u'42'), + (0x32B8, 'M', u'43'), + (0x32B9, 'M', u'44'), + (0x32BA, 'M', u'45'), + (0x32BB, 'M', u'46'), + (0x32BC, 'M', u'47'), + (0x32BD, 'M', u'48'), + (0x32BE, 'M', u'49'), + (0x32BF, 'M', u'50'), + (0x32C0, 'M', u'1月'), + (0x32C1, 'M', u'2月'), + (0x32C2, 'M', u'3月'), + (0x32C3, 'M', u'4月'), + (0x32C4, 'M', u'5月'), + (0x32C5, 'M', u'6月'), + (0x32C6, 'M', u'7月'), + (0x32C7, 'M', u'8月'), + (0x32C8, 'M', u'9月'), + (0x32C9, 'M', u'10月'), + (0x32CA, 'M', u'11月'), + (0x32CB, 'M', u'12月'), + (0x32CC, 'M', u'hg'), + (0x32CD, 'M', u'erg'), + (0x32CE, 'M', u'ev'), + (0x32CF, 'M', u'ltd'), + (0x32D0, 'M', u'ア'), + (0x32D1, 'M', u'イ'), + (0x32D2, 'M', u'ウ'), + (0x32D3, 'M', u'エ'), + ] + +def _seg_32(): + return [ + (0x32D4, 'M', u'オ'), + (0x32D5, 'M', u'カ'), + (0x32D6, 'M', u'キ'), + (0x32D7, 'M', u'ク'), + (0x32D8, 'M', u'ケ'), + (0x32D9, 'M', u'コ'), + (0x32DA, 'M', u'サ'), + (0x32DB, 'M', u'シ'), + (0x32DC, 'M', u'ス'), + (0x32DD, 'M', u'セ'), + (0x32DE, 'M', u'ソ'), + (0x32DF, 'M', u'タ'), + (0x32E0, 'M', u'チ'), + (0x32E1, 'M', u'ツ'), + (0x32E2, 'M', u'テ'), + (0x32E3, 'M', u'ト'), + (0x32E4, 'M', u'ナ'), + (0x32E5, 'M', u'ニ'), + (0x32E6, 'M', u'ヌ'), + (0x32E7, 'M', u'ネ'), + (0x32E8, 'M', u'ノ'), + (0x32E9, 'M', u'ハ'), + (0x32EA, 'M', u'ヒ'), + (0x32EB, 'M', u'フ'), + (0x32EC, 'M', u'ヘ'), + (0x32ED, 'M', u'ホ'), + (0x32EE, 'M', u'マ'), + (0x32EF, 'M', u'ミ'), + (0x32F0, 'M', u'ム'), + (0x32F1, 'M', u'メ'), + (0x32F2, 'M', u'モ'), + (0x32F3, 'M', u'ヤ'), + (0x32F4, 'M', u'ユ'), + (0x32F5, 'M', u'ヨ'), + (0x32F6, 'M', u'ラ'), + (0x32F7, 'M', u'リ'), + (0x32F8, 'M', u'ル'), + (0x32F9, 'M', u'レ'), + (0x32FA, 'M', u'ロ'), + (0x32FB, 'M', u'ワ'), + (0x32FC, 'M', u'ヰ'), + (0x32FD, 'M', u'ヱ'), + (0x32FE, 'M', u'ヲ'), + (0x32FF, 'X'), + (0x3300, 'M', u'アパート'), + (0x3301, 'M', u'アルファ'), + (0x3302, 'M', u'アンペア'), + (0x3303, 'M', u'アール'), + (0x3304, 'M', u'イニング'), + (0x3305, 'M', u'インチ'), + (0x3306, 'M', u'ウォン'), + (0x3307, 'M', u'エスクード'), + (0x3308, 'M', u'エーカー'), + (0x3309, 'M', u'オンス'), + (0x330A, 'M', u'オーム'), + (0x330B, 'M', u'カイリ'), + (0x330C, 'M', u'カラット'), + (0x330D, 'M', u'カロリー'), + (0x330E, 'M', u'ガロン'), + (0x330F, 'M', u'ガンマ'), + (0x3310, 'M', u'ギガ'), + (0x3311, 'M', u'ギニー'), + (0x3312, 'M', u'キュリー'), + (0x3313, 'M', u'ギルダー'), + (0x3314, 'M', u'キロ'), + (0x3315, 'M', u'キログラム'), + (0x3316, 'M', u'キロメートル'), + (0x3317, 'M', u'キロワット'), + (0x3318, 'M', u'グラム'), + (0x3319, 'M', u'グラムトン'), + (0x331A, 'M', u'クルゼイロ'), + (0x331B, 'M', u'クローネ'), + (0x331C, 'M', u'ケース'), + (0x331D, 'M', u'コルナ'), + (0x331E, 'M', u'コーポ'), + (0x331F, 'M', u'サイクル'), + (0x3320, 'M', u'サンチーム'), + (0x3321, 'M', u'シリング'), + (0x3322, 'M', u'センチ'), + (0x3323, 'M', u'セント'), + (0x3324, 'M', u'ダース'), + (0x3325, 'M', u'デシ'), + (0x3326, 'M', u'ドル'), + (0x3327, 'M', u'トン'), + (0x3328, 'M', u'ナノ'), + (0x3329, 'M', u'ノット'), + (0x332A, 'M', u'ハイツ'), + (0x332B, 'M', u'パーセント'), + (0x332C, 'M', u'パーツ'), + (0x332D, 'M', u'バーレル'), + (0x332E, 'M', u'ピアストル'), + (0x332F, 'M', u'ピクル'), + (0x3330, 'M', u'ピコ'), + (0x3331, 'M', u'ビル'), + (0x3332, 'M', u'ファラッド'), + (0x3333, 'M', u'フィート'), + (0x3334, 'M', u'ブッシェル'), + (0x3335, 'M', u'フラン'), + (0x3336, 'M', u'ヘクタール'), + (0x3337, 'M', u'ペソ'), + ] + +def _seg_33(): + return [ + (0x3338, 'M', u'ペニヒ'), + (0x3339, 'M', u'ヘルツ'), + (0x333A, 'M', u'ペンス'), + (0x333B, 'M', u'ページ'), + (0x333C, 'M', u'ベータ'), + (0x333D, 'M', u'ポイント'), + (0x333E, 'M', u'ボルト'), + (0x333F, 'M', u'ホン'), + (0x3340, 'M', u'ポンド'), + (0x3341, 'M', u'ホール'), + (0x3342, 'M', u'ホーン'), + (0x3343, 'M', u'マイクロ'), + (0x3344, 'M', u'マイル'), + (0x3345, 'M', u'マッハ'), + (0x3346, 'M', u'マルク'), + (0x3347, 'M', u'マンション'), + (0x3348, 'M', u'ミクロン'), + (0x3349, 'M', u'ミリ'), + (0x334A, 'M', u'ミリバール'), + (0x334B, 'M', u'メガ'), + (0x334C, 'M', u'メガトン'), + (0x334D, 'M', u'メートル'), + (0x334E, 'M', u'ヤード'), + (0x334F, 'M', u'ヤール'), + (0x3350, 'M', u'ユアン'), + (0x3351, 'M', u'リットル'), + (0x3352, 'M', u'リラ'), + (0x3353, 'M', u'ルピー'), + (0x3354, 'M', u'ルーブル'), + (0x3355, 'M', u'レム'), + (0x3356, 'M', u'レントゲン'), + (0x3357, 'M', u'ワット'), + (0x3358, 'M', u'0点'), + (0x3359, 'M', u'1点'), + (0x335A, 'M', u'2点'), + (0x335B, 'M', u'3点'), + (0x335C, 'M', u'4点'), + (0x335D, 'M', u'5点'), + (0x335E, 'M', u'6点'), + (0x335F, 'M', u'7点'), + (0x3360, 'M', u'8点'), + (0x3361, 'M', u'9点'), + (0x3362, 'M', u'10点'), + (0x3363, 'M', u'11点'), + (0x3364, 'M', u'12点'), + (0x3365, 'M', u'13点'), + (0x3366, 'M', u'14点'), + (0x3367, 'M', u'15点'), + (0x3368, 'M', u'16点'), + (0x3369, 'M', u'17点'), + (0x336A, 'M', u'18点'), + (0x336B, 'M', u'19点'), + (0x336C, 'M', u'20点'), + (0x336D, 'M', u'21点'), + (0x336E, 'M', u'22点'), + (0x336F, 'M', u'23点'), + (0x3370, 'M', u'24点'), + (0x3371, 'M', u'hpa'), + (0x3372, 'M', u'da'), + (0x3373, 'M', u'au'), + (0x3374, 'M', u'bar'), + (0x3375, 'M', u'ov'), + (0x3376, 'M', u'pc'), + (0x3377, 'M', u'dm'), + (0x3378, 'M', u'dm2'), + (0x3379, 'M', u'dm3'), + (0x337A, 'M', u'iu'), + (0x337B, 'M', u'平成'), + (0x337C, 'M', u'昭和'), + (0x337D, 'M', u'大正'), + (0x337E, 'M', u'明治'), + (0x337F, 'M', u'株式会社'), + (0x3380, 'M', u'pa'), + (0x3381, 'M', u'na'), + (0x3382, 'M', u'μa'), + (0x3383, 'M', u'ma'), + (0x3384, 'M', u'ka'), + (0x3385, 'M', u'kb'), + (0x3386, 'M', u'mb'), + (0x3387, 'M', u'gb'), + (0x3388, 'M', u'cal'), + (0x3389, 'M', u'kcal'), + (0x338A, 'M', u'pf'), + (0x338B, 'M', u'nf'), + (0x338C, 'M', u'μf'), + (0x338D, 'M', u'μg'), + (0x338E, 'M', u'mg'), + (0x338F, 'M', u'kg'), + (0x3390, 'M', u'hz'), + (0x3391, 'M', u'khz'), + (0x3392, 'M', u'mhz'), + (0x3393, 'M', u'ghz'), + (0x3394, 'M', u'thz'), + (0x3395, 'M', u'μl'), + (0x3396, 'M', u'ml'), + (0x3397, 'M', u'dl'), + (0x3398, 'M', u'kl'), + (0x3399, 'M', u'fm'), + (0x339A, 'M', u'nm'), + (0x339B, 'M', u'μm'), + ] + +def _seg_34(): + return [ + (0x339C, 'M', u'mm'), + (0x339D, 'M', u'cm'), + (0x339E, 'M', u'km'), + (0x339F, 'M', u'mm2'), + (0x33A0, 'M', u'cm2'), + (0x33A1, 'M', u'm2'), + (0x33A2, 'M', u'km2'), + (0x33A3, 'M', u'mm3'), + (0x33A4, 'M', u'cm3'), + (0x33A5, 'M', u'm3'), + (0x33A6, 'M', u'km3'), + (0x33A7, 'M', u'm∕s'), + (0x33A8, 'M', u'm∕s2'), + (0x33A9, 'M', u'pa'), + (0x33AA, 'M', u'kpa'), + (0x33AB, 'M', u'mpa'), + (0x33AC, 'M', u'gpa'), + (0x33AD, 'M', u'rad'), + (0x33AE, 'M', u'rad∕s'), + (0x33AF, 'M', u'rad∕s2'), + (0x33B0, 'M', u'ps'), + (0x33B1, 'M', u'ns'), + (0x33B2, 'M', u'μs'), + (0x33B3, 'M', u'ms'), + (0x33B4, 'M', u'pv'), + (0x33B5, 'M', u'nv'), + (0x33B6, 'M', u'μv'), + (0x33B7, 'M', u'mv'), + (0x33B8, 'M', u'kv'), + (0x33B9, 'M', u'mv'), + (0x33BA, 'M', u'pw'), + (0x33BB, 'M', u'nw'), + (0x33BC, 'M', u'μw'), + (0x33BD, 'M', u'mw'), + (0x33BE, 'M', u'kw'), + (0x33BF, 'M', u'mw'), + (0x33C0, 'M', u'kω'), + (0x33C1, 'M', u'mω'), + (0x33C2, 'X'), + (0x33C3, 'M', u'bq'), + (0x33C4, 'M', u'cc'), + (0x33C5, 'M', u'cd'), + (0x33C6, 'M', u'c∕kg'), + (0x33C7, 'X'), + (0x33C8, 'M', u'db'), + (0x33C9, 'M', u'gy'), + (0x33CA, 'M', u'ha'), + (0x33CB, 'M', u'hp'), + (0x33CC, 'M', u'in'), + (0x33CD, 'M', u'kk'), + (0x33CE, 'M', u'km'), + (0x33CF, 'M', u'kt'), + (0x33D0, 'M', u'lm'), + (0x33D1, 'M', u'ln'), + (0x33D2, 'M', u'log'), + (0x33D3, 'M', u'lx'), + (0x33D4, 'M', u'mb'), + (0x33D5, 'M', u'mil'), + (0x33D6, 'M', u'mol'), + (0x33D7, 'M', u'ph'), + (0x33D8, 'X'), + (0x33D9, 'M', u'ppm'), + (0x33DA, 'M', u'pr'), + (0x33DB, 'M', u'sr'), + (0x33DC, 'M', u'sv'), + (0x33DD, 'M', u'wb'), + (0x33DE, 'M', u'v∕m'), + (0x33DF, 'M', u'a∕m'), + (0x33E0, 'M', u'1日'), + (0x33E1, 'M', u'2日'), + (0x33E2, 'M', u'3日'), + (0x33E3, 'M', u'4日'), + (0x33E4, 'M', u'5日'), + (0x33E5, 'M', u'6日'), + (0x33E6, 'M', u'7日'), + (0x33E7, 'M', u'8日'), + (0x33E8, 'M', u'9日'), + (0x33E9, 'M', u'10日'), + (0x33EA, 'M', u'11日'), + (0x33EB, 'M', u'12日'), + (0x33EC, 'M', u'13日'), + (0x33ED, 'M', u'14日'), + (0x33EE, 'M', u'15日'), + (0x33EF, 'M', u'16日'), + (0x33F0, 'M', u'17日'), + (0x33F1, 'M', u'18日'), + (0x33F2, 'M', u'19日'), + (0x33F3, 'M', u'20日'), + (0x33F4, 'M', u'21日'), + (0x33F5, 'M', u'22日'), + (0x33F6, 'M', u'23日'), + (0x33F7, 'M', u'24日'), + (0x33F8, 'M', u'25日'), + (0x33F9, 'M', u'26日'), + (0x33FA, 'M', u'27日'), + (0x33FB, 'M', u'28日'), + (0x33FC, 'M', u'29日'), + (0x33FD, 'M', u'30日'), + (0x33FE, 'M', u'31日'), + (0x33FF, 'M', u'gal'), + ] + +def _seg_35(): + return [ + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FCD, 'X'), + (0xA000, 'V'), + (0xA48D, 'X'), + (0xA490, 'V'), + (0xA4C7, 'X'), + (0xA4D0, 'V'), + (0xA62C, 'X'), + (0xA640, 'M', u'ꙁ'), + (0xA641, 'V'), + (0xA642, 'M', u'ꙃ'), + (0xA643, 'V'), + (0xA644, 'M', u'ꙅ'), + (0xA645, 'V'), + (0xA646, 'M', u'ꙇ'), + (0xA647, 'V'), + (0xA648, 'M', u'ꙉ'), + (0xA649, 'V'), + (0xA64A, 'M', u'ꙋ'), + (0xA64B, 'V'), + (0xA64C, 'M', u'ꙍ'), + (0xA64D, 'V'), + (0xA64E, 'M', u'ꙏ'), + (0xA64F, 'V'), + (0xA650, 'M', u'ꙑ'), + (0xA651, 'V'), + (0xA652, 'M', u'ꙓ'), + (0xA653, 'V'), + (0xA654, 'M', u'ꙕ'), + (0xA655, 'V'), + (0xA656, 'M', u'ꙗ'), + (0xA657, 'V'), + (0xA658, 'M', u'ꙙ'), + (0xA659, 'V'), + (0xA65A, 'M', u'ꙛ'), + (0xA65B, 'V'), + (0xA65C, 'M', u'ꙝ'), + (0xA65D, 'V'), + (0xA65E, 'M', u'ꙟ'), + (0xA65F, 'V'), + (0xA660, 'M', u'ꙡ'), + (0xA661, 'V'), + (0xA662, 'M', u'ꙣ'), + (0xA663, 'V'), + (0xA664, 'M', u'ꙥ'), + (0xA665, 'V'), + (0xA666, 'M', u'ꙧ'), + (0xA667, 'V'), + (0xA668, 'M', u'ꙩ'), + (0xA669, 'V'), + (0xA66A, 'M', u'ꙫ'), + (0xA66B, 'V'), + (0xA66C, 'M', u'ꙭ'), + (0xA66D, 'V'), + (0xA680, 'M', u'ꚁ'), + (0xA681, 'V'), + (0xA682, 'M', u'ꚃ'), + (0xA683, 'V'), + (0xA684, 'M', u'ꚅ'), + (0xA685, 'V'), + (0xA686, 'M', u'ꚇ'), + (0xA687, 'V'), + (0xA688, 'M', u'ꚉ'), + (0xA689, 'V'), + (0xA68A, 'M', u'ꚋ'), + (0xA68B, 'V'), + (0xA68C, 'M', u'ꚍ'), + (0xA68D, 'V'), + (0xA68E, 'M', u'ꚏ'), + (0xA68F, 'V'), + (0xA690, 'M', u'ꚑ'), + (0xA691, 'V'), + (0xA692, 'M', u'ꚓ'), + (0xA693, 'V'), + (0xA694, 'M', u'ꚕ'), + (0xA695, 'V'), + (0xA696, 'M', u'ꚗ'), + (0xA697, 'V'), + (0xA698, 'X'), + (0xA69F, 'V'), + (0xA6F8, 'X'), + (0xA700, 'V'), + (0xA722, 'M', u'ꜣ'), + (0xA723, 'V'), + (0xA724, 'M', u'ꜥ'), + (0xA725, 'V'), + (0xA726, 'M', u'ꜧ'), + (0xA727, 'V'), + (0xA728, 'M', u'ꜩ'), + (0xA729, 'V'), + (0xA72A, 'M', u'ꜫ'), + (0xA72B, 'V'), + (0xA72C, 'M', u'ꜭ'), + (0xA72D, 'V'), + (0xA72E, 'M', u'ꜯ'), + (0xA72F, 'V'), + (0xA732, 'M', u'ꜳ'), + (0xA733, 'V'), + ] + +def _seg_36(): + return [ + (0xA734, 'M', u'ꜵ'), + (0xA735, 'V'), + (0xA736, 'M', u'ꜷ'), + (0xA737, 'V'), + (0xA738, 'M', u'ꜹ'), + (0xA739, 'V'), + (0xA73A, 'M', u'ꜻ'), + (0xA73B, 'V'), + (0xA73C, 'M', u'ꜽ'), + (0xA73D, 'V'), + (0xA73E, 'M', u'ꜿ'), + (0xA73F, 'V'), + (0xA740, 'M', u'ꝁ'), + (0xA741, 'V'), + (0xA742, 'M', u'ꝃ'), + (0xA743, 'V'), + (0xA744, 'M', u'ꝅ'), + (0xA745, 'V'), + (0xA746, 'M', u'ꝇ'), + (0xA747, 'V'), + (0xA748, 'M', u'ꝉ'), + (0xA749, 'V'), + (0xA74A, 'M', u'ꝋ'), + (0xA74B, 'V'), + (0xA74C, 'M', u'ꝍ'), + (0xA74D, 'V'), + (0xA74E, 'M', u'ꝏ'), + (0xA74F, 'V'), + (0xA750, 'M', u'ꝑ'), + (0xA751, 'V'), + (0xA752, 'M', u'ꝓ'), + (0xA753, 'V'), + (0xA754, 'M', u'ꝕ'), + (0xA755, 'V'), + (0xA756, 'M', u'ꝗ'), + (0xA757, 'V'), + (0xA758, 'M', u'ꝙ'), + (0xA759, 'V'), + (0xA75A, 'M', u'ꝛ'), + (0xA75B, 'V'), + (0xA75C, 'M', u'ꝝ'), + (0xA75D, 'V'), + (0xA75E, 'M', u'ꝟ'), + (0xA75F, 'V'), + (0xA760, 'M', u'ꝡ'), + (0xA761, 'V'), + (0xA762, 'M', u'ꝣ'), + (0xA763, 'V'), + (0xA764, 'M', u'ꝥ'), + (0xA765, 'V'), + (0xA766, 'M', u'ꝧ'), + (0xA767, 'V'), + (0xA768, 'M', u'ꝩ'), + (0xA769, 'V'), + (0xA76A, 'M', u'ꝫ'), + (0xA76B, 'V'), + (0xA76C, 'M', u'ꝭ'), + (0xA76D, 'V'), + (0xA76E, 'M', u'ꝯ'), + (0xA76F, 'V'), + (0xA770, 'M', u'ꝯ'), + (0xA771, 'V'), + (0xA779, 'M', u'ꝺ'), + (0xA77A, 'V'), + (0xA77B, 'M', u'ꝼ'), + (0xA77C, 'V'), + (0xA77D, 'M', u'ᵹ'), + (0xA77E, 'M', u'ꝿ'), + (0xA77F, 'V'), + (0xA780, 'M', u'ꞁ'), + (0xA781, 'V'), + (0xA782, 'M', u'ꞃ'), + (0xA783, 'V'), + (0xA784, 'M', u'ꞅ'), + (0xA785, 'V'), + (0xA786, 'M', u'ꞇ'), + (0xA787, 'V'), + (0xA78B, 'M', u'ꞌ'), + (0xA78C, 'V'), + (0xA78D, 'M', u'ɥ'), + (0xA78E, 'V'), + (0xA78F, 'X'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA794, 'X'), + (0xA7A0, 'M', u'ꞡ'), + (0xA7A1, 'V'), + (0xA7A2, 'M', u'ꞣ'), + (0xA7A3, 'V'), + (0xA7A4, 'M', u'ꞥ'), + (0xA7A5, 'V'), + (0xA7A6, 'M', u'ꞧ'), + (0xA7A7, 'V'), + (0xA7A8, 'M', u'ꞩ'), + (0xA7A9, 'V'), + (0xA7AA, 'M', u'ɦ'), + (0xA7AB, 'X'), + (0xA7F8, 'M', u'ħ'), + ] + +def _seg_37(): + return [ + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C5, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA8FC, 'X'), + (0xA900, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9E0, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, 'V'), + (0xAA7C, 'X'), + (0xAA80, 'V'), + (0xAAC3, 'X'), + (0xAADB, 'V'), + (0xAAF7, 'X'), + (0xAB01, 'V'), + (0xAB07, 'X'), + (0xAB09, 'V'), + (0xAB0F, 'X'), + (0xAB11, 'V'), + (0xAB17, 'X'), + (0xAB20, 'V'), + (0xAB27, 'X'), + (0xAB28, 'V'), + (0xAB2F, 'X'), + (0xABC0, 'V'), + (0xABEE, 'X'), + (0xABF0, 'V'), + (0xABFA, 'X'), + (0xAC00, 'V'), + (0xD7A4, 'X'), + (0xD7B0, 'V'), + (0xD7C7, 'X'), + (0xD7CB, 'V'), + (0xD7FC, 'X'), + (0xF900, 'M', u'豈'), + (0xF901, 'M', u'更'), + (0xF902, 'M', u'車'), + (0xF903, 'M', u'賈'), + (0xF904, 'M', u'滑'), + (0xF905, 'M', u'串'), + (0xF906, 'M', u'句'), + (0xF907, 'M', u'龜'), + (0xF909, 'M', u'契'), + (0xF90A, 'M', u'金'), + (0xF90B, 'M', u'喇'), + (0xF90C, 'M', u'奈'), + (0xF90D, 'M', u'懶'), + (0xF90E, 'M', u'癩'), + (0xF90F, 'M', u'羅'), + (0xF910, 'M', u'蘿'), + (0xF911, 'M', u'螺'), + (0xF912, 'M', u'裸'), + (0xF913, 'M', u'邏'), + (0xF914, 'M', u'樂'), + (0xF915, 'M', u'洛'), + (0xF916, 'M', u'烙'), + (0xF917, 'M', u'珞'), + (0xF918, 'M', u'落'), + (0xF919, 'M', u'酪'), + (0xF91A, 'M', u'駱'), + (0xF91B, 'M', u'亂'), + (0xF91C, 'M', u'卵'), + (0xF91D, 'M', u'欄'), + (0xF91E, 'M', u'爛'), + (0xF91F, 'M', u'蘭'), + (0xF920, 'M', u'鸞'), + (0xF921, 'M', u'嵐'), + (0xF922, 'M', u'濫'), + (0xF923, 'M', u'藍'), + (0xF924, 'M', u'襤'), + (0xF925, 'M', u'拉'), + (0xF926, 'M', u'臘'), + (0xF927, 'M', u'蠟'), + (0xF928, 'M', u'廊'), + (0xF929, 'M', u'朗'), + (0xF92A, 'M', u'浪'), + (0xF92B, 'M', u'狼'), + (0xF92C, 'M', u'郎'), + (0xF92D, 'M', u'來'), + ] + +def _seg_38(): + return [ + (0xF92E, 'M', u'冷'), + (0xF92F, 'M', u'勞'), + (0xF930, 'M', u'擄'), + (0xF931, 'M', u'櫓'), + (0xF932, 'M', u'爐'), + (0xF933, 'M', u'盧'), + (0xF934, 'M', u'老'), + (0xF935, 'M', u'蘆'), + (0xF936, 'M', u'虜'), + (0xF937, 'M', u'路'), + (0xF938, 'M', u'露'), + (0xF939, 'M', u'魯'), + (0xF93A, 'M', u'鷺'), + (0xF93B, 'M', u'碌'), + (0xF93C, 'M', u'祿'), + (0xF93D, 'M', u'綠'), + (0xF93E, 'M', u'菉'), + (0xF93F, 'M', u'錄'), + (0xF940, 'M', u'鹿'), + (0xF941, 'M', u'論'), + (0xF942, 'M', u'壟'), + (0xF943, 'M', u'弄'), + (0xF944, 'M', u'籠'), + (0xF945, 'M', u'聾'), + (0xF946, 'M', u'牢'), + (0xF947, 'M', u'磊'), + (0xF948, 'M', u'賂'), + (0xF949, 'M', u'雷'), + (0xF94A, 'M', u'壘'), + (0xF94B, 'M', u'屢'), + (0xF94C, 'M', u'樓'), + (0xF94D, 'M', u'淚'), + (0xF94E, 'M', u'漏'), + (0xF94F, 'M', u'累'), + (0xF950, 'M', u'縷'), + (0xF951, 'M', u'陋'), + (0xF952, 'M', u'勒'), + (0xF953, 'M', u'肋'), + (0xF954, 'M', u'凜'), + (0xF955, 'M', u'凌'), + (0xF956, 'M', u'稜'), + (0xF957, 'M', u'綾'), + (0xF958, 'M', u'菱'), + (0xF959, 'M', u'陵'), + (0xF95A, 'M', u'讀'), + (0xF95B, 'M', u'拏'), + (0xF95C, 'M', u'樂'), + (0xF95D, 'M', u'諾'), + (0xF95E, 'M', u'丹'), + (0xF95F, 'M', u'寧'), + (0xF960, 'M', u'怒'), + (0xF961, 'M', u'率'), + (0xF962, 'M', u'異'), + (0xF963, 'M', u'北'), + (0xF964, 'M', u'磻'), + (0xF965, 'M', u'便'), + (0xF966, 'M', u'復'), + (0xF967, 'M', u'不'), + (0xF968, 'M', u'泌'), + (0xF969, 'M', u'數'), + (0xF96A, 'M', u'索'), + (0xF96B, 'M', u'參'), + (0xF96C, 'M', u'塞'), + (0xF96D, 'M', u'省'), + (0xF96E, 'M', u'葉'), + (0xF96F, 'M', u'說'), + (0xF970, 'M', u'殺'), + (0xF971, 'M', u'辰'), + (0xF972, 'M', u'沈'), + (0xF973, 'M', u'拾'), + (0xF974, 'M', u'若'), + (0xF975, 'M', u'掠'), + (0xF976, 'M', u'略'), + (0xF977, 'M', u'亮'), + (0xF978, 'M', u'兩'), + (0xF979, 'M', u'凉'), + (0xF97A, 'M', u'梁'), + (0xF97B, 'M', u'糧'), + (0xF97C, 'M', u'良'), + (0xF97D, 'M', u'諒'), + (0xF97E, 'M', u'量'), + (0xF97F, 'M', u'勵'), + (0xF980, 'M', u'呂'), + (0xF981, 'M', u'女'), + (0xF982, 'M', u'廬'), + (0xF983, 'M', u'旅'), + (0xF984, 'M', u'濾'), + (0xF985, 'M', u'礪'), + (0xF986, 'M', u'閭'), + (0xF987, 'M', u'驪'), + (0xF988, 'M', u'麗'), + (0xF989, 'M', u'黎'), + (0xF98A, 'M', u'力'), + (0xF98B, 'M', u'曆'), + (0xF98C, 'M', u'歷'), + (0xF98D, 'M', u'轢'), + (0xF98E, 'M', u'年'), + (0xF98F, 'M', u'憐'), + (0xF990, 'M', u'戀'), + (0xF991, 'M', u'撚'), + ] + +def _seg_39(): + return [ + (0xF992, 'M', u'漣'), + (0xF993, 'M', u'煉'), + (0xF994, 'M', u'璉'), + (0xF995, 'M', u'秊'), + (0xF996, 'M', u'練'), + (0xF997, 'M', u'聯'), + (0xF998, 'M', u'輦'), + (0xF999, 'M', u'蓮'), + (0xF99A, 'M', u'連'), + (0xF99B, 'M', u'鍊'), + (0xF99C, 'M', u'列'), + (0xF99D, 'M', u'劣'), + (0xF99E, 'M', u'咽'), + (0xF99F, 'M', u'烈'), + (0xF9A0, 'M', u'裂'), + (0xF9A1, 'M', u'說'), + (0xF9A2, 'M', u'廉'), + (0xF9A3, 'M', u'念'), + (0xF9A4, 'M', u'捻'), + (0xF9A5, 'M', u'殮'), + (0xF9A6, 'M', u'簾'), + (0xF9A7, 'M', u'獵'), + (0xF9A8, 'M', u'令'), + (0xF9A9, 'M', u'囹'), + (0xF9AA, 'M', u'寧'), + (0xF9AB, 'M', u'嶺'), + (0xF9AC, 'M', u'怜'), + (0xF9AD, 'M', u'玲'), + (0xF9AE, 'M', u'瑩'), + (0xF9AF, 'M', u'羚'), + (0xF9B0, 'M', u'聆'), + (0xF9B1, 'M', u'鈴'), + (0xF9B2, 'M', u'零'), + (0xF9B3, 'M', u'靈'), + (0xF9B4, 'M', u'領'), + (0xF9B5, 'M', u'例'), + (0xF9B6, 'M', u'禮'), + (0xF9B7, 'M', u'醴'), + (0xF9B8, 'M', u'隸'), + (0xF9B9, 'M', u'惡'), + (0xF9BA, 'M', u'了'), + (0xF9BB, 'M', u'僚'), + (0xF9BC, 'M', u'寮'), + (0xF9BD, 'M', u'尿'), + (0xF9BE, 'M', u'料'), + (0xF9BF, 'M', u'樂'), + (0xF9C0, 'M', u'燎'), + (0xF9C1, 'M', u'療'), + (0xF9C2, 'M', u'蓼'), + (0xF9C3, 'M', u'遼'), + (0xF9C4, 'M', u'龍'), + (0xF9C5, 'M', u'暈'), + (0xF9C6, 'M', u'阮'), + (0xF9C7, 'M', u'劉'), + (0xF9C8, 'M', u'杻'), + (0xF9C9, 'M', u'柳'), + (0xF9CA, 'M', u'流'), + (0xF9CB, 'M', u'溜'), + (0xF9CC, 'M', u'琉'), + (0xF9CD, 'M', u'留'), + (0xF9CE, 'M', u'硫'), + (0xF9CF, 'M', u'紐'), + (0xF9D0, 'M', u'類'), + (0xF9D1, 'M', u'六'), + (0xF9D2, 'M', u'戮'), + (0xF9D3, 'M', u'陸'), + (0xF9D4, 'M', u'倫'), + (0xF9D5, 'M', u'崙'), + (0xF9D6, 'M', u'淪'), + (0xF9D7, 'M', u'輪'), + (0xF9D8, 'M', u'律'), + (0xF9D9, 'M', u'慄'), + (0xF9DA, 'M', u'栗'), + (0xF9DB, 'M', u'率'), + (0xF9DC, 'M', u'隆'), + (0xF9DD, 'M', u'利'), + (0xF9DE, 'M', u'吏'), + (0xF9DF, 'M', u'履'), + (0xF9E0, 'M', u'易'), + (0xF9E1, 'M', u'李'), + (0xF9E2, 'M', u'梨'), + (0xF9E3, 'M', u'泥'), + (0xF9E4, 'M', u'理'), + (0xF9E5, 'M', u'痢'), + (0xF9E6, 'M', u'罹'), + (0xF9E7, 'M', u'裏'), + (0xF9E8, 'M', u'裡'), + (0xF9E9, 'M', u'里'), + (0xF9EA, 'M', u'離'), + (0xF9EB, 'M', u'匿'), + (0xF9EC, 'M', u'溺'), + (0xF9ED, 'M', u'吝'), + (0xF9EE, 'M', u'燐'), + (0xF9EF, 'M', u'璘'), + (0xF9F0, 'M', u'藺'), + (0xF9F1, 'M', u'隣'), + (0xF9F2, 'M', u'鱗'), + (0xF9F3, 'M', u'麟'), + (0xF9F4, 'M', u'林'), + (0xF9F5, 'M', u'淋'), + ] + +def _seg_40(): + return [ + (0xF9F6, 'M', u'臨'), + (0xF9F7, 'M', u'立'), + (0xF9F8, 'M', u'笠'), + (0xF9F9, 'M', u'粒'), + (0xF9FA, 'M', u'狀'), + (0xF9FB, 'M', u'炙'), + (0xF9FC, 'M', u'識'), + (0xF9FD, 'M', u'什'), + (0xF9FE, 'M', u'茶'), + (0xF9FF, 'M', u'刺'), + (0xFA00, 'M', u'切'), + (0xFA01, 'M', u'度'), + (0xFA02, 'M', u'拓'), + (0xFA03, 'M', u'糖'), + (0xFA04, 'M', u'宅'), + (0xFA05, 'M', u'洞'), + (0xFA06, 'M', u'暴'), + (0xFA07, 'M', u'輻'), + (0xFA08, 'M', u'行'), + (0xFA09, 'M', u'降'), + (0xFA0A, 'M', u'見'), + (0xFA0B, 'M', u'廓'), + (0xFA0C, 'M', u'兀'), + (0xFA0D, 'M', u'嗀'), + (0xFA0E, 'V'), + (0xFA10, 'M', u'塚'), + (0xFA11, 'V'), + (0xFA12, 'M', u'晴'), + (0xFA13, 'V'), + (0xFA15, 'M', u'凞'), + (0xFA16, 'M', u'猪'), + (0xFA17, 'M', u'益'), + (0xFA18, 'M', u'礼'), + (0xFA19, 'M', u'神'), + (0xFA1A, 'M', u'祥'), + (0xFA1B, 'M', u'福'), + (0xFA1C, 'M', u'靖'), + (0xFA1D, 'M', u'精'), + (0xFA1E, 'M', u'羽'), + (0xFA1F, 'V'), + (0xFA20, 'M', u'蘒'), + (0xFA21, 'V'), + (0xFA22, 'M', u'諸'), + (0xFA23, 'V'), + (0xFA25, 'M', u'逸'), + (0xFA26, 'M', u'都'), + (0xFA27, 'V'), + (0xFA2A, 'M', u'飯'), + (0xFA2B, 'M', u'飼'), + (0xFA2C, 'M', u'館'), + (0xFA2D, 'M', u'鶴'), + (0xFA2E, 'M', u'郞'), + (0xFA2F, 'M', u'隷'), + (0xFA30, 'M', u'侮'), + (0xFA31, 'M', u'僧'), + (0xFA32, 'M', u'免'), + (0xFA33, 'M', u'勉'), + (0xFA34, 'M', u'勤'), + (0xFA35, 'M', u'卑'), + (0xFA36, 'M', u'喝'), + (0xFA37, 'M', u'嘆'), + (0xFA38, 'M', u'器'), + (0xFA39, 'M', u'塀'), + (0xFA3A, 'M', u'墨'), + (0xFA3B, 'M', u'層'), + (0xFA3C, 'M', u'屮'), + (0xFA3D, 'M', u'悔'), + (0xFA3E, 'M', u'慨'), + (0xFA3F, 'M', u'憎'), + (0xFA40, 'M', u'懲'), + (0xFA41, 'M', u'敏'), + (0xFA42, 'M', u'既'), + (0xFA43, 'M', u'暑'), + (0xFA44, 'M', u'梅'), + (0xFA45, 'M', u'海'), + (0xFA46, 'M', u'渚'), + (0xFA47, 'M', u'漢'), + (0xFA48, 'M', u'煮'), + (0xFA49, 'M', u'爫'), + (0xFA4A, 'M', u'琢'), + (0xFA4B, 'M', u'碑'), + (0xFA4C, 'M', u'社'), + (0xFA4D, 'M', u'祉'), + (0xFA4E, 'M', u'祈'), + (0xFA4F, 'M', u'祐'), + (0xFA50, 'M', u'祖'), + (0xFA51, 'M', u'祝'), + (0xFA52, 'M', u'禍'), + (0xFA53, 'M', u'禎'), + (0xFA54, 'M', u'穀'), + (0xFA55, 'M', u'突'), + (0xFA56, 'M', u'節'), + (0xFA57, 'M', u'練'), + (0xFA58, 'M', u'縉'), + (0xFA59, 'M', u'繁'), + (0xFA5A, 'M', u'署'), + (0xFA5B, 'M', u'者'), + (0xFA5C, 'M', u'臭'), + (0xFA5D, 'M', u'艹'), + (0xFA5F, 'M', u'著'), + ] + +def _seg_41(): + return [ + (0xFA60, 'M', u'褐'), + (0xFA61, 'M', u'視'), + (0xFA62, 'M', u'謁'), + (0xFA63, 'M', u'謹'), + (0xFA64, 'M', u'賓'), + (0xFA65, 'M', u'贈'), + (0xFA66, 'M', u'辶'), + (0xFA67, 'M', u'逸'), + (0xFA68, 'M', u'難'), + (0xFA69, 'M', u'響'), + (0xFA6A, 'M', u'頻'), + (0xFA6B, 'M', u'恵'), + (0xFA6C, 'M', u'𤋮'), + (0xFA6D, 'M', u'舘'), + (0xFA6E, 'X'), + (0xFA70, 'M', u'並'), + (0xFA71, 'M', u'况'), + (0xFA72, 'M', u'全'), + (0xFA73, 'M', u'侀'), + (0xFA74, 'M', u'充'), + (0xFA75, 'M', u'冀'), + (0xFA76, 'M', u'勇'), + (0xFA77, 'M', u'勺'), + (0xFA78, 'M', u'喝'), + (0xFA79, 'M', u'啕'), + (0xFA7A, 'M', u'喙'), + (0xFA7B, 'M', u'嗢'), + (0xFA7C, 'M', u'塚'), + (0xFA7D, 'M', u'墳'), + (0xFA7E, 'M', u'奄'), + (0xFA7F, 'M', u'奔'), + (0xFA80, 'M', u'婢'), + (0xFA81, 'M', u'嬨'), + (0xFA82, 'M', u'廒'), + (0xFA83, 'M', u'廙'), + (0xFA84, 'M', u'彩'), + (0xFA85, 'M', u'徭'), + (0xFA86, 'M', u'惘'), + (0xFA87, 'M', u'慎'), + (0xFA88, 'M', u'愈'), + (0xFA89, 'M', u'憎'), + (0xFA8A, 'M', u'慠'), + (0xFA8B, 'M', u'懲'), + (0xFA8C, 'M', u'戴'), + (0xFA8D, 'M', u'揄'), + (0xFA8E, 'M', u'搜'), + (0xFA8F, 'M', u'摒'), + (0xFA90, 'M', u'敖'), + (0xFA91, 'M', u'晴'), + (0xFA92, 'M', u'朗'), + (0xFA93, 'M', u'望'), + (0xFA94, 'M', u'杖'), + (0xFA95, 'M', u'歹'), + (0xFA96, 'M', u'殺'), + (0xFA97, 'M', u'流'), + (0xFA98, 'M', u'滛'), + (0xFA99, 'M', u'滋'), + (0xFA9A, 'M', u'漢'), + (0xFA9B, 'M', u'瀞'), + (0xFA9C, 'M', u'煮'), + (0xFA9D, 'M', u'瞧'), + (0xFA9E, 'M', u'爵'), + (0xFA9F, 'M', u'犯'), + (0xFAA0, 'M', u'猪'), + (0xFAA1, 'M', u'瑱'), + (0xFAA2, 'M', u'甆'), + (0xFAA3, 'M', u'画'), + (0xFAA4, 'M', u'瘝'), + (0xFAA5, 'M', u'瘟'), + (0xFAA6, 'M', u'益'), + (0xFAA7, 'M', u'盛'), + (0xFAA8, 'M', u'直'), + (0xFAA9, 'M', u'睊'), + (0xFAAA, 'M', u'着'), + (0xFAAB, 'M', u'磌'), + (0xFAAC, 'M', u'窱'), + (0xFAAD, 'M', u'節'), + (0xFAAE, 'M', u'类'), + (0xFAAF, 'M', u'絛'), + (0xFAB0, 'M', u'練'), + (0xFAB1, 'M', u'缾'), + (0xFAB2, 'M', u'者'), + (0xFAB3, 'M', u'荒'), + (0xFAB4, 'M', u'華'), + (0xFAB5, 'M', u'蝹'), + (0xFAB6, 'M', u'襁'), + (0xFAB7, 'M', u'覆'), + (0xFAB8, 'M', u'視'), + (0xFAB9, 'M', u'調'), + (0xFABA, 'M', u'諸'), + (0xFABB, 'M', u'請'), + (0xFABC, 'M', u'謁'), + (0xFABD, 'M', u'諾'), + (0xFABE, 'M', u'諭'), + (0xFABF, 'M', u'謹'), + (0xFAC0, 'M', u'變'), + (0xFAC1, 'M', u'贈'), + (0xFAC2, 'M', u'輸'), + (0xFAC3, 'M', u'遲'), + (0xFAC4, 'M', u'醙'), + ] + +def _seg_42(): + return [ + (0xFAC5, 'M', u'鉶'), + (0xFAC6, 'M', u'陼'), + (0xFAC7, 'M', u'難'), + (0xFAC8, 'M', u'靖'), + (0xFAC9, 'M', u'韛'), + (0xFACA, 'M', u'響'), + (0xFACB, 'M', u'頋'), + (0xFACC, 'M', u'頻'), + (0xFACD, 'M', u'鬒'), + (0xFACE, 'M', u'龜'), + (0xFACF, 'M', u'𢡊'), + (0xFAD0, 'M', u'𢡄'), + (0xFAD1, 'M', u'𣏕'), + (0xFAD2, 'M', u'㮝'), + (0xFAD3, 'M', u'䀘'), + (0xFAD4, 'M', u'䀹'), + (0xFAD5, 'M', u'𥉉'), + (0xFAD6, 'M', u'𥳐'), + (0xFAD7, 'M', u'𧻓'), + (0xFAD8, 'M', u'齃'), + (0xFAD9, 'M', u'龎'), + (0xFADA, 'X'), + (0xFB00, 'M', u'ff'), + (0xFB01, 'M', u'fi'), + (0xFB02, 'M', u'fl'), + (0xFB03, 'M', u'ffi'), + (0xFB04, 'M', u'ffl'), + (0xFB05, 'M', u'st'), + (0xFB07, 'X'), + (0xFB13, 'M', u'մն'), + (0xFB14, 'M', u'մե'), + (0xFB15, 'M', u'մի'), + (0xFB16, 'M', u'վն'), + (0xFB17, 'M', u'մխ'), + (0xFB18, 'X'), + (0xFB1D, 'M', u'יִ'), + (0xFB1E, 'V'), + (0xFB1F, 'M', u'ײַ'), + (0xFB20, 'M', u'ע'), + (0xFB21, 'M', u'א'), + (0xFB22, 'M', u'ד'), + (0xFB23, 'M', u'ה'), + (0xFB24, 'M', u'כ'), + (0xFB25, 'M', u'ל'), + (0xFB26, 'M', u'ם'), + (0xFB27, 'M', u'ר'), + (0xFB28, 'M', u'ת'), + (0xFB29, '3', u'+'), + (0xFB2A, 'M', u'שׁ'), + (0xFB2B, 'M', u'שׂ'), + (0xFB2C, 'M', u'שּׁ'), + (0xFB2D, 'M', u'שּׂ'), + (0xFB2E, 'M', u'אַ'), + (0xFB2F, 'M', u'אָ'), + (0xFB30, 'M', u'אּ'), + (0xFB31, 'M', u'בּ'), + (0xFB32, 'M', u'גּ'), + (0xFB33, 'M', u'דּ'), + (0xFB34, 'M', u'הּ'), + (0xFB35, 'M', u'וּ'), + (0xFB36, 'M', u'זּ'), + (0xFB37, 'X'), + (0xFB38, 'M', u'טּ'), + (0xFB39, 'M', u'יּ'), + (0xFB3A, 'M', u'ךּ'), + (0xFB3B, 'M', u'כּ'), + (0xFB3C, 'M', u'לּ'), + (0xFB3D, 'X'), + (0xFB3E, 'M', u'מּ'), + (0xFB3F, 'X'), + (0xFB40, 'M', u'נּ'), + (0xFB41, 'M', u'סּ'), + (0xFB42, 'X'), + (0xFB43, 'M', u'ףּ'), + (0xFB44, 'M', u'פּ'), + (0xFB45, 'X'), + (0xFB46, 'M', u'צּ'), + (0xFB47, 'M', u'קּ'), + (0xFB48, 'M', u'רּ'), + (0xFB49, 'M', u'שּ'), + (0xFB4A, 'M', u'תּ'), + (0xFB4B, 'M', u'וֹ'), + (0xFB4C, 'M', u'בֿ'), + (0xFB4D, 'M', u'כֿ'), + (0xFB4E, 'M', u'פֿ'), + (0xFB4F, 'M', u'אל'), + (0xFB50, 'M', u'ٱ'), + (0xFB52, 'M', u'ٻ'), + (0xFB56, 'M', u'پ'), + (0xFB5A, 'M', u'ڀ'), + (0xFB5E, 'M', u'ٺ'), + (0xFB62, 'M', u'ٿ'), + (0xFB66, 'M', u'ٹ'), + (0xFB6A, 'M', u'ڤ'), + (0xFB6E, 'M', u'ڦ'), + (0xFB72, 'M', u'ڄ'), + (0xFB76, 'M', u'ڃ'), + (0xFB7A, 'M', u'چ'), + (0xFB7E, 'M', u'ڇ'), + (0xFB82, 'M', u'ڍ'), + ] + +def _seg_43(): + return [ + (0xFB84, 'M', u'ڌ'), + (0xFB86, 'M', u'ڎ'), + (0xFB88, 'M', u'ڈ'), + (0xFB8A, 'M', u'ژ'), + (0xFB8C, 'M', u'ڑ'), + (0xFB8E, 'M', u'ک'), + (0xFB92, 'M', u'گ'), + (0xFB96, 'M', u'ڳ'), + (0xFB9A, 'M', u'ڱ'), + (0xFB9E, 'M', u'ں'), + (0xFBA0, 'M', u'ڻ'), + (0xFBA4, 'M', u'ۀ'), + (0xFBA6, 'M', u'ہ'), + (0xFBAA, 'M', u'ھ'), + (0xFBAE, 'M', u'ے'), + (0xFBB0, 'M', u'ۓ'), + (0xFBB2, 'V'), + (0xFBC2, 'X'), + (0xFBD3, 'M', u'ڭ'), + (0xFBD7, 'M', u'ۇ'), + (0xFBD9, 'M', u'ۆ'), + (0xFBDB, 'M', u'ۈ'), + (0xFBDD, 'M', u'ۇٴ'), + (0xFBDE, 'M', u'ۋ'), + (0xFBE0, 'M', u'ۅ'), + (0xFBE2, 'M', u'ۉ'), + (0xFBE4, 'M', u'ې'), + (0xFBE8, 'M', u'ى'), + (0xFBEA, 'M', u'ئا'), + (0xFBEC, 'M', u'ئە'), + (0xFBEE, 'M', u'ئو'), + (0xFBF0, 'M', u'ئۇ'), + (0xFBF2, 'M', u'ئۆ'), + (0xFBF4, 'M', u'ئۈ'), + (0xFBF6, 'M', u'ئې'), + (0xFBF9, 'M', u'ئى'), + (0xFBFC, 'M', u'ی'), + (0xFC00, 'M', u'ئج'), + (0xFC01, 'M', u'ئح'), + (0xFC02, 'M', u'ئم'), + (0xFC03, 'M', u'ئى'), + (0xFC04, 'M', u'ئي'), + (0xFC05, 'M', u'بج'), + (0xFC06, 'M', u'بح'), + (0xFC07, 'M', u'بخ'), + (0xFC08, 'M', u'بم'), + (0xFC09, 'M', u'بى'), + (0xFC0A, 'M', u'بي'), + (0xFC0B, 'M', u'تج'), + (0xFC0C, 'M', u'تح'), + (0xFC0D, 'M', u'تخ'), + (0xFC0E, 'M', u'تم'), + (0xFC0F, 'M', u'تى'), + (0xFC10, 'M', u'تي'), + (0xFC11, 'M', u'ثج'), + (0xFC12, 'M', u'ثم'), + (0xFC13, 'M', u'ثى'), + (0xFC14, 'M', u'ثي'), + (0xFC15, 'M', u'جح'), + (0xFC16, 'M', u'جم'), + (0xFC17, 'M', u'حج'), + (0xFC18, 'M', u'حم'), + (0xFC19, 'M', u'خج'), + (0xFC1A, 'M', u'خح'), + (0xFC1B, 'M', u'خم'), + (0xFC1C, 'M', u'سج'), + (0xFC1D, 'M', u'سح'), + (0xFC1E, 'M', u'سخ'), + (0xFC1F, 'M', u'سم'), + (0xFC20, 'M', u'صح'), + (0xFC21, 'M', u'صم'), + (0xFC22, 'M', u'ضج'), + (0xFC23, 'M', u'ضح'), + (0xFC24, 'M', u'ضخ'), + (0xFC25, 'M', u'ضم'), + (0xFC26, 'M', u'طح'), + (0xFC27, 'M', u'طم'), + (0xFC28, 'M', u'ظم'), + (0xFC29, 'M', u'عج'), + (0xFC2A, 'M', u'عم'), + (0xFC2B, 'M', u'غج'), + (0xFC2C, 'M', u'غم'), + (0xFC2D, 'M', u'فج'), + (0xFC2E, 'M', u'فح'), + (0xFC2F, 'M', u'فخ'), + (0xFC30, 'M', u'فم'), + (0xFC31, 'M', u'فى'), + (0xFC32, 'M', u'في'), + (0xFC33, 'M', u'قح'), + (0xFC34, 'M', u'قم'), + (0xFC35, 'M', u'قى'), + (0xFC36, 'M', u'قي'), + (0xFC37, 'M', u'كا'), + (0xFC38, 'M', u'كج'), + (0xFC39, 'M', u'كح'), + (0xFC3A, 'M', u'كخ'), + (0xFC3B, 'M', u'كل'), + (0xFC3C, 'M', u'كم'), + (0xFC3D, 'M', u'كى'), + (0xFC3E, 'M', u'كي'), + ] + +def _seg_44(): + return [ + (0xFC3F, 'M', u'لج'), + (0xFC40, 'M', u'لح'), + (0xFC41, 'M', u'لخ'), + (0xFC42, 'M', u'لم'), + (0xFC43, 'M', u'لى'), + (0xFC44, 'M', u'لي'), + (0xFC45, 'M', u'مج'), + (0xFC46, 'M', u'مح'), + (0xFC47, 'M', u'مخ'), + (0xFC48, 'M', u'مم'), + (0xFC49, 'M', u'مى'), + (0xFC4A, 'M', u'مي'), + (0xFC4B, 'M', u'نج'), + (0xFC4C, 'M', u'نح'), + (0xFC4D, 'M', u'نخ'), + (0xFC4E, 'M', u'نم'), + (0xFC4F, 'M', u'نى'), + (0xFC50, 'M', u'ني'), + (0xFC51, 'M', u'هج'), + (0xFC52, 'M', u'هم'), + (0xFC53, 'M', u'هى'), + (0xFC54, 'M', u'هي'), + (0xFC55, 'M', u'يج'), + (0xFC56, 'M', u'يح'), + (0xFC57, 'M', u'يخ'), + (0xFC58, 'M', u'يم'), + (0xFC59, 'M', u'يى'), + (0xFC5A, 'M', u'يي'), + (0xFC5B, 'M', u'ذٰ'), + (0xFC5C, 'M', u'رٰ'), + (0xFC5D, 'M', u'ىٰ'), + (0xFC5E, '3', u' ٌّ'), + (0xFC5F, '3', u' ٍّ'), + (0xFC60, '3', u' َّ'), + (0xFC61, '3', u' ُّ'), + (0xFC62, '3', u' ِّ'), + (0xFC63, '3', u' ّٰ'), + (0xFC64, 'M', u'ئر'), + (0xFC65, 'M', u'ئز'), + (0xFC66, 'M', u'ئم'), + (0xFC67, 'M', u'ئن'), + (0xFC68, 'M', u'ئى'), + (0xFC69, 'M', u'ئي'), + (0xFC6A, 'M', u'بر'), + (0xFC6B, 'M', u'بز'), + (0xFC6C, 'M', u'بم'), + (0xFC6D, 'M', u'بن'), + (0xFC6E, 'M', u'بى'), + (0xFC6F, 'M', u'بي'), + (0xFC70, 'M', u'تر'), + (0xFC71, 'M', u'تز'), + (0xFC72, 'M', u'تم'), + (0xFC73, 'M', u'تن'), + (0xFC74, 'M', u'تى'), + (0xFC75, 'M', u'تي'), + (0xFC76, 'M', u'ثر'), + (0xFC77, 'M', u'ثز'), + (0xFC78, 'M', u'ثم'), + (0xFC79, 'M', u'ثن'), + (0xFC7A, 'M', u'ثى'), + (0xFC7B, 'M', u'ثي'), + (0xFC7C, 'M', u'فى'), + (0xFC7D, 'M', u'في'), + (0xFC7E, 'M', u'قى'), + (0xFC7F, 'M', u'قي'), + (0xFC80, 'M', u'كا'), + (0xFC81, 'M', u'كل'), + (0xFC82, 'M', u'كم'), + (0xFC83, 'M', u'كى'), + (0xFC84, 'M', u'كي'), + (0xFC85, 'M', u'لم'), + (0xFC86, 'M', u'لى'), + (0xFC87, 'M', u'لي'), + (0xFC88, 'M', u'ما'), + (0xFC89, 'M', u'مم'), + (0xFC8A, 'M', u'نر'), + (0xFC8B, 'M', u'نز'), + (0xFC8C, 'M', u'نم'), + (0xFC8D, 'M', u'نن'), + (0xFC8E, 'M', u'نى'), + (0xFC8F, 'M', u'ني'), + (0xFC90, 'M', u'ىٰ'), + (0xFC91, 'M', u'ير'), + (0xFC92, 'M', u'يز'), + (0xFC93, 'M', u'يم'), + (0xFC94, 'M', u'ين'), + (0xFC95, 'M', u'يى'), + (0xFC96, 'M', u'يي'), + (0xFC97, 'M', u'ئج'), + (0xFC98, 'M', u'ئح'), + (0xFC99, 'M', u'ئخ'), + (0xFC9A, 'M', u'ئم'), + (0xFC9B, 'M', u'ئه'), + (0xFC9C, 'M', u'بج'), + (0xFC9D, 'M', u'بح'), + (0xFC9E, 'M', u'بخ'), + (0xFC9F, 'M', u'بم'), + (0xFCA0, 'M', u'به'), + (0xFCA1, 'M', u'تج'), + (0xFCA2, 'M', u'تح'), + ] + +def _seg_45(): + return [ + (0xFCA3, 'M', u'تخ'), + (0xFCA4, 'M', u'تم'), + (0xFCA5, 'M', u'ته'), + (0xFCA6, 'M', u'ثم'), + (0xFCA7, 'M', u'جح'), + (0xFCA8, 'M', u'جم'), + (0xFCA9, 'M', u'حج'), + (0xFCAA, 'M', u'حم'), + (0xFCAB, 'M', u'خج'), + (0xFCAC, 'M', u'خم'), + (0xFCAD, 'M', u'سج'), + (0xFCAE, 'M', u'سح'), + (0xFCAF, 'M', u'سخ'), + (0xFCB0, 'M', u'سم'), + (0xFCB1, 'M', u'صح'), + (0xFCB2, 'M', u'صخ'), + (0xFCB3, 'M', u'صم'), + (0xFCB4, 'M', u'ضج'), + (0xFCB5, 'M', u'ضح'), + (0xFCB6, 'M', u'ضخ'), + (0xFCB7, 'M', u'ضم'), + (0xFCB8, 'M', u'طح'), + (0xFCB9, 'M', u'ظم'), + (0xFCBA, 'M', u'عج'), + (0xFCBB, 'M', u'عم'), + (0xFCBC, 'M', u'غج'), + (0xFCBD, 'M', u'غم'), + (0xFCBE, 'M', u'فج'), + (0xFCBF, 'M', u'فح'), + (0xFCC0, 'M', u'فخ'), + (0xFCC1, 'M', u'فم'), + (0xFCC2, 'M', u'قح'), + (0xFCC3, 'M', u'قم'), + (0xFCC4, 'M', u'كج'), + (0xFCC5, 'M', u'كح'), + (0xFCC6, 'M', u'كخ'), + (0xFCC7, 'M', u'كل'), + (0xFCC8, 'M', u'كم'), + (0xFCC9, 'M', u'لج'), + (0xFCCA, 'M', u'لح'), + (0xFCCB, 'M', u'لخ'), + (0xFCCC, 'M', u'لم'), + (0xFCCD, 'M', u'له'), + (0xFCCE, 'M', u'مج'), + (0xFCCF, 'M', u'مح'), + (0xFCD0, 'M', u'مخ'), + (0xFCD1, 'M', u'مم'), + (0xFCD2, 'M', u'نج'), + (0xFCD3, 'M', u'نح'), + (0xFCD4, 'M', u'نخ'), + (0xFCD5, 'M', u'نم'), + (0xFCD6, 'M', u'نه'), + (0xFCD7, 'M', u'هج'), + (0xFCD8, 'M', u'هم'), + (0xFCD9, 'M', u'هٰ'), + (0xFCDA, 'M', u'يج'), + (0xFCDB, 'M', u'يح'), + (0xFCDC, 'M', u'يخ'), + (0xFCDD, 'M', u'يم'), + (0xFCDE, 'M', u'يه'), + (0xFCDF, 'M', u'ئم'), + (0xFCE0, 'M', u'ئه'), + (0xFCE1, 'M', u'بم'), + (0xFCE2, 'M', u'به'), + (0xFCE3, 'M', u'تم'), + (0xFCE4, 'M', u'ته'), + (0xFCE5, 'M', u'ثم'), + (0xFCE6, 'M', u'ثه'), + (0xFCE7, 'M', u'سم'), + (0xFCE8, 'M', u'سه'), + (0xFCE9, 'M', u'شم'), + (0xFCEA, 'M', u'شه'), + (0xFCEB, 'M', u'كل'), + (0xFCEC, 'M', u'كم'), + (0xFCED, 'M', u'لم'), + (0xFCEE, 'M', u'نم'), + (0xFCEF, 'M', u'نه'), + (0xFCF0, 'M', u'يم'), + (0xFCF1, 'M', u'يه'), + (0xFCF2, 'M', u'ـَّ'), + (0xFCF3, 'M', u'ـُّ'), + (0xFCF4, 'M', u'ـِّ'), + (0xFCF5, 'M', u'طى'), + (0xFCF6, 'M', u'طي'), + (0xFCF7, 'M', u'عى'), + (0xFCF8, 'M', u'عي'), + (0xFCF9, 'M', u'غى'), + (0xFCFA, 'M', u'غي'), + (0xFCFB, 'M', u'سى'), + (0xFCFC, 'M', u'سي'), + (0xFCFD, 'M', u'شى'), + (0xFCFE, 'M', u'شي'), + (0xFCFF, 'M', u'حى'), + (0xFD00, 'M', u'حي'), + (0xFD01, 'M', u'جى'), + (0xFD02, 'M', u'جي'), + (0xFD03, 'M', u'خى'), + (0xFD04, 'M', u'خي'), + (0xFD05, 'M', u'صى'), + (0xFD06, 'M', u'صي'), + ] + +def _seg_46(): + return [ + (0xFD07, 'M', u'ضى'), + (0xFD08, 'M', u'ضي'), + (0xFD09, 'M', u'شج'), + (0xFD0A, 'M', u'شح'), + (0xFD0B, 'M', u'شخ'), + (0xFD0C, 'M', u'شم'), + (0xFD0D, 'M', u'شر'), + (0xFD0E, 'M', u'سر'), + (0xFD0F, 'M', u'صر'), + (0xFD10, 'M', u'ضر'), + (0xFD11, 'M', u'طى'), + (0xFD12, 'M', u'طي'), + (0xFD13, 'M', u'عى'), + (0xFD14, 'M', u'عي'), + (0xFD15, 'M', u'غى'), + (0xFD16, 'M', u'غي'), + (0xFD17, 'M', u'سى'), + (0xFD18, 'M', u'سي'), + (0xFD19, 'M', u'شى'), + (0xFD1A, 'M', u'شي'), + (0xFD1B, 'M', u'حى'), + (0xFD1C, 'M', u'حي'), + (0xFD1D, 'M', u'جى'), + (0xFD1E, 'M', u'جي'), + (0xFD1F, 'M', u'خى'), + (0xFD20, 'M', u'خي'), + (0xFD21, 'M', u'صى'), + (0xFD22, 'M', u'صي'), + (0xFD23, 'M', u'ضى'), + (0xFD24, 'M', u'ضي'), + (0xFD25, 'M', u'شج'), + (0xFD26, 'M', u'شح'), + (0xFD27, 'M', u'شخ'), + (0xFD28, 'M', u'شم'), + (0xFD29, 'M', u'شر'), + (0xFD2A, 'M', u'سر'), + (0xFD2B, 'M', u'صر'), + (0xFD2C, 'M', u'ضر'), + (0xFD2D, 'M', u'شج'), + (0xFD2E, 'M', u'شح'), + (0xFD2F, 'M', u'شخ'), + (0xFD30, 'M', u'شم'), + (0xFD31, 'M', u'سه'), + (0xFD32, 'M', u'شه'), + (0xFD33, 'M', u'طم'), + (0xFD34, 'M', u'سج'), + (0xFD35, 'M', u'سح'), + (0xFD36, 'M', u'سخ'), + (0xFD37, 'M', u'شج'), + (0xFD38, 'M', u'شح'), + (0xFD39, 'M', u'شخ'), + (0xFD3A, 'M', u'طم'), + (0xFD3B, 'M', u'ظم'), + (0xFD3C, 'M', u'اً'), + (0xFD3E, 'V'), + (0xFD40, 'X'), + (0xFD50, 'M', u'تجم'), + (0xFD51, 'M', u'تحج'), + (0xFD53, 'M', u'تحم'), + (0xFD54, 'M', u'تخم'), + (0xFD55, 'M', u'تمج'), + (0xFD56, 'M', u'تمح'), + (0xFD57, 'M', u'تمخ'), + (0xFD58, 'M', u'جمح'), + (0xFD5A, 'M', u'حمي'), + (0xFD5B, 'M', u'حمى'), + (0xFD5C, 'M', u'سحج'), + (0xFD5D, 'M', u'سجح'), + (0xFD5E, 'M', u'سجى'), + (0xFD5F, 'M', u'سمح'), + (0xFD61, 'M', u'سمج'), + (0xFD62, 'M', u'سمم'), + (0xFD64, 'M', u'صحح'), + (0xFD66, 'M', u'صمم'), + (0xFD67, 'M', u'شحم'), + (0xFD69, 'M', u'شجي'), + (0xFD6A, 'M', u'شمخ'), + (0xFD6C, 'M', u'شمم'), + (0xFD6E, 'M', u'ضحى'), + (0xFD6F, 'M', u'ضخم'), + (0xFD71, 'M', u'طمح'), + (0xFD73, 'M', u'طمم'), + (0xFD74, 'M', u'طمي'), + (0xFD75, 'M', u'عجم'), + (0xFD76, 'M', u'عمم'), + (0xFD78, 'M', u'عمى'), + (0xFD79, 'M', u'غمم'), + (0xFD7A, 'M', u'غمي'), + (0xFD7B, 'M', u'غمى'), + (0xFD7C, 'M', u'فخم'), + (0xFD7E, 'M', u'قمح'), + (0xFD7F, 'M', u'قمم'), + (0xFD80, 'M', u'لحم'), + (0xFD81, 'M', u'لحي'), + (0xFD82, 'M', u'لحى'), + (0xFD83, 'M', u'لجج'), + (0xFD85, 'M', u'لخم'), + (0xFD87, 'M', u'لمح'), + (0xFD89, 'M', u'محج'), + (0xFD8A, 'M', u'محم'), + ] + +def _seg_47(): + return [ + (0xFD8B, 'M', u'محي'), + (0xFD8C, 'M', u'مجح'), + (0xFD8D, 'M', u'مجم'), + (0xFD8E, 'M', u'مخج'), + (0xFD8F, 'M', u'مخم'), + (0xFD90, 'X'), + (0xFD92, 'M', u'مجخ'), + (0xFD93, 'M', u'همج'), + (0xFD94, 'M', u'همم'), + (0xFD95, 'M', u'نحم'), + (0xFD96, 'M', u'نحى'), + (0xFD97, 'M', u'نجم'), + (0xFD99, 'M', u'نجى'), + (0xFD9A, 'M', u'نمي'), + (0xFD9B, 'M', u'نمى'), + (0xFD9C, 'M', u'يمم'), + (0xFD9E, 'M', u'بخي'), + (0xFD9F, 'M', u'تجي'), + (0xFDA0, 'M', u'تجى'), + (0xFDA1, 'M', u'تخي'), + (0xFDA2, 'M', u'تخى'), + (0xFDA3, 'M', u'تمي'), + (0xFDA4, 'M', u'تمى'), + (0xFDA5, 'M', u'جمي'), + (0xFDA6, 'M', u'جحى'), + (0xFDA7, 'M', u'جمى'), + (0xFDA8, 'M', u'سخى'), + (0xFDA9, 'M', u'صحي'), + (0xFDAA, 'M', u'شحي'), + (0xFDAB, 'M', u'ضحي'), + (0xFDAC, 'M', u'لجي'), + (0xFDAD, 'M', u'لمي'), + (0xFDAE, 'M', u'يحي'), + (0xFDAF, 'M', u'يجي'), + (0xFDB0, 'M', u'يمي'), + (0xFDB1, 'M', u'ممي'), + (0xFDB2, 'M', u'قمي'), + (0xFDB3, 'M', u'نحي'), + (0xFDB4, 'M', u'قمح'), + (0xFDB5, 'M', u'لحم'), + (0xFDB6, 'M', u'عمي'), + (0xFDB7, 'M', u'كمي'), + (0xFDB8, 'M', u'نجح'), + (0xFDB9, 'M', u'مخي'), + (0xFDBA, 'M', u'لجم'), + (0xFDBB, 'M', u'كمم'), + (0xFDBC, 'M', u'لجم'), + (0xFDBD, 'M', u'نجح'), + (0xFDBE, 'M', u'جحي'), + (0xFDBF, 'M', u'حجي'), + (0xFDC0, 'M', u'مجي'), + (0xFDC1, 'M', u'فمي'), + (0xFDC2, 'M', u'بحي'), + (0xFDC3, 'M', u'كمم'), + (0xFDC4, 'M', u'عجم'), + (0xFDC5, 'M', u'صمم'), + (0xFDC6, 'M', u'سخي'), + (0xFDC7, 'M', u'نجي'), + (0xFDC8, 'X'), + (0xFDF0, 'M', u'صلے'), + (0xFDF1, 'M', u'قلے'), + (0xFDF2, 'M', u'الله'), + (0xFDF3, 'M', u'اكبر'), + (0xFDF4, 'M', u'محمد'), + (0xFDF5, 'M', u'صلعم'), + (0xFDF6, 'M', u'رسول'), + (0xFDF7, 'M', u'عليه'), + (0xFDF8, 'M', u'وسلم'), + (0xFDF9, 'M', u'صلى'), + (0xFDFA, '3', u'صلى الله عليه وسلم'), + (0xFDFB, '3', u'جل جلاله'), + (0xFDFC, 'M', u'ریال'), + (0xFDFD, 'V'), + (0xFDFE, 'X'), + (0xFE00, 'I'), + (0xFE10, '3', u','), + (0xFE11, 'M', u'、'), + (0xFE12, 'X'), + (0xFE13, '3', u':'), + (0xFE14, '3', u';'), + (0xFE15, '3', u'!'), + (0xFE16, '3', u'?'), + (0xFE17, 'M', u'〖'), + (0xFE18, 'M', u'〗'), + (0xFE19, 'X'), + (0xFE20, 'V'), + (0xFE27, 'X'), + (0xFE31, 'M', u'—'), + (0xFE32, 'M', u'–'), + (0xFE33, '3', u'_'), + (0xFE35, '3', u'('), + (0xFE36, '3', u')'), + (0xFE37, '3', u'{'), + (0xFE38, '3', u'}'), + (0xFE39, 'M', u'〔'), + (0xFE3A, 'M', u'〕'), + (0xFE3B, 'M', u'【'), + (0xFE3C, 'M', u'】'), + (0xFE3D, 'M', u'《'), + (0xFE3E, 'M', u'》'), + ] + +def _seg_48(): + return [ + (0xFE3F, 'M', u'〈'), + (0xFE40, 'M', u'〉'), + (0xFE41, 'M', u'「'), + (0xFE42, 'M', u'」'), + (0xFE43, 'M', u'『'), + (0xFE44, 'M', u'』'), + (0xFE45, 'V'), + (0xFE47, '3', u'['), + (0xFE48, '3', u']'), + (0xFE49, '3', u' ̅'), + (0xFE4D, '3', u'_'), + (0xFE50, '3', u','), + (0xFE51, 'M', u'、'), + (0xFE52, 'X'), + (0xFE54, '3', u';'), + (0xFE55, '3', u':'), + (0xFE56, '3', u'?'), + (0xFE57, '3', u'!'), + (0xFE58, 'M', u'—'), + (0xFE59, '3', u'('), + (0xFE5A, '3', u')'), + (0xFE5B, '3', u'{'), + (0xFE5C, '3', u'}'), + (0xFE5D, 'M', u'〔'), + (0xFE5E, 'M', u'〕'), + (0xFE5F, '3', u'#'), + (0xFE60, '3', u'&'), + (0xFE61, '3', u'*'), + (0xFE62, '3', u'+'), + (0xFE63, 'M', u'-'), + (0xFE64, '3', u'<'), + (0xFE65, '3', u'>'), + (0xFE66, '3', u'='), + (0xFE67, 'X'), + (0xFE68, '3', u'\\'), + (0xFE69, '3', u'$'), + (0xFE6A, '3', u'%'), + (0xFE6B, '3', u'@'), + (0xFE6C, 'X'), + (0xFE70, '3', u' ً'), + (0xFE71, 'M', u'ـً'), + (0xFE72, '3', u' ٌ'), + (0xFE73, 'V'), + (0xFE74, '3', u' ٍ'), + (0xFE75, 'X'), + (0xFE76, '3', u' َ'), + (0xFE77, 'M', u'ـَ'), + (0xFE78, '3', u' ُ'), + (0xFE79, 'M', u'ـُ'), + (0xFE7A, '3', u' ِ'), + (0xFE7B, 'M', u'ـِ'), + (0xFE7C, '3', u' ّ'), + (0xFE7D, 'M', u'ـّ'), + (0xFE7E, '3', u' ْ'), + (0xFE7F, 'M', u'ـْ'), + (0xFE80, 'M', u'ء'), + (0xFE81, 'M', u'آ'), + (0xFE83, 'M', u'أ'), + (0xFE85, 'M', u'ؤ'), + (0xFE87, 'M', u'إ'), + (0xFE89, 'M', u'ئ'), + (0xFE8D, 'M', u'ا'), + (0xFE8F, 'M', u'ب'), + (0xFE93, 'M', u'ة'), + (0xFE95, 'M', u'ت'), + (0xFE99, 'M', u'ث'), + (0xFE9D, 'M', u'ج'), + (0xFEA1, 'M', u'ح'), + (0xFEA5, 'M', u'خ'), + (0xFEA9, 'M', u'د'), + (0xFEAB, 'M', u'ذ'), + (0xFEAD, 'M', u'ر'), + (0xFEAF, 'M', u'ز'), + (0xFEB1, 'M', u'س'), + (0xFEB5, 'M', u'ش'), + (0xFEB9, 'M', u'ص'), + (0xFEBD, 'M', u'ض'), + (0xFEC1, 'M', u'ط'), + (0xFEC5, 'M', u'ظ'), + (0xFEC9, 'M', u'ع'), + (0xFECD, 'M', u'غ'), + (0xFED1, 'M', u'ف'), + (0xFED5, 'M', u'ق'), + (0xFED9, 'M', u'ك'), + (0xFEDD, 'M', u'ل'), + (0xFEE1, 'M', u'م'), + (0xFEE5, 'M', u'ن'), + (0xFEE9, 'M', u'ه'), + (0xFEED, 'M', u'و'), + (0xFEEF, 'M', u'ى'), + (0xFEF1, 'M', u'ي'), + (0xFEF5, 'M', u'لآ'), + (0xFEF7, 'M', u'لأ'), + (0xFEF9, 'M', u'لإ'), + (0xFEFB, 'M', u'لا'), + (0xFEFD, 'X'), + (0xFEFF, 'I'), + (0xFF00, 'X'), + (0xFF01, '3', u'!'), + (0xFF02, '3', u'"'), + ] + +def _seg_49(): + return [ + (0xFF03, '3', u'#'), + (0xFF04, '3', u'$'), + (0xFF05, '3', u'%'), + (0xFF06, '3', u'&'), + (0xFF07, '3', u'\''), + (0xFF08, '3', u'('), + (0xFF09, '3', u')'), + (0xFF0A, '3', u'*'), + (0xFF0B, '3', u'+'), + (0xFF0C, '3', u','), + (0xFF0D, 'M', u'-'), + (0xFF0E, 'M', u'.'), + (0xFF0F, '3', u'/'), + (0xFF10, 'M', u'0'), + (0xFF11, 'M', u'1'), + (0xFF12, 'M', u'2'), + (0xFF13, 'M', u'3'), + (0xFF14, 'M', u'4'), + (0xFF15, 'M', u'5'), + (0xFF16, 'M', u'6'), + (0xFF17, 'M', u'7'), + (0xFF18, 'M', u'8'), + (0xFF19, 'M', u'9'), + (0xFF1A, '3', u':'), + (0xFF1B, '3', u';'), + (0xFF1C, '3', u'<'), + (0xFF1D, '3', u'='), + (0xFF1E, '3', u'>'), + (0xFF1F, '3', u'?'), + (0xFF20, '3', u'@'), + (0xFF21, 'M', u'a'), + (0xFF22, 'M', u'b'), + (0xFF23, 'M', u'c'), + (0xFF24, 'M', u'd'), + (0xFF25, 'M', u'e'), + (0xFF26, 'M', u'f'), + (0xFF27, 'M', u'g'), + (0xFF28, 'M', u'h'), + (0xFF29, 'M', u'i'), + (0xFF2A, 'M', u'j'), + (0xFF2B, 'M', u'k'), + (0xFF2C, 'M', u'l'), + (0xFF2D, 'M', u'm'), + (0xFF2E, 'M', u'n'), + (0xFF2F, 'M', u'o'), + (0xFF30, 'M', u'p'), + (0xFF31, 'M', u'q'), + (0xFF32, 'M', u'r'), + (0xFF33, 'M', u's'), + (0xFF34, 'M', u't'), + (0xFF35, 'M', u'u'), + (0xFF36, 'M', u'v'), + (0xFF37, 'M', u'w'), + (0xFF38, 'M', u'x'), + (0xFF39, 'M', u'y'), + (0xFF3A, 'M', u'z'), + (0xFF3B, '3', u'['), + (0xFF3C, '3', u'\\'), + (0xFF3D, '3', u']'), + (0xFF3E, '3', u'^'), + (0xFF3F, '3', u'_'), + (0xFF40, '3', u'`'), + (0xFF41, 'M', u'a'), + (0xFF42, 'M', u'b'), + (0xFF43, 'M', u'c'), + (0xFF44, 'M', u'd'), + (0xFF45, 'M', u'e'), + (0xFF46, 'M', u'f'), + (0xFF47, 'M', u'g'), + (0xFF48, 'M', u'h'), + (0xFF49, 'M', u'i'), + (0xFF4A, 'M', u'j'), + (0xFF4B, 'M', u'k'), + (0xFF4C, 'M', u'l'), + (0xFF4D, 'M', u'm'), + (0xFF4E, 'M', u'n'), + (0xFF4F, 'M', u'o'), + (0xFF50, 'M', u'p'), + (0xFF51, 'M', u'q'), + (0xFF52, 'M', u'r'), + (0xFF53, 'M', u's'), + (0xFF54, 'M', u't'), + (0xFF55, 'M', u'u'), + (0xFF56, 'M', u'v'), + (0xFF57, 'M', u'w'), + (0xFF58, 'M', u'x'), + (0xFF59, 'M', u'y'), + (0xFF5A, 'M', u'z'), + (0xFF5B, '3', u'{'), + (0xFF5C, '3', u'|'), + (0xFF5D, '3', u'}'), + (0xFF5E, '3', u'~'), + (0xFF5F, 'M', u'⦅'), + (0xFF60, 'M', u'⦆'), + (0xFF61, 'M', u'.'), + (0xFF62, 'M', u'「'), + (0xFF63, 'M', u'」'), + (0xFF64, 'M', u'、'), + (0xFF65, 'M', u'・'), + (0xFF66, 'M', u'ヲ'), + ] + +def _seg_50(): + return [ + (0xFF67, 'M', u'ァ'), + (0xFF68, 'M', u'ィ'), + (0xFF69, 'M', u'ゥ'), + (0xFF6A, 'M', u'ェ'), + (0xFF6B, 'M', u'ォ'), + (0xFF6C, 'M', u'ャ'), + (0xFF6D, 'M', u'ュ'), + (0xFF6E, 'M', u'ョ'), + (0xFF6F, 'M', u'ッ'), + (0xFF70, 'M', u'ー'), + (0xFF71, 'M', u'ア'), + (0xFF72, 'M', u'イ'), + (0xFF73, 'M', u'ウ'), + (0xFF74, 'M', u'エ'), + (0xFF75, 'M', u'オ'), + (0xFF76, 'M', u'カ'), + (0xFF77, 'M', u'キ'), + (0xFF78, 'M', u'ク'), + (0xFF79, 'M', u'ケ'), + (0xFF7A, 'M', u'コ'), + (0xFF7B, 'M', u'サ'), + (0xFF7C, 'M', u'シ'), + (0xFF7D, 'M', u'ス'), + (0xFF7E, 'M', u'セ'), + (0xFF7F, 'M', u'ソ'), + (0xFF80, 'M', u'タ'), + (0xFF81, 'M', u'チ'), + (0xFF82, 'M', u'ツ'), + (0xFF83, 'M', u'テ'), + (0xFF84, 'M', u'ト'), + (0xFF85, 'M', u'ナ'), + (0xFF86, 'M', u'ニ'), + (0xFF87, 'M', u'ヌ'), + (0xFF88, 'M', u'ネ'), + (0xFF89, 'M', u'ノ'), + (0xFF8A, 'M', u'ハ'), + (0xFF8B, 'M', u'ヒ'), + (0xFF8C, 'M', u'フ'), + (0xFF8D, 'M', u'ヘ'), + (0xFF8E, 'M', u'ホ'), + (0xFF8F, 'M', u'マ'), + (0xFF90, 'M', u'ミ'), + (0xFF91, 'M', u'ム'), + (0xFF92, 'M', u'メ'), + (0xFF93, 'M', u'モ'), + (0xFF94, 'M', u'ヤ'), + (0xFF95, 'M', u'ユ'), + (0xFF96, 'M', u'ヨ'), + (0xFF97, 'M', u'ラ'), + (0xFF98, 'M', u'リ'), + (0xFF99, 'M', u'ル'), + (0xFF9A, 'M', u'レ'), + (0xFF9B, 'M', u'ロ'), + (0xFF9C, 'M', u'ワ'), + (0xFF9D, 'M', u'ン'), + (0xFF9E, 'M', u'゙'), + (0xFF9F, 'M', u'゚'), + (0xFFA0, 'X'), + (0xFFA1, 'M', u'ᄀ'), + (0xFFA2, 'M', u'ᄁ'), + (0xFFA3, 'M', u'ᆪ'), + (0xFFA4, 'M', u'ᄂ'), + (0xFFA5, 'M', u'ᆬ'), + (0xFFA6, 'M', u'ᆭ'), + (0xFFA7, 'M', u'ᄃ'), + (0xFFA8, 'M', u'ᄄ'), + (0xFFA9, 'M', u'ᄅ'), + (0xFFAA, 'M', u'ᆰ'), + (0xFFAB, 'M', u'ᆱ'), + (0xFFAC, 'M', u'ᆲ'), + (0xFFAD, 'M', u'ᆳ'), + (0xFFAE, 'M', u'ᆴ'), + (0xFFAF, 'M', u'ᆵ'), + (0xFFB0, 'M', u'ᄚ'), + (0xFFB1, 'M', u'ᄆ'), + (0xFFB2, 'M', u'ᄇ'), + (0xFFB3, 'M', u'ᄈ'), + (0xFFB4, 'M', u'ᄡ'), + (0xFFB5, 'M', u'ᄉ'), + (0xFFB6, 'M', u'ᄊ'), + (0xFFB7, 'M', u'ᄋ'), + (0xFFB8, 'M', u'ᄌ'), + (0xFFB9, 'M', u'ᄍ'), + (0xFFBA, 'M', u'ᄎ'), + (0xFFBB, 'M', u'ᄏ'), + (0xFFBC, 'M', u'ᄐ'), + (0xFFBD, 'M', u'ᄑ'), + (0xFFBE, 'M', u'ᄒ'), + (0xFFBF, 'X'), + (0xFFC2, 'M', u'ᅡ'), + (0xFFC3, 'M', u'ᅢ'), + (0xFFC4, 'M', u'ᅣ'), + (0xFFC5, 'M', u'ᅤ'), + (0xFFC6, 'M', u'ᅥ'), + (0xFFC7, 'M', u'ᅦ'), + (0xFFC8, 'X'), + (0xFFCA, 'M', u'ᅧ'), + (0xFFCB, 'M', u'ᅨ'), + (0xFFCC, 'M', u'ᅩ'), + (0xFFCD, 'M', u'ᅪ'), + ] + +def _seg_51(): + return [ + (0xFFCE, 'M', u'ᅫ'), + (0xFFCF, 'M', u'ᅬ'), + (0xFFD0, 'X'), + (0xFFD2, 'M', u'ᅭ'), + (0xFFD3, 'M', u'ᅮ'), + (0xFFD4, 'M', u'ᅯ'), + (0xFFD5, 'M', u'ᅰ'), + (0xFFD6, 'M', u'ᅱ'), + (0xFFD7, 'M', u'ᅲ'), + (0xFFD8, 'X'), + (0xFFDA, 'M', u'ᅳ'), + (0xFFDB, 'M', u'ᅴ'), + (0xFFDC, 'M', u'ᅵ'), + (0xFFDD, 'X'), + (0xFFE0, 'M', u'¢'), + (0xFFE1, 'M', u'£'), + (0xFFE2, 'M', u'¬'), + (0xFFE3, '3', u' ̄'), + (0xFFE4, 'M', u'¦'), + (0xFFE5, 'M', u'¥'), + (0xFFE6, 'M', u'₩'), + (0xFFE7, 'X'), + (0xFFE8, 'M', u'│'), + (0xFFE9, 'M', u'←'), + (0xFFEA, 'M', u'↑'), + (0xFFEB, 'M', u'→'), + (0xFFEC, 'M', u'↓'), + (0xFFED, 'M', u'■'), + (0xFFEE, 'M', u'○'), + (0xFFEF, 'X'), + (0x10000, 'V'), + (0x1000C, 'X'), + (0x1000D, 'V'), + (0x10027, 'X'), + (0x10028, 'V'), + (0x1003B, 'X'), + (0x1003C, 'V'), + (0x1003E, 'X'), + (0x1003F, 'V'), + (0x1004E, 'X'), + (0x10050, 'V'), + (0x1005E, 'X'), + (0x10080, 'V'), + (0x100FB, 'X'), + (0x10100, 'V'), + (0x10103, 'X'), + (0x10107, 'V'), + (0x10134, 'X'), + (0x10137, 'V'), + (0x1018B, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x10300, 'V'), + (0x1031F, 'X'), + (0x10320, 'V'), + (0x10324, 'X'), + (0x10330, 'V'), + (0x1034B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + (0x10402, 'M', u'𐐪'), + (0x10403, 'M', u'𐐫'), + (0x10404, 'M', u'𐐬'), + (0x10405, 'M', u'𐐭'), + (0x10406, 'M', u'𐐮'), + (0x10407, 'M', u'𐐯'), + (0x10408, 'M', u'𐐰'), + (0x10409, 'M', u'𐐱'), + (0x1040A, 'M', u'𐐲'), + (0x1040B, 'M', u'𐐳'), + (0x1040C, 'M', u'𐐴'), + (0x1040D, 'M', u'𐐵'), + (0x1040E, 'M', u'𐐶'), + (0x1040F, 'M', u'𐐷'), + (0x10410, 'M', u'𐐸'), + (0x10411, 'M', u'𐐹'), + (0x10412, 'M', u'𐐺'), + (0x10413, 'M', u'𐐻'), + (0x10414, 'M', u'𐐼'), + (0x10415, 'M', u'𐐽'), + (0x10416, 'M', u'𐐾'), + (0x10417, 'M', u'𐐿'), + (0x10418, 'M', u'𐑀'), + (0x10419, 'M', u'𐑁'), + (0x1041A, 'M', u'𐑂'), + (0x1041B, 'M', u'𐑃'), + (0x1041C, 'M', u'𐑄'), + (0x1041D, 'M', u'𐑅'), + ] + +def _seg_52(): + return [ + (0x1041E, 'M', u'𐑆'), + (0x1041F, 'M', u'𐑇'), + (0x10420, 'M', u'𐑈'), + (0x10421, 'M', u'𐑉'), + (0x10422, 'M', u'𐑊'), + (0x10423, 'M', u'𐑋'), + (0x10424, 'M', u'𐑌'), + (0x10425, 'M', u'𐑍'), + (0x10426, 'M', u'𐑎'), + (0x10427, 'M', u'𐑏'), + (0x10428, 'V'), + (0x1049E, 'X'), + (0x104A0, 'V'), + (0x104AA, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x10860, 'X'), + (0x10900, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BE, 'V'), + (0x109C0, 'X'), + (0x10A00, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A34, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A48, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10A80, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B80, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x11080, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11144, 'X'), + (0x11180, 'V'), + (0x111C9, 'X'), + (0x111D0, 'V'), + (0x111DA, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x12000, 'V'), + (0x1236F, 'X'), + (0x12400, 'V'), + (0x12463, 'X'), + (0x12470, 'V'), + (0x12474, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + ] + +def _seg_53(): + return [ + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x1B000, 'V'), + (0x1B002, 'X'), + (0x1D000, 'V'), + (0x1D0F6, 'X'), + (0x1D100, 'V'), + (0x1D127, 'X'), + (0x1D129, 'V'), + (0x1D15E, 'M', u'𝅗𝅥'), + (0x1D15F, 'M', u'𝅘𝅥'), + (0x1D160, 'M', u'𝅘𝅥𝅮'), + (0x1D161, 'M', u'𝅘𝅥𝅯'), + (0x1D162, 'M', u'𝅘𝅥𝅰'), + (0x1D163, 'M', u'𝅘𝅥𝅱'), + (0x1D164, 'M', u'𝅘𝅥𝅲'), + (0x1D165, 'V'), + (0x1D173, 'X'), + (0x1D17B, 'V'), + (0x1D1BB, 'M', u'𝆹𝅥'), + (0x1D1BC, 'M', u'𝆺𝅥'), + (0x1D1BD, 'M', u'𝆹𝅥𝅮'), + (0x1D1BE, 'M', u'𝆺𝅥𝅮'), + (0x1D1BF, 'M', u'𝆹𝅥𝅯'), + (0x1D1C0, 'M', u'𝆺𝅥𝅯'), + (0x1D1C1, 'V'), + (0x1D1DE, 'X'), + (0x1D200, 'V'), + (0x1D246, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D372, 'X'), + (0x1D400, 'M', u'a'), + (0x1D401, 'M', u'b'), + (0x1D402, 'M', u'c'), + (0x1D403, 'M', u'd'), + (0x1D404, 'M', u'e'), + (0x1D405, 'M', u'f'), + (0x1D406, 'M', u'g'), + (0x1D407, 'M', u'h'), + (0x1D408, 'M', u'i'), + (0x1D409, 'M', u'j'), + (0x1D40A, 'M', u'k'), + (0x1D40B, 'M', u'l'), + (0x1D40C, 'M', u'm'), + (0x1D40D, 'M', u'n'), + (0x1D40E, 'M', u'o'), + (0x1D40F, 'M', u'p'), + (0x1D410, 'M', u'q'), + (0x1D411, 'M', u'r'), + (0x1D412, 'M', u's'), + (0x1D413, 'M', u't'), + (0x1D414, 'M', u'u'), + (0x1D415, 'M', u'v'), + (0x1D416, 'M', u'w'), + (0x1D417, 'M', u'x'), + (0x1D418, 'M', u'y'), + (0x1D419, 'M', u'z'), + (0x1D41A, 'M', u'a'), + (0x1D41B, 'M', u'b'), + (0x1D41C, 'M', u'c'), + (0x1D41D, 'M', u'd'), + (0x1D41E, 'M', u'e'), + (0x1D41F, 'M', u'f'), + (0x1D420, 'M', u'g'), + (0x1D421, 'M', u'h'), + (0x1D422, 'M', u'i'), + (0x1D423, 'M', u'j'), + (0x1D424, 'M', u'k'), + (0x1D425, 'M', u'l'), + (0x1D426, 'M', u'm'), + (0x1D427, 'M', u'n'), + (0x1D428, 'M', u'o'), + (0x1D429, 'M', u'p'), + (0x1D42A, 'M', u'q'), + (0x1D42B, 'M', u'r'), + (0x1D42C, 'M', u's'), + (0x1D42D, 'M', u't'), + (0x1D42E, 'M', u'u'), + (0x1D42F, 'M', u'v'), + (0x1D430, 'M', u'w'), + (0x1D431, 'M', u'x'), + (0x1D432, 'M', u'y'), + (0x1D433, 'M', u'z'), + (0x1D434, 'M', u'a'), + (0x1D435, 'M', u'b'), + (0x1D436, 'M', u'c'), + (0x1D437, 'M', u'd'), + (0x1D438, 'M', u'e'), + (0x1D439, 'M', u'f'), + (0x1D43A, 'M', u'g'), + (0x1D43B, 'M', u'h'), + (0x1D43C, 'M', u'i'), + ] + +def _seg_54(): + return [ + (0x1D43D, 'M', u'j'), + (0x1D43E, 'M', u'k'), + (0x1D43F, 'M', u'l'), + (0x1D440, 'M', u'm'), + (0x1D441, 'M', u'n'), + (0x1D442, 'M', u'o'), + (0x1D443, 'M', u'p'), + (0x1D444, 'M', u'q'), + (0x1D445, 'M', u'r'), + (0x1D446, 'M', u's'), + (0x1D447, 'M', u't'), + (0x1D448, 'M', u'u'), + (0x1D449, 'M', u'v'), + (0x1D44A, 'M', u'w'), + (0x1D44B, 'M', u'x'), + (0x1D44C, 'M', u'y'), + (0x1D44D, 'M', u'z'), + (0x1D44E, 'M', u'a'), + (0x1D44F, 'M', u'b'), + (0x1D450, 'M', u'c'), + (0x1D451, 'M', u'd'), + (0x1D452, 'M', u'e'), + (0x1D453, 'M', u'f'), + (0x1D454, 'M', u'g'), + (0x1D455, 'X'), + (0x1D456, 'M', u'i'), + (0x1D457, 'M', u'j'), + (0x1D458, 'M', u'k'), + (0x1D459, 'M', u'l'), + (0x1D45A, 'M', u'm'), + (0x1D45B, 'M', u'n'), + (0x1D45C, 'M', u'o'), + (0x1D45D, 'M', u'p'), + (0x1D45E, 'M', u'q'), + (0x1D45F, 'M', u'r'), + (0x1D460, 'M', u's'), + (0x1D461, 'M', u't'), + (0x1D462, 'M', u'u'), + (0x1D463, 'M', u'v'), + (0x1D464, 'M', u'w'), + (0x1D465, 'M', u'x'), + (0x1D466, 'M', u'y'), + (0x1D467, 'M', u'z'), + (0x1D468, 'M', u'a'), + (0x1D469, 'M', u'b'), + (0x1D46A, 'M', u'c'), + (0x1D46B, 'M', u'd'), + (0x1D46C, 'M', u'e'), + (0x1D46D, 'M', u'f'), + (0x1D46E, 'M', u'g'), + (0x1D46F, 'M', u'h'), + (0x1D470, 'M', u'i'), + (0x1D471, 'M', u'j'), + (0x1D472, 'M', u'k'), + (0x1D473, 'M', u'l'), + (0x1D474, 'M', u'm'), + (0x1D475, 'M', u'n'), + (0x1D476, 'M', u'o'), + (0x1D477, 'M', u'p'), + (0x1D478, 'M', u'q'), + (0x1D479, 'M', u'r'), + (0x1D47A, 'M', u's'), + (0x1D47B, 'M', u't'), + (0x1D47C, 'M', u'u'), + (0x1D47D, 'M', u'v'), + (0x1D47E, 'M', u'w'), + (0x1D47F, 'M', u'x'), + (0x1D480, 'M', u'y'), + (0x1D481, 'M', u'z'), + (0x1D482, 'M', u'a'), + (0x1D483, 'M', u'b'), + (0x1D484, 'M', u'c'), + (0x1D485, 'M', u'd'), + (0x1D486, 'M', u'e'), + (0x1D487, 'M', u'f'), + (0x1D488, 'M', u'g'), + (0x1D489, 'M', u'h'), + (0x1D48A, 'M', u'i'), + (0x1D48B, 'M', u'j'), + (0x1D48C, 'M', u'k'), + (0x1D48D, 'M', u'l'), + (0x1D48E, 'M', u'm'), + (0x1D48F, 'M', u'n'), + (0x1D490, 'M', u'o'), + (0x1D491, 'M', u'p'), + (0x1D492, 'M', u'q'), + (0x1D493, 'M', u'r'), + (0x1D494, 'M', u's'), + (0x1D495, 'M', u't'), + (0x1D496, 'M', u'u'), + (0x1D497, 'M', u'v'), + (0x1D498, 'M', u'w'), + (0x1D499, 'M', u'x'), + (0x1D49A, 'M', u'y'), + (0x1D49B, 'M', u'z'), + (0x1D49C, 'M', u'a'), + (0x1D49D, 'X'), + (0x1D49E, 'M', u'c'), + (0x1D49F, 'M', u'd'), + (0x1D4A0, 'X'), + ] + +def _seg_55(): + return [ + (0x1D4A2, 'M', u'g'), + (0x1D4A3, 'X'), + (0x1D4A5, 'M', u'j'), + (0x1D4A6, 'M', u'k'), + (0x1D4A7, 'X'), + (0x1D4A9, 'M', u'n'), + (0x1D4AA, 'M', u'o'), + (0x1D4AB, 'M', u'p'), + (0x1D4AC, 'M', u'q'), + (0x1D4AD, 'X'), + (0x1D4AE, 'M', u's'), + (0x1D4AF, 'M', u't'), + (0x1D4B0, 'M', u'u'), + (0x1D4B1, 'M', u'v'), + (0x1D4B2, 'M', u'w'), + (0x1D4B3, 'M', u'x'), + (0x1D4B4, 'M', u'y'), + (0x1D4B5, 'M', u'z'), + (0x1D4B6, 'M', u'a'), + (0x1D4B7, 'M', u'b'), + (0x1D4B8, 'M', u'c'), + (0x1D4B9, 'M', u'd'), + (0x1D4BA, 'X'), + (0x1D4BB, 'M', u'f'), + (0x1D4BC, 'X'), + (0x1D4BD, 'M', u'h'), + (0x1D4BE, 'M', u'i'), + (0x1D4BF, 'M', u'j'), + (0x1D4C0, 'M', u'k'), + (0x1D4C1, 'M', u'l'), + (0x1D4C2, 'M', u'm'), + (0x1D4C3, 'M', u'n'), + (0x1D4C4, 'X'), + (0x1D4C5, 'M', u'p'), + (0x1D4C6, 'M', u'q'), + (0x1D4C7, 'M', u'r'), + (0x1D4C8, 'M', u's'), + (0x1D4C9, 'M', u't'), + (0x1D4CA, 'M', u'u'), + (0x1D4CB, 'M', u'v'), + (0x1D4CC, 'M', u'w'), + (0x1D4CD, 'M', u'x'), + (0x1D4CE, 'M', u'y'), + (0x1D4CF, 'M', u'z'), + (0x1D4D0, 'M', u'a'), + (0x1D4D1, 'M', u'b'), + (0x1D4D2, 'M', u'c'), + (0x1D4D3, 'M', u'd'), + (0x1D4D4, 'M', u'e'), + (0x1D4D5, 'M', u'f'), + (0x1D4D6, 'M', u'g'), + (0x1D4D7, 'M', u'h'), + (0x1D4D8, 'M', u'i'), + (0x1D4D9, 'M', u'j'), + (0x1D4DA, 'M', u'k'), + (0x1D4DB, 'M', u'l'), + (0x1D4DC, 'M', u'm'), + (0x1D4DD, 'M', u'n'), + (0x1D4DE, 'M', u'o'), + (0x1D4DF, 'M', u'p'), + (0x1D4E0, 'M', u'q'), + (0x1D4E1, 'M', u'r'), + (0x1D4E2, 'M', u's'), + (0x1D4E3, 'M', u't'), + (0x1D4E4, 'M', u'u'), + (0x1D4E5, 'M', u'v'), + (0x1D4E6, 'M', u'w'), + (0x1D4E7, 'M', u'x'), + (0x1D4E8, 'M', u'y'), + (0x1D4E9, 'M', u'z'), + (0x1D4EA, 'M', u'a'), + (0x1D4EB, 'M', u'b'), + (0x1D4EC, 'M', u'c'), + (0x1D4ED, 'M', u'd'), + (0x1D4EE, 'M', u'e'), + (0x1D4EF, 'M', u'f'), + (0x1D4F0, 'M', u'g'), + (0x1D4F1, 'M', u'h'), + (0x1D4F2, 'M', u'i'), + (0x1D4F3, 'M', u'j'), + (0x1D4F4, 'M', u'k'), + (0x1D4F5, 'M', u'l'), + (0x1D4F6, 'M', u'm'), + (0x1D4F7, 'M', u'n'), + (0x1D4F8, 'M', u'o'), + (0x1D4F9, 'M', u'p'), + (0x1D4FA, 'M', u'q'), + (0x1D4FB, 'M', u'r'), + (0x1D4FC, 'M', u's'), + (0x1D4FD, 'M', u't'), + (0x1D4FE, 'M', u'u'), + (0x1D4FF, 'M', u'v'), + (0x1D500, 'M', u'w'), + (0x1D501, 'M', u'x'), + (0x1D502, 'M', u'y'), + (0x1D503, 'M', u'z'), + (0x1D504, 'M', u'a'), + (0x1D505, 'M', u'b'), + (0x1D506, 'X'), + (0x1D507, 'M', u'd'), + ] + +def _seg_56(): + return [ + (0x1D508, 'M', u'e'), + (0x1D509, 'M', u'f'), + (0x1D50A, 'M', u'g'), + (0x1D50B, 'X'), + (0x1D50D, 'M', u'j'), + (0x1D50E, 'M', u'k'), + (0x1D50F, 'M', u'l'), + (0x1D510, 'M', u'm'), + (0x1D511, 'M', u'n'), + (0x1D512, 'M', u'o'), + (0x1D513, 'M', u'p'), + (0x1D514, 'M', u'q'), + (0x1D515, 'X'), + (0x1D516, 'M', u's'), + (0x1D517, 'M', u't'), + (0x1D518, 'M', u'u'), + (0x1D519, 'M', u'v'), + (0x1D51A, 'M', u'w'), + (0x1D51B, 'M', u'x'), + (0x1D51C, 'M', u'y'), + (0x1D51D, 'X'), + (0x1D51E, 'M', u'a'), + (0x1D51F, 'M', u'b'), + (0x1D520, 'M', u'c'), + (0x1D521, 'M', u'd'), + (0x1D522, 'M', u'e'), + (0x1D523, 'M', u'f'), + (0x1D524, 'M', u'g'), + (0x1D525, 'M', u'h'), + (0x1D526, 'M', u'i'), + (0x1D527, 'M', u'j'), + (0x1D528, 'M', u'k'), + (0x1D529, 'M', u'l'), + (0x1D52A, 'M', u'm'), + (0x1D52B, 'M', u'n'), + (0x1D52C, 'M', u'o'), + (0x1D52D, 'M', u'p'), + (0x1D52E, 'M', u'q'), + (0x1D52F, 'M', u'r'), + (0x1D530, 'M', u's'), + (0x1D531, 'M', u't'), + (0x1D532, 'M', u'u'), + (0x1D533, 'M', u'v'), + (0x1D534, 'M', u'w'), + (0x1D535, 'M', u'x'), + (0x1D536, 'M', u'y'), + (0x1D537, 'M', u'z'), + (0x1D538, 'M', u'a'), + (0x1D539, 'M', u'b'), + (0x1D53A, 'X'), + (0x1D53B, 'M', u'd'), + (0x1D53C, 'M', u'e'), + (0x1D53D, 'M', u'f'), + (0x1D53E, 'M', u'g'), + (0x1D53F, 'X'), + (0x1D540, 'M', u'i'), + (0x1D541, 'M', u'j'), + (0x1D542, 'M', u'k'), + (0x1D543, 'M', u'l'), + (0x1D544, 'M', u'm'), + (0x1D545, 'X'), + (0x1D546, 'M', u'o'), + (0x1D547, 'X'), + (0x1D54A, 'M', u's'), + (0x1D54B, 'M', u't'), + (0x1D54C, 'M', u'u'), + (0x1D54D, 'M', u'v'), + (0x1D54E, 'M', u'w'), + (0x1D54F, 'M', u'x'), + (0x1D550, 'M', u'y'), + (0x1D551, 'X'), + (0x1D552, 'M', u'a'), + (0x1D553, 'M', u'b'), + (0x1D554, 'M', u'c'), + (0x1D555, 'M', u'd'), + (0x1D556, 'M', u'e'), + (0x1D557, 'M', u'f'), + (0x1D558, 'M', u'g'), + (0x1D559, 'M', u'h'), + (0x1D55A, 'M', u'i'), + (0x1D55B, 'M', u'j'), + (0x1D55C, 'M', u'k'), + (0x1D55D, 'M', u'l'), + (0x1D55E, 'M', u'm'), + (0x1D55F, 'M', u'n'), + (0x1D560, 'M', u'o'), + (0x1D561, 'M', u'p'), + (0x1D562, 'M', u'q'), + (0x1D563, 'M', u'r'), + (0x1D564, 'M', u's'), + (0x1D565, 'M', u't'), + (0x1D566, 'M', u'u'), + (0x1D567, 'M', u'v'), + (0x1D568, 'M', u'w'), + (0x1D569, 'M', u'x'), + (0x1D56A, 'M', u'y'), + (0x1D56B, 'M', u'z'), + (0x1D56C, 'M', u'a'), + (0x1D56D, 'M', u'b'), + (0x1D56E, 'M', u'c'), + ] + +def _seg_57(): + return [ + (0x1D56F, 'M', u'd'), + (0x1D570, 'M', u'e'), + (0x1D571, 'M', u'f'), + (0x1D572, 'M', u'g'), + (0x1D573, 'M', u'h'), + (0x1D574, 'M', u'i'), + (0x1D575, 'M', u'j'), + (0x1D576, 'M', u'k'), + (0x1D577, 'M', u'l'), + (0x1D578, 'M', u'm'), + (0x1D579, 'M', u'n'), + (0x1D57A, 'M', u'o'), + (0x1D57B, 'M', u'p'), + (0x1D57C, 'M', u'q'), + (0x1D57D, 'M', u'r'), + (0x1D57E, 'M', u's'), + (0x1D57F, 'M', u't'), + (0x1D580, 'M', u'u'), + (0x1D581, 'M', u'v'), + (0x1D582, 'M', u'w'), + (0x1D583, 'M', u'x'), + (0x1D584, 'M', u'y'), + (0x1D585, 'M', u'z'), + (0x1D586, 'M', u'a'), + (0x1D587, 'M', u'b'), + (0x1D588, 'M', u'c'), + (0x1D589, 'M', u'd'), + (0x1D58A, 'M', u'e'), + (0x1D58B, 'M', u'f'), + (0x1D58C, 'M', u'g'), + (0x1D58D, 'M', u'h'), + (0x1D58E, 'M', u'i'), + (0x1D58F, 'M', u'j'), + (0x1D590, 'M', u'k'), + (0x1D591, 'M', u'l'), + (0x1D592, 'M', u'm'), + (0x1D593, 'M', u'n'), + (0x1D594, 'M', u'o'), + (0x1D595, 'M', u'p'), + (0x1D596, 'M', u'q'), + (0x1D597, 'M', u'r'), + (0x1D598, 'M', u's'), + (0x1D599, 'M', u't'), + (0x1D59A, 'M', u'u'), + (0x1D59B, 'M', u'v'), + (0x1D59C, 'M', u'w'), + (0x1D59D, 'M', u'x'), + (0x1D59E, 'M', u'y'), + (0x1D59F, 'M', u'z'), + (0x1D5A0, 'M', u'a'), + (0x1D5A1, 'M', u'b'), + (0x1D5A2, 'M', u'c'), + (0x1D5A3, 'M', u'd'), + (0x1D5A4, 'M', u'e'), + (0x1D5A5, 'M', u'f'), + (0x1D5A6, 'M', u'g'), + (0x1D5A7, 'M', u'h'), + (0x1D5A8, 'M', u'i'), + (0x1D5A9, 'M', u'j'), + (0x1D5AA, 'M', u'k'), + (0x1D5AB, 'M', u'l'), + (0x1D5AC, 'M', u'm'), + (0x1D5AD, 'M', u'n'), + (0x1D5AE, 'M', u'o'), + (0x1D5AF, 'M', u'p'), + (0x1D5B0, 'M', u'q'), + (0x1D5B1, 'M', u'r'), + (0x1D5B2, 'M', u's'), + (0x1D5B3, 'M', u't'), + (0x1D5B4, 'M', u'u'), + (0x1D5B5, 'M', u'v'), + (0x1D5B6, 'M', u'w'), + (0x1D5B7, 'M', u'x'), + (0x1D5B8, 'M', u'y'), + (0x1D5B9, 'M', u'z'), + (0x1D5BA, 'M', u'a'), + (0x1D5BB, 'M', u'b'), + (0x1D5BC, 'M', u'c'), + (0x1D5BD, 'M', u'd'), + (0x1D5BE, 'M', u'e'), + (0x1D5BF, 'M', u'f'), + (0x1D5C0, 'M', u'g'), + (0x1D5C1, 'M', u'h'), + (0x1D5C2, 'M', u'i'), + (0x1D5C3, 'M', u'j'), + (0x1D5C4, 'M', u'k'), + (0x1D5C5, 'M', u'l'), + (0x1D5C6, 'M', u'm'), + (0x1D5C7, 'M', u'n'), + (0x1D5C8, 'M', u'o'), + (0x1D5C9, 'M', u'p'), + (0x1D5CA, 'M', u'q'), + (0x1D5CB, 'M', u'r'), + (0x1D5CC, 'M', u's'), + (0x1D5CD, 'M', u't'), + (0x1D5CE, 'M', u'u'), + (0x1D5CF, 'M', u'v'), + (0x1D5D0, 'M', u'w'), + (0x1D5D1, 'M', u'x'), + (0x1D5D2, 'M', u'y'), + ] + +def _seg_58(): + return [ + (0x1D5D3, 'M', u'z'), + (0x1D5D4, 'M', u'a'), + (0x1D5D5, 'M', u'b'), + (0x1D5D6, 'M', u'c'), + (0x1D5D7, 'M', u'd'), + (0x1D5D8, 'M', u'e'), + (0x1D5D9, 'M', u'f'), + (0x1D5DA, 'M', u'g'), + (0x1D5DB, 'M', u'h'), + (0x1D5DC, 'M', u'i'), + (0x1D5DD, 'M', u'j'), + (0x1D5DE, 'M', u'k'), + (0x1D5DF, 'M', u'l'), + (0x1D5E0, 'M', u'm'), + (0x1D5E1, 'M', u'n'), + (0x1D5E2, 'M', u'o'), + (0x1D5E3, 'M', u'p'), + (0x1D5E4, 'M', u'q'), + (0x1D5E5, 'M', u'r'), + (0x1D5E6, 'M', u's'), + (0x1D5E7, 'M', u't'), + (0x1D5E8, 'M', u'u'), + (0x1D5E9, 'M', u'v'), + (0x1D5EA, 'M', u'w'), + (0x1D5EB, 'M', u'x'), + (0x1D5EC, 'M', u'y'), + (0x1D5ED, 'M', u'z'), + (0x1D5EE, 'M', u'a'), + (0x1D5EF, 'M', u'b'), + (0x1D5F0, 'M', u'c'), + (0x1D5F1, 'M', u'd'), + (0x1D5F2, 'M', u'e'), + (0x1D5F3, 'M', u'f'), + (0x1D5F4, 'M', u'g'), + (0x1D5F5, 'M', u'h'), + (0x1D5F6, 'M', u'i'), + (0x1D5F7, 'M', u'j'), + (0x1D5F8, 'M', u'k'), + (0x1D5F9, 'M', u'l'), + (0x1D5FA, 'M', u'm'), + (0x1D5FB, 'M', u'n'), + (0x1D5FC, 'M', u'o'), + (0x1D5FD, 'M', u'p'), + (0x1D5FE, 'M', u'q'), + (0x1D5FF, 'M', u'r'), + (0x1D600, 'M', u's'), + (0x1D601, 'M', u't'), + (0x1D602, 'M', u'u'), + (0x1D603, 'M', u'v'), + (0x1D604, 'M', u'w'), + (0x1D605, 'M', u'x'), + (0x1D606, 'M', u'y'), + (0x1D607, 'M', u'z'), + (0x1D608, 'M', u'a'), + (0x1D609, 'M', u'b'), + (0x1D60A, 'M', u'c'), + (0x1D60B, 'M', u'd'), + (0x1D60C, 'M', u'e'), + (0x1D60D, 'M', u'f'), + (0x1D60E, 'M', u'g'), + (0x1D60F, 'M', u'h'), + (0x1D610, 'M', u'i'), + (0x1D611, 'M', u'j'), + (0x1D612, 'M', u'k'), + (0x1D613, 'M', u'l'), + (0x1D614, 'M', u'm'), + (0x1D615, 'M', u'n'), + (0x1D616, 'M', u'o'), + (0x1D617, 'M', u'p'), + (0x1D618, 'M', u'q'), + (0x1D619, 'M', u'r'), + (0x1D61A, 'M', u's'), + (0x1D61B, 'M', u't'), + (0x1D61C, 'M', u'u'), + (0x1D61D, 'M', u'v'), + (0x1D61E, 'M', u'w'), + (0x1D61F, 'M', u'x'), + (0x1D620, 'M', u'y'), + (0x1D621, 'M', u'z'), + (0x1D622, 'M', u'a'), + (0x1D623, 'M', u'b'), + (0x1D624, 'M', u'c'), + (0x1D625, 'M', u'd'), + (0x1D626, 'M', u'e'), + (0x1D627, 'M', u'f'), + (0x1D628, 'M', u'g'), + (0x1D629, 'M', u'h'), + (0x1D62A, 'M', u'i'), + (0x1D62B, 'M', u'j'), + (0x1D62C, 'M', u'k'), + (0x1D62D, 'M', u'l'), + (0x1D62E, 'M', u'm'), + (0x1D62F, 'M', u'n'), + (0x1D630, 'M', u'o'), + (0x1D631, 'M', u'p'), + (0x1D632, 'M', u'q'), + (0x1D633, 'M', u'r'), + (0x1D634, 'M', u's'), + (0x1D635, 'M', u't'), + (0x1D636, 'M', u'u'), + ] + +def _seg_59(): + return [ + (0x1D637, 'M', u'v'), + (0x1D638, 'M', u'w'), + (0x1D639, 'M', u'x'), + (0x1D63A, 'M', u'y'), + (0x1D63B, 'M', u'z'), + (0x1D63C, 'M', u'a'), + (0x1D63D, 'M', u'b'), + (0x1D63E, 'M', u'c'), + (0x1D63F, 'M', u'd'), + (0x1D640, 'M', u'e'), + (0x1D641, 'M', u'f'), + (0x1D642, 'M', u'g'), + (0x1D643, 'M', u'h'), + (0x1D644, 'M', u'i'), + (0x1D645, 'M', u'j'), + (0x1D646, 'M', u'k'), + (0x1D647, 'M', u'l'), + (0x1D648, 'M', u'm'), + (0x1D649, 'M', u'n'), + (0x1D64A, 'M', u'o'), + (0x1D64B, 'M', u'p'), + (0x1D64C, 'M', u'q'), + (0x1D64D, 'M', u'r'), + (0x1D64E, 'M', u's'), + (0x1D64F, 'M', u't'), + (0x1D650, 'M', u'u'), + (0x1D651, 'M', u'v'), + (0x1D652, 'M', u'w'), + (0x1D653, 'M', u'x'), + (0x1D654, 'M', u'y'), + (0x1D655, 'M', u'z'), + (0x1D656, 'M', u'a'), + (0x1D657, 'M', u'b'), + (0x1D658, 'M', u'c'), + (0x1D659, 'M', u'd'), + (0x1D65A, 'M', u'e'), + (0x1D65B, 'M', u'f'), + (0x1D65C, 'M', u'g'), + (0x1D65D, 'M', u'h'), + (0x1D65E, 'M', u'i'), + (0x1D65F, 'M', u'j'), + (0x1D660, 'M', u'k'), + (0x1D661, 'M', u'l'), + (0x1D662, 'M', u'm'), + (0x1D663, 'M', u'n'), + (0x1D664, 'M', u'o'), + (0x1D665, 'M', u'p'), + (0x1D666, 'M', u'q'), + (0x1D667, 'M', u'r'), + (0x1D668, 'M', u's'), + (0x1D669, 'M', u't'), + (0x1D66A, 'M', u'u'), + (0x1D66B, 'M', u'v'), + (0x1D66C, 'M', u'w'), + (0x1D66D, 'M', u'x'), + (0x1D66E, 'M', u'y'), + (0x1D66F, 'M', u'z'), + (0x1D670, 'M', u'a'), + (0x1D671, 'M', u'b'), + (0x1D672, 'M', u'c'), + (0x1D673, 'M', u'd'), + (0x1D674, 'M', u'e'), + (0x1D675, 'M', u'f'), + (0x1D676, 'M', u'g'), + (0x1D677, 'M', u'h'), + (0x1D678, 'M', u'i'), + (0x1D679, 'M', u'j'), + (0x1D67A, 'M', u'k'), + (0x1D67B, 'M', u'l'), + (0x1D67C, 'M', u'm'), + (0x1D67D, 'M', u'n'), + (0x1D67E, 'M', u'o'), + (0x1D67F, 'M', u'p'), + (0x1D680, 'M', u'q'), + (0x1D681, 'M', u'r'), + (0x1D682, 'M', u's'), + (0x1D683, 'M', u't'), + (0x1D684, 'M', u'u'), + (0x1D685, 'M', u'v'), + (0x1D686, 'M', u'w'), + (0x1D687, 'M', u'x'), + (0x1D688, 'M', u'y'), + (0x1D689, 'M', u'z'), + (0x1D68A, 'M', u'a'), + (0x1D68B, 'M', u'b'), + (0x1D68C, 'M', u'c'), + (0x1D68D, 'M', u'd'), + (0x1D68E, 'M', u'e'), + (0x1D68F, 'M', u'f'), + (0x1D690, 'M', u'g'), + (0x1D691, 'M', u'h'), + (0x1D692, 'M', u'i'), + (0x1D693, 'M', u'j'), + (0x1D694, 'M', u'k'), + (0x1D695, 'M', u'l'), + (0x1D696, 'M', u'm'), + (0x1D697, 'M', u'n'), + (0x1D698, 'M', u'o'), + (0x1D699, 'M', u'p'), + (0x1D69A, 'M', u'q'), + ] + +def _seg_60(): + return [ + (0x1D69B, 'M', u'r'), + (0x1D69C, 'M', u's'), + (0x1D69D, 'M', u't'), + (0x1D69E, 'M', u'u'), + (0x1D69F, 'M', u'v'), + (0x1D6A0, 'M', u'w'), + (0x1D6A1, 'M', u'x'), + (0x1D6A2, 'M', u'y'), + (0x1D6A3, 'M', u'z'), + (0x1D6A4, 'M', u'ı'), + (0x1D6A5, 'M', u'ȷ'), + (0x1D6A6, 'X'), + (0x1D6A8, 'M', u'α'), + (0x1D6A9, 'M', u'β'), + (0x1D6AA, 'M', u'γ'), + (0x1D6AB, 'M', u'δ'), + (0x1D6AC, 'M', u'ε'), + (0x1D6AD, 'M', u'ζ'), + (0x1D6AE, 'M', u'η'), + (0x1D6AF, 'M', u'θ'), + (0x1D6B0, 'M', u'ι'), + (0x1D6B1, 'M', u'κ'), + (0x1D6B2, 'M', u'λ'), + (0x1D6B3, 'M', u'μ'), + (0x1D6B4, 'M', u'ν'), + (0x1D6B5, 'M', u'ξ'), + (0x1D6B6, 'M', u'ο'), + (0x1D6B7, 'M', u'π'), + (0x1D6B8, 'M', u'ρ'), + (0x1D6B9, 'M', u'θ'), + (0x1D6BA, 'M', u'σ'), + (0x1D6BB, 'M', u'τ'), + (0x1D6BC, 'M', u'υ'), + (0x1D6BD, 'M', u'φ'), + (0x1D6BE, 'M', u'χ'), + (0x1D6BF, 'M', u'ψ'), + (0x1D6C0, 'M', u'ω'), + (0x1D6C1, 'M', u'∇'), + (0x1D6C2, 'M', u'α'), + (0x1D6C3, 'M', u'β'), + (0x1D6C4, 'M', u'γ'), + (0x1D6C5, 'M', u'δ'), + (0x1D6C6, 'M', u'ε'), + (0x1D6C7, 'M', u'ζ'), + (0x1D6C8, 'M', u'η'), + (0x1D6C9, 'M', u'θ'), + (0x1D6CA, 'M', u'ι'), + (0x1D6CB, 'M', u'κ'), + (0x1D6CC, 'M', u'λ'), + (0x1D6CD, 'M', u'μ'), + (0x1D6CE, 'M', u'ν'), + (0x1D6CF, 'M', u'ξ'), + (0x1D6D0, 'M', u'ο'), + (0x1D6D1, 'M', u'π'), + (0x1D6D2, 'M', u'ρ'), + (0x1D6D3, 'M', u'σ'), + (0x1D6D5, 'M', u'τ'), + (0x1D6D6, 'M', u'υ'), + (0x1D6D7, 'M', u'φ'), + (0x1D6D8, 'M', u'χ'), + (0x1D6D9, 'M', u'ψ'), + (0x1D6DA, 'M', u'ω'), + (0x1D6DB, 'M', u'∂'), + (0x1D6DC, 'M', u'ε'), + (0x1D6DD, 'M', u'θ'), + (0x1D6DE, 'M', u'κ'), + (0x1D6DF, 'M', u'φ'), + (0x1D6E0, 'M', u'ρ'), + (0x1D6E1, 'M', u'π'), + (0x1D6E2, 'M', u'α'), + (0x1D6E3, 'M', u'β'), + (0x1D6E4, 'M', u'γ'), + (0x1D6E5, 'M', u'δ'), + (0x1D6E6, 'M', u'ε'), + (0x1D6E7, 'M', u'ζ'), + (0x1D6E8, 'M', u'η'), + (0x1D6E9, 'M', u'θ'), + (0x1D6EA, 'M', u'ι'), + (0x1D6EB, 'M', u'κ'), + (0x1D6EC, 'M', u'λ'), + (0x1D6ED, 'M', u'μ'), + (0x1D6EE, 'M', u'ν'), + (0x1D6EF, 'M', u'ξ'), + (0x1D6F0, 'M', u'ο'), + (0x1D6F1, 'M', u'π'), + (0x1D6F2, 'M', u'ρ'), + (0x1D6F3, 'M', u'θ'), + (0x1D6F4, 'M', u'σ'), + (0x1D6F5, 'M', u'τ'), + (0x1D6F6, 'M', u'υ'), + (0x1D6F7, 'M', u'φ'), + (0x1D6F8, 'M', u'χ'), + (0x1D6F9, 'M', u'ψ'), + (0x1D6FA, 'M', u'ω'), + (0x1D6FB, 'M', u'∇'), + (0x1D6FC, 'M', u'α'), + (0x1D6FD, 'M', u'β'), + (0x1D6FE, 'M', u'γ'), + (0x1D6FF, 'M', u'δ'), + (0x1D700, 'M', u'ε'), + ] + +def _seg_61(): + return [ + (0x1D701, 'M', u'ζ'), + (0x1D702, 'M', u'η'), + (0x1D703, 'M', u'θ'), + (0x1D704, 'M', u'ι'), + (0x1D705, 'M', u'κ'), + (0x1D706, 'M', u'λ'), + (0x1D707, 'M', u'μ'), + (0x1D708, 'M', u'ν'), + (0x1D709, 'M', u'ξ'), + (0x1D70A, 'M', u'ο'), + (0x1D70B, 'M', u'π'), + (0x1D70C, 'M', u'ρ'), + (0x1D70D, 'M', u'σ'), + (0x1D70F, 'M', u'τ'), + (0x1D710, 'M', u'υ'), + (0x1D711, 'M', u'φ'), + (0x1D712, 'M', u'χ'), + (0x1D713, 'M', u'ψ'), + (0x1D714, 'M', u'ω'), + (0x1D715, 'M', u'∂'), + (0x1D716, 'M', u'ε'), + (0x1D717, 'M', u'θ'), + (0x1D718, 'M', u'κ'), + (0x1D719, 'M', u'φ'), + (0x1D71A, 'M', u'ρ'), + (0x1D71B, 'M', u'π'), + (0x1D71C, 'M', u'α'), + (0x1D71D, 'M', u'β'), + (0x1D71E, 'M', u'γ'), + (0x1D71F, 'M', u'δ'), + (0x1D720, 'M', u'ε'), + (0x1D721, 'M', u'ζ'), + (0x1D722, 'M', u'η'), + (0x1D723, 'M', u'θ'), + (0x1D724, 'M', u'ι'), + (0x1D725, 'M', u'κ'), + (0x1D726, 'M', u'λ'), + (0x1D727, 'M', u'μ'), + (0x1D728, 'M', u'ν'), + (0x1D729, 'M', u'ξ'), + (0x1D72A, 'M', u'ο'), + (0x1D72B, 'M', u'π'), + (0x1D72C, 'M', u'ρ'), + (0x1D72D, 'M', u'θ'), + (0x1D72E, 'M', u'σ'), + (0x1D72F, 'M', u'τ'), + (0x1D730, 'M', u'υ'), + (0x1D731, 'M', u'φ'), + (0x1D732, 'M', u'χ'), + (0x1D733, 'M', u'ψ'), + (0x1D734, 'M', u'ω'), + (0x1D735, 'M', u'∇'), + (0x1D736, 'M', u'α'), + (0x1D737, 'M', u'β'), + (0x1D738, 'M', u'γ'), + (0x1D739, 'M', u'δ'), + (0x1D73A, 'M', u'ε'), + (0x1D73B, 'M', u'ζ'), + (0x1D73C, 'M', u'η'), + (0x1D73D, 'M', u'θ'), + (0x1D73E, 'M', u'ι'), + (0x1D73F, 'M', u'κ'), + (0x1D740, 'M', u'λ'), + (0x1D741, 'M', u'μ'), + (0x1D742, 'M', u'ν'), + (0x1D743, 'M', u'ξ'), + (0x1D744, 'M', u'ο'), + (0x1D745, 'M', u'π'), + (0x1D746, 'M', u'ρ'), + (0x1D747, 'M', u'σ'), + (0x1D749, 'M', u'τ'), + (0x1D74A, 'M', u'υ'), + (0x1D74B, 'M', u'φ'), + (0x1D74C, 'M', u'χ'), + (0x1D74D, 'M', u'ψ'), + (0x1D74E, 'M', u'ω'), + (0x1D74F, 'M', u'∂'), + (0x1D750, 'M', u'ε'), + (0x1D751, 'M', u'θ'), + (0x1D752, 'M', u'κ'), + (0x1D753, 'M', u'φ'), + (0x1D754, 'M', u'ρ'), + (0x1D755, 'M', u'π'), + (0x1D756, 'M', u'α'), + (0x1D757, 'M', u'β'), + (0x1D758, 'M', u'γ'), + (0x1D759, 'M', u'δ'), + (0x1D75A, 'M', u'ε'), + (0x1D75B, 'M', u'ζ'), + (0x1D75C, 'M', u'η'), + (0x1D75D, 'M', u'θ'), + (0x1D75E, 'M', u'ι'), + (0x1D75F, 'M', u'κ'), + (0x1D760, 'M', u'λ'), + (0x1D761, 'M', u'μ'), + (0x1D762, 'M', u'ν'), + (0x1D763, 'M', u'ξ'), + (0x1D764, 'M', u'ο'), + (0x1D765, 'M', u'π'), + (0x1D766, 'M', u'ρ'), + ] + +def _seg_62(): + return [ + (0x1D767, 'M', u'θ'), + (0x1D768, 'M', u'σ'), + (0x1D769, 'M', u'τ'), + (0x1D76A, 'M', u'υ'), + (0x1D76B, 'M', u'φ'), + (0x1D76C, 'M', u'χ'), + (0x1D76D, 'M', u'ψ'), + (0x1D76E, 'M', u'ω'), + (0x1D76F, 'M', u'∇'), + (0x1D770, 'M', u'α'), + (0x1D771, 'M', u'β'), + (0x1D772, 'M', u'γ'), + (0x1D773, 'M', u'δ'), + (0x1D774, 'M', u'ε'), + (0x1D775, 'M', u'ζ'), + (0x1D776, 'M', u'η'), + (0x1D777, 'M', u'θ'), + (0x1D778, 'M', u'ι'), + (0x1D779, 'M', u'κ'), + (0x1D77A, 'M', u'λ'), + (0x1D77B, 'M', u'μ'), + (0x1D77C, 'M', u'ν'), + (0x1D77D, 'M', u'ξ'), + (0x1D77E, 'M', u'ο'), + (0x1D77F, 'M', u'π'), + (0x1D780, 'M', u'ρ'), + (0x1D781, 'M', u'σ'), + (0x1D783, 'M', u'τ'), + (0x1D784, 'M', u'υ'), + (0x1D785, 'M', u'φ'), + (0x1D786, 'M', u'χ'), + (0x1D787, 'M', u'ψ'), + (0x1D788, 'M', u'ω'), + (0x1D789, 'M', u'∂'), + (0x1D78A, 'M', u'ε'), + (0x1D78B, 'M', u'θ'), + (0x1D78C, 'M', u'κ'), + (0x1D78D, 'M', u'φ'), + (0x1D78E, 'M', u'ρ'), + (0x1D78F, 'M', u'π'), + (0x1D790, 'M', u'α'), + (0x1D791, 'M', u'β'), + (0x1D792, 'M', u'γ'), + (0x1D793, 'M', u'δ'), + (0x1D794, 'M', u'ε'), + (0x1D795, 'M', u'ζ'), + (0x1D796, 'M', u'η'), + (0x1D797, 'M', u'θ'), + (0x1D798, 'M', u'ι'), + (0x1D799, 'M', u'κ'), + (0x1D79A, 'M', u'λ'), + (0x1D79B, 'M', u'μ'), + (0x1D79C, 'M', u'ν'), + (0x1D79D, 'M', u'ξ'), + (0x1D79E, 'M', u'ο'), + (0x1D79F, 'M', u'π'), + (0x1D7A0, 'M', u'ρ'), + (0x1D7A1, 'M', u'θ'), + (0x1D7A2, 'M', u'σ'), + (0x1D7A3, 'M', u'τ'), + (0x1D7A4, 'M', u'υ'), + (0x1D7A5, 'M', u'φ'), + (0x1D7A6, 'M', u'χ'), + (0x1D7A7, 'M', u'ψ'), + (0x1D7A8, 'M', u'ω'), + (0x1D7A9, 'M', u'∇'), + (0x1D7AA, 'M', u'α'), + (0x1D7AB, 'M', u'β'), + (0x1D7AC, 'M', u'γ'), + (0x1D7AD, 'M', u'δ'), + (0x1D7AE, 'M', u'ε'), + (0x1D7AF, 'M', u'ζ'), + (0x1D7B0, 'M', u'η'), + (0x1D7B1, 'M', u'θ'), + (0x1D7B2, 'M', u'ι'), + (0x1D7B3, 'M', u'κ'), + (0x1D7B4, 'M', u'λ'), + (0x1D7B5, 'M', u'μ'), + (0x1D7B6, 'M', u'ν'), + (0x1D7B7, 'M', u'ξ'), + (0x1D7B8, 'M', u'ο'), + (0x1D7B9, 'M', u'π'), + (0x1D7BA, 'M', u'ρ'), + (0x1D7BB, 'M', u'σ'), + (0x1D7BD, 'M', u'τ'), + (0x1D7BE, 'M', u'υ'), + (0x1D7BF, 'M', u'φ'), + (0x1D7C0, 'M', u'χ'), + (0x1D7C1, 'M', u'ψ'), + (0x1D7C2, 'M', u'ω'), + (0x1D7C3, 'M', u'∂'), + (0x1D7C4, 'M', u'ε'), + (0x1D7C5, 'M', u'θ'), + (0x1D7C6, 'M', u'κ'), + (0x1D7C7, 'M', u'φ'), + (0x1D7C8, 'M', u'ρ'), + (0x1D7C9, 'M', u'π'), + (0x1D7CA, 'M', u'ϝ'), + (0x1D7CC, 'X'), + (0x1D7CE, 'M', u'0'), + ] + +def _seg_63(): + return [ + (0x1D7CF, 'M', u'1'), + (0x1D7D0, 'M', u'2'), + (0x1D7D1, 'M', u'3'), + (0x1D7D2, 'M', u'4'), + (0x1D7D3, 'M', u'5'), + (0x1D7D4, 'M', u'6'), + (0x1D7D5, 'M', u'7'), + (0x1D7D6, 'M', u'8'), + (0x1D7D7, 'M', u'9'), + (0x1D7D8, 'M', u'0'), + (0x1D7D9, 'M', u'1'), + (0x1D7DA, 'M', u'2'), + (0x1D7DB, 'M', u'3'), + (0x1D7DC, 'M', u'4'), + (0x1D7DD, 'M', u'5'), + (0x1D7DE, 'M', u'6'), + (0x1D7DF, 'M', u'7'), + (0x1D7E0, 'M', u'8'), + (0x1D7E1, 'M', u'9'), + (0x1D7E2, 'M', u'0'), + (0x1D7E3, 'M', u'1'), + (0x1D7E4, 'M', u'2'), + (0x1D7E5, 'M', u'3'), + (0x1D7E6, 'M', u'4'), + (0x1D7E7, 'M', u'5'), + (0x1D7E8, 'M', u'6'), + (0x1D7E9, 'M', u'7'), + (0x1D7EA, 'M', u'8'), + (0x1D7EB, 'M', u'9'), + (0x1D7EC, 'M', u'0'), + (0x1D7ED, 'M', u'1'), + (0x1D7EE, 'M', u'2'), + (0x1D7EF, 'M', u'3'), + (0x1D7F0, 'M', u'4'), + (0x1D7F1, 'M', u'5'), + (0x1D7F2, 'M', u'6'), + (0x1D7F3, 'M', u'7'), + (0x1D7F4, 'M', u'8'), + (0x1D7F5, 'M', u'9'), + (0x1D7F6, 'M', u'0'), + (0x1D7F7, 'M', u'1'), + (0x1D7F8, 'M', u'2'), + (0x1D7F9, 'M', u'3'), + (0x1D7FA, 'M', u'4'), + (0x1D7FB, 'M', u'5'), + (0x1D7FC, 'M', u'6'), + (0x1D7FD, 'M', u'7'), + (0x1D7FE, 'M', u'8'), + (0x1D7FF, 'M', u'9'), + (0x1D800, 'X'), + (0x1EE00, 'M', u'ا'), + (0x1EE01, 'M', u'ب'), + (0x1EE02, 'M', u'ج'), + (0x1EE03, 'M', u'د'), + (0x1EE04, 'X'), + (0x1EE05, 'M', u'و'), + (0x1EE06, 'M', u'ز'), + (0x1EE07, 'M', u'ح'), + (0x1EE08, 'M', u'ط'), + (0x1EE09, 'M', u'ي'), + (0x1EE0A, 'M', u'ك'), + (0x1EE0B, 'M', u'ل'), + (0x1EE0C, 'M', u'م'), + (0x1EE0D, 'M', u'ن'), + (0x1EE0E, 'M', u'س'), + (0x1EE0F, 'M', u'ع'), + (0x1EE10, 'M', u'ف'), + (0x1EE11, 'M', u'ص'), + (0x1EE12, 'M', u'ق'), + (0x1EE13, 'M', u'ر'), + (0x1EE14, 'M', u'ش'), + (0x1EE15, 'M', u'ت'), + (0x1EE16, 'M', u'ث'), + (0x1EE17, 'M', u'خ'), + (0x1EE18, 'M', u'ذ'), + (0x1EE19, 'M', u'ض'), + (0x1EE1A, 'M', u'ظ'), + (0x1EE1B, 'M', u'غ'), + (0x1EE1C, 'M', u'ٮ'), + (0x1EE1D, 'M', u'ں'), + (0x1EE1E, 'M', u'ڡ'), + (0x1EE1F, 'M', u'ٯ'), + (0x1EE20, 'X'), + (0x1EE21, 'M', u'ب'), + (0x1EE22, 'M', u'ج'), + (0x1EE23, 'X'), + (0x1EE24, 'M', u'ه'), + (0x1EE25, 'X'), + (0x1EE27, 'M', u'ح'), + (0x1EE28, 'X'), + (0x1EE29, 'M', u'ي'), + (0x1EE2A, 'M', u'ك'), + (0x1EE2B, 'M', u'ل'), + (0x1EE2C, 'M', u'م'), + (0x1EE2D, 'M', u'ن'), + (0x1EE2E, 'M', u'س'), + (0x1EE2F, 'M', u'ع'), + (0x1EE30, 'M', u'ف'), + (0x1EE31, 'M', u'ص'), + (0x1EE32, 'M', u'ق'), + ] + +def _seg_64(): + return [ + (0x1EE33, 'X'), + (0x1EE34, 'M', u'ش'), + (0x1EE35, 'M', u'ت'), + (0x1EE36, 'M', u'ث'), + (0x1EE37, 'M', u'خ'), + (0x1EE38, 'X'), + (0x1EE39, 'M', u'ض'), + (0x1EE3A, 'X'), + (0x1EE3B, 'M', u'غ'), + (0x1EE3C, 'X'), + (0x1EE42, 'M', u'ج'), + (0x1EE43, 'X'), + (0x1EE47, 'M', u'ح'), + (0x1EE48, 'X'), + (0x1EE49, 'M', u'ي'), + (0x1EE4A, 'X'), + (0x1EE4B, 'M', u'ل'), + (0x1EE4C, 'X'), + (0x1EE4D, 'M', u'ن'), + (0x1EE4E, 'M', u'س'), + (0x1EE4F, 'M', u'ع'), + (0x1EE50, 'X'), + (0x1EE51, 'M', u'ص'), + (0x1EE52, 'M', u'ق'), + (0x1EE53, 'X'), + (0x1EE54, 'M', u'ش'), + (0x1EE55, 'X'), + (0x1EE57, 'M', u'خ'), + (0x1EE58, 'X'), + (0x1EE59, 'M', u'ض'), + (0x1EE5A, 'X'), + (0x1EE5B, 'M', u'غ'), + (0x1EE5C, 'X'), + (0x1EE5D, 'M', u'ں'), + (0x1EE5E, 'X'), + (0x1EE5F, 'M', u'ٯ'), + (0x1EE60, 'X'), + (0x1EE61, 'M', u'ب'), + (0x1EE62, 'M', u'ج'), + (0x1EE63, 'X'), + (0x1EE64, 'M', u'ه'), + (0x1EE65, 'X'), + (0x1EE67, 'M', u'ح'), + (0x1EE68, 'M', u'ط'), + (0x1EE69, 'M', u'ي'), + (0x1EE6A, 'M', u'ك'), + (0x1EE6B, 'X'), + (0x1EE6C, 'M', u'م'), + (0x1EE6D, 'M', u'ن'), + (0x1EE6E, 'M', u'س'), + (0x1EE6F, 'M', u'ع'), + (0x1EE70, 'M', u'ف'), + (0x1EE71, 'M', u'ص'), + (0x1EE72, 'M', u'ق'), + (0x1EE73, 'X'), + (0x1EE74, 'M', u'ش'), + (0x1EE75, 'M', u'ت'), + (0x1EE76, 'M', u'ث'), + (0x1EE77, 'M', u'خ'), + (0x1EE78, 'X'), + (0x1EE79, 'M', u'ض'), + (0x1EE7A, 'M', u'ظ'), + (0x1EE7B, 'M', u'غ'), + (0x1EE7C, 'M', u'ٮ'), + (0x1EE7D, 'X'), + (0x1EE7E, 'M', u'ڡ'), + (0x1EE7F, 'X'), + (0x1EE80, 'M', u'ا'), + (0x1EE81, 'M', u'ب'), + (0x1EE82, 'M', u'ج'), + (0x1EE83, 'M', u'د'), + (0x1EE84, 'M', u'ه'), + (0x1EE85, 'M', u'و'), + (0x1EE86, 'M', u'ز'), + (0x1EE87, 'M', u'ح'), + (0x1EE88, 'M', u'ط'), + (0x1EE89, 'M', u'ي'), + (0x1EE8A, 'X'), + (0x1EE8B, 'M', u'ل'), + (0x1EE8C, 'M', u'م'), + (0x1EE8D, 'M', u'ن'), + (0x1EE8E, 'M', u'س'), + (0x1EE8F, 'M', u'ع'), + (0x1EE90, 'M', u'ف'), + (0x1EE91, 'M', u'ص'), + (0x1EE92, 'M', u'ق'), + (0x1EE93, 'M', u'ر'), + (0x1EE94, 'M', u'ش'), + (0x1EE95, 'M', u'ت'), + (0x1EE96, 'M', u'ث'), + (0x1EE97, 'M', u'خ'), + (0x1EE98, 'M', u'ذ'), + (0x1EE99, 'M', u'ض'), + (0x1EE9A, 'M', u'ظ'), + (0x1EE9B, 'M', u'غ'), + (0x1EE9C, 'X'), + (0x1EEA1, 'M', u'ب'), + (0x1EEA2, 'M', u'ج'), + (0x1EEA3, 'M', u'د'), + (0x1EEA4, 'X'), + ] + +def _seg_65(): + return [ + (0x1EEA5, 'M', u'و'), + (0x1EEA6, 'M', u'ز'), + (0x1EEA7, 'M', u'ح'), + (0x1EEA8, 'M', u'ط'), + (0x1EEA9, 'M', u'ي'), + (0x1EEAA, 'X'), + (0x1EEAB, 'M', u'ل'), + (0x1EEAC, 'M', u'م'), + (0x1EEAD, 'M', u'ن'), + (0x1EEAE, 'M', u'س'), + (0x1EEAF, 'M', u'ع'), + (0x1EEB0, 'M', u'ف'), + (0x1EEB1, 'M', u'ص'), + (0x1EEB2, 'M', u'ق'), + (0x1EEB3, 'M', u'ر'), + (0x1EEB4, 'M', u'ش'), + (0x1EEB5, 'M', u'ت'), + (0x1EEB6, 'M', u'ث'), + (0x1EEB7, 'M', u'خ'), + (0x1EEB8, 'M', u'ذ'), + (0x1EEB9, 'M', u'ض'), + (0x1EEBA, 'M', u'ظ'), + (0x1EEBB, 'M', u'غ'), + (0x1EEBC, 'X'), + (0x1EEF0, 'V'), + (0x1EEF2, 'X'), + (0x1F000, 'V'), + (0x1F02C, 'X'), + (0x1F030, 'V'), + (0x1F094, 'X'), + (0x1F0A0, 'V'), + (0x1F0AF, 'X'), + (0x1F0B1, 'V'), + (0x1F0BF, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0E0, 'X'), + (0x1F101, '3', u'0,'), + (0x1F102, '3', u'1,'), + (0x1F103, '3', u'2,'), + (0x1F104, '3', u'3,'), + (0x1F105, '3', u'4,'), + (0x1F106, '3', u'5,'), + (0x1F107, '3', u'6,'), + (0x1F108, '3', u'7,'), + (0x1F109, '3', u'8,'), + (0x1F10A, '3', u'9,'), + (0x1F10B, 'X'), + (0x1F110, '3', u'(a)'), + (0x1F111, '3', u'(b)'), + (0x1F112, '3', u'(c)'), + (0x1F113, '3', u'(d)'), + (0x1F114, '3', u'(e)'), + (0x1F115, '3', u'(f)'), + (0x1F116, '3', u'(g)'), + (0x1F117, '3', u'(h)'), + (0x1F118, '3', u'(i)'), + (0x1F119, '3', u'(j)'), + (0x1F11A, '3', u'(k)'), + (0x1F11B, '3', u'(l)'), + (0x1F11C, '3', u'(m)'), + (0x1F11D, '3', u'(n)'), + (0x1F11E, '3', u'(o)'), + (0x1F11F, '3', u'(p)'), + (0x1F120, '3', u'(q)'), + (0x1F121, '3', u'(r)'), + (0x1F122, '3', u'(s)'), + (0x1F123, '3', u'(t)'), + (0x1F124, '3', u'(u)'), + (0x1F125, '3', u'(v)'), + (0x1F126, '3', u'(w)'), + (0x1F127, '3', u'(x)'), + (0x1F128, '3', u'(y)'), + (0x1F129, '3', u'(z)'), + (0x1F12A, 'M', u'〔s〕'), + (0x1F12B, 'M', u'c'), + (0x1F12C, 'M', u'r'), + (0x1F12D, 'M', u'cd'), + (0x1F12E, 'M', u'wz'), + (0x1F12F, 'X'), + (0x1F130, 'M', u'a'), + (0x1F131, 'M', u'b'), + (0x1F132, 'M', u'c'), + (0x1F133, 'M', u'd'), + (0x1F134, 'M', u'e'), + (0x1F135, 'M', u'f'), + (0x1F136, 'M', u'g'), + (0x1F137, 'M', u'h'), + (0x1F138, 'M', u'i'), + (0x1F139, 'M', u'j'), + (0x1F13A, 'M', u'k'), + (0x1F13B, 'M', u'l'), + (0x1F13C, 'M', u'm'), + (0x1F13D, 'M', u'n'), + (0x1F13E, 'M', u'o'), + (0x1F13F, 'M', u'p'), + (0x1F140, 'M', u'q'), + (0x1F141, 'M', u'r'), + (0x1F142, 'M', u's'), + ] + +def _seg_66(): + return [ + (0x1F143, 'M', u't'), + (0x1F144, 'M', u'u'), + (0x1F145, 'M', u'v'), + (0x1F146, 'M', u'w'), + (0x1F147, 'M', u'x'), + (0x1F148, 'M', u'y'), + (0x1F149, 'M', u'z'), + (0x1F14A, 'M', u'hv'), + (0x1F14B, 'M', u'mv'), + (0x1F14C, 'M', u'sd'), + (0x1F14D, 'M', u'ss'), + (0x1F14E, 'M', u'ppv'), + (0x1F14F, 'M', u'wc'), + (0x1F150, 'V'), + (0x1F16A, 'M', u'mc'), + (0x1F16B, 'M', u'md'), + (0x1F16C, 'X'), + (0x1F170, 'V'), + (0x1F190, 'M', u'dj'), + (0x1F191, 'V'), + (0x1F19B, 'X'), + (0x1F1E6, 'V'), + (0x1F200, 'M', u'ほか'), + (0x1F201, 'M', u'ココ'), + (0x1F202, 'M', u'サ'), + (0x1F203, 'X'), + (0x1F210, 'M', u'手'), + (0x1F211, 'M', u'字'), + (0x1F212, 'M', u'双'), + (0x1F213, 'M', u'デ'), + (0x1F214, 'M', u'二'), + (0x1F215, 'M', u'多'), + (0x1F216, 'M', u'解'), + (0x1F217, 'M', u'天'), + (0x1F218, 'M', u'交'), + (0x1F219, 'M', u'映'), + (0x1F21A, 'M', u'無'), + (0x1F21B, 'M', u'料'), + (0x1F21C, 'M', u'前'), + (0x1F21D, 'M', u'後'), + (0x1F21E, 'M', u'再'), + (0x1F21F, 'M', u'新'), + (0x1F220, 'M', u'初'), + (0x1F221, 'M', u'終'), + (0x1F222, 'M', u'生'), + (0x1F223, 'M', u'販'), + (0x1F224, 'M', u'声'), + (0x1F225, 'M', u'吹'), + (0x1F226, 'M', u'演'), + (0x1F227, 'M', u'投'), + (0x1F228, 'M', u'捕'), + (0x1F229, 'M', u'一'), + (0x1F22A, 'M', u'三'), + (0x1F22B, 'M', u'遊'), + (0x1F22C, 'M', u'左'), + (0x1F22D, 'M', u'中'), + (0x1F22E, 'M', u'右'), + (0x1F22F, 'M', u'指'), + (0x1F230, 'M', u'走'), + (0x1F231, 'M', u'打'), + (0x1F232, 'M', u'禁'), + (0x1F233, 'M', u'空'), + (0x1F234, 'M', u'合'), + (0x1F235, 'M', u'満'), + (0x1F236, 'M', u'有'), + (0x1F237, 'M', u'月'), + (0x1F238, 'M', u'申'), + (0x1F239, 'M', u'割'), + (0x1F23A, 'M', u'営'), + (0x1F23B, 'X'), + (0x1F240, 'M', u'〔本〕'), + (0x1F241, 'M', u'〔三〕'), + (0x1F242, 'M', u'〔二〕'), + (0x1F243, 'M', u'〔安〕'), + (0x1F244, 'M', u'〔点〕'), + (0x1F245, 'M', u'〔打〕'), + (0x1F246, 'M', u'〔盗〕'), + (0x1F247, 'M', u'〔勝〕'), + (0x1F248, 'M', u'〔敗〕'), + (0x1F249, 'X'), + (0x1F250, 'M', u'得'), + (0x1F251, 'M', u'可'), + (0x1F252, 'X'), + (0x1F300, 'V'), + (0x1F321, 'X'), + (0x1F330, 'V'), + (0x1F336, 'X'), + (0x1F337, 'V'), + (0x1F37D, 'X'), + (0x1F380, 'V'), + (0x1F394, 'X'), + (0x1F3A0, 'V'), + (0x1F3C5, 'X'), + (0x1F3C6, 'V'), + (0x1F3CB, 'X'), + (0x1F3E0, 'V'), + (0x1F3F1, 'X'), + (0x1F400, 'V'), + (0x1F43F, 'X'), + (0x1F440, 'V'), + ] + +def _seg_67(): + return [ + (0x1F441, 'X'), + (0x1F442, 'V'), + (0x1F4F8, 'X'), + (0x1F4F9, 'V'), + (0x1F4FD, 'X'), + (0x1F500, 'V'), + (0x1F53E, 'X'), + (0x1F540, 'V'), + (0x1F544, 'X'), + (0x1F550, 'V'), + (0x1F568, 'X'), + (0x1F5FB, 'V'), + (0x1F641, 'X'), + (0x1F645, 'V'), + (0x1F650, 'X'), + (0x1F680, 'V'), + (0x1F6C6, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2F800, 'M', u'丽'), + (0x2F801, 'M', u'丸'), + (0x2F802, 'M', u'乁'), + (0x2F803, 'M', u'𠄢'), + (0x2F804, 'M', u'你'), + (0x2F805, 'M', u'侮'), + (0x2F806, 'M', u'侻'), + (0x2F807, 'M', u'倂'), + (0x2F808, 'M', u'偺'), + (0x2F809, 'M', u'備'), + (0x2F80A, 'M', u'僧'), + (0x2F80B, 'M', u'像'), + (0x2F80C, 'M', u'㒞'), + (0x2F80D, 'M', u'𠘺'), + (0x2F80E, 'M', u'免'), + (0x2F80F, 'M', u'兔'), + (0x2F810, 'M', u'兤'), + (0x2F811, 'M', u'具'), + (0x2F812, 'M', u'𠔜'), + (0x2F813, 'M', u'㒹'), + (0x2F814, 'M', u'內'), + (0x2F815, 'M', u'再'), + (0x2F816, 'M', u'𠕋'), + (0x2F817, 'M', u'冗'), + (0x2F818, 'M', u'冤'), + (0x2F819, 'M', u'仌'), + (0x2F81A, 'M', u'冬'), + (0x2F81B, 'M', u'况'), + (0x2F81C, 'M', u'𩇟'), + (0x2F81D, 'M', u'凵'), + (0x2F81E, 'M', u'刃'), + (0x2F81F, 'M', u'㓟'), + (0x2F820, 'M', u'刻'), + (0x2F821, 'M', u'剆'), + (0x2F822, 'M', u'割'), + (0x2F823, 'M', u'剷'), + (0x2F824, 'M', u'㔕'), + (0x2F825, 'M', u'勇'), + (0x2F826, 'M', u'勉'), + (0x2F827, 'M', u'勤'), + (0x2F828, 'M', u'勺'), + (0x2F829, 'M', u'包'), + (0x2F82A, 'M', u'匆'), + (0x2F82B, 'M', u'北'), + (0x2F82C, 'M', u'卉'), + (0x2F82D, 'M', u'卑'), + (0x2F82E, 'M', u'博'), + (0x2F82F, 'M', u'即'), + (0x2F830, 'M', u'卽'), + (0x2F831, 'M', u'卿'), + (0x2F834, 'M', u'𠨬'), + (0x2F835, 'M', u'灰'), + (0x2F836, 'M', u'及'), + (0x2F837, 'M', u'叟'), + (0x2F838, 'M', u'𠭣'), + (0x2F839, 'M', u'叫'), + (0x2F83A, 'M', u'叱'), + (0x2F83B, 'M', u'吆'), + (0x2F83C, 'M', u'咞'), + (0x2F83D, 'M', u'吸'), + (0x2F83E, 'M', u'呈'), + (0x2F83F, 'M', u'周'), + (0x2F840, 'M', u'咢'), + (0x2F841, 'M', u'哶'), + (0x2F842, 'M', u'唐'), + (0x2F843, 'M', u'啓'), + (0x2F844, 'M', u'啣'), + (0x2F845, 'M', u'善'), + (0x2F847, 'M', u'喙'), + (0x2F848, 'M', u'喫'), + (0x2F849, 'M', u'喳'), + (0x2F84A, 'M', u'嗂'), + (0x2F84B, 'M', u'圖'), + (0x2F84C, 'M', u'嘆'), + (0x2F84D, 'M', u'圗'), + ] + +def _seg_68(): + return [ + (0x2F84E, 'M', u'噑'), + (0x2F84F, 'M', u'噴'), + (0x2F850, 'M', u'切'), + (0x2F851, 'M', u'壮'), + (0x2F852, 'M', u'城'), + (0x2F853, 'M', u'埴'), + (0x2F854, 'M', u'堍'), + (0x2F855, 'M', u'型'), + (0x2F856, 'M', u'堲'), + (0x2F857, 'M', u'報'), + (0x2F858, 'M', u'墬'), + (0x2F859, 'M', u'𡓤'), + (0x2F85A, 'M', u'売'), + (0x2F85B, 'M', u'壷'), + (0x2F85C, 'M', u'夆'), + (0x2F85D, 'M', u'多'), + (0x2F85E, 'M', u'夢'), + (0x2F85F, 'M', u'奢'), + (0x2F860, 'M', u'𡚨'), + (0x2F861, 'M', u'𡛪'), + (0x2F862, 'M', u'姬'), + (0x2F863, 'M', u'娛'), + (0x2F864, 'M', u'娧'), + (0x2F865, 'M', u'姘'), + (0x2F866, 'M', u'婦'), + (0x2F867, 'M', u'㛮'), + (0x2F868, 'X'), + (0x2F869, 'M', u'嬈'), + (0x2F86A, 'M', u'嬾'), + (0x2F86C, 'M', u'𡧈'), + (0x2F86D, 'M', u'寃'), + (0x2F86E, 'M', u'寘'), + (0x2F86F, 'M', u'寧'), + (0x2F870, 'M', u'寳'), + (0x2F871, 'M', u'𡬘'), + (0x2F872, 'M', u'寿'), + (0x2F873, 'M', u'将'), + (0x2F874, 'X'), + (0x2F875, 'M', u'尢'), + (0x2F876, 'M', u'㞁'), + (0x2F877, 'M', u'屠'), + (0x2F878, 'M', u'屮'), + (0x2F879, 'M', u'峀'), + (0x2F87A, 'M', u'岍'), + (0x2F87B, 'M', u'𡷤'), + (0x2F87C, 'M', u'嵃'), + (0x2F87D, 'M', u'𡷦'), + (0x2F87E, 'M', u'嵮'), + (0x2F87F, 'M', u'嵫'), + (0x2F880, 'M', u'嵼'), + (0x2F881, 'M', u'巡'), + (0x2F882, 'M', u'巢'), + (0x2F883, 'M', u'㠯'), + (0x2F884, 'M', u'巽'), + (0x2F885, 'M', u'帨'), + (0x2F886, 'M', u'帽'), + (0x2F887, 'M', u'幩'), + (0x2F888, 'M', u'㡢'), + (0x2F889, 'M', u'𢆃'), + (0x2F88A, 'M', u'㡼'), + (0x2F88B, 'M', u'庰'), + (0x2F88C, 'M', u'庳'), + (0x2F88D, 'M', u'庶'), + (0x2F88E, 'M', u'廊'), + (0x2F88F, 'M', u'𪎒'), + (0x2F890, 'M', u'廾'), + (0x2F891, 'M', u'𢌱'), + (0x2F893, 'M', u'舁'), + (0x2F894, 'M', u'弢'), + (0x2F896, 'M', u'㣇'), + (0x2F897, 'M', u'𣊸'), + (0x2F898, 'M', u'𦇚'), + (0x2F899, 'M', u'形'), + (0x2F89A, 'M', u'彫'), + (0x2F89B, 'M', u'㣣'), + (0x2F89C, 'M', u'徚'), + (0x2F89D, 'M', u'忍'), + (0x2F89E, 'M', u'志'), + (0x2F89F, 'M', u'忹'), + (0x2F8A0, 'M', u'悁'), + (0x2F8A1, 'M', u'㤺'), + (0x2F8A2, 'M', u'㤜'), + (0x2F8A3, 'M', u'悔'), + (0x2F8A4, 'M', u'𢛔'), + (0x2F8A5, 'M', u'惇'), + (0x2F8A6, 'M', u'慈'), + (0x2F8A7, 'M', u'慌'), + (0x2F8A8, 'M', u'慎'), + (0x2F8A9, 'M', u'慌'), + (0x2F8AA, 'M', u'慺'), + (0x2F8AB, 'M', u'憎'), + (0x2F8AC, 'M', u'憲'), + (0x2F8AD, 'M', u'憤'), + (0x2F8AE, 'M', u'憯'), + (0x2F8AF, 'M', u'懞'), + (0x2F8B0, 'M', u'懲'), + (0x2F8B1, 'M', u'懶'), + (0x2F8B2, 'M', u'成'), + (0x2F8B3, 'M', u'戛'), + (0x2F8B4, 'M', u'扝'), + ] + +def _seg_69(): + return [ + (0x2F8B5, 'M', u'抱'), + (0x2F8B6, 'M', u'拔'), + (0x2F8B7, 'M', u'捐'), + (0x2F8B8, 'M', u'𢬌'), + (0x2F8B9, 'M', u'挽'), + (0x2F8BA, 'M', u'拼'), + (0x2F8BB, 'M', u'捨'), + (0x2F8BC, 'M', u'掃'), + (0x2F8BD, 'M', u'揤'), + (0x2F8BE, 'M', u'𢯱'), + (0x2F8BF, 'M', u'搢'), + (0x2F8C0, 'M', u'揅'), + (0x2F8C1, 'M', u'掩'), + (0x2F8C2, 'M', u'㨮'), + (0x2F8C3, 'M', u'摩'), + (0x2F8C4, 'M', u'摾'), + (0x2F8C5, 'M', u'撝'), + (0x2F8C6, 'M', u'摷'), + (0x2F8C7, 'M', u'㩬'), + (0x2F8C8, 'M', u'敏'), + (0x2F8C9, 'M', u'敬'), + (0x2F8CA, 'M', u'𣀊'), + (0x2F8CB, 'M', u'旣'), + (0x2F8CC, 'M', u'書'), + (0x2F8CD, 'M', u'晉'), + (0x2F8CE, 'M', u'㬙'), + (0x2F8CF, 'M', u'暑'), + (0x2F8D0, 'M', u'㬈'), + (0x2F8D1, 'M', u'㫤'), + (0x2F8D2, 'M', u'冒'), + (0x2F8D3, 'M', u'冕'), + (0x2F8D4, 'M', u'最'), + (0x2F8D5, 'M', u'暜'), + (0x2F8D6, 'M', u'肭'), + (0x2F8D7, 'M', u'䏙'), + (0x2F8D8, 'M', u'朗'), + (0x2F8D9, 'M', u'望'), + (0x2F8DA, 'M', u'朡'), + (0x2F8DB, 'M', u'杞'), + (0x2F8DC, 'M', u'杓'), + (0x2F8DD, 'M', u'𣏃'), + (0x2F8DE, 'M', u'㭉'), + (0x2F8DF, 'M', u'柺'), + (0x2F8E0, 'M', u'枅'), + (0x2F8E1, 'M', u'桒'), + (0x2F8E2, 'M', u'梅'), + (0x2F8E3, 'M', u'𣑭'), + (0x2F8E4, 'M', u'梎'), + (0x2F8E5, 'M', u'栟'), + (0x2F8E6, 'M', u'椔'), + (0x2F8E7, 'M', u'㮝'), + (0x2F8E8, 'M', u'楂'), + (0x2F8E9, 'M', u'榣'), + (0x2F8EA, 'M', u'槪'), + (0x2F8EB, 'M', u'檨'), + (0x2F8EC, 'M', u'𣚣'), + (0x2F8ED, 'M', u'櫛'), + (0x2F8EE, 'M', u'㰘'), + (0x2F8EF, 'M', u'次'), + (0x2F8F0, 'M', u'𣢧'), + (0x2F8F1, 'M', u'歔'), + (0x2F8F2, 'M', u'㱎'), + (0x2F8F3, 'M', u'歲'), + (0x2F8F4, 'M', u'殟'), + (0x2F8F5, 'M', u'殺'), + (0x2F8F6, 'M', u'殻'), + (0x2F8F7, 'M', u'𣪍'), + (0x2F8F8, 'M', u'𡴋'), + (0x2F8F9, 'M', u'𣫺'), + (0x2F8FA, 'M', u'汎'), + (0x2F8FB, 'M', u'𣲼'), + (0x2F8FC, 'M', u'沿'), + (0x2F8FD, 'M', u'泍'), + (0x2F8FE, 'M', u'汧'), + (0x2F8FF, 'M', u'洖'), + (0x2F900, 'M', u'派'), + (0x2F901, 'M', u'海'), + (0x2F902, 'M', u'流'), + (0x2F903, 'M', u'浩'), + (0x2F904, 'M', u'浸'), + (0x2F905, 'M', u'涅'), + (0x2F906, 'M', u'𣴞'), + (0x2F907, 'M', u'洴'), + (0x2F908, 'M', u'港'), + (0x2F909, 'M', u'湮'), + (0x2F90A, 'M', u'㴳'), + (0x2F90B, 'M', u'滋'), + (0x2F90C, 'M', u'滇'), + (0x2F90D, 'M', u'𣻑'), + (0x2F90E, 'M', u'淹'), + (0x2F90F, 'M', u'潮'), + (0x2F910, 'M', u'𣽞'), + (0x2F911, 'M', u'𣾎'), + (0x2F912, 'M', u'濆'), + (0x2F913, 'M', u'瀹'), + (0x2F914, 'M', u'瀞'), + (0x2F915, 'M', u'瀛'), + (0x2F916, 'M', u'㶖'), + (0x2F917, 'M', u'灊'), + (0x2F918, 'M', u'災'), + ] + +def _seg_70(): + return [ + (0x2F919, 'M', u'灷'), + (0x2F91A, 'M', u'炭'), + (0x2F91B, 'M', u'𠔥'), + (0x2F91C, 'M', u'煅'), + (0x2F91D, 'M', u'𤉣'), + (0x2F91E, 'M', u'熜'), + (0x2F91F, 'X'), + (0x2F920, 'M', u'爨'), + (0x2F921, 'M', u'爵'), + (0x2F922, 'M', u'牐'), + (0x2F923, 'M', u'𤘈'), + (0x2F924, 'M', u'犀'), + (0x2F925, 'M', u'犕'), + (0x2F926, 'M', u'𤜵'), + (0x2F927, 'M', u'𤠔'), + (0x2F928, 'M', u'獺'), + (0x2F929, 'M', u'王'), + (0x2F92A, 'M', u'㺬'), + (0x2F92B, 'M', u'玥'), + (0x2F92C, 'M', u'㺸'), + (0x2F92E, 'M', u'瑇'), + (0x2F92F, 'M', u'瑜'), + (0x2F930, 'M', u'瑱'), + (0x2F931, 'M', u'璅'), + (0x2F932, 'M', u'瓊'), + (0x2F933, 'M', u'㼛'), + (0x2F934, 'M', u'甤'), + (0x2F935, 'M', u'𤰶'), + (0x2F936, 'M', u'甾'), + (0x2F937, 'M', u'𤲒'), + (0x2F938, 'M', u'異'), + (0x2F939, 'M', u'𢆟'), + (0x2F93A, 'M', u'瘐'), + (0x2F93B, 'M', u'𤾡'), + (0x2F93C, 'M', u'𤾸'), + (0x2F93D, 'M', u'𥁄'), + (0x2F93E, 'M', u'㿼'), + (0x2F93F, 'M', u'䀈'), + (0x2F940, 'M', u'直'), + (0x2F941, 'M', u'𥃳'), + (0x2F942, 'M', u'𥃲'), + (0x2F943, 'M', u'𥄙'), + (0x2F944, 'M', u'𥄳'), + (0x2F945, 'M', u'眞'), + (0x2F946, 'M', u'真'), + (0x2F948, 'M', u'睊'), + (0x2F949, 'M', u'䀹'), + (0x2F94A, 'M', u'瞋'), + (0x2F94B, 'M', u'䁆'), + (0x2F94C, 'M', u'䂖'), + (0x2F94D, 'M', u'𥐝'), + (0x2F94E, 'M', u'硎'), + (0x2F94F, 'M', u'碌'), + (0x2F950, 'M', u'磌'), + (0x2F951, 'M', u'䃣'), + (0x2F952, 'M', u'𥘦'), + (0x2F953, 'M', u'祖'), + (0x2F954, 'M', u'𥚚'), + (0x2F955, 'M', u'𥛅'), + (0x2F956, 'M', u'福'), + (0x2F957, 'M', u'秫'), + (0x2F958, 'M', u'䄯'), + (0x2F959, 'M', u'穀'), + (0x2F95A, 'M', u'穊'), + (0x2F95B, 'M', u'穏'), + (0x2F95C, 'M', u'𥥼'), + (0x2F95D, 'M', u'𥪧'), + (0x2F95F, 'X'), + (0x2F960, 'M', u'䈂'), + (0x2F961, 'M', u'𥮫'), + (0x2F962, 'M', u'篆'), + (0x2F963, 'M', u'築'), + (0x2F964, 'M', u'䈧'), + (0x2F965, 'M', u'𥲀'), + (0x2F966, 'M', u'糒'), + (0x2F967, 'M', u'䊠'), + (0x2F968, 'M', u'糨'), + (0x2F969, 'M', u'糣'), + (0x2F96A, 'M', u'紀'), + (0x2F96B, 'M', u'𥾆'), + (0x2F96C, 'M', u'絣'), + (0x2F96D, 'M', u'䌁'), + (0x2F96E, 'M', u'緇'), + (0x2F96F, 'M', u'縂'), + (0x2F970, 'M', u'繅'), + (0x2F971, 'M', u'䌴'), + (0x2F972, 'M', u'𦈨'), + (0x2F973, 'M', u'𦉇'), + (0x2F974, 'M', u'䍙'), + (0x2F975, 'M', u'𦋙'), + (0x2F976, 'M', u'罺'), + (0x2F977, 'M', u'𦌾'), + (0x2F978, 'M', u'羕'), + (0x2F979, 'M', u'翺'), + (0x2F97A, 'M', u'者'), + (0x2F97B, 'M', u'𦓚'), + (0x2F97C, 'M', u'𦔣'), + (0x2F97D, 'M', u'聠'), + (0x2F97E, 'M', u'𦖨'), + (0x2F97F, 'M', u'聰'), + ] + +def _seg_71(): + return [ + (0x2F980, 'M', u'𣍟'), + (0x2F981, 'M', u'䏕'), + (0x2F982, 'M', u'育'), + (0x2F983, 'M', u'脃'), + (0x2F984, 'M', u'䐋'), + (0x2F985, 'M', u'脾'), + (0x2F986, 'M', u'媵'), + (0x2F987, 'M', u'𦞧'), + (0x2F988, 'M', u'𦞵'), + (0x2F989, 'M', u'𣎓'), + (0x2F98A, 'M', u'𣎜'), + (0x2F98B, 'M', u'舁'), + (0x2F98C, 'M', u'舄'), + (0x2F98D, 'M', u'辞'), + (0x2F98E, 'M', u'䑫'), + (0x2F98F, 'M', u'芑'), + (0x2F990, 'M', u'芋'), + (0x2F991, 'M', u'芝'), + (0x2F992, 'M', u'劳'), + (0x2F993, 'M', u'花'), + (0x2F994, 'M', u'芳'), + (0x2F995, 'M', u'芽'), + (0x2F996, 'M', u'苦'), + (0x2F997, 'M', u'𦬼'), + (0x2F998, 'M', u'若'), + (0x2F999, 'M', u'茝'), + (0x2F99A, 'M', u'荣'), + (0x2F99B, 'M', u'莭'), + (0x2F99C, 'M', u'茣'), + (0x2F99D, 'M', u'莽'), + (0x2F99E, 'M', u'菧'), + (0x2F99F, 'M', u'著'), + (0x2F9A0, 'M', u'荓'), + (0x2F9A1, 'M', u'菊'), + (0x2F9A2, 'M', u'菌'), + (0x2F9A3, 'M', u'菜'), + (0x2F9A4, 'M', u'𦰶'), + (0x2F9A5, 'M', u'𦵫'), + (0x2F9A6, 'M', u'𦳕'), + (0x2F9A7, 'M', u'䔫'), + (0x2F9A8, 'M', u'蓱'), + (0x2F9A9, 'M', u'蓳'), + (0x2F9AA, 'M', u'蔖'), + (0x2F9AB, 'M', u'𧏊'), + (0x2F9AC, 'M', u'蕤'), + (0x2F9AD, 'M', u'𦼬'), + (0x2F9AE, 'M', u'䕝'), + (0x2F9AF, 'M', u'䕡'), + (0x2F9B0, 'M', u'𦾱'), + (0x2F9B1, 'M', u'𧃒'), + (0x2F9B2, 'M', u'䕫'), + (0x2F9B3, 'M', u'虐'), + (0x2F9B4, 'M', u'虜'), + (0x2F9B5, 'M', u'虧'), + (0x2F9B6, 'M', u'虩'), + (0x2F9B7, 'M', u'蚩'), + (0x2F9B8, 'M', u'蚈'), + (0x2F9B9, 'M', u'蜎'), + (0x2F9BA, 'M', u'蛢'), + (0x2F9BB, 'M', u'蝹'), + (0x2F9BC, 'M', u'蜨'), + (0x2F9BD, 'M', u'蝫'), + (0x2F9BE, 'M', u'螆'), + (0x2F9BF, 'X'), + (0x2F9C0, 'M', u'蟡'), + (0x2F9C1, 'M', u'蠁'), + (0x2F9C2, 'M', u'䗹'), + (0x2F9C3, 'M', u'衠'), + (0x2F9C4, 'M', u'衣'), + (0x2F9C5, 'M', u'𧙧'), + (0x2F9C6, 'M', u'裗'), + (0x2F9C7, 'M', u'裞'), + (0x2F9C8, 'M', u'䘵'), + (0x2F9C9, 'M', u'裺'), + (0x2F9CA, 'M', u'㒻'), + (0x2F9CB, 'M', u'𧢮'), + (0x2F9CC, 'M', u'𧥦'), + (0x2F9CD, 'M', u'䚾'), + (0x2F9CE, 'M', u'䛇'), + (0x2F9CF, 'M', u'誠'), + (0x2F9D0, 'M', u'諭'), + (0x2F9D1, 'M', u'變'), + (0x2F9D2, 'M', u'豕'), + (0x2F9D3, 'M', u'𧲨'), + (0x2F9D4, 'M', u'貫'), + (0x2F9D5, 'M', u'賁'), + (0x2F9D6, 'M', u'贛'), + (0x2F9D7, 'M', u'起'), + (0x2F9D8, 'M', u'𧼯'), + (0x2F9D9, 'M', u'𠠄'), + (0x2F9DA, 'M', u'跋'), + (0x2F9DB, 'M', u'趼'), + (0x2F9DC, 'M', u'跰'), + (0x2F9DD, 'M', u'𠣞'), + (0x2F9DE, 'M', u'軔'), + (0x2F9DF, 'M', u'輸'), + (0x2F9E0, 'M', u'𨗒'), + (0x2F9E1, 'M', u'𨗭'), + (0x2F9E2, 'M', u'邔'), + (0x2F9E3, 'M', u'郱'), + ] + +def _seg_72(): + return [ + (0x2F9E4, 'M', u'鄑'), + (0x2F9E5, 'M', u'𨜮'), + (0x2F9E6, 'M', u'鄛'), + (0x2F9E7, 'M', u'鈸'), + (0x2F9E8, 'M', u'鋗'), + (0x2F9E9, 'M', u'鋘'), + (0x2F9EA, 'M', u'鉼'), + (0x2F9EB, 'M', u'鏹'), + (0x2F9EC, 'M', u'鐕'), + (0x2F9ED, 'M', u'𨯺'), + (0x2F9EE, 'M', u'開'), + (0x2F9EF, 'M', u'䦕'), + (0x2F9F0, 'M', u'閷'), + (0x2F9F1, 'M', u'𨵷'), + (0x2F9F2, 'M', u'䧦'), + (0x2F9F3, 'M', u'雃'), + (0x2F9F4, 'M', u'嶲'), + (0x2F9F5, 'M', u'霣'), + (0x2F9F6, 'M', u'𩅅'), + (0x2F9F7, 'M', u'𩈚'), + (0x2F9F8, 'M', u'䩮'), + (0x2F9F9, 'M', u'䩶'), + (0x2F9FA, 'M', u'韠'), + (0x2F9FB, 'M', u'𩐊'), + (0x2F9FC, 'M', u'䪲'), + (0x2F9FD, 'M', u'𩒖'), + (0x2F9FE, 'M', u'頋'), + (0x2FA00, 'M', u'頩'), + (0x2FA01, 'M', u'𩖶'), + (0x2FA02, 'M', u'飢'), + (0x2FA03, 'M', u'䬳'), + (0x2FA04, 'M', u'餩'), + (0x2FA05, 'M', u'馧'), + (0x2FA06, 'M', u'駂'), + (0x2FA07, 'M', u'駾'), + (0x2FA08, 'M', u'䯎'), + (0x2FA09, 'M', u'𩬰'), + (0x2FA0A, 'M', u'鬒'), + (0x2FA0B, 'M', u'鱀'), + (0x2FA0C, 'M', u'鳽'), + (0x2FA0D, 'M', u'䳎'), + (0x2FA0E, 'M', u'䳭'), + (0x2FA0F, 'M', u'鵧'), + (0x2FA10, 'M', u'𪃎'), + (0x2FA11, 'M', u'䳸'), + (0x2FA12, 'M', u'𪄅'), + (0x2FA13, 'M', u'𪈎'), + (0x2FA14, 'M', u'𪊑'), + (0x2FA15, 'M', u'麻'), + (0x2FA16, 'M', u'䵖'), + (0x2FA17, 'M', u'黹'), + (0x2FA18, 'M', u'黾'), + (0x2FA19, 'M', u'鼅'), + (0x2FA1A, 'M', u'鼏'), + (0x2FA1B, 'M', u'鼖'), + (0x2FA1C, 'M', u'鼻'), + (0x2FA1D, 'M', u'𪘀'), + (0x2FA1E, 'X'), + (0xE0100, 'I'), + (0xE01F0, 'X'), + ] + +uts46data = tuple( + _seg_0() + + _seg_1() + + _seg_2() + + _seg_3() + + _seg_4() + + _seg_5() + + _seg_6() + + _seg_7() + + _seg_8() + + _seg_9() + + _seg_10() + + _seg_11() + + _seg_12() + + _seg_13() + + _seg_14() + + _seg_15() + + _seg_16() + + _seg_17() + + _seg_18() + + _seg_19() + + _seg_20() + + _seg_21() + + _seg_22() + + _seg_23() + + _seg_24() + + _seg_25() + + _seg_26() + + _seg_27() + + _seg_28() + + _seg_29() + + _seg_30() + + _seg_31() + + _seg_32() + + _seg_33() + + _seg_34() + + _seg_35() + + _seg_36() + + _seg_37() + + _seg_38() + + _seg_39() + + _seg_40() + + _seg_41() + + _seg_42() + + _seg_43() + + _seg_44() + + _seg_45() + + _seg_46() + + _seg_47() + + _seg_48() + + _seg_49() + + _seg_50() + + _seg_51() + + _seg_52() + + _seg_53() + + _seg_54() + + _seg_55() + + _seg_56() + + _seg_57() + + _seg_58() + + _seg_59() + + _seg_60() + + _seg_61() + + _seg_62() + + _seg_63() + + _seg_64() + + _seg_65() + + _seg_66() + + _seg_67() + + _seg_68() + + _seg_69() + + _seg_70() + + _seg_71() + + _seg_72() +) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py b/myenv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py new file mode 100644 index 000000000..6da8d93c7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/ipaddress.py @@ -0,0 +1,2419 @@ +# Copyright 2007 Google Inc. +# Licensed to PSF under a Contributor Agreement. + +"""A fast, lightweight IPv4/IPv6 manipulation library in Python. + +This library is used to create/poke/manipulate IPv4 and IPv6 addresses +and networks. + +""" + +from __future__ import unicode_literals + + +import itertools +import struct + +__version__ = '1.0.19' + +# Compatibility functions +_compat_int_types = (int,) +try: + _compat_int_types = (int, long) +except NameError: + pass +try: + _compat_str = unicode +except NameError: + _compat_str = str + assert bytes != str +if b'\0'[0] == 0: # Python 3 semantics + def _compat_bytes_to_byte_vals(byt): + return byt +else: + def _compat_bytes_to_byte_vals(byt): + return [struct.unpack(b'!B', b)[0] for b in byt] +try: + _compat_int_from_byte_vals = int.from_bytes +except AttributeError: + def _compat_int_from_byte_vals(bytvals, endianess): + assert endianess == 'big' + res = 0 + for bv in bytvals: + assert isinstance(bv, _compat_int_types) + res = (res << 8) + bv + return res + + +def _compat_to_bytes(intval, length, endianess): + assert isinstance(intval, _compat_int_types) + assert endianess == 'big' + if length == 4: + if intval < 0 or intval >= 2 ** 32: + raise struct.error("integer out of range for 'I' format code") + return struct.pack(b'!I', intval) + elif length == 16: + if intval < 0 or intval >= 2 ** 128: + raise struct.error("integer out of range for 'QQ' format code") + return struct.pack(b'!QQ', intval >> 64, intval & 0xffffffffffffffff) + else: + raise NotImplementedError() + + +if hasattr(int, 'bit_length'): + # Not int.bit_length , since that won't work in 2.7 where long exists + def _compat_bit_length(i): + return i.bit_length() +else: + def _compat_bit_length(i): + for res in itertools.count(): + if i >> res == 0: + return res + + +def _compat_range(start, end, step=1): + assert step > 0 + i = start + while i < end: + yield i + i += step + + +class _TotalOrderingMixin(object): + __slots__ = () + + # Helper that derives the other comparison operations from + # __lt__ and __eq__ + # We avoid functools.total_ordering because it doesn't handle + # NotImplemented correctly yet (http://bugs.python.org/issue10042) + def __eq__(self, other): + raise NotImplementedError + + def __ne__(self, other): + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not equal + + def __lt__(self, other): + raise NotImplementedError + + def __le__(self, other): + less = self.__lt__(other) + if less is NotImplemented or not less: + return self.__eq__(other) + return less + + def __gt__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + equal = self.__eq__(other) + if equal is NotImplemented: + return NotImplemented + return not (less or equal) + + def __ge__(self, other): + less = self.__lt__(other) + if less is NotImplemented: + return NotImplemented + return not less + + +IPV4LENGTH = 32 +IPV6LENGTH = 128 + + +class AddressValueError(ValueError): + """A Value Error related to the address.""" + + +class NetmaskValueError(ValueError): + """A Value Error related to the netmask.""" + + +def ip_address(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Address or IPv6Address object. + + Raises: + ValueError: if the *address* passed isn't either a v4 or a v6 + address + + """ + try: + return IPv4Address(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Address(address) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 address' % + address) + + +def ip_network(address, strict=True): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP network. Either IPv4 or + IPv6 networks may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Network or IPv6Network object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. Or if the network has host bits set. + + """ + try: + return IPv4Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Network(address, strict) + except (AddressValueError, NetmaskValueError): + pass + + if isinstance(address, bytes): + raise AddressValueError( + '%r does not appear to be an IPv4 or IPv6 network. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?' % address) + + raise ValueError('%r does not appear to be an IPv4 or IPv6 network' % + address) + + +def ip_interface(address): + """Take an IP string/int and return an object of the correct type. + + Args: + address: A string or integer, the IP address. Either IPv4 or + IPv6 addresses may be supplied; integers less than 2**32 will + be considered to be IPv4 by default. + + Returns: + An IPv4Interface or IPv6Interface object. + + Raises: + ValueError: if the string passed isn't either a v4 or a v6 + address. + + Notes: + The IPv?Interface classes describe an Address on a particular + Network, so they're basically a combination of both the Address + and Network classes. + + """ + try: + return IPv4Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + try: + return IPv6Interface(address) + except (AddressValueError, NetmaskValueError): + pass + + raise ValueError('%r does not appear to be an IPv4 or IPv6 interface' % + address) + + +def v4_int_to_packed(address): + """Represent an address as 4 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv4 IP address. + + Returns: + The integer address packed as 4 bytes in network (big-endian) order. + + Raises: + ValueError: If the integer is negative or too large to be an + IPv4 IP address. + + """ + try: + return _compat_to_bytes(address, 4, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv4") + + +def v6_int_to_packed(address): + """Represent an address as 16 packed bytes in network (big-endian) order. + + Args: + address: An integer representation of an IPv6 IP address. + + Returns: + The integer address packed as 16 bytes in network (big-endian) order. + + """ + try: + return _compat_to_bytes(address, 16, 'big') + except (struct.error, OverflowError): + raise ValueError("Address negative or too large for IPv6") + + +def _split_optional_netmask(address): + """Helper to split the netmask and raise AddressValueError if needed""" + addr = _compat_str(address).split('/') + if len(addr) > 2: + raise AddressValueError("Only one '/' permitted in %r" % address) + return addr + + +def _find_address_range(addresses): + """Find a sequence of sorted deduplicated IPv#Address. + + Args: + addresses: a list of IPv#Address objects. + + Yields: + A tuple containing the first and last IP addresses in the sequence. + + """ + it = iter(addresses) + first = last = next(it) + for ip in it: + if ip._ip != last._ip + 1: + yield first, last + first = ip + last = ip + yield first, last + + +def _count_righthand_zero_bits(number, bits): + """Count the number of zero bits on the right hand side. + + Args: + number: an integer. + bits: maximum number of bits to count. + + Returns: + The number of zero bits on the right hand side of the number. + + """ + if number == 0: + return bits + return min(bits, _compat_bit_length(~number & (number - 1))) + + +def summarize_address_range(first, last): + """Summarize a network range given the first and last IP addresses. + + Example: + >>> list(summarize_address_range(IPv4Address('192.0.2.0'), + ... IPv4Address('192.0.2.130'))) + ... #doctest: +NORMALIZE_WHITESPACE + [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), + IPv4Network('192.0.2.130/32')] + + Args: + first: the first IPv4Address or IPv6Address in the range. + last: the last IPv4Address or IPv6Address in the range. + + Returns: + An iterator of the summarized IPv(4|6) network objects. + + Raise: + TypeError: + If the first and last objects are not IP addresses. + If the first and last objects are not the same version. + ValueError: + If the last object is not greater than the first. + If the version of the first address is not 4 or 6. + + """ + if (not (isinstance(first, _BaseAddress) and + isinstance(last, _BaseAddress))): + raise TypeError('first and last must be IP addresses, not networks') + if first.version != last.version: + raise TypeError("%s and %s are not of the same version" % ( + first, last)) + if first > last: + raise ValueError('last IP address must be greater than first') + + if first.version == 4: + ip = IPv4Network + elif first.version == 6: + ip = IPv6Network + else: + raise ValueError('unknown IP version') + + ip_bits = first._max_prefixlen + first_int = first._ip + last_int = last._ip + while first_int <= last_int: + nbits = min(_count_righthand_zero_bits(first_int, ip_bits), + _compat_bit_length(last_int - first_int + 1) - 1) + net = ip((first_int, ip_bits - nbits)) + yield net + first_int += 1 << nbits + if first_int - 1 == ip._ALL_ONES: + break + + +def _collapse_addresses_internal(addresses): + """Loops through the addresses, collapsing concurrent netblocks. + + Example: + + ip1 = IPv4Network('192.0.2.0/26') + ip2 = IPv4Network('192.0.2.64/26') + ip3 = IPv4Network('192.0.2.128/26') + ip4 = IPv4Network('192.0.2.192/26') + + _collapse_addresses_internal([ip1, ip2, ip3, ip4]) -> + [IPv4Network('192.0.2.0/24')] + + This shouldn't be called directly; it is called via + collapse_addresses([]). + + Args: + addresses: A list of IPv4Network's or IPv6Network's + + Returns: + A list of IPv4Network's or IPv6Network's depending on what we were + passed. + + """ + # First merge + to_merge = list(addresses) + subnets = {} + while to_merge: + net = to_merge.pop() + supernet = net.supernet() + existing = subnets.get(supernet) + if existing is None: + subnets[supernet] = net + elif existing != net: + # Merge consecutive subnets + del subnets[supernet] + to_merge.append(supernet) + # Then iterate over resulting networks, skipping subsumed subnets + last = None + for net in sorted(subnets.values()): + if last is not None: + # Since they are sorted, + # last.network_address <= net.network_address is a given. + if last.broadcast_address >= net.broadcast_address: + continue + yield net + last = net + + +def collapse_addresses(addresses): + """Collapse a list of IP objects. + + Example: + collapse_addresses([IPv4Network('192.0.2.0/25'), + IPv4Network('192.0.2.128/25')]) -> + [IPv4Network('192.0.2.0/24')] + + Args: + addresses: An iterator of IPv4Network or IPv6Network objects. + + Returns: + An iterator of the collapsed IPv(4|6)Network objects. + + Raises: + TypeError: If passed a list of mixed version objects. + + """ + addrs = [] + ips = [] + nets = [] + + # split IP addresses and networks + for ip in addresses: + if isinstance(ip, _BaseAddress): + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + ips.append(ip) + elif ip._prefixlen == ip._max_prefixlen: + if ips and ips[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, ips[-1])) + try: + ips.append(ip.ip) + except AttributeError: + ips.append(ip.network_address) + else: + if nets and nets[-1]._version != ip._version: + raise TypeError("%s and %s are not of the same version" % ( + ip, nets[-1])) + nets.append(ip) + + # sort and dedup + ips = sorted(set(ips)) + + # find consecutive address ranges in the sorted sequence and summarize them + if ips: + for first, last in _find_address_range(ips): + addrs.extend(summarize_address_range(first, last)) + + return _collapse_addresses_internal(addrs + nets) + + +def get_mixed_type_key(obj): + """Return a key suitable for sorting between networks and addresses. + + Address and Network objects are not sortable by default; they're + fundamentally different so the expression + + IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') + + doesn't make any sense. There are some times however, where you may wish + to have ipaddress sort these for you anyway. If you need to do this, you + can use this function as the key= argument to sorted(). + + Args: + obj: either a Network or Address object. + Returns: + appropriate key. + + """ + if isinstance(obj, _BaseNetwork): + return obj._get_networks_key() + elif isinstance(obj, _BaseAddress): + return obj._get_address_key() + return NotImplemented + + +class _IPAddressBase(_TotalOrderingMixin): + + """The mother class.""" + + __slots__ = () + + @property + def exploded(self): + """Return the longhand version of the IP address as a string.""" + return self._explode_shorthand_ip_string() + + @property + def compressed(self): + """Return the shorthand version of the IP address as a string.""" + return _compat_str(self) + + @property + def reverse_pointer(self): + """The name of the reverse DNS pointer for the IP address, e.g.: + >>> ipaddress.ip_address("127.0.0.1").reverse_pointer + '1.0.0.127.in-addr.arpa' + >>> ipaddress.ip_address("2001:db8::1").reverse_pointer + '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' + + """ + return self._reverse_pointer() + + @property + def version(self): + msg = '%200s has no version specified' % (type(self),) + raise NotImplementedError(msg) + + def _check_int_address(self, address): + if address < 0: + msg = "%d (< 0) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._version)) + if address > self._ALL_ONES: + msg = "%d (>= 2**%d) is not permitted as an IPv%d address" + raise AddressValueError(msg % (address, self._max_prefixlen, + self._version)) + + def _check_packed_address(self, address, expected_len): + address_len = len(address) + if address_len != expected_len: + msg = ( + '%r (len %d != %d) is not permitted as an IPv%d address. ' + 'Did you pass in a bytes (str in Python 2) instead of' + ' a unicode object?') + raise AddressValueError(msg % (address, address_len, + expected_len, self._version)) + + @classmethod + def _ip_int_from_prefix(cls, prefixlen): + """Turn the prefix length into a bitwise netmask + + Args: + prefixlen: An integer, the prefix length. + + Returns: + An integer. + + """ + return cls._ALL_ONES ^ (cls._ALL_ONES >> prefixlen) + + @classmethod + def _prefix_from_ip_int(cls, ip_int): + """Return prefix length from the bitwise netmask. + + Args: + ip_int: An integer, the netmask in expanded bitwise format + + Returns: + An integer, the prefix length. + + Raises: + ValueError: If the input intermingles zeroes & ones + """ + trailing_zeroes = _count_righthand_zero_bits(ip_int, + cls._max_prefixlen) + prefixlen = cls._max_prefixlen - trailing_zeroes + leading_ones = ip_int >> trailing_zeroes + all_ones = (1 << prefixlen) - 1 + if leading_ones != all_ones: + byteslen = cls._max_prefixlen // 8 + details = _compat_to_bytes(ip_int, byteslen, 'big') + msg = 'Netmask pattern %r mixes zeroes & ones' + raise ValueError(msg % details) + return prefixlen + + @classmethod + def _report_invalid_netmask(cls, netmask_str): + msg = '%r is not a valid netmask' % netmask_str + raise NetmaskValueError(msg) + + @classmethod + def _prefix_from_prefix_string(cls, prefixlen_str): + """Return prefix length from a numeric string + + Args: + prefixlen_str: The string to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask + """ + # int allows a leading +/- as well as surrounding whitespace, + # so we ensure that isn't the case + if not _BaseV4._DECIMAL_DIGITS.issuperset(prefixlen_str): + cls._report_invalid_netmask(prefixlen_str) + try: + prefixlen = int(prefixlen_str) + except ValueError: + cls._report_invalid_netmask(prefixlen_str) + if not (0 <= prefixlen <= cls._max_prefixlen): + cls._report_invalid_netmask(prefixlen_str) + return prefixlen + + @classmethod + def _prefix_from_ip_string(cls, ip_str): + """Turn a netmask/hostmask string into a prefix length + + Args: + ip_str: The netmask/hostmask to be converted + + Returns: + An integer, the prefix length. + + Raises: + NetmaskValueError: If the input is not a valid netmask/hostmask + """ + # Parse the netmask/hostmask like an IP address. + try: + ip_int = cls._ip_int_from_string(ip_str) + except AddressValueError: + cls._report_invalid_netmask(ip_str) + + # Try matching a netmask (this would be /1*0*/ as a bitwise regexp). + # Note that the two ambiguous cases (all-ones and all-zeroes) are + # treated as netmasks. + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + pass + + # Invert the bits, and try matching a /0+1+/ hostmask instead. + ip_int ^= cls._ALL_ONES + try: + return cls._prefix_from_ip_int(ip_int) + except ValueError: + cls._report_invalid_netmask(ip_str) + + def __reduce__(self): + return self.__class__, (_compat_str(self),) + + +class _BaseAddress(_IPAddressBase): + + """A generic IP object. + + This IP class contains the version independent methods which are + used by single IP addresses. + """ + + __slots__ = () + + def __int__(self): + return self._ip + + def __eq__(self, other): + try: + return (self._ip == other._ip and + self._version == other._version) + except AttributeError: + return NotImplemented + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseAddress): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self._ip != other._ip: + return self._ip < other._ip + return False + + # Shorthand for Integer addition and subtraction. This is not + # meant to ever support addition/subtraction of addresses. + def __add__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) + other) + + def __sub__(self, other): + if not isinstance(other, _compat_int_types): + return NotImplemented + return self.__class__(int(self) - other) + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return _compat_str(self._string_from_ip_int(self._ip)) + + def __hash__(self): + return hash(hex(int(self._ip))) + + def _get_address_key(self): + return (self._version, self) + + def __reduce__(self): + return self.__class__, (self._ip,) + + +class _BaseNetwork(_IPAddressBase): + + """A generic IP network object. + + This IP class contains the version independent methods which are + used by networks. + + """ + def __init__(self, address): + self._cache = {} + + def __repr__(self): + return '%s(%r)' % (self.__class__.__name__, _compat_str(self)) + + def __str__(self): + return '%s/%d' % (self.network_address, self.prefixlen) + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the network + or broadcast addresses. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast): + yield self._address_class(x) + + def __iter__(self): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network, broadcast + 1): + yield self._address_class(x) + + def __getitem__(self, n): + network = int(self.network_address) + broadcast = int(self.broadcast_address) + if n >= 0: + if network + n > broadcast: + raise IndexError('address out of range') + return self._address_class(network + n) + else: + n += 1 + if broadcast + n < network: + raise IndexError('address out of range') + return self._address_class(broadcast + n) + + def __lt__(self, other): + if not isinstance(other, _IPAddressBase): + return NotImplemented + if not isinstance(other, _BaseNetwork): + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + if self._version != other._version: + raise TypeError('%s and %s are not of the same version' % ( + self, other)) + if self.network_address != other.network_address: + return self.network_address < other.network_address + if self.netmask != other.netmask: + return self.netmask < other.netmask + return False + + def __eq__(self, other): + try: + return (self._version == other._version and + self.network_address == other.network_address and + int(self.netmask) == int(other.netmask)) + except AttributeError: + return NotImplemented + + def __hash__(self): + return hash(int(self.network_address) ^ int(self.netmask)) + + def __contains__(self, other): + # always false if one is v4 and the other is v6. + if self._version != other._version: + return False + # dealing with another network. + if isinstance(other, _BaseNetwork): + return False + # dealing with another address + else: + # address + return (int(self.network_address) <= int(other._ip) <= + int(self.broadcast_address)) + + def overlaps(self, other): + """Tell if self is partly contained in other.""" + return self.network_address in other or ( + self.broadcast_address in other or ( + other.network_address in self or ( + other.broadcast_address in self))) + + @property + def broadcast_address(self): + x = self._cache.get('broadcast_address') + if x is None: + x = self._address_class(int(self.network_address) | + int(self.hostmask)) + self._cache['broadcast_address'] = x + return x + + @property + def hostmask(self): + x = self._cache.get('hostmask') + if x is None: + x = self._address_class(int(self.netmask) ^ self._ALL_ONES) + self._cache['hostmask'] = x + return x + + @property + def with_prefixlen(self): + return '%s/%d' % (self.network_address, self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self.network_address, self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self.network_address, self.hostmask) + + @property + def num_addresses(self): + """Number of hosts in the current subnet.""" + return int(self.broadcast_address) - int(self.network_address) + 1 + + @property + def _address_class(self): + # Returning bare address objects (rather than interfaces) allows for + # more consistent behaviour across the network address, broadcast + # address and individual host addresses. + msg = '%200s has no associated address class' % (type(self),) + raise NotImplementedError(msg) + + @property + def prefixlen(self): + return self._prefixlen + + def address_exclude(self, other): + """Remove an address from a larger block. + + For example: + + addr1 = ip_network('192.0.2.0/28') + addr2 = ip_network('192.0.2.1/32') + list(addr1.address_exclude(addr2)) = + [IPv4Network('192.0.2.0/32'), IPv4Network('192.0.2.2/31'), + IPv4Network('192.0.2.4/30'), IPv4Network('192.0.2.8/29')] + + or IPv6: + + addr1 = ip_network('2001:db8::1/32') + addr2 = ip_network('2001:db8::1/128') + list(addr1.address_exclude(addr2)) = + [ip_network('2001:db8::1/128'), + ip_network('2001:db8::2/127'), + ip_network('2001:db8::4/126'), + ip_network('2001:db8::8/125'), + ... + ip_network('2001:db8:8000::/33')] + + Args: + other: An IPv4Network or IPv6Network object of the same type. + + Returns: + An iterator of the IPv(4|6)Network objects which is self + minus other. + + Raises: + TypeError: If self and other are of differing address + versions, or if other is not a network object. + ValueError: If other is not completely contained by self. + + """ + if not self._version == other._version: + raise TypeError("%s and %s are not of the same version" % ( + self, other)) + + if not isinstance(other, _BaseNetwork): + raise TypeError("%s is not a network object" % other) + + if not other.subnet_of(self): + raise ValueError('%s not contained in %s' % (other, self)) + if other == self: + return + + # Make sure we're comparing the network of other. + other = other.__class__('%s/%s' % (other.network_address, + other.prefixlen)) + + s1, s2 = self.subnets() + while s1 != other and s2 != other: + if other.subnet_of(s1): + yield s2 + s1, s2 = s1.subnets() + elif other.subnet_of(s2): + yield s1 + s1, s2 = s2.subnets() + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + if s1 == other: + yield s2 + elif s2 == other: + yield s1 + else: + # If we got here, there's a bug somewhere. + raise AssertionError('Error performing exclusion: ' + 's1: %s s2: %s other: %s' % + (s1, s2, other)) + + def compare_networks(self, other): + """Compare two IP objects. + + This is only concerned about the comparison of the integer + representation of the network addresses. This means that the + host bits aren't considered at all in this method. If you want + to compare host bits, you can easily enough do a + 'HostA._ip < HostB._ip' + + Args: + other: An IP object. + + Returns: + If the IP versions of self and other are the same, returns: + + -1 if self < other: + eg: IPv4Network('192.0.2.0/25') < IPv4Network('192.0.2.128/25') + IPv6Network('2001:db8::1000/124') < + IPv6Network('2001:db8::2000/124') + 0 if self == other + eg: IPv4Network('192.0.2.0/24') == IPv4Network('192.0.2.0/24') + IPv6Network('2001:db8::1000/124') == + IPv6Network('2001:db8::1000/124') + 1 if self > other + eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') + IPv6Network('2001:db8::2000/124') > + IPv6Network('2001:db8::1000/124') + + Raises: + TypeError if the IP versions are different. + + """ + # does this need to raise a ValueError? + if self._version != other._version: + raise TypeError('%s and %s are not of the same type' % ( + self, other)) + # self._version == other._version below here: + if self.network_address < other.network_address: + return -1 + if self.network_address > other.network_address: + return 1 + # self.network_address == other.network_address below here: + if self.netmask < other.netmask: + return -1 + if self.netmask > other.netmask: + return 1 + return 0 + + def _get_networks_key(self): + """Network-only key function. + + Returns an object that identifies this address' network and + netmask. This function is a suitable "key" argument for sorted() + and list.sort(). + + """ + return (self._version, self.network_address, self.netmask) + + def subnets(self, prefixlen_diff=1, new_prefix=None): + """The subnets which join to make the current subnet. + + In the case that self contains only one IP + (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 + for IPv6), yield an iterator with just ourself. + + Args: + prefixlen_diff: An integer, the amount the prefix length + should be increased by. This should not be set if + new_prefix is also set. + new_prefix: The desired new prefix length. This must be a + larger number (smaller prefix) than the existing prefix. + This should not be set if prefixlen_diff is also set. + + Returns: + An iterator of IPv(4|6) objects. + + Raises: + ValueError: The prefixlen_diff is too small or too large. + OR + prefixlen_diff and new_prefix are both set or new_prefix + is a smaller number than the current prefix (smaller + number means a larger network) + + """ + if self._prefixlen == self._max_prefixlen: + yield self + return + + if new_prefix is not None: + if new_prefix < self._prefixlen: + raise ValueError('new prefix must be longer') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = new_prefix - self._prefixlen + + if prefixlen_diff < 0: + raise ValueError('prefix length diff must be > 0') + new_prefixlen = self._prefixlen + prefixlen_diff + + if new_prefixlen > self._max_prefixlen: + raise ValueError( + 'prefix length diff %d is invalid for netblock %s' % ( + new_prefixlen, self)) + + start = int(self.network_address) + end = int(self.broadcast_address) + 1 + step = (int(self.hostmask) + 1) >> prefixlen_diff + for new_addr in _compat_range(start, end, step): + current = self.__class__((new_addr, new_prefixlen)) + yield current + + def supernet(self, prefixlen_diff=1, new_prefix=None): + """The supernet containing the current network. + + Args: + prefixlen_diff: An integer, the amount the prefix length of + the network should be decreased by. For example, given a + /24 network and a prefixlen_diff of 3, a supernet with a + /21 netmask is returned. + + Returns: + An IPv4 network object. + + Raises: + ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have + a negative prefix length. + OR + If prefixlen_diff and new_prefix are both set or new_prefix is a + larger number than the current prefix (larger number means a + smaller network) + + """ + if self._prefixlen == 0: + return self + + if new_prefix is not None: + if new_prefix > self._prefixlen: + raise ValueError('new prefix must be shorter') + if prefixlen_diff != 1: + raise ValueError('cannot set prefixlen_diff and new_prefix') + prefixlen_diff = self._prefixlen - new_prefix + + new_prefixlen = self.prefixlen - prefixlen_diff + if new_prefixlen < 0: + raise ValueError( + 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % + (self.prefixlen, prefixlen_diff)) + return self.__class__(( + int(self.network_address) & (int(self.netmask) << prefixlen_diff), + new_prefixlen)) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return (self.network_address.is_multicast and + self.broadcast_address.is_multicast) + + @staticmethod + def _is_subnet_of(a, b): + try: + # Always false if one is v4 and the other is v6. + if a._version != b._version: + raise TypeError("%s and %s are not of the same version" (a, b)) + return (b.network_address <= a.network_address and + b.broadcast_address >= a.broadcast_address) + except AttributeError: + raise TypeError("Unable to test subnet containment " + "between %s and %s" % (a, b)) + + def subnet_of(self, other): + """Return True if this network is a subnet of other.""" + return self._is_subnet_of(self, other) + + def supernet_of(self, other): + """Return True if this network is a supernet of other.""" + return self._is_subnet_of(other, self) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return (self.network_address.is_reserved and + self.broadcast_address.is_reserved) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return (self.network_address.is_link_local and + self.broadcast_address.is_link_local) + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return (self.network_address.is_private and + self.broadcast_address.is_private) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry or iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return (self.network_address.is_unspecified and + self.broadcast_address.is_unspecified) + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return (self.network_address.is_loopback and + self.broadcast_address.is_loopback) + + +class _BaseV4(object): + + """Base IPv4 object. + + The following methods are used by IPv4 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 4 + # Equivalent to 255.255.255.255 or 32 bits of 1's. + _ALL_ONES = (2 ** IPV4LENGTH) - 1 + _DECIMAL_DIGITS = frozenset('0123456789') + + # the valid octets for host and netmasks. only useful for IPv4. + _valid_mask_octets = frozenset([255, 254, 252, 248, 240, 224, 192, 128, 0]) + + _max_prefixlen = IPV4LENGTH + # There are only a handful of valid v4 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + def _explode_shorthand_ip_string(self): + return _compat_str(self) + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + try: + # Check for a netmask in prefix length form + prefixlen = cls._prefix_from_prefix_string(arg) + except NetmaskValueError: + # Check for a netmask or hostmask in dotted-quad form. + # This may raise NetmaskValueError. + prefixlen = cls._prefix_from_ip_string(arg) + netmask = IPv4Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn the given IP string into an integer for comparison. + + Args: + ip_str: A string, the IP ip_str. + + Returns: + The IP ip_str as an integer. + + Raises: + AddressValueError: if ip_str isn't a valid IPv4 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + octets = ip_str.split('.') + if len(octets) != 4: + raise AddressValueError("Expected 4 octets in %r" % ip_str) + + try: + return _compat_int_from_byte_vals( + map(cls._parse_octet, octets), 'big') + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_octet(cls, octet_str): + """Convert a decimal octet into an integer. + + Args: + octet_str: A string, the number to parse. + + Returns: + The octet as an integer. + + Raises: + ValueError: if the octet isn't strictly a decimal from [0..255]. + + """ + if not octet_str: + raise ValueError("Empty octet not permitted") + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._DECIMAL_DIGITS.issuperset(octet_str): + msg = "Only decimal digits permitted in %r" + raise ValueError(msg % octet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(octet_str) > 3: + msg = "At most 3 characters permitted in %r" + raise ValueError(msg % octet_str) + # Convert to integer (we know digits are legal) + octet_int = int(octet_str, 10) + # Any octets that look like they *might* be written in octal, + # and which don't look exactly the same in both octal and + # decimal are rejected as ambiguous + if octet_int > 7 and octet_str[0] == '0': + msg = "Ambiguous (octal/decimal) value in %r not permitted" + raise ValueError(msg % octet_str) + if octet_int > 255: + raise ValueError("Octet %d (> 255) not permitted" % octet_int) + return octet_int + + @classmethod + def _string_from_ip_int(cls, ip_int): + """Turns a 32-bit integer into dotted decimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + The IP address as a string in dotted decimal notation. + + """ + return '.'.join(_compat_str(struct.unpack(b'!B', b)[0] + if isinstance(b, bytes) + else b) + for b in _compat_to_bytes(ip_int, 4, 'big')) + + def _is_hostmask(self, ip_str): + """Test if the IP string is a hostmask (rather than a netmask). + + Args: + ip_str: A string, the potential hostmask. + + Returns: + A boolean, True if the IP string is a hostmask. + + """ + bits = ip_str.split('.') + try: + parts = [x for x in map(int, bits) if x in self._valid_mask_octets] + except ValueError: + return False + if len(parts) != len(bits): + return False + if parts[0] < parts[-1]: + return True + return False + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv4 address. + + This implements the method described in RFC1035 3.5. + + """ + reverse_octets = _compat_str(self).split('.')[::-1] + return '.'.join(reverse_octets) + '.in-addr.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv4Address(_BaseV4, _BaseAddress): + + """Represent and manipulate single IPv4 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + + """ + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv4Address('192.0.2.1') == IPv4Address(3221225985). + or, more generally + IPv4Address(int(IPv4Address('192.0.2.1'))) == + IPv4Address('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 4) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v4_int_to_packed(self._ip) + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within the + reserved IPv4 Network range. + + """ + return self in self._constants._reserved_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv4-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + return ( + self not in self._constants._public_network and + not self.is_private) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is multicast. + See RFC 3171 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 5735 3. + + """ + return self == self._constants._unspecified_address + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback per RFC 3330. + + """ + return self in self._constants._loopback_network + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is link-local per RFC 3927. + + """ + return self in self._constants._linklocal_network + + +class IPv4Interface(IPv4Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv4Address.__init__(self, address) + self.network = IPv4Network(self._ip) + self._prefixlen = self._max_prefixlen + return + + if isinstance(address, tuple): + IPv4Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + + self.network = IPv4Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv4Address.__init__(self, addr[0]) + + self.network = IPv4Network(address, strict=False) + self._prefixlen = self.network._prefixlen + + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv4Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv4Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv4Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + +class IPv4Network(_BaseV4, _BaseNetwork): + + """This class represents and manipulates 32-bit IPv4 network + addresses.. + + Attributes: [examples for IPv4Network('192.0.2.0/27')] + .network_address: IPv4Address('192.0.2.0') + .hostmask: IPv4Address('0.0.0.31') + .broadcast_address: IPv4Address('192.0.2.32') + .netmask: IPv4Address('255.255.255.224') + .prefixlen: 27 + + """ + # Class to use when creating address objects + _address_class = IPv4Address + + def __init__(self, address, strict=True): + + """Instantiate a new IPv4 network object. + + Args: + address: A string or integer representing the IP [& network]. + '192.0.2.0/24' + '192.0.2.0/255.255.255.0' + '192.0.0.2/0.0.0.255' + are all functionally the same in IPv4. Similarly, + '192.0.2.1' + '192.0.2.1/255.255.255.255' + '192.0.2.1/32' + are also functionally equivalent. That is to say, failing to + provide a subnetmask will create an object with a mask of /32. + + If the mask (portion after the / in the argument) is given in + dotted quad form, it is treated as a netmask if it starts with a + non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it + starts with a zero field (e.g. 0.255.255.255 == /8), with the + single exception of an all-zero mask which is treated as a + netmask == /0. If no mask is given, a default of /32 is used. + + Additionally, an integer can be passed, so + IPv4Network('192.0.2.1') == IPv4Network(3221225985) + or, more generally + IPv4Interface(int(IPv4Interface('192.0.2.1'))) == + IPv4Interface('192.0.2.1') + + Raises: + AddressValueError: If ipaddress isn't a valid IPv4 address. + NetmaskValueError: If the netmask isn't valid for + an IPv4 address. + ValueError: If strict is True and a network address is not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Constructing from a packed address or integer + if isinstance(address, (_compat_int_types, bytes)): + self.network_address = IPv4Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + # fixme: address/network test here. + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + # We weren't given an address[1] + arg = self._max_prefixlen + self.network_address = IPv4Address(address[0]) + self.netmask, self._prefixlen = self._make_netmask(arg) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv4Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + self.network_address = IPv4Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv4Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv4Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, True if the address is not reserved per + iana-ipv4-special-registry. + + """ + return (not (self.network_address in IPv4Network('100.64.0.0/10') and + self.broadcast_address in IPv4Network('100.64.0.0/10')) and + not self.is_private) + + +class _IPv4Constants(object): + + _linklocal_network = IPv4Network('169.254.0.0/16') + + _loopback_network = IPv4Network('127.0.0.0/8') + + _multicast_network = IPv4Network('224.0.0.0/4') + + _public_network = IPv4Network('100.64.0.0/10') + + _private_networks = [ + IPv4Network('0.0.0.0/8'), + IPv4Network('10.0.0.0/8'), + IPv4Network('127.0.0.0/8'), + IPv4Network('169.254.0.0/16'), + IPv4Network('172.16.0.0/12'), + IPv4Network('192.0.0.0/29'), + IPv4Network('192.0.0.170/31'), + IPv4Network('192.0.2.0/24'), + IPv4Network('192.168.0.0/16'), + IPv4Network('198.18.0.0/15'), + IPv4Network('198.51.100.0/24'), + IPv4Network('203.0.113.0/24'), + IPv4Network('240.0.0.0/4'), + IPv4Network('255.255.255.255/32'), + ] + + _reserved_network = IPv4Network('240.0.0.0/4') + + _unspecified_address = IPv4Address('0.0.0.0') + + +IPv4Address._constants = _IPv4Constants + + +class _BaseV6(object): + + """Base IPv6 object. + + The following methods are used by IPv6 objects in both single IP + addresses and networks. + + """ + + __slots__ = () + _version = 6 + _ALL_ONES = (2 ** IPV6LENGTH) - 1 + _HEXTET_COUNT = 8 + _HEX_DIGITS = frozenset('0123456789ABCDEFabcdef') + _max_prefixlen = IPV6LENGTH + + # There are only a bunch of valid v6 netmasks, so we cache them all + # when constructed (see _make_netmask()). + _netmask_cache = {} + + @classmethod + def _make_netmask(cls, arg): + """Make a (netmask, prefix_len) tuple from the given argument. + + Argument can be: + - an integer (the prefix length) + - a string representing the prefix length (e.g. "24") + - a string representing the prefix netmask (e.g. "255.255.255.0") + """ + if arg not in cls._netmask_cache: + if isinstance(arg, _compat_int_types): + prefixlen = arg + else: + prefixlen = cls._prefix_from_prefix_string(arg) + netmask = IPv6Address(cls._ip_int_from_prefix(prefixlen)) + cls._netmask_cache[arg] = netmask, prefixlen + return cls._netmask_cache[arg] + + @classmethod + def _ip_int_from_string(cls, ip_str): + """Turn an IPv6 ip_str into an integer. + + Args: + ip_str: A string, the IPv6 ip_str. + + Returns: + An int, the IPv6 address + + Raises: + AddressValueError: if ip_str isn't a valid IPv6 Address. + + """ + if not ip_str: + raise AddressValueError('Address cannot be empty') + + parts = ip_str.split(':') + + # An IPv6 address needs at least 2 colons (3 parts). + _min_parts = 3 + if len(parts) < _min_parts: + msg = "At least %d parts expected in %r" % (_min_parts, ip_str) + raise AddressValueError(msg) + + # If the address has an IPv4-style suffix, convert it to hexadecimal. + if '.' in parts[-1]: + try: + ipv4_int = IPv4Address(parts.pop())._ip + except AddressValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + parts.append('%x' % ((ipv4_int >> 16) & 0xFFFF)) + parts.append('%x' % (ipv4_int & 0xFFFF)) + + # An IPv6 address can't have more than 8 colons (9 parts). + # The extra colon comes from using the "::" notation for a single + # leading or trailing zero part. + _max_parts = cls._HEXTET_COUNT + 1 + if len(parts) > _max_parts: + msg = "At most %d colons permitted in %r" % ( + _max_parts - 1, ip_str) + raise AddressValueError(msg) + + # Disregarding the endpoints, find '::' with nothing in between. + # This indicates that a run of zeroes has been skipped. + skip_index = None + for i in _compat_range(1, len(parts) - 1): + if not parts[i]: + if skip_index is not None: + # Can't have more than one '::' + msg = "At most one '::' permitted in %r" % ip_str + raise AddressValueError(msg) + skip_index = i + + # parts_hi is the number of parts to copy from above/before the '::' + # parts_lo is the number of parts to copy from below/after the '::' + if skip_index is not None: + # If we found a '::', then check if it also covers the endpoints. + parts_hi = skip_index + parts_lo = len(parts) - skip_index - 1 + if not parts[0]: + parts_hi -= 1 + if parts_hi: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + parts_lo -= 1 + if parts_lo: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_skipped = cls._HEXTET_COUNT - (parts_hi + parts_lo) + if parts_skipped < 1: + msg = "Expected at most %d other parts with '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT - 1, ip_str)) + else: + # Otherwise, allocate the entire address to parts_hi. The + # endpoints could still be empty, but _parse_hextet() will check + # for that. + if len(parts) != cls._HEXTET_COUNT: + msg = "Exactly %d parts expected without '::' in %r" + raise AddressValueError(msg % (cls._HEXTET_COUNT, ip_str)) + if not parts[0]: + msg = "Leading ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # ^: requires ^:: + if not parts[-1]: + msg = "Trailing ':' only permitted as part of '::' in %r" + raise AddressValueError(msg % ip_str) # :$ requires ::$ + parts_hi = len(parts) + parts_lo = 0 + parts_skipped = 0 + + try: + # Now, parse the hextets into a 128-bit integer. + ip_int = 0 + for i in range(parts_hi): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + ip_int <<= 16 * parts_skipped + for i in range(-parts_lo, 0): + ip_int <<= 16 + ip_int |= cls._parse_hextet(parts[i]) + return ip_int + except ValueError as exc: + raise AddressValueError("%s in %r" % (exc, ip_str)) + + @classmethod + def _parse_hextet(cls, hextet_str): + """Convert an IPv6 hextet string into an integer. + + Args: + hextet_str: A string, the number to parse. + + Returns: + The hextet as an integer. + + Raises: + ValueError: if the input isn't strictly a hex number from + [0..FFFF]. + + """ + # Whitelist the characters, since int() allows a lot of bizarre stuff. + if not cls._HEX_DIGITS.issuperset(hextet_str): + raise ValueError("Only hex digits permitted in %r" % hextet_str) + # We do the length check second, since the invalid character error + # is likely to be more informative for the user + if len(hextet_str) > 4: + msg = "At most 4 characters permitted in %r" + raise ValueError(msg % hextet_str) + # Length check means we can skip checking the integer value + return int(hextet_str, 16) + + @classmethod + def _compress_hextets(cls, hextets): + """Compresses a list of hextets. + + Compresses a list of strings, replacing the longest continuous + sequence of "0" in the list with "" and adding empty strings at + the beginning or at the end of the string such that subsequently + calling ":".join(hextets) will produce the compressed version of + the IPv6 address. + + Args: + hextets: A list of strings, the hextets to compress. + + Returns: + A list of strings. + + """ + best_doublecolon_start = -1 + best_doublecolon_len = 0 + doublecolon_start = -1 + doublecolon_len = 0 + for index, hextet in enumerate(hextets): + if hextet == '0': + doublecolon_len += 1 + if doublecolon_start == -1: + # Start of a sequence of zeros. + doublecolon_start = index + if doublecolon_len > best_doublecolon_len: + # This is the longest sequence of zeros so far. + best_doublecolon_len = doublecolon_len + best_doublecolon_start = doublecolon_start + else: + doublecolon_len = 0 + doublecolon_start = -1 + + if best_doublecolon_len > 1: + best_doublecolon_end = (best_doublecolon_start + + best_doublecolon_len) + # For zeros at the end of the address. + if best_doublecolon_end == len(hextets): + hextets += [''] + hextets[best_doublecolon_start:best_doublecolon_end] = [''] + # For zeros at the beginning of the address. + if best_doublecolon_start == 0: + hextets = [''] + hextets + + return hextets + + @classmethod + def _string_from_ip_int(cls, ip_int=None): + """Turns a 128-bit integer into hexadecimal notation. + + Args: + ip_int: An integer, the IP address. + + Returns: + A string, the hexadecimal representation of the address. + + Raises: + ValueError: The address is bigger than 128 bits of all ones. + + """ + if ip_int is None: + ip_int = int(cls._ip) + + if ip_int > cls._ALL_ONES: + raise ValueError('IPv6 address is too large') + + hex_str = '%032x' % ip_int + hextets = ['%x' % int(hex_str[x:x + 4], 16) for x in range(0, 32, 4)] + + hextets = cls._compress_hextets(hextets) + return ':'.join(hextets) + + def _explode_shorthand_ip_string(self): + """Expand a shortened IPv6 address. + + Args: + ip_str: A string, the IPv6 address. + + Returns: + A string, the expanded IPv6 address. + + """ + if isinstance(self, IPv6Network): + ip_str = _compat_str(self.network_address) + elif isinstance(self, IPv6Interface): + ip_str = _compat_str(self.ip) + else: + ip_str = _compat_str(self) + + ip_int = self._ip_int_from_string(ip_str) + hex_str = '%032x' % ip_int + parts = [hex_str[x:x + 4] for x in range(0, 32, 4)] + if isinstance(self, (_BaseNetwork, IPv6Interface)): + return '%s/%d' % (':'.join(parts), self._prefixlen) + return ':'.join(parts) + + def _reverse_pointer(self): + """Return the reverse DNS pointer name for the IPv6 address. + + This implements the method described in RFC3596 2.5. + + """ + reverse_chars = self.exploded[::-1].replace(':', '') + return '.'.join(reverse_chars) + '.ip6.arpa' + + @property + def max_prefixlen(self): + return self._max_prefixlen + + @property + def version(self): + return self._version + + +class IPv6Address(_BaseV6, _BaseAddress): + + """Represent and manipulate single IPv6 Addresses.""" + + __slots__ = ('_ip', '__weakref__') + + def __init__(self, address): + """Instantiate a new IPv6 address object. + + Args: + address: A string or integer representing the IP + + Additionally, an integer can be passed, so + IPv6Address('2001:db8::') == + IPv6Address(42540766411282592856903984951653826560) + or, more generally + IPv6Address(int(IPv6Address('2001:db8::'))) == + IPv6Address('2001:db8::') + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + + """ + # Efficient constructor from integer. + if isinstance(address, _compat_int_types): + self._check_int_address(address) + self._ip = address + return + + # Constructing from a packed address + if isinstance(address, bytes): + self._check_packed_address(address, 16) + bvs = _compat_bytes_to_byte_vals(address) + self._ip = _compat_int_from_byte_vals(bvs, 'big') + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP string. + addr_str = _compat_str(address) + if '/' in addr_str: + raise AddressValueError("Unexpected '/' in %r" % address) + self._ip = self._ip_int_from_string(addr_str) + + @property + def packed(self): + """The binary representation of this address.""" + return v6_int_to_packed(self._ip) + + @property + def is_multicast(self): + """Test if the address is reserved for multicast use. + + Returns: + A boolean, True if the address is a multicast address. + See RFC 2373 2.7 for details. + + """ + return self in self._constants._multicast_network + + @property + def is_reserved(self): + """Test if the address is otherwise IETF reserved. + + Returns: + A boolean, True if the address is within one of the + reserved IPv6 Network ranges. + + """ + return any(self in x for x in self._constants._reserved_networks) + + @property + def is_link_local(self): + """Test if the address is reserved for link-local. + + Returns: + A boolean, True if the address is reserved per RFC 4291. + + """ + return self in self._constants._linklocal_network + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return self in self._constants._sitelocal_network + + @property + def is_private(self): + """Test if this address is allocated for private networks. + + Returns: + A boolean, True if the address is reserved per + iana-ipv6-special-registry. + + """ + return any(self in net for net in self._constants._private_networks) + + @property + def is_global(self): + """Test if this address is allocated for public networks. + + Returns: + A boolean, true if the address is not reserved per + iana-ipv6-special-registry. + + """ + return not self.is_private + + @property + def is_unspecified(self): + """Test if the address is unspecified. + + Returns: + A boolean, True if this is the unspecified address as defined in + RFC 2373 2.5.2. + + """ + return self._ip == 0 + + @property + def is_loopback(self): + """Test if the address is a loopback address. + + Returns: + A boolean, True if the address is a loopback address as defined in + RFC 2373 2.5.3. + + """ + return self._ip == 1 + + @property + def ipv4_mapped(self): + """Return the IPv4 mapped address. + + Returns: + If the IPv6 address is a v4 mapped address, return the + IPv4 mapped address. Return None otherwise. + + """ + if (self._ip >> 32) != 0xFFFF: + return None + return IPv4Address(self._ip & 0xFFFFFFFF) + + @property + def teredo(self): + """Tuple of embedded teredo IPs. + + Returns: + Tuple of the (server, client) IPs or None if the address + doesn't appear to be a teredo address (doesn't start with + 2001::/32) + + """ + if (self._ip >> 96) != 0x20010000: + return None + return (IPv4Address((self._ip >> 64) & 0xFFFFFFFF), + IPv4Address(~self._ip & 0xFFFFFFFF)) + + @property + def sixtofour(self): + """Return the IPv4 6to4 embedded address. + + Returns: + The IPv4 6to4-embedded address if present or None if the + address doesn't appear to contain a 6to4 embedded address. + + """ + if (self._ip >> 112) != 0x2002: + return None + return IPv4Address((self._ip >> 80) & 0xFFFFFFFF) + + +class IPv6Interface(IPv6Address): + + def __init__(self, address): + if isinstance(address, (bytes, _compat_int_types)): + IPv6Address.__init__(self, address) + self.network = IPv6Network(self._ip) + self._prefixlen = self._max_prefixlen + return + if isinstance(address, tuple): + IPv6Address.__init__(self, address[0]) + if len(address) > 1: + self._prefixlen = int(address[1]) + else: + self._prefixlen = self._max_prefixlen + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self.hostmask = self.network.hostmask + return + + addr = _split_optional_netmask(address) + IPv6Address.__init__(self, addr[0]) + self.network = IPv6Network(address, strict=False) + self.netmask = self.network.netmask + self._prefixlen = self.network._prefixlen + self.hostmask = self.network.hostmask + + def __str__(self): + return '%s/%d' % (self._string_from_ip_int(self._ip), + self.network.prefixlen) + + def __eq__(self, other): + address_equal = IPv6Address.__eq__(self, other) + if not address_equal or address_equal is NotImplemented: + return address_equal + try: + return self.network == other.network + except AttributeError: + # An interface with an associated network is NOT the + # same as an unassociated address. That's why the hash + # takes the extra info into account. + return False + + def __lt__(self, other): + address_less = IPv6Address.__lt__(self, other) + if address_less is NotImplemented: + return NotImplemented + try: + return (self.network < other.network or + self.network == other.network and address_less) + except AttributeError: + # We *do* allow addresses and interfaces to be sorted. The + # unassociated address is considered less than all interfaces. + return False + + def __hash__(self): + return self._ip ^ self._prefixlen ^ int(self.network.network_address) + + __reduce__ = _IPAddressBase.__reduce__ + + @property + def ip(self): + return IPv6Address(self._ip) + + @property + def with_prefixlen(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self._prefixlen) + + @property + def with_netmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.netmask) + + @property + def with_hostmask(self): + return '%s/%s' % (self._string_from_ip_int(self._ip), + self.hostmask) + + @property + def is_unspecified(self): + return self._ip == 0 and self.network.is_unspecified + + @property + def is_loopback(self): + return self._ip == 1 and self.network.is_loopback + + +class IPv6Network(_BaseV6, _BaseNetwork): + + """This class represents and manipulates 128-bit IPv6 networks. + + Attributes: [examples for IPv6('2001:db8::1000/124')] + .network_address: IPv6Address('2001:db8::1000') + .hostmask: IPv6Address('::f') + .broadcast_address: IPv6Address('2001:db8::100f') + .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') + .prefixlen: 124 + + """ + + # Class to use when creating address objects + _address_class = IPv6Address + + def __init__(self, address, strict=True): + """Instantiate a new IPv6 Network object. + + Args: + address: A string or integer representing the IPv6 network or the + IP and prefix/netmask. + '2001:db8::/128' + '2001:db8:0000:0000:0000:0000:0000:0000/128' + '2001:db8::' + are all functionally the same in IPv6. That is to say, + failing to provide a subnetmask will create an object with + a mask of /128. + + Additionally, an integer can be passed, so + IPv6Network('2001:db8::') == + IPv6Network(42540766411282592856903984951653826560) + or, more generally + IPv6Network(int(IPv6Network('2001:db8::'))) == + IPv6Network('2001:db8::') + + strict: A boolean. If true, ensure that we have been passed + A true network address, eg, 2001:db8::1000/124 and not an + IP address on a network, eg, 2001:db8::1/124. + + Raises: + AddressValueError: If address isn't a valid IPv6 address. + NetmaskValueError: If the netmask isn't valid for + an IPv6 address. + ValueError: If strict was True and a network address was not + supplied. + + """ + _BaseNetwork.__init__(self, address) + + # Efficient constructor from integer or packed address + if isinstance(address, (bytes, _compat_int_types)): + self.network_address = IPv6Address(address) + self.netmask, self._prefixlen = self._make_netmask( + self._max_prefixlen) + return + + if isinstance(address, tuple): + if len(address) > 1: + arg = address[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + self.network_address = IPv6Address(address[0]) + packed = int(self.network_address) + if packed & int(self.netmask) != packed: + if strict: + raise ValueError('%s has host bits set' % self) + else: + self.network_address = IPv6Address(packed & + int(self.netmask)) + return + + # Assume input argument to be string or any object representation + # which converts into a formatted IP prefix string. + addr = _split_optional_netmask(address) + + self.network_address = IPv6Address(self._ip_int_from_string(addr[0])) + + if len(addr) == 2: + arg = addr[1] + else: + arg = self._max_prefixlen + self.netmask, self._prefixlen = self._make_netmask(arg) + + if strict: + if (IPv6Address(int(self.network_address) & int(self.netmask)) != + self.network_address): + raise ValueError('%s has host bits set' % self) + self.network_address = IPv6Address(int(self.network_address) & + int(self.netmask)) + + if self._prefixlen == (self._max_prefixlen - 1): + self.hosts = self.__iter__ + + def hosts(self): + """Generate Iterator over usable hosts in a network. + + This is like __iter__ except it doesn't return the + Subnet-Router anycast address. + + """ + network = int(self.network_address) + broadcast = int(self.broadcast_address) + for x in _compat_range(network + 1, broadcast + 1): + yield self._address_class(x) + + @property + def is_site_local(self): + """Test if the address is reserved for site-local. + + Note that the site-local address space has been deprecated by RFC 3879. + Use is_private to test if this address is in the space of unique local + addresses as defined by RFC 4193. + + Returns: + A boolean, True if the address is reserved per RFC 3513 2.5.6. + + """ + return (self.network_address.is_site_local and + self.broadcast_address.is_site_local) + + +class _IPv6Constants(object): + + _linklocal_network = IPv6Network('fe80::/10') + + _multicast_network = IPv6Network('ff00::/8') + + _private_networks = [ + IPv6Network('::1/128'), + IPv6Network('::/128'), + IPv6Network('::ffff:0:0/96'), + IPv6Network('100::/64'), + IPv6Network('2001::/23'), + IPv6Network('2001:2::/48'), + IPv6Network('2001:db8::/32'), + IPv6Network('2001:10::/28'), + IPv6Network('fc00::/7'), + IPv6Network('fe80::/10'), + ] + + _reserved_networks = [ + IPv6Network('::/8'), IPv6Network('100::/8'), + IPv6Network('200::/7'), IPv6Network('400::/6'), + IPv6Network('800::/5'), IPv6Network('1000::/4'), + IPv6Network('4000::/3'), IPv6Network('6000::/3'), + IPv6Network('8000::/3'), IPv6Network('A000::/3'), + IPv6Network('C000::/3'), IPv6Network('E000::/4'), + IPv6Network('F000::/5'), IPv6Network('F800::/6'), + IPv6Network('FE00::/9'), + ] + + _sitelocal_network = IPv6Network('fec0::/10') + + +IPv6Address._constants = _IPv6Constants diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py new file mode 100644 index 000000000..228e051df --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__init__.py @@ -0,0 +1,347 @@ +# -*- coding: utf-8 -*- + +""" +lockfile.py - Platform-independent advisory file locks. + +Requires Python 2.5 unless you apply 2.4.diff +Locking is done on a per-thread basis instead of a per-process basis. + +Usage: + +>>> lock = LockFile('somefile') +>>> try: +... lock.acquire() +... except AlreadyLocked: +... print 'somefile', 'is locked already.' +... except LockFailed: +... print 'somefile', 'can\\'t be locked.' +... else: +... print 'got lock' +got lock +>>> print lock.is_locked() +True +>>> lock.release() + +>>> lock = LockFile('somefile') +>>> print lock.is_locked() +False +>>> with lock: +... print lock.is_locked() +True +>>> print lock.is_locked() +False + +>>> lock = LockFile('somefile') +>>> # It is okay to lock twice from the same thread... +>>> with lock: +... lock.acquire() +... +>>> # Though no counter is kept, so you can't unlock multiple times... +>>> print lock.is_locked() +False + +Exceptions: + + Error - base class for other exceptions + LockError - base class for all locking exceptions + AlreadyLocked - Another thread or process already holds the lock + LockFailed - Lock failed for some other reason + UnlockError - base class for all unlocking exceptions + AlreadyUnlocked - File was not locked. + NotMyLock - File was locked but not by the current thread/process +""" + +from __future__ import absolute_import + +import functools +import os +import socket +import threading +import warnings + +# Work with PEP8 and non-PEP8 versions of threading module. +if not hasattr(threading, "current_thread"): + threading.current_thread = threading.currentThread +if not hasattr(threading.Thread, "get_name"): + threading.Thread.get_name = threading.Thread.getName + +__all__ = ['Error', 'LockError', 'LockTimeout', 'AlreadyLocked', + 'LockFailed', 'UnlockError', 'NotLocked', 'NotMyLock', + 'LinkFileLock', 'MkdirFileLock', 'SQLiteFileLock', + 'LockBase', 'locked'] + + +class Error(Exception): + """ + Base class for other exceptions. + + >>> try: + ... raise Error + ... except Exception: + ... pass + """ + pass + + +class LockError(Error): + """ + Base class for error arising from attempts to acquire the lock. + + >>> try: + ... raise LockError + ... except Error: + ... pass + """ + pass + + +class LockTimeout(LockError): + """Raised when lock creation fails within a user-defined period of time. + + >>> try: + ... raise LockTimeout + ... except LockError: + ... pass + """ + pass + + +class AlreadyLocked(LockError): + """Some other thread/process is locking the file. + + >>> try: + ... raise AlreadyLocked + ... except LockError: + ... pass + """ + pass + + +class LockFailed(LockError): + """Lock file creation failed for some other reason. + + >>> try: + ... raise LockFailed + ... except LockError: + ... pass + """ + pass + + +class UnlockError(Error): + """ + Base class for errors arising from attempts to release the lock. + + >>> try: + ... raise UnlockError + ... except Error: + ... pass + """ + pass + + +class NotLocked(UnlockError): + """Raised when an attempt is made to unlock an unlocked file. + + >>> try: + ... raise NotLocked + ... except UnlockError: + ... pass + """ + pass + + +class NotMyLock(UnlockError): + """Raised when an attempt is made to unlock a file someone else locked. + + >>> try: + ... raise NotMyLock + ... except UnlockError: + ... pass + """ + pass + + +class _SharedBase(object): + def __init__(self, path): + self.path = path + + def acquire(self, timeout=None): + """ + Acquire the lock. + + * If timeout is omitted (or None), wait forever trying to lock the + file. + + * If timeout > 0, try to acquire the lock for that many seconds. If + the lock period expires and the file is still locked, raise + LockTimeout. + + * If timeout <= 0, raise AlreadyLocked immediately if the file is + already locked. + """ + raise NotImplemented("implement in subclass") + + def release(self): + """ + Release the lock. + + If the file is not locked, raise NotLocked. + """ + raise NotImplemented("implement in subclass") + + def __enter__(self): + """ + Context manager support. + """ + self.acquire() + return self + + def __exit__(self, *_exc): + """ + Context manager support. + """ + self.release() + + def __repr__(self): + return "<%s: %r>" % (self.__class__.__name__, self.path) + + +class LockBase(_SharedBase): + """Base class for platform-specific lock classes.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = LockBase('somefile') + >>> lock = LockBase('somefile', threaded=False) + """ + super(LockBase, self).__init__(path) + self.lock_file = os.path.abspath(path) + ".lock" + self.hostname = socket.gethostname() + self.pid = os.getpid() + if threaded: + t = threading.current_thread() + # Thread objects in Python 2.4 and earlier do not have ident + # attrs. Worm around that. + ident = getattr(t, "ident", hash(t)) + self.tname = "-%x" % (ident & 0xffffffff) + else: + self.tname = "" + dirname = os.path.dirname(self.lock_file) + + # unique name is mostly about the current process, but must + # also contain the path -- otherwise, two adjacent locked + # files conflict (one file gets locked, creating lock-file and + # unique file, the other one gets locked, creating lock-file + # and overwriting the already existing lock-file, then one + # gets unlocked, deleting both lock-file and unique file, + # finally the last lock errors out upon releasing. + self.unique_name = os.path.join(dirname, + "%s%s.%s%s" % (self.hostname, + self.tname, + self.pid, + hash(self.path))) + self.timeout = timeout + + def is_locked(self): + """ + Tell whether or not the file is locked. + """ + raise NotImplemented("implement in subclass") + + def i_am_locking(self): + """ + Return True if this object is locking the file. + """ + raise NotImplemented("implement in subclass") + + def break_lock(self): + """ + Remove a lock. Useful if a locking thread failed to unlock. + """ + raise NotImplemented("implement in subclass") + + def __repr__(self): + return "<%s: %r -- %r>" % (self.__class__.__name__, self.unique_name, + self.path) + + +def _fl_helper(cls, mod, *args, **kwds): + warnings.warn("Import from %s module instead of lockfile package" % mod, + DeprecationWarning, stacklevel=2) + # This is a bit funky, but it's only for awhile. The way the unit tests + # are constructed this function winds up as an unbound method, so it + # actually takes three args, not two. We want to toss out self. + if not isinstance(args[0], str): + # We are testing, avoid the first arg + args = args[1:] + if len(args) == 1 and not kwds: + kwds["threaded"] = True + return cls(*args, **kwds) + + +def LinkFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import LinkLockFile from the + lockfile.linklockfile module. + """ + from . import linklockfile + return _fl_helper(linklockfile.LinkLockFile, "lockfile.linklockfile", + *args, **kwds) + + +def MkdirFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import MkdirLockFile from the + lockfile.mkdirlockfile module. + """ + from . import mkdirlockfile + return _fl_helper(mkdirlockfile.MkdirLockFile, "lockfile.mkdirlockfile", + *args, **kwds) + + +def SQLiteFileLock(*args, **kwds): + """Factory function provided for backwards compatibility. + + Do not use in new code. Instead, import SQLiteLockFile from the + lockfile.mkdirlockfile module. + """ + from . import sqlitelockfile + return _fl_helper(sqlitelockfile.SQLiteLockFile, "lockfile.sqlitelockfile", + *args, **kwds) + + +def locked(path, timeout=None): + """Decorator which enables locks for decorated function. + + Arguments: + - path: path for lockfile. + - timeout (optional): Timeout for acquiring lock. + + Usage: + @locked('/var/run/myname', timeout=0) + def myname(...): + ... + """ + def decor(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + lock = FileLock(path, timeout=timeout) + lock.acquire() + try: + return func(*args, **kwargs) + finally: + lock.release() + return wrapper + return decor + + +if hasattr(os, "link"): + from . import linklockfile as _llf + LockFile = _llf.LinkLockFile +else: + from . import mkdirlockfile as _mlf + LockFile = _mlf.MkdirLockFile + +FileLock = LockFile diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dbea8d4256934d4f3c623bbc9a9eb32f557e084 GIT binary patch literal 9916 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 G8~+E@siDmP literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/linklockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..085bf7751596289928870691da436d4e52da42dc GIT binary patch literal 2297 zcma)7&5smC6tC*<>75-Gn5=xLX%QAC0R|BSj4X%>F~PxPNq|mFr+2Cbd!|2Tt7;Z@ zGF*f|fP)uJOlA%qOgwq>U+Jq}_R7(d?^Vy@E?JG8)T>wZ-mCZOy<fe)wYcaL`1<#k zzxf%sKX9@0S-{+cA-@K~2%{;<Xh<pYMrwqHp3Tr?CbLp2vqL*`LML-WH}gU-tA(}9 z4}D7R5N0#y1z`@ipPS(VGuBAU-G)<1i<SrCby=h%#iJw}7D9ElDGHp@yIXVzw_?dl zAGzCcl5$qoI)%dJoc(GG7v%!d`$@)&kt!EIO$CpcmT=ZZKRcfZ%uN{bV<4P_lo7ZG zg*z<bEnd*js$vao<}&XE2_05rKFls#V0D;19ety$-%av?jtjyX|Abr+ce`B5Kovn8 z^k6#}$s~Uq#Hz@WZZH(ZkPEdH6ulq?<1-gq=Y2nbZ*_GwNb!K{!R}MfoR&q#@u1VK z|EYI2P~YO+IlF#4P9?AGI$Z;<iyzk1gYg**c>)r>)l_6c`jpY<#?+V*N*<8>ghiA& z@Wn?I)|4oV8K|>Np40E>Ba#~r$pkVtsEN-fG`B!zKcmW-Iy3Ujm`nOFn*&SqC$Mt` z_MiR+zTByYC&8%A4DIWC@Z}HumsB+8-rVT|>da`r{>+>}RR)Imm65d_pRX!U69Z0v z1t%_6+7#vJ@lVxYHtZd!;>{asi8=qQ!TMkoBlz@zbB~jkbXaHJ46yx(Y@`nX;cGBI z&~vNSDUB!V<HJ1-K&);TQmlAzN(zMPHYRtxGDlzVBu*4o9Z}HT7$t&Nwe1xGEXK`K zGDu_)R}j@A&bILtKK}6s{C>aDI#gN!mAqUS<;li~M|qs_((a}Oyao5mdtV4q2w{Us z>8d&AEo4fgkfnv#Dr<<R2(eST_tvyUX-O5U(vvF6wT?5=vp_(U)-VR>)R47h%K5Nm zfdNl@;t=k6JZF*i;b<fI3lRYb{@QF0MY0L$Xm7@%-78YYg=}Y{z21+atMYPwWs_a% zM#IgE7gX=+<Gx5g=v}^ct$n{eOor!@9AZk-bE13s>W6A0#!Wq<O>kI<HeLg7(Z+~( z7Uzdsr8`gVK?p)#079rio3ufj#v$s_CF&XQ!OoJ=pq^=&O<IS2%cvU`_324-+}!=v z&d-nQVny-88M}pkDcAugWJ+d49#QaC08PdmU2iM1Z%p+Ym{EC2Ir^>4rOKSTplc(t z=DbE3;;UtL#!D3#@<PplFg{-G;7vI@8?291fYSA?AmgoCSxaP8$%F$jiQ`C`KuU){ zO{9|I0PeU*jv-kF(xT!W<b&7bJ>W`L@RUP)y#fna2SRk-8j!;}eIq+_)%~;608<4o zc8XoXoKd(N?X)Z%R~6w&(D;u~#QPw>0YmCOMaRo~O7r^8`@25_hE;Kj6-A*KCWK+l zD6Xd12!QW9j1KU(V{`;wwdHD`Z-%IocLe0(C@Srrw|WxAnXUpn^IM=Nu@soR1|1*W z8~HBH{eyoOEO+Nl98*N23G#@4+A5d!n}K3kb%FmSMt>bz)IbM$2UI2YeS-15wI{xR zw6J2e(u;JjiK5bvqO4$}lmlOnqK#3UVi$sy8%3<>Mv*vyF`Pnz<r6DNP9q8S5(JyT z28Tlf&9g1TU-3N8^lU9@)zM*Zq(%Z<2t<K6j6_452n=60ybARi-q^KtztSh{=d|=b SsqV0fk6EHY-SD6>1lHfcD<+iy literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/mkdirlockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e2b41a2c2b56da9cb8cf977ebefd8e3a1031f2a GIT binary patch literal 2659 zcmb7F&2JM&6rb4-d%d<36GHertWX1W3o#8)Kq?d{P*H)4lt@rZXtnXIVeS2JX2v10 zoJ+%B&|5j#$NmYGdhTDqX-<`T;@V?ReQ(w#B+8|;nm051W_Nz?z2AFtzgl$(wC?)S z%eX?w-?*4H3nq7=3kHG_Mq`rD7EO$nL2+%wX3Ny0)w1+xw`@HYS_Nh@D=sEZ%SlSD zQsTDUq}(bel~yIGwyKnTPngXLZwV`e&YsztW5yb(7eByBq;9DBU_)f_K!$#l^fNA% z!=kN7L|NMWKygb!IZv{7?|vXc<>Ks75XB)=rDi5^Ih{V;!G$WLT#u448%R~X7xOS+ zS`)H1o;YhJOzuJ#4?u*ZMHy)sjDnRlW-<FM1v`(i0xQDIW)3U8C19z`$}kpLg;im6 z*c_XOvBXTUXhBt<_E^L<L_jz^k29|WQ*UF(YXcG)rLVlegH2&uW_)L5z1c?BW5cls z{X6L5YY>u*>4=Qz$QYRuixO#c&9OBiU7NxCZUK4`y3;Y2$ix^CzoZ>&4u$JY+nqai zycj{;_6|V%{G!N`5RqN1|DVm5Joy?O8nWAuf>?z69}kPmVr5w@i)P*BHlSCI??-7Q zeP0=wP*y*Xua(u!qEwX-l8>h==XEAz8YH2z^TF&#OqB;|v^fZURMahHi7@W)IsMbw z`Kl=M82?82DbW1;rqSooRv^R1R=^vbEM_4Wjf6Kgy1su?Tu*Oov1@I=zqNWrc5c4v z^7yOH^;@?Z>y3WYzZ|7P2623ux3Ay4DmMdssk^@wrYz$Pgp7zA35IyKTIug_NF{>U zgw8IzX1cUMEjnB};PI82H`)g5#fDCDpzC<ofaxQkV6Vh0Bbs8A$u5<2OebX5m}*vG zq&<tT0wd^+*?WiIWyY?V&Pkvz>@d%gJy>u5u~U;%zDy`3&q?}=MP#Ap@_#77M;6D< zgfQzg*|kPiw<Jqlw`cIbq}eTxD}bOnq5K^qYcpi;b37vhFub2)`BTm@8}^o$$R7Qf z0*ZNt%$%;_iyE*O&IipghJ3a2oj;MyXD^6cz;l?hXN-?e027|J`RutK>!l{g0`ThH zuh@S7_5*sDW1b8zOf%ej6GS?xWab6!%>g7<PWVp7y=5_6Tozs=ydW<FS{1V4@s6$_ z9(<&;GK8(lc(YMo<R{_p%0g}_GYPhN71y>7I<Mip_~Y6`&NHq|u_KfdZnuHvolMyw z=V_)24<EjGytbaRwGeJcLJGbJAMz3kv_RP+4#Pe#;M~gkVXEwQoIy6(`~+^&7#!f8 zuW?vtqcY+Dn(4VXjUN}MCZC0cSOr1o0(EGOI)+0F#++eL16FgiLMyPc=ptw>qhear zr4@70sL|nxgEXD~v5k($h9j0r&C+Ku8IduW5OGQZ7a?}WH16ksHAY^YCRALL1qKyq zrUf4A$RiJ6?trF*bBuP~Yz}LAl+sMjB6K!?gLxLROWwvndZ>jm3KhXsrAYX>j$_Hx z-qxYwpW#yb8*@t)25B6nJ!SI*(pE>XPIE6~)%etxJd8uQV(!6ffjLdIC+D>H4tr_3 z_h>I+F_5H7$LImzKG;Z`bt}h*${ZxJ>1Ztc5~v<S7rIu^;mLzB`e^*o=P$vRd6cq6 zNg*mG;IL*mZ2kAcV9;YngHe^p4-)NdxV)YqDt%*tcZO#U;re9bM`&om$7}5eSbXXl z{%HFPxaP3jfukOfmuH~pk+H4!U>Pw-bYdV?HqSlB3lV9g%Za8AxYapqNuH!J<Q)e5 zG91X~QLKQd8#?sL!i(i_GPxUYv-Py0$a8`GArSoqdWH^99kg_RYu#9HVt8G=@9?*9 z-?_e@WNZ-QyyE+tgCL%2ioVaXw(sjpgMSGJ@CFJDIKP78DvEt->KW!bFM~i@3S<yu zF?Fl%1;=qr$I`m`Jf7Pb$N`6QIl7%=;_`DSu#9mJ#d#2l=qp-Rpge)l*!>Ene|QuM V<$RM{b_eT%PLmpx8vPia^&dvjdOrXF literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/pidlockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00a2fbd25a8bfa5f72bffa1acf3a3e556fe62a93 GIT binary patch literal 4859 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 No4fO$d+&K?{sUK<*6{!U literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/sqlitelockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2b09a03b79e402b593c0b49c9309bfd89f75485 GIT binary patch literal 3758 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 VzR2l~xq>^$qq_$Q&Nseq{trQ|lWPC~ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/__pycache__/symlinklockfile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bea6333cd5582d12bd1eeb3dfa764ead42a587f9 GIT binary patch literal 2182 zcmah~TW=dh6rP#A`jSgSNSij46;P-p8bfGkDnSXQz)LX?iBzzJRvXVcU3)Li%s61n z<$>l0Al~4iavpi*4T)dCPuN$U@)vmGoY@U2t|i8rnKNf*&wTTpi|;QiR0*`+{@OR+ zgY*|J&YKCsE_C@222MDQNkZF{qRe8}W_mW-1~<4Fn~Bx761#0DPTNV`wwqMi6-quQ z+~W2L;dW>}HQH6q_DI7y1B;|V^QGWGX7Nykev}L{p;~7YH>})!n05O10~zL(R;F+f zaxH!_!bM)gaX(7JY^d^uk7E%AT<?UugSO9`0m3eH`2dEHv?(Wmn*!!#ZgT5{woQJC z+uQ-k;x4b8khaaMyauzw>wE!bmoM@qm@C`>>?`@w-YAKqw2u%zi{fzn7D`^w>4Z{x zD)R!b3u<pDqx8^|#o?P<jm`a52RX%tvkm<d=<+5EicIN*Oz4D7j8l^m#d^lnoRFS% zN;zF86XIK(!2PTx@KFt0ppD%1{V0u;@8>L&xj6{b<J^*iI8u3Sm_|p#&`*OTY?!$z z!?-Kz`Xlui2?I(URdDz#5i79s_oz7#(Q%-{=5ZjJ-7Myzkj+Fi4|=}8Be&B#$NYB3 z9~^JJqq;kXJrTd#-M)Lbx!)W_gIiH5RS?IwL}z>FJ#`eIQg{D2OnD}nF%X5^G)q>_ z*PDZpz(8DpE;UDNnT@Z^5WRW+)((Sn*pLYqx~B0@5GLT@enr$LG)3~r6RPNxo{}f5 z+}VPe_D!(`MAJK<|L&*Js$x?EP8W1DN*<9^nMB$Bs`!Hv{7uNzIVFOl3rb7R3d<7) z)}EDCe^f4KV5zc3p3)y^x~QrgEthNfqE>$W8_ec4k}?hsrsQjKbo(nvtUZ_?>A7LI z1SZ4y%`(irZ-Yo-L}7$=j)sv4J><{pX2QE6$E!D_7fCNDazSr}{0vz={N-nCzkk%I zi%YQ1P4v2`q3D#J5R15~pg|u!lsjMUeJVsI@_OV4iH{p_xp3f^4kCfPL#V}JIA|DR z3H92z3$FI{1sG8}ti(%r)+tfrLcRe5u~(=|m#NF3(N((0TxJ@ppfg#WnY2nhV|;lw z2udp*BnKPL7za8A?tuWlBBw-NQQ&Fdo|V2>1HA$IO=W5ym3n1OZ8+ti7j%Ldt?_a} zWtypy#__d6gDiynZSP>HJls7Pd5~LfUWue;DCEKd1O-9sC}ENpOxwd0tA@A?ng%Th zn`KCZaR^24eK;b~bEM#hF47lyD9_I40lle6k4`ZfjZ+GRgSHx`MpD!OJCgqcN4x?? zK7=lHy3z6atSkO~^?VTC42bMHR5?sC00g7e$NvI=WnaJ&_>HD0cd<lii1?WKj0xm; z7kW`Nkf)6oKt30~^Ko7W1J9Esu3q3Qg91=m^H2)>c0RVedH^rz>$rIEABb0HAzmD8 zu>BTNQpLiKg&PWc)%TN(4`Y<;zJD|f;&R9FeV%oEU)N5t0hfqZaX`muYQ$?OT|}9d zF#kja28=L?<YK~A?dt2U;~K81_Zl_4w>wlr0rv`wfa3ixgOn5f=TpSGj&NNTup;P> X=iQjQ9~7^+hY2h3Y@NA~`y1vz;1T%< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 000000000..11af0f38a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/linklockfile.py @@ -0,0 +1,73 @@ +from __future__ import absolute_import + +import time +import os + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class LinkLockFile(LockBase): + """Lock access to a file using atomic property of link(2). + + >>> lock = LinkLockFile('somefile') + >>> lock = LinkLockFile('somefile', threaded=False) + """ + + def acquire(self, timeout=None): + try: + open(self.unique_name, "wb").close() + except IOError: + raise LockFailed("failed to create %s" % self.unique_name) + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a hard link to it. + try: + os.link(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + nlinks = os.stat(self.unique_name).st_nlink + if nlinks == 2: + # The original link plus the one I created == 2. We're + # good to go. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + os.unlink(self.unique_name) + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name) and + os.stat(self.unique_name).st_nlink == 2) + + def break_lock(self): + if os.path.exists(self.lock_file): + os.unlink(self.lock_file) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 000000000..bd5a51e13 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/mkdirlockfile.py @@ -0,0 +1,84 @@ +from __future__ import absolute_import, division + +import time +import os +import sys +import errno + +from . import (LockBase, LockFailed, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class MkdirLockFile(LockBase): + """Lock file by creating a directory.""" + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = MkdirLockFile('somefile') + >>> lock = MkdirLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + # Lock file itself is a directory. Place the unique file name into + # it. + self.unique_name = os.path.join(self.lock_file, + "%s.%s%s" % (self.hostname, + self.tname, + self.pid)) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + else: + wait = max(0, timeout / 10) + + while True: + try: + os.mkdir(self.lock_file) + except OSError: + err = sys.exc_info()[1] + if err.errno == errno.EEXIST: + # Already locked. + if os.path.exists(self.unique_name): + # Already locked by me. + return + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock. + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(wait) + else: + # Couldn't create the lock for some other reason + raise LockFailed("failed to create %s" % self.lock_file) + else: + open(self.unique_name, "wb").close() + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not os.path.exists(self.unique_name): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.unique_name) + os.rmdir(self.lock_file) + + def is_locked(self): + return os.path.exists(self.lock_file) + + def i_am_locking(self): + return (self.is_locked() and + os.path.exists(self.unique_name)) + + def break_lock(self): + if os.path.exists(self.lock_file): + for name in os.listdir(self.lock_file): + os.unlink(os.path.join(self.lock_file, name)) + os.rmdir(self.lock_file) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 000000000..d776de522 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/pidlockfile.py @@ -0,0 +1,190 @@ +# -*- coding: utf-8 -*- + +# pidlockfile.py +# +# Copyright © 2008–2009 Ben Finney <ben+python@benfinney.id.au> +# +# This is free software: you may copy, modify, and/or distribute this work +# under the terms of the Python Software Foundation License, version 2 or +# later as published by the Python Software Foundation. +# No warranty expressed or implied. See the file LICENSE.PSF-2 for details. + +""" Lockfile behaviour implemented via Unix PID files. + """ + +from __future__ import absolute_import + +import errno +import os +import time + +from . import (LockBase, AlreadyLocked, LockFailed, NotLocked, NotMyLock, + LockTimeout) + + +class PIDLockFile(LockBase): + """ Lockfile implemented as a Unix PID file. + + The lock file is a normal file named by the attribute `path`. + A lock's PID file contains a single line of text, containing + the process ID (PID) of the process that acquired the lock. + + >>> lock = PIDLockFile('somefile') + >>> lock = PIDLockFile('somefile') + """ + + def __init__(self, path, threaded=False, timeout=None): + # pid lockfiles don't support threaded operation, so always force + # False as the threaded arg. + LockBase.__init__(self, path, False, timeout) + self.unique_name = self.path + + def read_pid(self): + """ Get the PID from the lock file. + """ + return read_pid_from_pidfile(self.path) + + def is_locked(self): + """ Test if the lock is currently held. + + The lock is held if the PID file for this lock exists. + + """ + return os.path.exists(self.path) + + def i_am_locking(self): + """ Test if the lock is held by the current process. + + Returns ``True`` if the current process ID matches the + number stored in the PID file. + """ + return self.is_locked() and os.getpid() == self.read_pid() + + def acquire(self, timeout=None): + """ Acquire the lock. + + Creates the PID file for this lock, or raises an error if + the lock could not be acquired. + """ + + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + try: + write_pid_to_pidfile(self.path) + except OSError as exc: + if exc.errno == errno.EEXIST: + # The lock creation failed. Maybe sleep a bit. + if time.time() > end_time: + if timeout is not None and timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout is not None and timeout / 10 or 0.1) + else: + raise LockFailed("failed to create %s" % self.path) + else: + return + + def release(self): + """ Release the lock. + + Removes the PID file to release the lock, or raises an + error if the current process does not hold the lock. + + """ + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + remove_existing_pidfile(self.path) + + def break_lock(self): + """ Break an existing lock. + + Removes the PID file if it already exists, otherwise does + nothing. + + """ + remove_existing_pidfile(self.path) + + +def read_pid_from_pidfile(pidfile_path): + """ Read the PID recorded in the named PID file. + + Read and return the numeric PID recorded as text in the named + PID file. If the PID file cannot be read, or if the content is + not a valid PID, return ``None``. + + """ + pid = None + try: + pidfile = open(pidfile_path, 'r') + except IOError: + pass + else: + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. + # + # Programs that read PID files should be somewhat flexible + # in what they accept; i.e., they should ignore extra + # whitespace, leading zeroes, absence of the trailing + # newline, or additional lines in the PID file. + + line = pidfile.readline().strip() + try: + pid = int(line) + except ValueError: + pass + pidfile.close() + + return pid + + +def write_pid_to_pidfile(pidfile_path): + """ Write the PID in the named PID file. + + Get the numeric process ID (“PID”) of the current process + and write it to the named file as a line of text. + + """ + open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) + open_mode = 0o644 + pidfile_fd = os.open(pidfile_path, open_flags, open_mode) + pidfile = os.fdopen(pidfile_fd, 'w') + + # According to the FHS 2.3 section on PID files in /var/run: + # + # The file must consist of the process identifier in + # ASCII-encoded decimal, followed by a newline character. For + # example, if crond was process number 25, /var/run/crond.pid + # would contain three characters: two, five, and newline. + + pid = os.getpid() + pidfile.write("%s\n" % pid) + pidfile.close() + + +def remove_existing_pidfile(pidfile_path): + """ Remove the named PID file if it exists. + + Removing a PID file that doesn't already exist puts us in the + desired state, so we ignore the condition if the file does not + exist. + + """ + try: + os.remove(pidfile_path) + except OSError as exc: + if exc.errno == errno.ENOENT: + pass + else: + raise diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 000000000..278dff4c1 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/sqlitelockfile.py @@ -0,0 +1,156 @@ +from __future__ import absolute_import, division + +import time +import os + +try: + unicode +except NameError: + unicode = str + +from . import LockBase, NotLocked, NotMyLock, LockTimeout, AlreadyLocked + + +class SQLiteLockFile(LockBase): + "Demonstrate SQL-based locking." + + testdb = None + + def __init__(self, path, threaded=True, timeout=None): + """ + >>> lock = SQLiteLockFile('somefile') + >>> lock = SQLiteLockFile('somefile', threaded=False) + """ + LockBase.__init__(self, path, threaded, timeout) + self.lock_file = unicode(self.lock_file) + self.unique_name = unicode(self.unique_name) + + if SQLiteLockFile.testdb is None: + import tempfile + _fd, testdb = tempfile.mkstemp() + os.close(_fd) + os.unlink(testdb) + del _fd, tempfile + SQLiteLockFile.testdb = testdb + + import sqlite3 + self.connection = sqlite3.connect(SQLiteLockFile.testdb) + + c = self.connection.cursor() + try: + c.execute("create table locks" + "(" + " lock_file varchar(32)," + " unique_name varchar(32)" + ")") + except sqlite3.OperationalError: + pass + else: + self.connection.commit() + import atexit + atexit.register(os.unlink, SQLiteLockFile.testdb) + + def acquire(self, timeout=None): + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + if timeout is None: + wait = 0.1 + elif timeout <= 0: + wait = 0 + else: + wait = timeout / 10 + + cursor = self.connection.cursor() + + while True: + if not self.is_locked(): + # Not locked. Try to lock it. + cursor.execute("insert into locks" + " (lock_file, unique_name)" + " values" + " (?, ?)", + (self.lock_file, self.unique_name)) + self.connection.commit() + + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) > 1: + # Nope. Someone else got there. Remove our lock. + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + else: + # Yup. We're done, so go home. + return + else: + # Check to see if we are the only lock holder. + cursor.execute("select * from locks" + " where unique_name = ?", + (self.unique_name,)) + rows = cursor.fetchall() + if len(rows) == 1: + # We're the locker, so go home. + return + + # Maybe we should wait a bit longer. + if timeout is not None and time.time() > end_time: + if timeout > 0: + # No more waiting. + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + # Someone else has the lock and we are impatient.. + raise AlreadyLocked("%s is already locked" % self.path) + + # Well, okay. We'll give it a bit longer. + time.sleep(wait) + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + if not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me (by %s)" % + (self.unique_name, self._who_is_locking())) + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where unique_name = ?", + (self.unique_name,)) + self.connection.commit() + + def _who_is_locking(self): + cursor = self.connection.cursor() + cursor.execute("select unique_name from locks" + " where lock_file = ?", + (self.lock_file,)) + return cursor.fetchone()[0] + + def is_locked(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?", + (self.lock_file,)) + rows = cursor.fetchall() + return not not rows + + def i_am_locking(self): + cursor = self.connection.cursor() + cursor.execute("select * from locks" + " where lock_file = ?" + " and unique_name = ?", + (self.lock_file, self.unique_name)) + return not not cursor.fetchall() + + def break_lock(self): + cursor = self.connection.cursor() + cursor.execute("delete from locks" + " where lock_file = ?", + (self.lock_file,)) + self.connection.commit() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 000000000..93ff2b560 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/lockfile/symlinklockfile.py @@ -0,0 +1,70 @@ +from __future__ import absolute_import + +import os +import time + +from . import (LockBase, NotLocked, NotMyLock, LockTimeout, + AlreadyLocked) + + +class SymlinkLockFile(LockBase): + """Lock access to a file using symlink(2).""" + + def __init__(self, path, threaded=True, timeout=None): + # super(SymlinkLockFile).__init(...) + LockBase.__init__(self, path, threaded, timeout) + # split it back! + self.unique_name = os.path.split(self.unique_name)[1] + + def acquire(self, timeout=None): + # Hopefully unnecessary for symlink. + # try: + # open(self.unique_name, "wb").close() + # except IOError: + # raise LockFailed("failed to create %s" % self.unique_name) + timeout = timeout if timeout is not None else self.timeout + end_time = time.time() + if timeout is not None and timeout > 0: + end_time += timeout + + while True: + # Try and create a symbolic link to it. + try: + os.symlink(self.unique_name, self.lock_file) + except OSError: + # Link creation failed. Maybe we've double-locked? + if self.i_am_locking(): + # Linked to out unique name. Proceed. + return + else: + # Otherwise the lock creation failed. + if timeout is not None and time.time() > end_time: + if timeout > 0: + raise LockTimeout("Timeout waiting to acquire" + " lock for %s" % + self.path) + else: + raise AlreadyLocked("%s is already locked" % + self.path) + time.sleep(timeout / 10 if timeout is not None else 0.1) + else: + # Link creation succeeded. We're good to go. + return + + def release(self): + if not self.is_locked(): + raise NotLocked("%s is not locked" % self.path) + elif not self.i_am_locking(): + raise NotMyLock("%s is locked, but not by me" % self.path) + os.unlink(self.lock_file) + + def is_locked(self): + return os.path.islink(self.lock_file) + + def i_am_locking(self): + return (os.path.islink(self.lock_file) + and os.readlink(self.lock_file) == self.unique_name) + + def break_lock(self): + if os.path.islink(self.lock_file): # exists && link + os.unlink(self.lock_file) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py new file mode 100644 index 000000000..dda626a2d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__init__.py @@ -0,0 +1,66 @@ +# coding: utf-8 +from pip._vendor.msgpack._version import version +from pip._vendor.msgpack.exceptions import * + +from collections import namedtuple + + +class ExtType(namedtuple('ExtType', 'code data')): + """ExtType represents ext type in msgpack.""" + def __new__(cls, code, data): + if not isinstance(code, int): + raise TypeError("code must be int") + if not isinstance(data, bytes): + raise TypeError("data must be bytes") + if not 0 <= code <= 127: + raise ValueError("code must be 0~127") + return super(ExtType, cls).__new__(cls, code, data) + + +import os +if os.environ.get('MSGPACK_PUREPYTHON'): + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker +else: + try: + from pip._vendor.msgpack._packer import Packer + from pip._vendor.msgpack._unpacker import unpackb, Unpacker + except ImportError: + from pip._vendor.msgpack.fallback import Packer, unpackb, Unpacker + + +def pack(o, stream, **kwargs): + """ + Pack object `o` and write it to `stream` + + See :class:`Packer` for options. + """ + packer = Packer(**kwargs) + stream.write(packer.pack(o)) + + +def packb(o, **kwargs): + """ + Pack object `o` and return packed bytes + + See :class:`Packer` for options. + """ + return Packer(**kwargs).pack(o) + + +def unpack(stream, **kwargs): + """ + Unpack an object from `stream`. + + Raises `ExtraData` when `stream` contains extra bytes. + See :class:`Unpacker` for options. + """ + data = stream.read() + return unpackb(data, **kwargs) + + +# alias for compatibility to simplejson/marshal/pickle. +load = unpack +loads = unpackb + +dump = pack +dumps = packb diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53a4d016e253092e5d31beb19f0118650f28c899 GIT binary patch literal 2078 zcmb7EUvC>l5Z}E!pD!0DP23VhOUnsW0wdLK3sut!At+P@s)ndd|DA-+=i7B~a{s!! zb{fkCiB#$f>Ssva;M4HN!@ly=ufP*Cd$ws&cwnuaots_H&Tr;7dt+(ICop!l*1rGU zCFD>1m<<n<&tb|xKrq5+N-`Q!in^6rTe#Y(ojIXH$t}VhR(noZjl;^^1M9#JYjC2T zx}nS6o%*52ydx^QU|UERGC%aQ#c(legbhmaZ}$VR`{@$e%?*p`@<00zN&cZj_=#O# z{7MP_j`Q-E<klm?8f@t~30K%MI|1t|TVboPHhD8V$rr;@d?kE~uZC-^evh=8uK*iq zQC%N#AqPbcD*XtApT`+zYFMT`!6UO_PZb$}!bwOO2`xrL`vvJ!W-<G@7dkJ9L&6%k zcXa*cQ?<2U^6>{#B@nz6T=HDWfIn4%g3Vx%2btV1<7Bs;%x=K71`}8L0E8kFs_20w zn+k3`pg&WvSjq;=d9YY$VfKVN@RwaG)|s<Q<&E5;L_tZ+`I>Sk<iI+tPr%p2I<g@~ zcVoPg6pRPiP^zGZ!KiVQ#VVd#di#n?K_P}$KY<uG-#CBq$4i&5wmj_*<RF(S&J(U} zaH1Cw_)Q@Sp=-v4_8-LQaAuOjk_&+lbv=r5z86I;TiZ!0wSyOE2ZMlGEJRU~#!^Pn zZ{)8hol*=&vErRkEIR!nWl*?ICOW;HC|Z|S@~b2ENfMQ#%NJFDeS1fwm-<((UF&Rh z%0YR-1em55L~>>QWA!9PqnXi&=d2K&X&E|EG{^@kirVGASb`9-P2@5NLVfC)xd!X_ z#I&sK83I>(paOZKNc&Ng6>ONI-iV?n!#JJp0AN-mQDl7Ur76IKrzzN)aElQwDppZH zi2@UaEh!yTs6&lqykKg9nc4`OckbQV{Nl^o(dPZTH#Z+|ef`}AWYpaRUU8x8!yFmb z)82ifZ~^|`0cR~soQ6f50g+fBaNsR?<!zYq90*1FK)09l8BpwyPV7T#LXPMWz6TU& zWQ`yB0Svq>D0(|QQ9-xp264`UJuy(gD<FFjbfpqJ&bq!ieUJ0tx+(7UZWU%X=oca= zN(Id*+vX5}FmdXdaikrD0lh^F?N;8jySo>QZK++{0#?maSmo|4#Qz=wK~%)`sX$AD zjK+bOvCRzD6;KRT`Vw&hMnFf$5C0RL;A$xHz}(CNL-hXv4w8>GFad#%nHB+xHzDX6 z`tP-1N1773;(gHP5HS2Xgj4V_A&2CMJhK$^d7n-IjDhisfl(0vYBQ@;UliHAH0>(< zyYWDB8FYc+BK`^p)(!T4;Q9PmkQBL!p`-8}6LE#Ss@UsgossRB!nQ2!02!E}9~2o& zRDs7L{5u0~#ox=YRn@WXQE?u=T5s!jp^w|s9&XQ`QusD+y1<0#bH^RwPZM5IO)n-z z3Xi?voj{&cPm@(hUFZ2|Ac|bu+gu%gS3geE9#p6*=DeN4GsoQ;RV)q99=ln=goa)G zCMye}%nNGxVM=ZwYbPyYrfVqSxn#qv)HRgywX7Ki;oG6TPpfz6Gt7j<oHeLtHSD#9 ZM;mm_vOu1q%k;GE`QC!paHwNB^lzQL8Y}<+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3242cdfc40b97eca1e5c702f6cbd954563b4bb2 GIT binary patch literal 227 zcmZ?b<>g`kf~*j+SWzJT7{q}AMj*ohh>JOZL<&O`LkeRsgC>(E^GhI~;Uz1GU;`3< znvA#D%TkMqGxPISG8BQt!NjjZ{eq&*vc!^9{j$U&{j~g?6rdvg+#>y?toV3~V$(eH zvJ{i#_<}McgOW6h^sJ&B!!%P%OZ^c2g3JQl%)H`~#GD-6qGVGG<C4NekRTYxm!;;V m<QM7Z7N-{^CTHsd`Cz;C3My}L*yQG?l;)(`fgE29#0&sa;yjE1 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec87c40eeafa679df416b19f18185cf775837546 GIT binary patch literal 2183 zcmcIlOK;Ok6t-h0anhzui^KvUG>eP4K{SR!MUfDyfZi*Flp<YV5rjsrXB=Ey+l=i1 zQFpN7uI|s^FL}$qV0FJUX&y~mi7uFECiBhX%z1q0_;IV%G|&!SUVi(`HjEzxCasFe z4tn+t!{3H5g!vU+8egow30x5tuq9343a~Azz*UVc;F_od*QF`#FLu9*6-P9%(vVf$ zr~x;{67Z6iSO;DfE#Q`{>l+SMR>Ue+R;42wkkJ(Fe~iwW4}GT1#B2vWYh#c`-xNl_ zBFw%eDmZJEtFPkJ^WX1&@@1NbNj!S~RHjP$UM@wKu~(U7(>)f(SuQ=n@`T}l|BiW4 z#N^~E6NL)n0V}jb%(}gfT{@h{-l62YY;t~>h$5o-GUp!(FFM|-b1o8}^Y4bLK}|jU z%-mFkL+IfSJ>>>TB&5pRL*?!taK4>w#rKEep3l?a=IuP#9vrCXPO$ahf&0=;!*qjG zg?1at-`c*LfADBgcRrM{NR)e+4ajhJs(#i@KPz$<^{j%yF*QEhpUXHf^Cx^+DVvXr zAdu>>B8qw)OOXg=(E#eqSvIz@PHPSZ;?d+e!oU1nW3R~ff~Q{Y{o-p4NT)t|jpk>+ zb`DwEW3s&VqC)N}m8j7lr`R&voX~}6u;>gjdKT+Bk5Im~=5!={LPzrI4js6PVHN;U z`D%dFmay@UR6{^&Wn=eKt~~OPPjR3||0LoGy3UCs^T^=FQ3WG%1J}$RLg|c2EJazB zBm<dZXEF*Dg<X+?bJ|lViRWP)=A5sSWQw?9*38lRRE6&3fKLRYHX)nVg>DFwc+?wR z8^8YNeup6yWjK@qX$CczfGu79bjMUHxU#4QQYp(7=a;dk<7}9twRs)%Zm&~ajL0ep zqqxsW)XAucx`d525=m-0reiBw@zJM^tl2?7uhO($oTxL;PBG`Ab%xUSxXLUVb1uEe zhAX5baRB*E_(E2!kQFnIkN!Q0S(q{9g&6|&@turW{yCK_36KhDk?ZKuiL6M|M4`g6 zeXNH0jf@Q`r)aN;r@P%|lcAk*)a?0bis^$F$unZ<wW%X)MfgIFSR=#thEfGl@^M@Y z{yVj_=#DVX<v^;LwF&Hpdz2Rsw4aWv^29^z&Bo@<n|JTrV)VD!`JEoQ1P@%F^9bQy zXNii)@wZWb4Rp;`R65J%ED(z7l+FoFDeca(b;3Q01fG>#rSow7U3{d!Je1XKn||wd IyMeL(KaCIA-T(jq literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26b612a73d991778ad20741e475149de9f021475 GIT binary patch literal 24555 zcmd6P3ve9CdEU;xcd=MJ2!bGv$D2EnM}S9yk9$!Rk0yB}MM`%#iUf5h<fO#{Gawd^ zU9e|Bf}4f!ES{9hm7-#ll%hDY0xBt2l5!=A6DzXplx0b=&krezW6R1|wpB`%N>Ch? z6XoG3N-p2`_q-MW@1ZCuVKF`Z{JZ<_zyJRG@4x4CXJ;{izuB?=_mw`HNc?*Sg1<aG zC-FG0kw{pH@q}eq$$4Ykkau!CDeu&H$~I=xma#oyrRI|AjFleG*xB)%ogXjQ#qka+ zV`X1TjF;*IR*orl=X4UO<?(`**C}?FZCHg{N%c8EEY5c?^o;iyiJRRBb<FoJY#Hw} z63-^;W;$VSohzzO843Q7T0&|cQ{S7YC!b58=KgmitWK-^Qo<_R+is=C2c*`1<n5Z@ zzA!jGfO6ed58Bg%xZe4D7Iuv9Sh#om-i4jxI~VR7zi+`DHy7?7zhB^QnSWqm*Z3~_ z$9G$O<9n>F;}2S?@x2HSAv}!mK7=2#`p5TM+r|%A1LGt1LHp2j(%NnfzGRFaw(hZZ zptd8{z1B{=AGYqZOuQdKJMXt1Ksz6hc0P*mE^9Z!yCwXXmAsr7-qRd8SDl}qtWM3D zi%ZHjFWz)#8g;X_usClo*mbw+)(~t=n+wj>MdVuJ*p05G;EqjU)Z~xvB%UYnI2_bg zVl{Cm0r<w~u;FEDuD#&EV_5$%p)yGS!L@^ns&>8V+6S*!)xqh;yk#rr;DS0hIa{e5 zbsnuhe%*Rxs<L?f$RT(7=+#*@e|Y-Qx4rG)*ullx;(=P-anb4nYU<IW54+c@jFhKx z-L6{=b<l6@!D+v5Ba1h^vQ?XMD`<+6=9Ji0HacOb9Ncqnwl{?k#IT{#C@DSCPL@GJ z>&4?k_j(p@F5X1Tlmk>&YW3*`P*JMeH|A@OTbZfVU4~EJbZzJKQjM5Exbw2BYW1sr z#1z1Vf5iPsJkEn~>;z^@0yCvxC9M?bA!Vhl48}igWvv|E87q%*D0+Df@WM0SN2$b= z^c)_(2~dV^KRhi%nQp>0TE;E>T8T=sm6%Pgrdq}w!${QgZsHb(x01B{;Y}-I(o4<T zbuTxm+wWzoi;EbE;iQ*#?D=WWaMmHo%U6Jjnp>%uC@nOTFw#cZC?}geK}$!1Je#-n zF_d)CUf00H?rRyV$vcS^quwiVDa1YKrrC=X^kO!%n$<lB+MV-?HAe`kK4p8w1$&{P zZeFk1H@uwNnB-u11-`0ERd0G3iBa9CQuV+YPAU$u+CqmE9gV-2xj_o!;5fqijH3MV zMzb9DOtNfFaV&!dCsvJM1|_9lw1L<K(MiqgD$QTD-Rsr)C7WaDQ(g>{K`N%BDkH~m zmLpKFF4&cdSFBVP8rIT0{iRCf+ER61r>H(;RfBYP(2434pHO=z67Iv}FqAin*?d+p z4m6w-n!fN%TR+JwgxENBu4*C@z$lP*YE3&<3qgAM<MY*pNvnF|FhUNVgn9rDdQd#Q zG(Byrb4&B{Ug4P~_nGN4Rk!MOU#XK*y@%L1t5idI<%{j%9)_R6jGUft+|XGHXO~@7 zWqCFnfw7y5_8J?z#woJK)~>PFwbu|i#UTIqX1erf2%c7wB-cvK<<$WE3HXh<>}AGl zKW3v(g1XmfFV&cw^$gcbyQtF3xJzKY>ygk~nVPYu<|@omaljg;+)>mfNKY6gqm)!f z5DqcTHjxoayC&edS;DkH3swxQbH~$|;8^F*>vhgeI;Sz^Q%q+LH@%v%3^&Vgf5Oe( zNn+wBKj5!{En_xsCFfG=dADGtZW$jy55Zy5qs<R2VM1Ls!OYD`85tA24M?s|*{0ht zmt<JXJ<i)rcc$i;^LEv8q68MTIb4oen>L;K+7x4uZ^^MOvs$;z8@2g)bJ8{y=IV9C z)#_%|oL+LdZu#t0?L%LiyQix4dczHBoK}qmb75)TtsUSrHi2(@${jAMeq{Cv9BEAi zsf+J@*vsm+d-)qxRYwyXFHN61#LVSOOLe!lU_YzVyu7R>pjxjO(Hoe<2s5Y2PS%g) z)(Ylg#R8#K*shAM?F#Zc18@>X62n<err~Cjc_WXfXygrb9BJY3rVt?My$g?H!g0Ya zFl0#%6&BwVIAIdpFFB3D`3Q$6Iog~&Q&Z@-IfX@0P}{b~?**b|fQE*Nbjw~uW-QRw ze)EcB2h0CRn5Uuq{F5wz1sS6`GMrK5%Ia}A-u8=F0#MNz9~4%<0Bvc7++I!tn;cGg zS<tjyUGTDVz%@}$1g%G1R_DJ8;67(f16x^QhjbodhnOMp3wEA^$A#cXJgg*J$yKZd zT*+>h;OB~w!i3m?36a8tIPOn~w3Q@bYoQPMGItVc3=<*+f9_7=RuV*?BGETLTr}}_ zMU!?Fl9JGtDI_;RHe_29BSpz{sakVv$D9Z`&4hVl#;%(|Hgl>0c?+mCZSo>hmYfkO zdfB$kV^i~0$2m5k>$25^IgK%BEK)#obhgpv7IH9-AIaaYH<qr>j8F*6d-<T8m!7t5 zAituqsdfWFY7ZQ*T)EnCD^j_jpZtuGpw}>RIPGP1x6~;n=QR{tc`0SP>qbod6tXn% zI9#$4IWB}k-dO1KcqDy_Nx>f%*pqmiufPdq8%i~hZXnrUV8UO@hNKhxrn^PnF(~g? z1;{;Ft7vuLowG_-C*FChY<1yX@TK#j)oX1*xWnqRw&GpFuEDVSt!<E@%Hkiew!`0L z4O;ggz1!Mh-HUgR-80^64Ou&_`;fZD8n#U9e)#&VebxikF8H=u4_UjdJ@EBg4_bRs zW}C>``_&nAs(Km=JmdgSJ11d)KA%QF{7V$OonxA2jxAPIb-|pjVR4?X&DqC<97uBK z5Osi20m;o&uM^<J2<O&NeR#rLup!G^nlxDC0@&)JJyn~oaaIR4gPoEOJCKX3^WbFY z4{1m!xaJDuJw`~!CP+6!fa{ajl2e_WxBZ6u4F$s&conYXQDebDz`{ZMVMlZ;S+!&x zo)|HQEPJ{NE`7|L0BVK~Keq4ip(Bs%Hy5hQK9}^f4!7ZEveB658Ug$`Zd4^Y>neyt zem?^SW{Nz=Rmb1yuvCPiXWSWE-M~Bz%SAb5VU9O*4DdH;i>lsu<7OaJtPwKRLj(-J zx%Pl%nnS{dYf}vibWjiabYvLJ11ucTAc>G<Zq(cv^UBz{14qFcbecH?F5g%H$yv4) ztM|zzr9g)BH}_+$wgE~;h9j?$I=SSUAdX-~o|>uFuVRRSENr>3T-54et#ydd{wh6U znwJ~q&BhW|W5@N0@g@P;%Zps_QK4|PIon<&F>_yv1;Gk|p{<M9l1|p<Ywk^-^hnzK zf)4HTIU-nVZEB`{B{Ly4C{?q-ghc?+ytAEvxj2%n{aIC+X*A}d(R`NtIyQ&Ua%ZNo zM1jYabyd#@wupaMWLdD4Btfhp!Y~9?lUq?xqMqw!bsAEVPp9m)zk3DYFGiFw#5Dl8 zZJ3U1&S#xQy`A{hH+`{MQ_laR4sg~`D==r@JRsW+Q)>Hhb%mrIjA(@YvjNeHM99@I zAn_1om{t+Wzyg4B(ClcVZb!2V97XFgOin^1gCHX27tMEn{T15t*&ExnRF~;i(XwjP zI<T)mWE!T(WC<m2)<R7M5y?g^j<LYKs0&oGccOie$zazp#Ha~R)fQ?lSUGqv2S@n$ zjcUy$QTgoN!W=w=m7xkT!?_8mZ2^Mch0(Ff)2E(`P!zQ&5L%+G)&wT&lr3V1mR~fE zA-6#0#~cRRh>E`#bKRdIj_vAcCrg@5k{9tuH;he;)*T4h3LFABbQ())YLi8VH~@w! zP&;hsKhm(ds9(iY0~U}g&a{v0+xPI{1BdT|)mr^cK%A`A-!w#7Zr%h;$@iwAf-}4c znB*Vfm>x5uo(oCa%T;awd=&ZONNg%-34jZBT+BG;3npZ5p#<?n$mxc{1%5wg*Aq}K zI#?r_n|~s)a^DsdjmD12i>fhYJI+wUADuVXM5h5M+kK;kZPFSn5$Hcx@%Cn5OJ+U+ z%A1;llrnXFh+@dTeMh2hu&vmmQpQH!_QFh?gj_QhcA7Cke@8@yLZNnGZ-5s<h~b98 zQAORvSnajfUVCAR8Y%wq&CL&YL(WH#p_R81a|PAcwmmE$E)U+BTq(4mJB0rbwnvFd zs=kv7v)Rlo1NwlhmDYQEq~xp&)7`wN{t9k!w!_NKB~;xlK~q%_HDPBxPe1Z?S~<97 zal2Z@#g{FlRJy4FneCoSt53Q;(8W`4kX-x)x0kV2@fK1mTim`DYK3oWi)H#-gtrab zu0&;^MX1|bY{_5?x{1m?tq!<5T4+P%-c~2vovkw5`&wOa%~m(u`=u2Rv~tA5ZA0xw z4|BJS+lI3nJ?xNHWc;*~NJHO|b`ohNNz3|a&m%1>Y0o3Av#s26E6BBsv@+9>8?XWC z6~uHgMsz;iqs@_ES!)+f^d>u`(Qrd88)Ga3W6k^5$<7e(DMQ8Nj&s8)^$<pWjSA>B zQO=P@ghZMmZ;SjKmU9*$>wpWp5Z>0WDK+lGn)gg-6*Xj_Q0fn)jOM))dao-I#>V7b zL2@L9Y|M1j2NC6w{YDHhq$DUGpyNSXZ*t|Chmz^K-5i|2mUQ!~hj&Fv2=xRo097Za z9hMj`A2eT`K!SRhsfCbdDQaM_GsgUcUeQZof%HngW=RzH>QQDW1=|s=E|yTG=5^7d z^>m93tkYh1W!*}xj<I+OyBp|S!@ZA}<`%|FS1|lup%M@X;I)eyNDH<(C?1XsniIp9 z*BgW)oD!&yEM$(YoPG%F8CMf*^_do~SbnO%*7zX;(s{A2V$rBHrl+y85BF%T^t%P2 zQP=Wei&N}fN4%vy8wTGiM7_#~cqp$!L)SX2dik(-9r4adAn03Xd)Fi_=$Qokj;+^V zPy_yN@Ho%INfh%qq=3o^O1ZQs=ct;?8rf7nRfN(mpUf7rNoqOrMlW2XZ2n93AxG>% znP$%wf48vl*dv9i`3PTk;Q`Nt3d|*^5q&e1ec+L^!aHX(1Jvb0fwhhKvf#LnxH)j! z1oXBBLX*sCF)jbW<P&(OaXiA%QK+&j(ENgLg8L#C3dF}5huoq<lr?9#pq@b!yz(gr zVl%Z*qC6D^rRqY8x<uzabf|n&yXZU%2mFb8Ag@>_vPHaBZ)ak3t{`0NEaG;8b!n}U zU~{LDCWeh};J(=zVv5r`RQr+Hg{$8K2uL5;Pxd`IkdVIkVH{wITD19)`3@U0Gq#14 zgt*z2-35eH#QHIsAB>oz=s}GQmd;6+?s6JafiBO1CTBmp!A2#L{cS_+r?)je9Aaw0 z&}5#%q2afTIsdFJr7I4Ry!ly>dIyRhX2m=ONEpp+A->ube6L?Q@n$7HnB4AHo{Yxz zF7=*AZI9fg-nb5N^W!{y?zM^oy*nHkeR3>Z(m!nTjQToC@ruG}gpwYQRlFtaaFiZa zN-T$DA}5{+T`4u^v!Wwz$<(O`_93=lifxM_B8Bxtam$F6K?s5L?$fqff!{M~>l&(B zh(5*^QZJprbkBmUo8_>b($BDooDU%}d;<ZV-OTb_N$9v`3_!i#0tL@yAje^R5T8;< z;HEKmlWs<4J1izJ+b393W_voE?UcmQGTQ+IB{0uB0CD+}z)Y*p^6Y0e2Og4KAz#U_ z7Fwx0#!9-Cc0O`3;TBtIx8qjQ`Gi|yP2dzpD=o7NG9B6qK6DiDuFX6fwOrc1Edi<V z>r$t*vW>5FuIC<PGr~ATM~!u}x~#?-$5loz;9Ke2PUj{Z96yl3=s_sqm<ZZ*&1bw$ zx1m>DAr`M7gdtk)b<F1l064{wB55Ryz7$zK&lo}ml;YUo$W4|4oLC#(VCUJk+3k}@ zIG~isSkIGqoaaF4F3@8cD=8}hr1I=0$ukL{nnRP?o>&1x23n!^7PO{X87p-XMj|wS zX=PT@w~O^6;?jsqBW?l$I*edWB|sSI+lBh~{Ind>J_&#RB+fb9G>C@7nE_echG2?8 zW$0FlgSeX0LyXd&Mu{RIccAp|!C#WndB1c4rN2TUSV|XI8f99385rn5%x2qksiI%1 zV-9UrqZE*(T!&u{y|KEa%nsrLkd7dxTVh769*Hp#(<?D2tt}E$Mogc?e9|qUhRraD zzO`YHeeFam4C(t;X$1_0`f<qF*8jZpzaP+(DjP!I#_@5>t6kOr;9zSpo4S*tNfIZB z)U(YWsi>a6KyP2Kp7ZF%cBuy&DZdwkVLkWUrJlic^<ea0x1L=6o2X}p)blmB$FC>q z&%IGS&nH*18~Q_5&<ngJ)vKsyC%0a+y={2Qk~Q4U)t6DveW)j;PK5QCVSnzwOFgFF zpP-(UI`jthbfcaJq@JG->)937v->Xf?AlPz$6vReZ2cdgo;^~}w}ir?v3W46LudeV zSZKf>o7>s?Jj(7x*|gdzWrxD{4d12gkZvE!9zxlDQugAelpWOO^M>1*`u|3Whor=Z zr9?Ek>!~#;>r*SregS3oOW9Y~^>RH024#a@X6he8*#jt>QAh(9i+VZo2EEMG--)sZ zrR>S5momc+-KA{QU(Wx-Qnt0Ozgz_4vomOO(BE{O9PME#``LB<edI1>gZ`%LA4Azk zrR;xM*WbtPQZ^XXbbTCUA4l1&x}>Rgwijj;34~43p+(LgpI3$zjpES=I_7AKYet;s z+)mYh2<UGU=${UuZxiT0Ezq}ZfF8}vV|Rh>&rCq)8uE5P_<eNdo(L!b|CfF8}q z<9C7X&qqK%3FuD<^!X6_5TNJOF@Zj`0s4t>HvQCHpr7z(Q?mXoKtCzae>;SJN}$X9 zw@z(<emaEy<Xxbj4xzsU=w|>uPu0>}Sc$L(qf9^gxA`iZtnUNlvjX`;A>@c6V)OcW z$Pw-Ipx1S&Vfn5#81+|C!#SzpJ7EnGkBiOzSPk*jNB6;dof@W5!#hwzL7j9dKafYf zl|De$@TG>hv|-da|IZ8DkA-mGO3OEeTmLMeUJ$5%_Lf^p`KF-04P3<J8yC_~eG*XL z38+PNdL6%cV+?Dl>G&p4ONe_{E8|Nql<U&dv`BeMD~81mYVAdcn`_^s12yq$Yp>C_ zN{0q}&A~miG?~H{+7b1if1EP3#~EJxbLP5Dhnvmjj&)f>9T78c0Oadc1kmRR;|p-k zt$h*h*xHxiZYbevX{5xzLI%-eHj^jLul)u?6vYv`u=bnqc*)a~8vyv)8v*bti*W1P zOr1DCx%OKO9?-!HlWV_CU-HEC+V8-##_bqF*4pnf^kq7<JX!nKI{w{jUxmjrCfBF~ zLdKc3-_xGj+P~GFYiqyHEUC%E&e|Vn-w|i+YufjSv-XGZtrc|esI&HU2D!gq>tS4a z^6+EM+P`Diqw_~}xZ_*<V>*9A=TG4@`>xdI>Wv$9a|R|8wmN1WTHdofyu~Yzz4zkT z%7v$&K6~cEsj;()+m~pg?&T%<(y3>a#e_X{xEJ+`l5pzMrBm-!(~QtLpFVX_U5$dL zFN`XiLE2|6O}Spjk|?RfbWPD{%`bQMxiK|^;BZc>cyji#J+<W8UJ4eAvL6$ZIJL?m z##8II$IvaxeoXhR%H0=C@Ui<!%a6OQGM+r1Zh5D%1LMw%arF1XPhUyYZrWmwO1Pq= z>e9@k!~Ih7#}h6Z{ZeQ2)@_Kw>(gI99P~lw`q4uH&WI)5>ptoA8-=O1Bt~`aZukO! zS#%b$P_kq+x3+6ADtZLNeJ|;rDm^MQoHFL*%L%P(c|NtG<rr9RW0$!fY6F^-4!PJ< z$$kvH43^#8+nz^S25D!ICRTa0yp#OckswbNd6t(4UF=_P8D|pjE3afwOWwt<#7JD5 zd{)eDU97S&ZOty5VZJ`>v9qg1$=h*9tlO`>@+?|7TjHUQ`V3M^E$(fyi0f3JZ^4Y$ zE%O*i>d%0u8>*>W0AF@_cL;kR-iBCfzO7pWcwPR%(jlaF{guSDLG!kk@&SZfXwOQv zey)~4oA(8=@7uYO3);Jq4}92><&P(B8`n-q>$`o(*OA_>+s~GV?R;4jMoG6v+W%Fw zrPnX<=~jAm3&VK&?j%>z^&RkSMc=;Q_EV{Y7^r?$w^$ji3=%wS6FA>RZ3C^8&UXh_ zOE5y*+ZyVJI!<B+5tD@C`X21K(^##tqs{W!W!R+gs9zS9W+@C~83{F%Wak+?Jg{*d zfYVC6Z*avxrBIUI3E$Jn_u$^nweWI6Qk_FyuXOgg%9GEGULL!2<;gKzN=S|z@{CHG z7L!!^gTnEvHgwaA>cq3CP}HaCWOG+U<C^=89G`FC9LYH`66W_ZOYU^#=<p83RnF@} zg_q8rI#Uq_TR9K!*-PqkNYa*;y+JzoZIJpaESN*W<#%1U=w+7`O{%2*imFk$cA&U= zstGz3I)~{@(y7w<WjgPJ<7LI}#8&TT%=2_aN%m{>P0{&PI-jK@inD@NoPC}VzfOmG zOwF=iq>rYw>NntcDVY2S`wq}Y%t<pJCC<1AB%l$4<+5;O|1IHivJBor!_PkQl_Yr$ zk4?zS$?3p%lHIU;CdcYSSaTwBBl1*mbL3=*T!~PczNNpdMtoz|kX~f<Kuey)Bl`E2 z)?&A{oCKv;BKAS9q`)erQsKY{y7RVE8A%Q6K(5Hf{x||R`yt>7J@U#4jf<hu1GDgr ziyza*#X*Xj4h)P%3krRAMvu0P@n2@!cC%Ty3Dj7;fU4yxR&en|24rIg<Yc9CogFBn zFs;dnE8-OQPvV`?IYUm(&ZO}O!cM{ybcJ0Ie)x!sTR^ZePv4=9IXWnZM%3Emct~(d z^p~r7cG_3#Hs3xW_gu6Jb|SFM6N{_BR0`%uu$6+<s%y{Bi*adSN?y>|pqLh&=X$*x zt;w~x!_ye8jwkAZBZH1u1J(;2X=kps_%lQm=T|}yRl;%}J6~ds5Jf3u+7w0D*t}&F zwRrmuM)^Mu6bZpRhSrJQy`qG=DNgk9o1);VCv-dgh!OqE#77A^B7A^wx<VGHIp9w| zPDJYezsHH!BZ8^k?`YxX_NEvb3^BB!z)wE1xF?F{*pEy=UYGQp+dqw}k8g^qfp%0y z*+b6S#=Xg#!DReXNJ9=_gSDrffN_HgOk|an;sFK6W-?RcOc6KW<bOcj%U<uKa~~X- zeN?Q*RHdSZ86`L0&eA8Gm`AGWJe{AW!!4BFYRTODB7^7XaNnr7SM<_ku!?&_nOBN? zL&a^O;*K!Ji=+>-h@L^h&){*6!pV=)!hrSz$?#V?n=j`xc~~3Zm&==_7ZO)WC*Uun zlf_&y&!1c}m;!+CkB3hu@i-rW({`ugez`eqjHhkhn$At9telm{y#?H$u!^|1P_R0z z65d69;~94)x~y)5OIDB7i+88B#p=VmY;Cpr@$RxS5M;Mm1Ax&j_mdO21+DKV_xksf zxA^yy`{Yi<174PQ@vykf01sj^_cSa3t5<DCn>tOK`{TO7RT%1pW_5B4MVU|dnT8^Z zx~eu!84=z;r1OpNHB=pbGr1;_ORCY;!$6j&^|Aqm&G8KGF*uC{o3_t48j5o3rgt_1 zOQXPeJ~9)0vQfv;F|McK4B6z3KHAOmawiOR{qRiH_4{QyON)yQ7$ZbRwVPOiqm3Y5 zxjNEr&mP{6aA5v~OC-4QSdHD1;M%KGU|@)=A-tk&N*>)18YW6GZb<4Ibqb1n!)U3d zy5u%^@)?7FiNWADptf_jtFX)GXo#s7E)6Xy+&71@1(58*cv$X<$SG~xoe-L7#x5xE zE=yog9Nap<oehc-QkJ3w;&FE=f{QDJyd8sbe(DsiAS%CgcR?F9Qyijb^oTOVYW%>= zOX2G56t*vj3hc^xL%=*Ta!Bl5r8&{yT|ftE#c$VnR{*5ss-qFEeN(4R8iRbW1C+Ml za**l&1!!pa_cGX2Cw46ZcSg}Pl9vr#Uv<hIG0(u(owq0DI+^W+pya|2C{o`7k~<JF zXkzOMS_#rY_R)>Z5C%=cWGlzZgg)W2e$qJegPeGsLpRC4R1%@)lx4wIy-^oaKe=t= zcV&~xaeWk55Mq;Jj8{tW4-%MOn%Ab~uDVIPa&$lZo`G4Nnp%P=9d$*->aYhS_(lB< z1nGVINMH~)xtGvp`5#VheN8}c&)ekM=wI%g1eR^_Ikgx2#{)<AwwtB1x_0BYXynD{ z3e2c((T0=F4!{OQ+Q4h_0elk9=(({eYCieLcPQ10Z5ejYun8{1JRw=ftzjA`_!mo4 zl7jD3;J|^_xKKKa^$2Zpp-h3BrIl|5su;L=w;=YyMPE9ebvt-B+L?7rG27x!*(_v6 z)vIX8TQ!eWPqENIa6M_gMeJ}nCe=KFtX`*od0NjSm{EdUG*5&-<X_0f_+akKmRfJ6 zd9z*1))(m$`_X*GuYWl2D?k0PT4bJUthbx+;w;!JM75RTm3gK3OpnP4A|g;M`7#BZ z-S8w}o07$TIWS0!8yo6<H$`{7h($()lsEWCA)lgw?D#%{SPVGL03rLd(y$hx{weRm zz;GH?0k<>DvoH?Ac_mKgQ^B=wA%`<4!wchSnr&g=p^?M47iRGtiTC>{&=w&@=Yl@X z&y~AH3yYU<?rEf<Ae=MQD^?EhKUGiTx_O_@@51y5=Htd4*vH`FJPg+Tyq}S_d}Tvk z5SyPj7v}vIELot3lDycWv$X;j7ekR7hE0H64st_d1<?fOgN7Q}Py*slSOUZ>ZDG!H zR?i&Fz175q61Zd<mcTbEbnB6G*(ysNAKg#_qEuL-CsxNlvbISbU)oRt7gfU&gRwfk z0UH^%?!Rp)0g)^$u`R44iAjGi>PV`g4JB~hH7sF<btKhEi|4>eHNK$)K0XtaXl0=F z!%6*Y5foEEZl2n6r0}r;Yu8HVn(1~}yS3gI^iy(Smm}2i73f>RGFEah;NLR`C@@V+ zSr58hjGgTcZFhQFIcj_L*b=T!W4(ZqQnW?bLRv-n@40=}Ua84g-O6}8{m^w9>uO4= z0n{`kITNef?gD>6;4kX3xH_@DFA=sirN#ka*oSbp77hx8Poow0prt>HcR-!{tcODU zMX~#>17R%Z+76UYt8b(3dsi?|W_PX>-1}O2*Cbr$>+bz95x%cga7z;Yj)coCT)$W; zwu;sW^s#9LV_%uU2Z_V_=MaBL;!QvPu*81~@kb<{)(D*O4@>+jh<`-lVXY$Zk4n5k z{9_V7<HtWP@#Bccd_=vk=y;inN3FNDikypR!BOPkd`hcdh~?<Dj)ghmvv|OIdk`PX zU2Nsa2SS=C&@Y;AU=2Ea+N>N3$2_r$D<aIX{Ghvw7esK5Ft~#2C9AuUyJI`F+1AKF zf|{?}nQLXO#TQ<;M<BfiIUm%}+`aMv5S^bV6`9)^XBjQiw4YJ%hqON;wBKhPZyD40 z)COtgnyH}=KQVev?5&#v5X_h4<3W&laKX<%w6(48bD#Wqala_;7t{w4;~A%G-^6*Z z9JZ;K8IwGHTKye(YA+%l$D*ev)!$|Cwb!tGB6wbXg24om8Jtmf5S*vN>$MkNdm$xx zE~uZAJc-1M%u`dJVjiw0%)?)o<a@XJBoqE8YQkIo@{({({XK-nnu8Z0=R>t^>WiZd zTqTB`wWzzLN)|~cnq4?^hCJss8s<E<Sa$Q#C#&_n{HlT6cJ}2W%FmGTj^Q#^BmkjU zcuBXp<+9{xhqdkL@OwY)3Fz6h`Z!v^K3eK;!zX9yg5Telb7}GZfgDPU_iO5BkxRUP zsQz)_{W<}hR)3QKK1Szn!D((mA1KX+a<sWe4G*b5LYkMRM5|T$53&HwiuK2L{t}Z5 z*lTF9Mg2?3&OMa+Q)b#rM-==6^zq1EK35_t4qQWFPLXD`TE@#=(ZZ<~Y($93YP5=! z6O_P>4PTKXUrJGL16(g7+d=gW)<I2)m*#M&(+txZ*Gq9v#6tyKMUjf*$}`1tb}u6d z_{ax#G`Qv>xu^z`D=YH-tl^SAkQiZh+!w%yvV``%jC=>j>)G%*9Ixa{T@>9cuP8T3 zM1<F88UG!SbSu9=--~oeyxI}r>IVpZo5B?j{Sy$ZvQV7MT@NVF`O`-dH2p0Z13044 zPrtDPTI0Jt`am^_(%pD?RIQDNOCq-EIK~qu4?Y5a9x(e6N1?9UFU$1x&j8{EaJhg7 zCOkx8`LZ!6ejbzr^*2iwK?OW2A-dailI*-lfuy*bxI(ATXyuc5{r(qG4E@!w@FPI5 zRMuaaA<u<%kDp#IyBS#d8oYjjEdY$vwJCpA5xMeVC{5Qp82n>6-j*wuFO0sUg2Oqy zPG7n36pqRQYkCg<rmE`ygoH8hC#N4Co^tSXnnR>5>v>Al?C?9hp}*mF=Qzr;xB6>m zSXX(n(cZItZbtVUJ<F=2Zf1SYa_WbG5;I*7d!~B}kiq2uFQW;3v$LBrTZ#Ku{v@cf zZ)NEl2ay)%(x<JlK1I3PMiV9VXmUzo>%~g~*v5&CGrk7ouZi)|JJi<46YKhz9F1{h z*mnqT`XB7GFsQqCSI@i6I@=?ijq`<B_P1C1t1UWWeIAJSIbP`hd$$9|7^$p(bR2Yr z1Fo6!((7QLKaPQ@@+l5A|47i`R_>i3INZUI&*C|~Zc-am#I{-3zt0)Yp*koN0xFL6 zAtLg)K8+h4r;#6bU=bsPj(vU#H+|C(W$`sZ5oJ?W9tIbSm?pVZ=!r>A_0J$z5wRcg zV_{B#*j2=q5c>%~wo_tXL2MbZzv#zyNvw-l82!VbL&NQn*!Ls07hAXQ`mtNw!fMg# z!$pPUHu;EC{Wx-Lm2DB&mb9o}^5D*Jn1`m4Z0mreY>!fOybn{hjWYd_w<V&ZXeI_n zn>)CSh|nPl27G9TA2`9+3=lmcGTPb;7=h+Mm@oP$$e{y=k38PoE}u4tN{dcV%EyJQ z@>n42$fpoQ?oi(aWDz^mf1qzaoj;>Pp+o&gI+Quo_vldA6G7xR)py_(`A)*G!glSv z_<jq%3&S0<R;#~YA+G;&GgXTaB0a1VKqzo1^4#IHR&nHmuEv(s_SMwu6auGV9`n9P z@_qym^toccu<Afb!NdHG&mfrIV3KQWvoAgY0+8YK$C4e9{|o}c^$f-R3)EL~ZjH}J z@fMfX4In)YvN{n<$L*PLUu8fKVW{V0sUY+q)lK8FIwpt^N5`o8Yp73<tv(E2Orrkh z2*yVj;@}1KONeatp5iwp+vHB1{YT<nh;8Au!HNG0D{9BFA{+iWVpcB|c}OIb8~8N0 z`#96$)uw#&Cj@aHL@#29`wW5`5ce+-+3Yz3f$_(Iw=8(%&))@a+uHCJ<F@3o{G+%O zicBXFhy<qPL#-sXjzcigPg9wOkIkjQp>SVMixvoHqVTnDf2)@qmAQ_QX2V2O8qR6~ zSVld?*#Cu^JY&u?uCJ#83LyW4y~)GF`Ney(&0x`3CthzpYq(AEXUzjKx{u8oF!VZ7 z(y+(Vv*&y)UpRY^i|L#{-1P^uFPuL}A3}N&=`Y99am=Xa7t-@?Mt@*IW>|Sty@Iys z8TMD{BahR2tA7e#jBb7r!3}it&zQUWlK#+7xR(TWH=AyMg3NC?=l&}){SvVqh%1A@ zH|L!^$!0tKM0=>s5q}-fhzJLlRzMwEbw!~K>PN&wOp~v1%0S!^Ri%&qr(&rg`k`*n z$e)d+hRBEcBEE_jXI>F5|2o<c!{tX2+<?o!fyid}X&iLL_vH`?1#iU5rdZ`#@_J0{ zKO_CuBZN}c4VW0->k&$&yq1{S%mv8Gp2Q=zJVfZK5q&;a#+ria=5_<J?tPgpAQYGl z1Y0FprZ=yqgpB^Dko8gktAb>-zuCMZFC(XqU)`iCNf^$Jj^b?Q+_~Yc>#P&h*HNDs zC3suUoIQ8y%2Q)7FnsdLrORh4PhEKW!kAvqk1&_)w76I+DAKWH(8<y1q$85Muo<!q zC8Nd>(2IY!lwfe(O5-8!?*lz@@Q@z@Wc-TTu<=^RcjgQE4*c%LyHLvJOZcS}OAJ4* z8-AG(Wm$WSzA-u!2DAY3=kVcU8?I8{r!S)|AAgtWlxm?EY2ecx_*$rZc+1P-1itFJ zY8+oMmQQO}#6WVqCkT%CpP_bC2Vroiyp9VCJVn=^D&U^X%j(Zh$e4M_8V=ByZznz_ zKH`5ye8fM`9SJ{p<>-$Y@bE?3(u<rV>X#wJjc?hcw6-Vt9Txc#9kEOji<{3f_&GYi zLg$z1{3@Maqk|9B`&yjC49d_Rr;lVVU(Qr#=p&wEqb1|U<q027)?al#0YC}o{cz-) z75Jnq%`JV?`V<W^@uZ6>Y9zYB%X$&+?G{}^%FLILLw?YQgui4uRnFym^Z9&l_X`RA H+xve2ks+rr literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py new file mode 100644 index 000000000..91d97cda0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 000000000..e0b513302 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/exceptions.py @@ -0,0 +1,41 @@ +class UnpackException(Exception): + """Deprecated. Use Exception instead to catch all exception during unpacking.""" + + +class BufferFull(UnpackException): + pass + + +class OutOfData(UnpackException): + pass + + +class UnpackValueError(UnpackException, ValueError): + """Deprecated. Use ValueError instead.""" + + +class ExtraData(UnpackValueError): + def __init__(self, unpacked, extra): + self.unpacked = unpacked + self.extra = extra + + def __str__(self): + return "unpack(b) received extra data." + + +class PackException(Exception): + """Deprecated. Use Exception instead to catch all exception during packing.""" + + +class PackValueError(PackException, ValueError): + """PackValueError is raised when type of input data is supported but it's value is unsupported. + + Deprecated. Use ValueError instead. + """ + + +class PackOverflowError(PackValueError, OverflowError): + """PackOverflowError is raised when integer value is out of range of msgpack support [-2**31, 2**32). + + Deprecated. Use ValueError instead. + """ diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py new file mode 100644 index 000000000..a1a9712de --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/msgpack/fallback.py @@ -0,0 +1,977 @@ +"""Fallback pure Python implementation of msgpack""" + +import sys +import struct +import warnings + +if sys.version_info[0] == 3: + PY3 = True + int_types = int + Unicode = str + xrange = range + def dict_iteritems(d): + return d.items() +else: + PY3 = False + int_types = (int, long) + Unicode = unicode + def dict_iteritems(d): + return d.iteritems() + + +if hasattr(sys, 'pypy_version_info'): + # cStringIO is slow on PyPy, StringIO is faster. However: PyPy's own + # StringBuilder is fastest. + from __pypy__ import newlist_hint + try: + from __pypy__.builders import BytesBuilder as StringBuilder + except ImportError: + from __pypy__.builders import StringBuilder + USING_STRINGBUILDER = True + class StringIO(object): + def __init__(self, s=b''): + if s: + self.builder = StringBuilder(len(s)) + self.builder.append(s) + else: + self.builder = StringBuilder() + def write(self, s): + if isinstance(s, memoryview): + s = s.tobytes() + elif isinstance(s, bytearray): + s = bytes(s) + self.builder.append(s) + def getvalue(self): + return self.builder.build() +else: + USING_STRINGBUILDER = False + from io import BytesIO as StringIO + newlist_hint = lambda size: [] + + +from pip._vendor.msgpack.exceptions import ( + BufferFull, + OutOfData, + UnpackValueError, + PackValueError, + PackOverflowError, + ExtraData) + +from pip._vendor.msgpack import ExtType + + +EX_SKIP = 0 +EX_CONSTRUCT = 1 +EX_READ_ARRAY_HEADER = 2 +EX_READ_MAP_HEADER = 3 + +TYPE_IMMEDIATE = 0 +TYPE_ARRAY = 1 +TYPE_MAP = 2 +TYPE_RAW = 3 +TYPE_BIN = 4 +TYPE_EXT = 5 + +DEFAULT_RECURSE_LIMIT = 511 + + +def _check_type_strict(obj, t, type=type, tuple=tuple): + if type(t) is tuple: + return type(obj) in t + else: + return type(obj) is t + + +def _get_data_from_buffer(obj): + try: + view = memoryview(obj) + except TypeError: + # try to use legacy buffer protocol if 2.7, otherwise re-raise + if not PY3: + view = memoryview(buffer(obj)) + warnings.warn("using old buffer interface to unpack %s; " + "this leads to unpacking errors if slicing is used and " + "will be removed in a future version" % type(obj), + RuntimeWarning) + else: + raise + if view.itemsize != 1: + raise ValueError("cannot unpack from multi-byte object") + return view + + +def unpack(stream, **kwargs): + warnings.warn( + "Direct calling implementation's unpack() is deprecated, Use msgpack.unpack() or unpackb() instead.", + PendingDeprecationWarning) + data = stream.read() + return unpackb(data, **kwargs) + + +def unpackb(packed, **kwargs): + """ + Unpack an object from `packed`. + + Raises `ExtraData` when `packed` contains extra bytes. + See :class:`Unpacker` for options. + """ + unpacker = Unpacker(None, **kwargs) + unpacker.feed(packed) + try: + ret = unpacker._unpack() + except OutOfData: + raise UnpackValueError("Data is not enough.") + if unpacker._got_extradata(): + raise ExtraData(ret, unpacker._get_extradata()) + return ret + + +class Unpacker(object): + """Streaming unpacker. + + arguments: + + :param file_like: + File-like object having `.read(n)` method. + If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable. + + :param int read_size: + Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`) + + :param bool use_list: + If true, unpack msgpack array to Python list. + Otherwise, unpack to Python tuple. (default: True) + + :param bool raw: + If true, unpack msgpack raw to Python bytes (default). + Otherwise, unpack to Python str (or unicode on Python 2) by decoding + with UTF-8 encoding (recommended). + Currently, the default is true, but it will be changed to false in + near future. So you must specify it explicitly for keeping backward + compatibility. + + *encoding* option which is deprecated overrides this option. + + :param callable object_hook: + When specified, it should be callable. + Unpacker calls it with a dict argument after unpacking msgpack map. + (See also simplejson) + + :param callable object_pairs_hook: + When specified, it should be callable. + Unpacker calls it with a list of key-value pairs after unpacking msgpack map. + (See also simplejson) + + :param str encoding: + Encoding used for decoding msgpack raw. + If it is None (default), msgpack raw is deserialized to Python bytes. + + :param str unicode_errors: + (deprecated) Used for decoding msgpack raw with *encoding*. + (default: `'strict'`) + + :param int max_buffer_size: + Limits size of data waiting unpacked. 0 means system's INT_MAX (default). + Raises `BufferFull` exception when it is insufficient. + You should set this parameter when unpacking data from untrusted source. + + :param int max_str_len: + Limits max length of str. (default: 2**31-1) + + :param int max_bin_len: + Limits max length of bin. (default: 2**31-1) + + :param int max_array_len: + Limits max length of array. (default: 2**31-1) + + :param int max_map_len: + Limits max length of map. (default: 2**31-1) + + + example of streaming deserialize from file-like object:: + + unpacker = Unpacker(file_like, raw=False) + for o in unpacker: + process(o) + + example of streaming deserialize from socket:: + + unpacker = Unpacker(raw=False) + while True: + buf = sock.recv(1024**2) + if not buf: + break + unpacker.feed(buf) + for o in unpacker: + process(o) + """ + + def __init__(self, file_like=None, read_size=0, use_list=True, raw=True, + object_hook=None, object_pairs_hook=None, list_hook=None, + encoding=None, unicode_errors=None, max_buffer_size=0, + ext_hook=ExtType, + max_str_len=2147483647, # 2**32-1 + max_bin_len=2147483647, + max_array_len=2147483647, + max_map_len=2147483647, + max_ext_len=2147483647): + + if encoding is not None: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + if file_like is None: + self._feeding = True + else: + if not callable(file_like.read): + raise TypeError("`file_like.read` must be callable") + self.file_like = file_like + self._feeding = False + + #: array of bytes fed. + self._buffer = bytearray() + # Some very old pythons don't support `struct.unpack_from()` with a + # `bytearray`. So we wrap it in a `buffer()` there. + if sys.version_info < (2, 7, 6): + self._buffer_view = buffer(self._buffer) + else: + self._buffer_view = self._buffer + #: Which position we currently reads + self._buff_i = 0 + + # When Unpacker is used as an iterable, between the calls to next(), + # the buffer is not "consumed" completely, for efficiency sake. + # Instead, it is done sloppily. To make sure we raise BufferFull at + # the correct moments, we have to keep track of how sloppy we were. + # Furthermore, when the buffer is incomplete (that is: in the case + # we raise an OutOfData) we need to rollback the buffer to the correct + # state, which _buf_checkpoint records. + self._buf_checkpoint = 0 + + self._max_buffer_size = max_buffer_size or 2**31-1 + if read_size > self._max_buffer_size: + raise ValueError("read_size must be smaller than max_buffer_size") + self._read_size = read_size or min(self._max_buffer_size, 16*1024) + self._raw = bool(raw) + self._encoding = encoding + self._unicode_errors = unicode_errors + self._use_list = use_list + self._list_hook = list_hook + self._object_hook = object_hook + self._object_pairs_hook = object_pairs_hook + self._ext_hook = ext_hook + self._max_str_len = max_str_len + self._max_bin_len = max_bin_len + self._max_array_len = max_array_len + self._max_map_len = max_map_len + self._max_ext_len = max_ext_len + self._stream_offset = 0 + + if list_hook is not None and not callable(list_hook): + raise TypeError('`list_hook` is not callable') + if object_hook is not None and not callable(object_hook): + raise TypeError('`object_hook` is not callable') + if object_pairs_hook is not None and not callable(object_pairs_hook): + raise TypeError('`object_pairs_hook` is not callable') + if object_hook is not None and object_pairs_hook is not None: + raise TypeError("object_pairs_hook and object_hook are mutually " + "exclusive") + if not callable(ext_hook): + raise TypeError("`ext_hook` is not callable") + + def feed(self, next_bytes): + assert self._feeding + view = _get_data_from_buffer(next_bytes) + if (len(self._buffer) - self._buff_i + len(view) > self._max_buffer_size): + raise BufferFull + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + self._buffer += view + + def _consume(self): + """ Gets rid of the used parts of the buffer. """ + self._stream_offset += self._buff_i - self._buf_checkpoint + self._buf_checkpoint = self._buff_i + + def _got_extradata(self): + return self._buff_i < len(self._buffer) + + def _get_extradata(self): + return self._buffer[self._buff_i:] + + def read_bytes(self, n): + return self._read(n) + + def _read(self, n): + # (int) -> bytearray + self._reserve(n) + i = self._buff_i + self._buff_i = i+n + return self._buffer[i:i+n] + + def _reserve(self, n): + remain_bytes = len(self._buffer) - self._buff_i - n + + # Fast path: buffer has n bytes already + if remain_bytes >= 0: + return + + if self._feeding: + self._buff_i = self._buf_checkpoint + raise OutOfData + + # Strip buffer before checkpoint before reading file. + if self._buf_checkpoint > 0: + del self._buffer[:self._buf_checkpoint] + self._buff_i -= self._buf_checkpoint + self._buf_checkpoint = 0 + + # Read from file + remain_bytes = -remain_bytes + while remain_bytes > 0: + to_read_bytes = max(self._read_size, remain_bytes) + read_data = self.file_like.read(to_read_bytes) + if not read_data: + break + assert isinstance(read_data, bytes) + self._buffer += read_data + remain_bytes -= len(read_data) + + if len(self._buffer) < n + self._buff_i: + self._buff_i = 0 # rollback + raise OutOfData + + def _read_header(self, execute=EX_CONSTRUCT): + typ = TYPE_IMMEDIATE + n = 0 + obj = None + self._reserve(1) + b = self._buffer[self._buff_i] + self._buff_i += 1 + if b & 0b10000000 == 0: + obj = b + elif b & 0b11100000 == 0b11100000: + obj = -1 - (b ^ 0xff) + elif b & 0b11100000 == 0b10100000: + n = b & 0b00011111 + typ = TYPE_RAW + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b & 0b11110000 == 0b10010000: + n = b & 0b00001111 + typ = TYPE_ARRAY + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b & 0b11110000 == 0b10000000: + n = b & 0b00001111 + typ = TYPE_MAP + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + elif b == 0xc0: + obj = None + elif b == 0xc2: + obj = False + elif b == 0xc3: + obj = True + elif b == 0xc4: + typ = TYPE_BIN + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc5: + typ = TYPE_BIN + self._reserve(2) + n = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc6: + typ = TYPE_BIN + self._reserve(4) + n = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + if n > self._max_bin_len: + raise UnpackValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len)) + obj = self._read(n) + elif b == 0xc7: # ext 8 + typ = TYPE_EXT + self._reserve(2) + L, n = struct.unpack_from('Bb', self._buffer_view, self._buff_i) + self._buff_i += 2 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc8: # ext 16 + typ = TYPE_EXT + self._reserve(3) + L, n = struct.unpack_from('>Hb', self._buffer_view, self._buff_i) + self._buff_i += 3 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xc9: # ext 32 + typ = TYPE_EXT + self._reserve(5) + L, n = struct.unpack_from('>Ib', self._buffer_view, self._buff_i) + self._buff_i += 5 + if L > self._max_ext_len: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len)) + obj = self._read(L) + elif b == 0xca: + self._reserve(4) + obj = struct.unpack_from(">f", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcb: + self._reserve(8) + obj = struct.unpack_from(">d", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xcc: + self._reserve(1) + obj = self._buffer[self._buff_i] + self._buff_i += 1 + elif b == 0xcd: + self._reserve(2) + obj = struct.unpack_from(">H", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xce: + self._reserve(4) + obj = struct.unpack_from(">I", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xcf: + self._reserve(8) + obj = struct.unpack_from(">Q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd0: + self._reserve(1) + obj = struct.unpack_from("b", self._buffer_view, self._buff_i)[0] + self._buff_i += 1 + elif b == 0xd1: + self._reserve(2) + obj = struct.unpack_from(">h", self._buffer_view, self._buff_i)[0] + self._buff_i += 2 + elif b == 0xd2: + self._reserve(4) + obj = struct.unpack_from(">i", self._buffer_view, self._buff_i)[0] + self._buff_i += 4 + elif b == 0xd3: + self._reserve(8) + obj = struct.unpack_from(">q", self._buffer_view, self._buff_i)[0] + self._buff_i += 8 + elif b == 0xd4: # fixext 1 + typ = TYPE_EXT + if self._max_ext_len < 1: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (1, self._max_ext_len)) + self._reserve(2) + n, obj = struct.unpack_from("b1s", self._buffer_view, self._buff_i) + self._buff_i += 2 + elif b == 0xd5: # fixext 2 + typ = TYPE_EXT + if self._max_ext_len < 2: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (2, self._max_ext_len)) + self._reserve(3) + n, obj = struct.unpack_from("b2s", self._buffer_view, self._buff_i) + self._buff_i += 3 + elif b == 0xd6: # fixext 4 + typ = TYPE_EXT + if self._max_ext_len < 4: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (4, self._max_ext_len)) + self._reserve(5) + n, obj = struct.unpack_from("b4s", self._buffer_view, self._buff_i) + self._buff_i += 5 + elif b == 0xd7: # fixext 8 + typ = TYPE_EXT + if self._max_ext_len < 8: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (8, self._max_ext_len)) + self._reserve(9) + n, obj = struct.unpack_from("b8s", self._buffer_view, self._buff_i) + self._buff_i += 9 + elif b == 0xd8: # fixext 16 + typ = TYPE_EXT + if self._max_ext_len < 16: + raise UnpackValueError("%s exceeds max_ext_len(%s)" % (16, self._max_ext_len)) + self._reserve(17) + n, obj = struct.unpack_from("b16s", self._buffer_view, self._buff_i) + self._buff_i += 17 + elif b == 0xd9: + typ = TYPE_RAW + self._reserve(1) + n = self._buffer[self._buff_i] + self._buff_i += 1 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xda: + typ = TYPE_RAW + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdb: + typ = TYPE_RAW + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_str_len: + raise UnpackValueError("%s exceeds max_str_len(%s)", n, self._max_str_len) + obj = self._read(n) + elif b == 0xdc: + typ = TYPE_ARRAY + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xdd: + typ = TYPE_ARRAY + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_array_len: + raise UnpackValueError("%s exceeds max_array_len(%s)", n, self._max_array_len) + elif b == 0xde: + self._reserve(2) + n, = struct.unpack_from(">H", self._buffer_view, self._buff_i) + self._buff_i += 2 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + elif b == 0xdf: + self._reserve(4) + n, = struct.unpack_from(">I", self._buffer_view, self._buff_i) + self._buff_i += 4 + if n > self._max_map_len: + raise UnpackValueError("%s exceeds max_map_len(%s)", n, self._max_map_len) + typ = TYPE_MAP + else: + raise UnpackValueError("Unknown header: 0x%x" % b) + return typ, n, obj + + def _unpack(self, execute=EX_CONSTRUCT): + typ, n, obj = self._read_header(execute) + + if execute == EX_READ_ARRAY_HEADER: + if typ != TYPE_ARRAY: + raise UnpackValueError("Expected array") + return n + if execute == EX_READ_MAP_HEADER: + if typ != TYPE_MAP: + raise UnpackValueError("Expected map") + return n + # TODO should we eliminate the recursion? + if typ == TYPE_ARRAY: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call `list_hook` + self._unpack(EX_SKIP) + return + ret = newlist_hint(n) + for i in xrange(n): + ret.append(self._unpack(EX_CONSTRUCT)) + if self._list_hook is not None: + ret = self._list_hook(ret) + # TODO is the interaction between `list_hook` and `use_list` ok? + return ret if self._use_list else tuple(ret) + if typ == TYPE_MAP: + if execute == EX_SKIP: + for i in xrange(n): + # TODO check whether we need to call hooks + self._unpack(EX_SKIP) + self._unpack(EX_SKIP) + return + if self._object_pairs_hook is not None: + ret = self._object_pairs_hook( + (self._unpack(EX_CONSTRUCT), + self._unpack(EX_CONSTRUCT)) + for _ in xrange(n)) + else: + ret = {} + for _ in xrange(n): + key = self._unpack(EX_CONSTRUCT) + ret[key] = self._unpack(EX_CONSTRUCT) + if self._object_hook is not None: + ret = self._object_hook(ret) + return ret + if execute == EX_SKIP: + return + if typ == TYPE_RAW: + if self._encoding is not None: + obj = obj.decode(self._encoding, self._unicode_errors) + elif self._raw: + obj = bytes(obj) + else: + obj = obj.decode('utf_8') + return obj + if typ == TYPE_EXT: + return self._ext_hook(n, bytes(obj)) + if typ == TYPE_BIN: + return bytes(obj) + assert typ == TYPE_IMMEDIATE + return obj + + def __iter__(self): + return self + + def __next__(self): + try: + ret = self._unpack(EX_CONSTRUCT) + self._consume() + return ret + except OutOfData: + self._consume() + raise StopIteration + + next = __next__ + + def skip(self, write_bytes=None): + self._unpack(EX_SKIP) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + + def unpack(self, write_bytes=None): + ret = self._unpack(EX_CONSTRUCT) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_array_header(self, write_bytes=None): + ret = self._unpack(EX_READ_ARRAY_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def read_map_header(self, write_bytes=None): + ret = self._unpack(EX_READ_MAP_HEADER) + if write_bytes is not None: + warnings.warn("`write_bytes` option is deprecated. Use `.tell()` instead.", DeprecationWarning) + write_bytes(self._buffer[self._buf_checkpoint:self._buff_i]) + self._consume() + return ret + + def tell(self): + return self._stream_offset + + +class Packer(object): + """ + MessagePack Packer + + usage: + + packer = Packer() + astream.write(packer.pack(a)) + astream.write(packer.pack(b)) + + Packer's constructor has some keyword arguments: + + :param callable default: + Convert user type to builtin type that Packer supports. + See also simplejson's document. + + :param bool use_single_float: + Use single precision float type for float. (default: False) + + :param bool autoreset: + Reset buffer after each pack and return its content as `bytes`. (default: True). + If set this to false, use `bytes()` to get content and `.reset()` to clear buffer. + + :param bool use_bin_type: + Use bin type introduced in msgpack spec 2.0 for bytes. + It also enables str8 type for unicode. + + :param bool strict_types: + If set to true, types will be checked to be exact. Derived classes + from serializeable types will not be serialized and will be + treated as unsupported type and forwarded to default. + Additionally tuples will not be serialized as lists. + This is useful when trying to implement accurate serialization + for python types. + + :param str encoding: + (deprecated) Convert unicode to bytes with this encoding. (default: 'utf-8') + + :param str unicode_errors: + Error handler for encoding unicode. (default: 'strict') + """ + def __init__(self, default=None, encoding=None, unicode_errors=None, + use_single_float=False, autoreset=True, use_bin_type=False, + strict_types=False): + if encoding is None: + encoding = 'utf_8' + else: + warnings.warn( + "encoding is deprecated, Use raw=False instead.", + PendingDeprecationWarning) + + if unicode_errors is None: + unicode_errors = 'strict' + + self._strict_types = strict_types + self._use_float = use_single_float + self._autoreset = autoreset + self._use_bin_type = use_bin_type + self._encoding = encoding + self._unicode_errors = unicode_errors + self._buffer = StringIO() + if default is not None: + if not callable(default): + raise TypeError("default must be callable") + self._default = default + + def _pack(self, obj, nest_limit=DEFAULT_RECURSE_LIMIT, + check=isinstance, check_type_strict=_check_type_strict): + default_used = False + if self._strict_types: + check = check_type_strict + list_types = list + else: + list_types = (list, tuple) + while True: + if nest_limit < 0: + raise PackValueError("recursion limit exceeded") + if obj is None: + return self._buffer.write(b"\xc0") + if check(obj, bool): + if obj: + return self._buffer.write(b"\xc3") + return self._buffer.write(b"\xc2") + if check(obj, int_types): + if 0 <= obj < 0x80: + return self._buffer.write(struct.pack("B", obj)) + if -0x20 <= obj < 0: + return self._buffer.write(struct.pack("b", obj)) + if 0x80 <= obj <= 0xff: + return self._buffer.write(struct.pack("BB", 0xcc, obj)) + if -0x80 <= obj < 0: + return self._buffer.write(struct.pack(">Bb", 0xd0, obj)) + if 0xff < obj <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xcd, obj)) + if -0x8000 <= obj < -0x80: + return self._buffer.write(struct.pack(">Bh", 0xd1, obj)) + if 0xffff < obj <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xce, obj)) + if -0x80000000 <= obj < -0x8000: + return self._buffer.write(struct.pack(">Bi", 0xd2, obj)) + if 0xffffffff < obj <= 0xffffffffffffffff: + return self._buffer.write(struct.pack(">BQ", 0xcf, obj)) + if -0x8000000000000000 <= obj < -0x80000000: + return self._buffer.write(struct.pack(">Bq", 0xd3, obj)) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = True + continue + raise PackOverflowError("Integer value out of range") + if check(obj, (bytes, bytearray)): + n = len(obj) + if n >= 2**32: + raise PackValueError("%s is too large" % type(obj).__name__) + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, Unicode): + if self._encoding is None: + raise TypeError( + "Can't encode unicode string: " + "no encoding is specified") + obj = obj.encode(self._encoding, self._unicode_errors) + n = len(obj) + if n >= 2**32: + raise PackValueError("String is too large") + self._pack_raw_header(n) + return self._buffer.write(obj) + if check(obj, memoryview): + n = len(obj) * obj.itemsize + if n >= 2**32: + raise PackValueError("Memoryview is too large") + self._pack_bin_header(n) + return self._buffer.write(obj) + if check(obj, float): + if self._use_float: + return self._buffer.write(struct.pack(">Bf", 0xca, obj)) + return self._buffer.write(struct.pack(">Bd", 0xcb, obj)) + if check(obj, ExtType): + code = obj.code + data = obj.data + assert isinstance(code, int) + assert isinstance(data, bytes) + L = len(data) + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(struct.pack(">BB", 0xc7, L)) + elif L <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xc8, L)) + else: + self._buffer.write(struct.pack(">BI", 0xc9, L)) + self._buffer.write(struct.pack("b", code)) + self._buffer.write(data) + return + if check(obj, list_types): + n = len(obj) + self._pack_array_header(n) + for i in xrange(n): + self._pack(obj[i], nest_limit - 1) + return + if check(obj, dict): + return self._pack_map_pairs(len(obj), dict_iteritems(obj), + nest_limit - 1) + if not default_used and self._default is not None: + obj = self._default(obj) + default_used = 1 + continue + raise TypeError("Cannot serialize %r" % (obj, )) + + def pack(self, obj): + try: + self._pack(obj) + except: + self._buffer = StringIO() # force reset + raise + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_pairs(self, pairs): + self._pack_map_pairs(len(pairs), pairs) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_array_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_array_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_map_header(self, n): + if n >= 2**32: + raise PackValueError + self._pack_map_header(n) + ret = self._buffer.getvalue() + if self._autoreset: + self._buffer = StringIO() + elif USING_STRINGBUILDER: + self._buffer = StringIO(ret) + return ret + + def pack_ext_type(self, typecode, data): + if not isinstance(typecode, int): + raise TypeError("typecode must have int type.") + if not 0 <= typecode <= 127: + raise ValueError("typecode should be 0-127") + if not isinstance(data, bytes): + raise TypeError("data must have bytes type") + L = len(data) + if L > 0xffffffff: + raise PackValueError("Too large data") + if L == 1: + self._buffer.write(b'\xd4') + elif L == 2: + self._buffer.write(b'\xd5') + elif L == 4: + self._buffer.write(b'\xd6') + elif L == 8: + self._buffer.write(b'\xd7') + elif L == 16: + self._buffer.write(b'\xd8') + elif L <= 0xff: + self._buffer.write(b'\xc7' + struct.pack('B', L)) + elif L <= 0xffff: + self._buffer.write(b'\xc8' + struct.pack('>H', L)) + else: + self._buffer.write(b'\xc9' + struct.pack('>I', L)) + self._buffer.write(struct.pack('B', typecode)) + self._buffer.write(data) + + def _pack_array_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x90 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xdc, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdd, n)) + raise PackValueError("Array is too large") + + def _pack_map_header(self, n): + if n <= 0x0f: + return self._buffer.write(struct.pack('B', 0x80 + n)) + if n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xde, n)) + if n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xdf, n)) + raise PackValueError("Dict is too large") + + def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT): + self._pack_map_header(n) + for (k, v) in pairs: + self._pack(k, nest_limit - 1) + self._pack(v, nest_limit - 1) + + def _pack_raw_header(self, n): + if n <= 0x1f: + self._buffer.write(struct.pack('B', 0xa0 + n)) + elif self._use_bin_type and n <= 0xff: + self._buffer.write(struct.pack('>BB', 0xd9, n)) + elif n <= 0xffff: + self._buffer.write(struct.pack(">BH", 0xda, n)) + elif n <= 0xffffffff: + self._buffer.write(struct.pack(">BI", 0xdb, n)) + else: + raise PackValueError('Raw is too large') + + def _pack_bin_header(self, n): + if not self._use_bin_type: + return self._pack_raw_header(n) + elif n <= 0xff: + return self._buffer.write(struct.pack('>BB', 0xc4, n)) + elif n <= 0xffff: + return self._buffer.write(struct.pack(">BH", 0xc5, n)) + elif n <= 0xffffffff: + return self._buffer.write(struct.pack(">BI", 0xc6, n)) + else: + raise PackValueError('Bin is too large') + + def bytes(self): + return self._buffer.getvalue() + + def reset(self): + self._buffer = StringIO() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py new file mode 100644 index 000000000..bb79fb740 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "17.1" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py new file mode 100644 index 000000000..e520d35aa --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f8b5347b881f720203adee1ac19c630599a3077 GIT binary patch literal 728 zcmYL{&1xGl5P)~RPHeB^ByEGwYM=*0<Bij}aY`v^l4B`>gdP@(kax7U(p_n*p9Sw5 z^_6@rJ@gfN>c}QULLW0?W;8##9t`3D*W<(R`=3@2{PxPz>Y{Lk$J`+xfUpS4Fb&IA z+A5<o3Ik|C1Z~)XUFbj;dW&w_hB)1Ue!2^LX$J;r7xvR09HcQErhRz9d&3~zgO~Tg z=+$408jPa#0h=3DILoOhE2Zta3!)ZAD7oIRw2+qOPG;8YJxZ;x1*de~r_{KzWO{{4 zhf=4-_O|BQ`=Sz4%A8#)jWT-jl8It#Q;3X9<HHOn%~ZA0VzIQ|tYX;@wh(gB9N#F- ziL;^*R&YadrODk2!%4C=;--1Mw6-!Il4K$5(#^-2DwAqevE(^SdvY<JG^1N3SpnqU zx;(dpNgzV{GQqKeWJ+2s=FTc@nnT!_UYU*QSg7Xs`u>*S>z^^|l9Mmn<lmBS+e*pV z__P_`JXJx?PABIli1*};`8pc-HssDajpb?_aiAlQHp2If71$HK<F9r-Iv#%Vy6544 zhwgjqA$|q=(90hGY=YCNndM2%bdswAFrTE<$^4PhnVHIq8qPCX)n}(RpDiABG0CTw zm&rp?iRwg1WAW`1olR%&>`!c&s5XbzT!PZiEle=UxpFw3akW}^Kb8ty!9V!|%n{-! Oio-Z+hqzm~J;VQPoZ007 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22a7c66c3da385d3c1aa00adefcbb17cf55f19b5 GIT binary patch literal 566 zcmYk2OODe(5QhCo{ETOWgg66P4CWP)kq|;0fDKu-gi0N^?di~Mn{wMyjx<;DmepK= z6;+8qwA7!fT2+7jU0;eK^XQxoFTURfp7)EBzbB#KGu`n(P@eLQXMN$@Km;}vq3@|c zg=S^fVr?T4*;vFj5s6JjYBQ19T;z5mHdMD#YZa+jB`Q^!%G*Q~YV*z87Eh$?ZNueO z9>?BHt_E#~9^H~CJ?l~T-EuRa?i@5zS2@a`eC|k=3_woqp+|tF0I2%mjJkbrl%@c+ zmD*640~lS^-B@3fak5t8`C8<(GyEO{OsKB~bB#O|0CSpyyd2yx3P!}>wP4DK317E2 z?4_C9gd~QvL=Qv8iojmvv7gA+wV7M~Q@H3~CjA@2cBCQmj~+hbYR2!eq&3Xa)#WU) zY<i=}Xlb!Lo&fgauKO^n_Z1BD+t;qyw<k1jn%(_<c_;@x-05y~q<M$cZvW2xl>B(P qFxQ>xu^eReL$<nWO90(zvioW{FUd#StI5=#_$woS{(0~+%KSf|W|+MI literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d2ddc13b608e3f4ab1471bf9afa2b526f8dd726 GIT binary patch literal 1018 zcmah{&2AGh5VqHwWE;}-KvjvKL%1O2&@8l6v{F?eK;l**Q6aGsvfQ;(Hr>D4PO3!Z z)JpARz>!z-l~Z4V6EjX5ia0RR%+8G0-^_gD*UQUo0x~*S`#fWW{KVi^0&re|nvY;4 zku)a-O=uA$LBSG6F&E@v5~^_2kmLc8>^Ml8iztMsrCR!}iiR{<Dx0c}U)hk&3zFQE z!3WZBT?01hGq)lRO_h(W;#pBw+PX+)lgwmQ>AJPfO3R1iGPMxzUt?p}&@D+R-Uh*- z3EBcRPr<w+m*kQT14(6Y5y{|+p0lrkCEw^-Aejs^@;!v|jal68fxOX5Sk)7~Lt#`e z&4n?&)69N>OrfmsiGlw!1@MJnSrqdSj3Nn@Bnj>oPMBm+CY(J%H2w!`H?LBWo4vsz zm4+UQ5d5Ov2Q?iqSM-ctku!FVP;~zX;5nA&#)YLQlxy2Bnc>*Daa8sL*O>buLThB? zmyUtL2}~GIgpP+*E|oTMq2t35=i6qhd^wRXQeICsp4s8{(Maddhg&;4@j+Z?^?Fts zEAo6@r(4^b_C#RPE1#%RRsb&2V{w#~M=?*Uq84^gPhE@iQk`=C7{|bk5jyMtmxaO2 zt$mm=0v`tC+_gC`Dml*4?{I!H7Ww={uK=!}u^(vUN-y6gbQe6gwBYv<guai6YNXb! zScNZ5=qdO6y@7F|oz}_&_t_lI1LK{4EBPYbzsFj|N`9NIHKx}f>UVI2;n<EfjG&PX zjc-TeUyhlnah(aQ1YS4K%3<Z$`%fEaHsR1}*8v0ca_r2ww%@PMcy!;@9pih7cIS-k TVF`n&)gWSB+6_Y*1x@xFC*A^_ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33383afd9603991b1591c6d50fc3ff69ed516190 GIT binary patch literal 2870 zcmcImOK;ma5GEyCmK`T?n)I~=3hZrNAXQ&!6QF2=w%A24zHCkg7K9?wj$B!GMznzh zy}5s;|E6bMd+J~4sWWuc+JUrkUo^;(I3&NB;mjw$SYK~2Y=fg~|9z-3_K{w)R>6lu z?8z$}B$GU1L*C^>t7{GIuFcs$Oj^=@$E2+)GrL<=)fwwnake6>I9oNdj&g9;k<P!Y zUHgP5v9_IV`p3yAnrJ1$;dlf(b!9jWlW-KL8)FD#EqaqU(D)wEj;vYuaELuQ!a=bv zm#k|^F0FU0YfD>JP$IT;P*!D4x+oo4mkpFPxh9(^UAZndP}b$9Y@uw(EqMjyn%qVU zcT)Ft+zaDSp9LI2sF9@p5_>{HksMcA9l(IG_pHs+N}{43IQVLY&r=VbnEG0IQy;wE zD3S^iZwTJ;K#2WhFMcwWj{-5CKDeiQ`~3k#_j`K>2i}o44#&G;oM=Cab|Ki?f2dD= znlxQZRV+u~js4(_-w)%yClU>lKu<s=cgJU`D+H)92vH|fDO!x5Z)FbM&9qCN*|^Af z*2D+RG=Ixxd`2GfPTNW=Cw_90R_NF^hZ?T=<|nxLN}#kx2s$7Sbgm7IIk<#mUO4|Y z2e&N)l2%9hM8Rb&M~FxZvAKY>x!@k@z7Gf1@u)l$CB&5?6x1!DTngb^4B>#!tSp2L zOl-Q+I8bRFw?=-F2yx+Pkpb#dh^qw#kS^bV4cwtwW<Zl&m;f#EatntN)EHg6QGiOi zCDgo2JX*ZOBH#LWO}7eANcW3S(B9icDC7&-PmSb~FZv>GJZ*JU-`C+(Wl2_012rLH z)feJVJSr=JR<;N0&L}(WCKXHU4-q|W2r(SVNkq?0Ax<ZLG}izXFHkW7T_;eo1LY!Y z)38GWWd>ZQ;VbFPpQs`YFHxl?w9B<zd--Sd0jj<>D#=6azmZqr8lGPq@(W5mukU72 zn<r8(<(LTFA$tv{@bjCOujxmq4(Lk=YdGXzvbmDo64VvBuCz?d)!$nHyPo6XN_1Ba zMG5w>42lZIL>m{9{D00{iEvC(KQ00OJzQr>>7WF9CBj?!YUL50DcGkaP%E)sITX>t z^D?N_sLzl@K_L+FyjXy_k&~Ml;{kn6;3f@!(D2jbMm+Kt_9Aj4eWzU`e(g=@pAr7+ pp@ap>SfIaesWUnrs6ZPR4KL-fXzD(l^Yb&>lMu1)*sa?R_AiDf0G9v& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7901a1df8aac9c15d56f2648637c851d521e1846 GIT binary patch literal 8869 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 E0c2y(@Bjb+ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..983b91f8ad280ebb1cbdef6174dd1fcc7932b5b8 GIT binary patch literal 3887 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 VO{-}Vff^bCKCIG))RdOc{tFD(=vV*% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..baf9313569b43f737ec8000ffc80b17bb5f31b7a GIT binary patch literal 19796 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aeb4e6d01b54bd2e1ed44c53fa660edf2f1d8edd GIT binary patch literal 1464 zcmbVMPj4eN6t_K-nPi%Dm))`wh{J%8Ae2tJKt)%oDztEcLoZt`C`&b(j-6zZ`M0){ zwjsT+ocRpN5k3eX!bdo*#3$&9_uRBl#0e+wjs4#9^Y8t!pLRL{fiXUQbTaV>`2!a> z!-2^cK<XP{oN$_xg7#^_`mAvJ4n-Nu-M-5m?&gic>wAUY_bCzXvdJ4O+HY}>`#+I> zz?-}U-wn>5k#6uB{E@C>?j@(H%BNbySy5L~n<md@naZltY}PU>bv&4ssfP8@Yl>T# z+5EbkC3(i53u*2A^<?h7*omW)?G){B;MWEE5=h+#rpc0Wx*#jIWGezN*wGc;0Td78 zG%2exOTq74#8M2!xpCC=)HL$yOvo-ZZkZI~7a}|0=c?`jwppS@Z<fg3pvpO5=@qhf zI*#LgwO4*V<DaE*J^N%=5B7&+nLi%vJ$ceQ?$uenla)#*dA=jlz5P%1%LIj%;+ZIU zC3|&}PLg3(4trCb<tnN#%o}$AB9={ziUA``-UEIcHp;M~HtauPa?#dgL0-{I@+~R1 zT%zeDkRgTqP>??(-;p7?gtUwqrxQm$UC^b&+0sSHimoVFfkZc!9#)w*mi~23LEroe z{DO^Rt;o2=o0FFO*?Mrnu7$M+yVlwceUUNr0$BZOtpa;aus(;3H>~bAtJ|=;jayyY z>VCJnw$-(-bsWxG01hZ=XZ~Xl!Z;pfDun+`$cs>AMV2Qr)K$1{mMD&umT~-XcskYL zC{bZmiV!NUa}n}vFc4CdsZiF}S*Ay!9*OWQxd<~fFL^GM6-kkcM8Q@uEJUdzyFp^> z&D|e%FW;T}AATS0cDLU*#L(zYk??XUq({IO<Ye=bLZRp@`Wy=Ll5y-%dIY`a090sv z7VR2(ZaeUrVGCTf4u+x>=e0cCMqgNcm&`x7(=U(&yeiQ_UO|hi!{~O;(f>juAHXSH zCLh8_ZXv^K@i!>>CM+KV-N0!^b)_`qW9~;>%y8mv1MhaEk2~SrA*LbfDjgXwscX0g z#v4?!NVH*6NbG0hj;pLR{yO8vsiiP3`ZW&t#H$LyL7x0|xTaAjQmcPqGh6?a8jM7J z1dMo$w&^DGnCk@ef$LJ2GWfmS2<ST~xgjRs1M6<v1Tnl(dMZU6OU%B+x=MU_<Xgx> xWEh|g)%a;u)LAZM3q^Qyt)qXSw7JCEn&v@K@o6p&(VM~~Y_TT0?*vY>@fVf)X<YyS literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28313546886efe1072d71dfffd78ab9f0fbb3049 GIT binary patch literal 11982 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py new file mode 100644 index 000000000..6daa860bc --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py new file mode 100644 index 000000000..3f0c27fd3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/_structures.py @@ -0,0 +1,70 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + + +NegativeInfinity = NegativeInfinity() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py new file mode 100644 index 000000000..b4dc0b9a6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pip._vendor.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pip._vendor.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pip._vendor.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py new file mode 100644 index 000000000..98bc507b0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/requirements.py @@ -0,0 +1,130 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pip._vendor.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pip._vendor.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pip._vendor.pyparsing import Literal as L # noqa +from pip._vendor.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPARATOR = SEMICOLON +MARKER = MARKER_SEPARATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd +# pyparsing isn't thread safe during initialization, so we do it eagerly, see +# issue #104 +REQUIREMENT.parseString("x[]") + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py new file mode 100644 index 000000000..7d2fe4ced --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the beginning. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py new file mode 100644 index 000000000..5151f9fa2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/utils.py @@ -0,0 +1,63 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + +from .version import InvalidVersion, Version + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() + + +def canonicalize_version(version): + """ + This is very similar to Version.__str__, but has one subtle differences + with the way it handles the release segment. + """ + + try: + version = Version(version) + except InvalidVersion: + # Legacy versions cannot be normalized + return version + + parts = [] + + # Epoch + if version.epoch != 0: + parts.append("{0}!".format(version.epoch)) + + # Release segment + # NB: This strips trailing '.0's to normalize + parts.append( + re.sub( + r'(\.0)+$', + '', + ".".join(str(x) for x in version.release) + ) + ) + + # Pre-release + if version.pre is not None: + parts.append("".join(str(x) for x in version.pre)) + + # Post-release + if version.post is not None: + parts.append(".post{0}".format(version.post)) + + # Development release + if version.dev is not None: + parts.append(".dev{0}".format(version.dev)) + + # Local version segment + if version.local is not None: + parts.append("+{0}".format(version.local)) + + return "".join(parts) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py new file mode 100644 index 000000000..a8affbd0a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/packaging/version.py @@ -0,0 +1,441 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def epoch(self): + return -1 + + @property + def release(self): + return None + + @property + def pre(self): + return None + + @property + def post(self): + return None + + @property + def dev(self): + return None + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + @property + def is_devrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + # Pre-release + if self.pre is not None: + parts.append("".join(str(x) for x in self.pre)) + + # Post-release + if self.post is not None: + parts.append(".post{0}".format(self.post)) + + # Development release + if self.dev is not None: + parts.append(".dev{0}".format(self.dev)) + + # Local version segment + if self.local is not None: + parts.append("+{0}".format(self.local)) + + return "".join(parts) + + @property + def epoch(self): + return self._version.epoch + + @property + def release(self): + return self._version.release + + @property + def pre(self): + return self._version.pre + + @property + def post(self): + return self._version.post[1] if self._version.post else None + + @property + def dev(self): + return self._version.dev[1] if self._version.dev else None + + @property + def local(self): + if self._version.local: + return ".".join(str(x) for x in self._version.local) + else: + return None + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self.epoch != 0: + parts.append("{0}!".format(self.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self.release)) + + return "".join(parts) + + @property + def is_prerelease(self): + return self.dev is not None or self.pre is not None + + @property + def is_postrelease(self): + return self.post is not None + + @property + def is_devrelease(self): + return self.dev is not None + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_separators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_separators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 000000000..6e1fb526e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3125 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +from pip._vendor import six +from pip._vendor.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pip._vendor import appdirs +from pip._vendor import packaging +__import__('pip._vendor.packaging.version') +__import__('pip._vendor.packaging.specifiers') +__import__('pip._vendor.packaging.requirements') +__import__('pip._vendor.packaging.markers') + + +if (3, 0) < sys.version_info < (3, 3): + raise RuntimeError("Python 3.3 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + try: + # Python 2.7 or >=3.2 + from sysconfig import get_platform + except ImportError: + from distutils.util import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet(object): + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + for dist in self: + entries = dist.get_entry_map(group) + if name is None: + for ep in entries.values(): + yield ep + elif name in entries: + yield entries[name] + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment(object): + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.3'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_cls = getattr( + importlib_machinery, + 'SourceFileLoader', + type(None), + ) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir('/'): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + loader = importer.find_module(packageName) + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + if not isinstance(orig_path, list): + # Is this behavior useful when module.__path__ is not a list? + return + + orig_path.sort(key=position_in_sys_path) + module.__path__[:] = [_normalize_cached(p) for p in orig_path] + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path, parent = sys.path, None + if '.' in packageName: + parent = '.'.join(packageName.split('.')[:-1]) + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(filename)) + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint(object): + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + DeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution(object): + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + mkdir(dirname, 0o755) + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f366a527a96448e454cb4a5e29c2e7ee0a3bcfa8 GIT binary patch literal 95301 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 ~KN^5Vd0c%y2IJj?#h%a*> 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 a`mv(7qd3t2pxvFPTw7e(%ee7O*Z&4Pz=!t$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a99e9bfee4e3ca30e442b957d0ce098091e4cd00 GIT binary patch literal 685 zcmYjO&2AGh5FXpRNl23jE<N-O_E5HI8qrD>s)|y<r5qB8vJ$M8wbSlT>}9-NH7IaE zJO~_lrM+_6SKx%bG|;i;^LRdM=JWV`IP8P5bg}zRQh;Cfur+3aGvgW!aNs0|;O|ZX z(w=ERd7m@xd?Nu9G<CR}LGhk<Z0rDojHol-%|JR7h-G>Yn1DapGJz{xyb(+~0@6;< z;bacpPGkDQ<wb0SwPpobxi5_Cmj>3O626lS{2&D0fIM=bq*))&34EpmKJ9J@9&BjJ zN|rhq!^5xUmJx2)FZ2rDf;7m%v?7<DTT`X$-YUujPf*w0*Yg>o!rB#xQq`T=?CRBg z;j!8&qVlHhiMvFXp~`9|?&6<-R@v{hUtm&2rSPi={iVveK<%&4|B!~^v7X9j6+eo@ zqB=Y%m&eyB=Hun`<iub2MN;f1QkPMl?_)eYo|GRWn`}L-gyahSBD)SzXmyLR(0;L= zjAOMja-J6JdJt~4hm&!~j;Q@wLdl3cHVX$P=ds34v9Tj<T$`XcG+PTE`yV&9!adnI zHohmHn7AP}K`y*5+Cpdx)l9E-+oK*-=Fy3gVIr5R9!Vj%{wEG?|8`gpV8<5dovswW W&Bb$DU5^a(h*_*Z=#xFNNB;l<q?~&I literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 000000000..3e1c1528b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pkg_resources/py31compat.py @@ -0,0 +1,22 @@ +import os +import errno +import sys + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + sys.version_info < (3, 2, 5) or + (3, 3) <= sys.version_info < (3, 3, 6) or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py new file mode 100644 index 000000000..4aa97fc05 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__init__.py @@ -0,0 +1,127 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import division + +from collections import deque +from datetime import timedelta +from math import ceil +from sys import stderr +from time import time + + +__version__ = '1.3' + + +class Infinite(object): + file = stderr + sma_window = 10 # Simple Moving Average window + + def __init__(self, *args, **kwargs): + self.index = 0 + self.start_ts = time() + self.avg = 0 + self._ts = self.start_ts + self._xput = deque(maxlen=self.sma_window) + for key, val in kwargs.items(): + setattr(self, key, val) + + def __getitem__(self, key): + if key.startswith('_'): + return None + return getattr(self, key, None) + + @property + def elapsed(self): + return int(time() - self.start_ts) + + @property + def elapsed_td(self): + return timedelta(seconds=self.elapsed) + + def update_avg(self, n, dt): + if n > 0: + self._xput.append(dt / n) + self.avg = sum(self._xput) / len(self._xput) + + def update(self): + pass + + def start(self): + pass + + def finish(self): + pass + + def next(self, n=1): + now = time() + dt = now - self._ts + self.update_avg(n, dt) + self._ts = now + self.index = self.index + n + self.update() + + def iter(self, it): + try: + for x in it: + yield x + self.next() + finally: + self.finish() + + +class Progress(Infinite): + def __init__(self, *args, **kwargs): + super(Progress, self).__init__(*args, **kwargs) + self.max = kwargs.get('max', 100) + + @property + def eta(self): + return int(ceil(self.avg * self.remaining)) + + @property + def eta_td(self): + return timedelta(seconds=self.eta) + + @property + def percent(self): + return self.progress * 100 + + @property + def progress(self): + return min(1, self.index / self.max) + + @property + def remaining(self): + return max(self.max - self.index, 0) + + def start(self): + self.update() + + def goto(self, index): + incr = index - self.index + self.next(incr) + + def iter(self, it): + try: + self.max = len(it) + except TypeError: + pass + + try: + for x in it: + yield x + self.next() + finally: + self.finish() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6f5b640f0db7f9a37be0924ac4f0ef4351f6e1b GIT binary patch literal 3919 zcmbtX&vV<x72d@HBnXidB`b~-&$Lb^ZNoN};@EENPMWGsI-N{rl+4tv6HYuBgbT@_ z0gzfODTza$q?w%3zri~8U)pO=KKIsBzqcSDT9HoyXWzcXF7~~BzrN*PI-P*w89loG z<iBmk{zHT6al!1O6%!E2Bu`n!2b>e{q)sLV!tx?@GjHHo-c1`>bI`QBm-<<2(6W3Z z4YFVmfNu`g{>G#)TW3tR;`XT+bTAI&8pdmJ2ji}6|DE+aFCmrnx$$K(ONwNigZE^7 zIE}%ybdtp~PIZKVJB*VQeWTDaR*K%x^jzH8zB{B{sz-p?MJsZUm<_mO11A;(SMq@; z9VyP(pdnr9p>M{%Y{=#rJLQ8Gc&jn^pwxA+Cfl-ub#2*|>*zbOCpXY{<qdgFZk_SL zx_m=k$D5vf6X$u$_+RAvNuKEVCE0w)LFn<8?JM-f*C3KFSjaR#W#}C{5(_qRFmkmA zt|6TtX-)I^*1~z=pR>=|ldbQZ=i<4mTMM=j3-=VRIlT86u7YT>r$`uCD2tBMIPV9> zOL7?>t0vwXztEA=p)QPwW(P)qQ)DU=6j>A=VdeP9c;WG6s_~tUv%)lsSVvl`zGvJb zPWO!)se{5ao*mg<Jd00^m__NonYw|U{-<^(Dw#z(-kC*eXMdc+QN>QCcD^5l;e+CS z{_#xS8-|nFM<43_2L~gS-r2wZ@Zrv*ok=peo#fCkO>e8={RemTVMH%&3uiHuqs_+$ zDlUqhFeD3y;r8Uj_|@Q-(4gpoFy7$4ZC$>}=NpwnwyTvxhgRXCp5p&AwBl`$1%Cm@ zoO9JBlWLfMf#^9EFt4*`c-VJfEiz+ql<23Xd9bvPqpsm=b)5)Vq9kvDGizapRb<aF zd>=201_<K;clms4MYVcS9Wvxia*)-o2SzW$W#rsIyh10w*B3@4xwalwNNv0;Rk@@^ zGftyP5zE_HQrP1=^Ik1|IeE2Y+EpV+M_lqBNvgAl7(-|b$GI%}jv@=HTOhBI9W1vG zwY-B>mH2Cy#bbU*=cR}G+A|+v06*|&uG)qk>;+#q3x1QGqe^Kc%m~)dlsxEfQaZUd zA)IAGc#4c?8qs8eI5MJ`W=0@CR0ps7!rII5+&EHSc3v=@NQ85Ugt?E!OW*mt$LAO7 zU#xk>faE^wIy#3{i0|3`Ut^|5xz8U+j`a|quh%9j=YH1yo(<eTu590}x3^P2Yxf2f zz2fQa%Jvu9mvb-4B6aSORca5@p*1^Y&mDLck#>VUhd*Dy%L{Sta7J%KWaCII_?zTm znsv_^p-!0xUYP=v|BBK~tr6*i^xZNeehuD;e0-#SLsOR$#LeSlZQVujP9-GZZO}HK zcWN`yn)(0~qCVOXt@sdRe(U({1xJ<Mq+|RO%0Wp+N*?-;8C7YFIgP)m)ppc2zEr;h zsUp!ywBg4;(GL|weMzD$lye9AHF(ci(T-LiHPr{S*#;HHJj&uQG(i|<V>wNUZ-?RG zG)l`EMYYJd`$-zBb+C$Rp!x;9^igalvC=0tv(>vaVeLvLRlg-dN|)+WTCXT<O-sd3 zk$rBW74*tS$#WgQ<$G<n?fRZC=ok2Q6<M)<$h7p>J4uD$Kd^n&0O_3h0};DYNY|pa z2i}tn%QwI`rEmEr_?8ST?}G=DTfQYbvJ1Qp<htykUy~bh6Mg#!gyW!tXu4+nua`(u zrvzz4(Mnb--UFdpykMse02|flU#LU?X+ip(TL`ytDfWy27QdAE02t~OQ<zkJjFGjp z5h(iV0Zo=wNNv&78}tH~pD-MzQBj0pX<BPga?n4}3Q~qyc&l{1fH%rBdZ?#$pP?1B zb*VJnF-Bqw#j*ksR}pwBx}(^lXj&@HA|!Nv@S0*J0DRxlwo5E&*IHnrwi+owma__6 zi6iPAOjj84De+h1R|DGuAD&=EC31aLBw@$uu}Li}m9mA9LGmrC6u^XsR*DU9dz*NT z#3o!djB_2Wi0suOmy@r^tWCX%Pqe+@ji_chHxVbLY@3>Z>@3O40%e_l<&o7cc8OPn zZ(In!9G$P&xs*<4Mnff)ypm4KU~7_TrC)t=MG%p!2;Qs(*HQ7xxocaKhpUoT)n#7R z;H!^FWhAR5@p-qFR05I>F3eL5)p10n1UZNE0VNR1bQ_?XKqb*BElYK^N-M$w<0kn~ ztyC$>C*vNB^>_kqnNR`BeXRt|U0v=U;fs?lZbe8TLZ-(o-*Rymc^0U5Ir5IPZ&~hq zb2TIg3ke_8kYI7_0uns+E9`E)WLl3-Ch=dD8mph+gxaB1ggckcq^KHew1Ogm0V%rp zHJl5?s1Hbp(eEm{U#Yu9?h&yd@O$DYA=RIV{F%ru5sHqo{(nv!2{WB#sT#&<T9qqu z69ViLT4YNXl|8bXRm<mu0o4yU;M%gd*Iy^J+MnvF0$M2w0JAn6r)fOY_;a}Y$Kuna zjQ;%DyQgupNI$jJ3zxf-!lGLFp9h!k8UBLcOF&;^{QU^qShy*RFzI;7ddB~x#L7=? TsqbM$+iBw(V1L3Dy@&q??=S%t literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..514e956a0a38dd807f9c74d1455543c68a9488df GIT binary patch literal 2649 zcmbVO&2Jk;6rcU{dTpmpnue6mpb}IcTGP^q79pq_3B&=bQYuwi39YuCwX<fuacAu` zjn)!UDror>Ahm*13kSpri3>;mk2%6A|3WYDd$SwIZi_@&XWpClW_I@XX5RZvF4bx- z!_&L6^kH0K>@PA79t)j|Xz33SoN+B?ea+J}#&vGQdf)I2)i-0aZ+Vu+-ecV2_ASQk z&<c$`)3f0zaR(kJwD%0J1iQ>#*lt*Y?ZB?^D(tGV%dl&F4)&ay@4`O9>#*ygi}@AU z^LzpJg0idp=mu*n?gJldXtF*^qV^UK{WuziB8by{Egx_$i><B*(-f1cR|Q7n<b!A@ zO4{`1!K0&d5iLCj5i(EX%+tB%8C>^FZg>_)MBMU9-1Zz^^2*%t+&mty!Ye>hmByt& z?62T`$#&;gPeut3cN)C8da@rt@9HbruAZ$t)bMxWN}J%(;}mTjI_*IWS;l%An!d>P zv@!LxOj~AS9X%ssOKc3;Gc#?GjZO5d3^T_TdbS$1xpu#l(Hti;GxC=+yK6tt#-)ti zceBz1I!6Y~dP~sf8x?6p$xvE1B0k)d&Y;*aS?Xiof^I0yP87$|4f})PO<(oxbkylY zJJRfJMTvB;1;QVQkUXkijFxWX8{TlFnTByk*68Js`*E0b@u_OQVs42!V37uvl9uv| zd2*O>l!U)9@jQ%&{pLVK+rcnwZU>^-*@}56(q>;Yul0QYe7csrvCYr5{lWIx*M^<* z-JXcgbk;6hXkKX!qQR*sNryokpAzl0^RExD2jo=E-wqSLC9rs&D@}knJ-8|D(SYM) zEBJJ}0Kv4n=IXAN{}wby+jVj3r}JqoB!T1mNze~{U%I~E-{PZ~`c>b*J__P|L{zbm z3RVRuj*_`ZqE6xngsf~v$mRA(q+3F~NNx&$O1wa(4Y7o#usNDJ`_t9<Oqx^DU8EOQ zARbF|9cgYL%}u1ah4ipxWqmUc-6-iI$lcoN$w4UEVKQv+)m2f(5+eiR&)eVU`tI#k z!x1mRC00nhOoGnvNg+<fqC!&voxtQ%Xelw%VL*cXPY#6k?Xf@%fH&p*yT~<Q-@w*` z01!d}^T$H})M{9d!krw!6Y;%*udSh_CIsOV<oVyo)+5o5r;y$IHAi;u&Ql{>1&%jo zkdbEw*@WYkF*3Vn+_=TSb0+r9l5_7TZ4vfy&OwY#Ym}#s`tH}o-hEZ*FAM!ep+7J5 zXNA5~=-U&*qwJ^LSw~BMgUAW5pgKizpfi1FW;%QZ>C9MWM0c=>@RY3x599_q1nu=S zt{rEYfj3K;$@Py+agDs0d7LG<vc?W9dsyOnX5o9z9td@hXtNAI#;}UZjr$-<*r3SF z$!MgKxn0oZxB}v=W|awXnyvl6@d&D?oI-2T0E<a`uo<LbnwNNuMsc$i#ZIXu4O|9! zO%R_<6~-}`jjEt>mZc<LM!JV|DXpY40ts7cNZLtGk;IwexOxd}A#iBoS#qhedyaaC z#Gy)z$m9}QO4AsatO^#(S#3^R(w5<=!?$~EHVY;c_gKX=u*|<x)T<bM2koF@bU~h( zyqu5{ZP099A|DOuT#j}^m5ENCOb<RT^sPdFQs_@}{nLT|xv+mP^dGH;`Dno__=kIR z$VF#>W`mGZ-8h;c`{{6RYzF)$Rgg7ZLEq$H?tWY7?+Oj_{O{n-0?gGZaAda{HM(>< zqv1&4(h-DPC8r>^lBLZs27jl5{<l+CgQ8W%V1md(os0@o&~j6WGuagByp`W+Z&QA$ UYp052sTvE<)SbG8-(ubT2Tpe^W&i*H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..809deeea54ec8fa211f0f425a98fb692f2541aa6 GIT binary patch literal 1583 zcmbVM&1=*^6raf?+3a>(YpGgAq#guwXyaG4f=ICk@!%p@5CRfnX12|mWVbWPw#s_Y ztsme)1V65N^k15zp8OX)`Cc~NR;efsy!R%*nR##Kz2D1?$;k$R(OEls|Ex{OH~iQg z7ED$^lmx{IrwK`^PbuLBXNi$ApQWa6mfvP#rM7QVa+7e2+dG8Y!WL|3`ZYjm+yTS^ z#010vq|O_FG%BPH$OLZ!(iHU}^Ba8fE^(*6LtNrgJzZpR)a4>b;#|luQQs*p7}~j& zwc`vx?c9;wbt#mB?Tvd9pxg0woJHticNj2P0Z}JG3F1>ue1lV;al<z`<K_<WEp9<% zTh~^*MFzn%S&J|j4zwo7Du|i|H6WizP6wo84C!ag3xTt=<uYw;;T1Gfxztviaj^~e zGL=Z$Ux=K9qdzvio{alpF1&syy>>U@LMktn-h)mMEUTsLN}peff?of^xxBr+-jT`q z_R`g>-kR5odkb-<@-RsjWVEz=G2aXkEG6iRjCUnCAEm>KM(<ecJ<@j3;}Gx!ULSKo z=;NvCnTw;P7QEaEf-Fo$5a>n_q+MPlIBy2QW)UXUN-c#<hwDO5Y{XEOsF12F<sooc zK5n0yLaYYrD2M`v5r>-8G)nB?>de8WU#r6zRL0~cWY^O5^2)rsmHkg;WF5Rq<h-s+ zk%qvYY~7`@i7*ysq{?gKdrpJwCTn^ed7LgwPUD%wsAf<hE&iN{Bd~f3L?MkJ5r#zM z;57ULNv*qi7(I0BKj?hHz|q$aPb>SZvct;mRQ7pgUsU#GWnb;(5*=aZuY#z{pmN}O zhYslzni~Vk=^V)!Am)J1k|7-$PYmb-3-=6+<7C_iMoXeAU=&M4rtRKFsD#oijWf;S zEZ5F1N6VVHtgL~qWz|L+A5;$)Z-q1>v_a?S<7SzHaXswc>w#qdOHq!&mNOvx*@;*L zG9K9bD<BH%{VO|xl}xicv2d+XHb1_u?7Paot?c{CzG=DUffwB)U^y#UI1d3mjEpVo zP>J6ycLKY!UF3y??v%JB9aKmxiRII^4UzQVpCU0^WxJJRllZjK$-eZCqiN^bsO7IC Sr4@EXlTOnnn{j4pGmW3A)<)L= literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/helpers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5791a07bad8b1c7ab08eb4126546b4d0e3727ab5 GIT binary patch literal 2983 zcmai0TXPge6z-n;UIGCkmV&zCbro1dqhO&TsF1P@RuYPGDeam}&+g7TI~%%t6WCfF ztfY!3{0-sJztpcj@fUdVoSw<<goL<T)6>(_J$)|U_np2mH&-R_>#v>u{jVA!|Kh{m z&w<W$xFm;$6HZeyplwPCx7rrB+x9KO9q#TB?#9lx-FD&G<32q5=GlWaLFy0uwm%5k z0jwjul2!)Qc9jyCTje#FTQhTOyuM1BbI)NX(xm#>hDb8SI-@L7$uJvxXYPM@c`+^S zy$Gl6{m@MO$;;5hq)j;i^Jv@Vl_#V_xy_xON*fI2-VSNI+~)z@y(h#WZ67wR>gqj_ zsQ8!UVUqo{99iaTgxGL*;exObxekpYicZM3)weoiV*QPQfM;e;s5m#lo--kRch`GH z#2?V}#SImx3b$~S+fQvuQ~-UaJYrT<pAifW*y1b;3Oi}iw6q;(Tsxg4jhi*?%F#wF z1lptn#*!>ijA@T;C0zBiKZvCayRq=_y_d*PsYkljOL)wpk&r{7T@z7VyS?<okL>2% zmDM{d+U=wx*=yR`k#X7)hy?BZxfP18gd9{Di_%a^#{MBM9<*TnW~k!UW++;nVaj76 zTLaNr?=yBqE@oeC@-HH`v3dED>RjpeMfzE1@#@vqT5BWOxR7L0g=u<0M2lBGR}VrQ zG#A?hCx-$)KI{tcq1B61@Kavgcq9Ta=MA{zNoWW?Nj>UN&#J<G9-hXhW?8$q7m;c5 z5EPian{dfBXduvJmqKcO#iaGE1@hRM&|Mq*&*)=YITLGQzYf^OnMJx>e5<?(-KN_x z&dj@Azm%>QG!VE~(-OFyNkB6&H-W$r6=<}Z_D52QIqchm@S(QTI1|U=vFV6;9Hmmz zbxk923ZC+20mt1fgysj(m33$ct-`-f7cc<xr2v>|5n=~_c%ORzK0KgL#`^|(BpM3* zHE{rc5ts&i_VPhj+>$G3K<-0r_4b{61&W%~c<{2}UI#ELdlz7hGz^8LjZc&;&fhob zax*|gXW<|QL{}Lb4EZR<ex0!gqcF|i2(vq4LY&3sZD{md0nsQ<Q^sZ{fK3P*fgv=U zISn0&iv#Ld$Lc{~Mh};fuVLCg8L1s5BfP?^ASb?&lK?1O*LCA%njI-9*I}1~f&x-< z)<_BB(%E$Zuh*dGiEGMNfyo%i$B`MU2p>Kz-owU(3u%2=7R51m(X{jInMo&bpa`A8 zp@|=UWDzcjbC8F~LP+LoWjALGJQRbNttkfIR3Oh~o)ywJcIM99|M?&W?UMCKp;sWz zkJ304Y4#0FDIiy+<Ar@z7E`7&fm%N$%B8ZA=O<*>LZU0s_cB$C8_rY${*N@sK0}(E z?p98BCrz?=hF1er?QbF1)9ib60Hcm<50E$eohYUq&i4IIs9eqHQz%woxGl~r3z%Qh zxFYrtQ>+~agI^W^41UhTx1e`;8VoUS!Rx69br9@AtP4(DoN>P*-ocMHuz44o8O=@P zKEyFZk2r_TR2}zVY7mN8$Kr1gY8V~_PT(01Kq2*H(#^tDd#g*gmX_C`v^nv^MD1h0 z4a@N-KZd5ve#3n@?d$|_gfOR_wrjZV0oOfUTTQx4nKD!#f4LHO6RDtnHNr-|X`>fr zJdHtdd!cGXPy}To_r5XA8o5E!M4}ORVPTNy?@S;-6wHYOg&Pv-Zd-+DgMNBB<3E7~ zIpaUV9y+3rGcW^BQiT}>-L-=?Uc8#`cVThCAt*EpB`0S@-wPSukw-Ui4dw%wLkx3( zH`{nh!jp}apKPE`nrt><-kvcgKcfL0M+6jsS&no0{uE~ZhM&%>NI=JD_L=jNgZ@i^ z(mrE+7(sPFMhX1dQBcAluHbIS282@G5jeICx(>CeGg2b~wMn4EMnDBpL3_jXejF)N rRdVT_<-nGYq(Fbohf3~EB~}O5@}l>x$vo<E-FB#B&!2@qt=s<rJ-kcY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9aea35a994dc69fb78ced96b0a36c1959855f480 GIT binary patch literal 1500 zcmbVMOK%e~5VrS~?IsPOKzU0&a3DhM@~UVhgd#W~BwAH!C8QN-wZu-k(Pp!?lTfO1 zYR?sq14k%1apJ;5;`syk2YZAQe<3GkHZC;4rFb<n{%r5~^UT;+M@Jn3t+6zI=c`G` zcLX~PFsXpZHBgK&8j&XTC?!l|dZaaVPtW>BWHe3Bq~tnbCbKpPv$)Ci4a2iwB*$zR zvAMOOdpW=(%mM6V*an<u1;B+2j{qKJMZm=jJ8a(~DVKi0{-jLPQYQ|pEyn#QY;zGr z@&_GE*f-)@7{eeea&8Ie%!R9AT*d!(ng*Q;h@1e$iANdnG)6t0X`aD!&twKOH;HF4 z3--*Vxy2-mV=husHu`k3PjC0>dY`&WRooOCdNe?;fyh&!)=7i3DQInjj*|z_d#)o| zr$@;)#*KhyI$t(YGmIHuP4$S!sg*1TlFQV*hs4WTYDgZ{QX0M_Vhp_YSKLH|-Js3g zZXn!RD`H$ow<+Aa4d0)U)A6M)yIA#;?)kIr+DyG6qI0$B*;#kVO~Pa{jAc8BqDfJm zp1IIo32-nIzsqCR65za57hFnL4h}q(+)u4e!eGPWcrrX9p(VOjR1ujPOwL1)Y~PQA zCinf+@%?6tbt3E+e1D}AL~1721m{7Wiz4_*^UEP5u-Xx_CB#7($<DY-9l$XQ)HsN= zLD|&6Ps>J!a*EU{xa<h1-#NwlWJcY9+?o(^D|Hq^uE=+ESo-bhJ7wQ0`$pN<kR5Rd zmI&Nl97ct_cM-&#h>Ybi=uLn~tOT11#Q()FKi6u-!vr5GLXVYwsO*!y5XAgpVeSw_ zJVX%VT)_n=K>Zm&2%=WEeg!dqGmM9$xb=QOYU_itAC>*I7m~R3Y2=`yh<J!3)<6Xp zOn~}}B)mBI#?);fIs(~t(!xTx%A=uh_C61o^;F(_uM~bZu-jh-_Jy)Nb)w#$PI40X zok61NB#7tBdAu97PP-%EZU~$bIaFA@X>OTE30!A^k8M`qSrrM)l)y*`bn>t2OYO^p V3wLEdtdLlw1qz=&=9CQh^q+qWK#l+a literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py new file mode 100644 index 000000000..3fdd703a2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/bar.py @@ -0,0 +1,88 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Progress +from .helpers import WritelnMixin + + +class Bar(WritelnMixin, Progress): + width = 32 + message = '' + suffix = '%(index)d/%(max)d' + bar_prefix = ' |' + bar_suffix = '| ' + empty_fill = ' ' + fill = '#' + hide_cursor = True + + def update(self): + filled_length = int(self.width * self.progress) + empty_length = self.width - filled_length + + message = self.message % self + bar = self.fill * filled_length + empty = self.empty_fill * empty_length + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, empty, self.bar_suffix, + suffix]) + self.writeln(line) + + +class ChargingBar(Bar): + suffix = '%(percent)d%%' + bar_prefix = ' ' + bar_suffix = ' ' + empty_fill = '∙' + fill = '█' + + +class FillingSquaresBar(ChargingBar): + empty_fill = '▢' + fill = '▣' + + +class FillingCirclesBar(ChargingBar): + empty_fill = '◯' + fill = '◉' + + +class IncrementalBar(Bar): + phases = (' ', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█') + + def update(self): + nphases = len(self.phases) + filled_len = self.width * self.progress + nfull = int(filled_len) # Number of full chars + phase = int((filled_len - nfull) * nphases) # Phase of last char + nempty = self.width - nfull # Number of empty chars + + message = self.message % self + bar = self.phases[-1] * nfull + current = self.phases[phase] if phase > 0 else '' + empty = self.empty_fill * max(0, nempty - len(current)) + suffix = self.suffix % self + line = ''.join([message, self.bar_prefix, bar, current, empty, + self.bar_suffix, suffix]) + self.writeln(line) + + +class PixelBar(IncrementalBar): + phases = ('⡀', '⡄', '⡆', '⡇', '⣇', '⣧', '⣷', '⣿') + + +class ShadyBar(IncrementalBar): + phases = (' ', '░', '▒', '▓', '█') diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py new file mode 100644 index 000000000..e993a5190 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/counter.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite, Progress +from .helpers import WriteMixin + + +class Counter(WriteMixin, Infinite): + message = '' + hide_cursor = True + + def update(self): + self.write(str(self.index)) + + +class Countdown(WriteMixin, Progress): + hide_cursor = True + + def update(self): + self.write(str(self.remaining)) + + +class Stack(WriteMixin, Progress): + phases = (' ', '▁', '▂', '▃', '▄', '▅', '▆', '▇', '█') + hide_cursor = True + + def update(self): + nphases = len(self.phases) + i = min(nphases - 1, int(self.progress * nphases)) + self.write(self.phases[i]) + + +class Pie(Stack): + phases = ('○', '◔', '◑', '◕', '●') diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py new file mode 100644 index 000000000..96c880099 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/helpers.py @@ -0,0 +1,91 @@ +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import print_function + + +HIDE_CURSOR = '\x1b[?25l' +SHOW_CURSOR = '\x1b[?25h' + + +class WriteMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WriteMixin, self).__init__(**kwargs) + self._width = 0 + if message: + self.message = message + + if self.file.isatty(): + if self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + print(self.message, end='', file=self.file) + self.file.flush() + + def write(self, s): + if self.file.isatty(): + b = '\b' * self._width + c = s.ljust(self._width) + print(b + c, end='', file=self.file) + self._width = max(self._width, len(s)) + self.file.flush() + + def finish(self): + if self.file.isatty() and self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +class WritelnMixin(object): + hide_cursor = False + + def __init__(self, message=None, **kwargs): + super(WritelnMixin, self).__init__(**kwargs) + if message: + self.message = message + + if self.file.isatty() and self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + + def clearln(self): + if self.file.isatty(): + print('\r\x1b[K', end='', file=self.file) + + def writeln(self, line): + if self.file.isatty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file.isatty(): + print(file=self.file) + if self.hide_cursor: + print(SHOW_CURSOR, end='', file=self.file) + + +from signal import signal, SIGINT +from sys import exit + + +class SigIntMixin(object): + """Registers a signal handler that calls finish on SIGINT""" + + def __init__(self, *args, **kwargs): + super(SigIntMixin, self).__init__(*args, **kwargs) + signal(SIGINT, self._sigint_handler) + + def _sigint_handler(self, signum, frame): + self.finish() + exit(0) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py new file mode 100644 index 000000000..d67c679eb --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/progress/spinner.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2012 Giorgos Verigakis <verigak@gmail.com> +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +from __future__ import unicode_literals +from . import Infinite +from .helpers import WriteMixin + + +class Spinner(WriteMixin, Infinite): + message = '' + phases = ('-', '\\', '|', '/') + hide_cursor = True + + def update(self): + i = self.index % len(self.phases) + self.write(self.phases[i]) + + +class PieSpinner(Spinner): + phases = ['◷', '◶', '◵', '◴'] + + +class MoonSpinner(Spinner): + phases = ['◑', '◒', '◐', '◓'] + + +class LineSpinner(Spinner): + phases = ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'] + +class PixelSpinner(Spinner): + phases = ['⣾','⣷', '⣯', '⣟', '⡿', '⢿', '⣻', '⣽'] diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py new file mode 100644 index 000000000..d362e08c0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pyparsing.py @@ -0,0 +1,5720 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2016 Paul T. McGuire +# +# 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. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pip._vendor.pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments +""" + +__version__ = "2.2.0" +__versionTime__ = "06 Mar 2017 02:06 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex(r'&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + r""" + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +collections.MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [(frame_summary.filename, frame_summary.lineno)] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [(frame_summary.filename, frame_summary.lineno)] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define one or more actions to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add one or more parse actions to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or loc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(cache) > size: + try: + cache.popitem(False) + except KeyError: + pass + + def clear(self): + cache.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + while len(key_fifo) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + def cache_len(self): + return len(cache) + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + self.__len__ = types.MethodType(cache_len, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + from pip._vendor import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + + # the sum() builtin can be used to merge results into a single ParseResults object + print(sum(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity"))) + prints:: + [['More'], ['Iron'], ['Lead'], ['Gold'], ['I'], ['Electricity']] + ['More', 'Iron', 'Lead', 'Gold', 'I', 'Electricity'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return self + And._ErrorStop() + other + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + r""" + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern, r"\g<1>", ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, collections.Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, collections.Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted); if the parse action + is passed a tuple or list of functions, this is equivalent to + calling C{setParseAction(*fn)} (L{ParserElement.setParseAction}) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + if isinstance(pa, (tuple, list)): + matchExpr.setParseAction(*pa) + else: + matchExpr.setParseAction(pa) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py new file mode 100644 index 000000000..222a1967f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__init__.py @@ -0,0 +1,3 @@ +from .core import TomlError +from .parser import load, loads +from .writer import dump, dumps diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f8261c77fb10cb0eea8c144d3170fc637eb2c6e GIT binary patch literal 339 zcmXw!%}T^D5XYN-?J6#K@*R3uvwjqJK|~h3da<X1gxI8#k~DFWt?VQDO1XOS6+D>~ z9GKtC{}02=>{qMPB*f5MypmAAqxg?BG>;+eCV(Xj$wZ+Rq1dM~Rau*<yv=8w$wHNF zsTS=b==>$AiXRllD&$WZt>hDchAQ>B)Rg%m(niS+%J?GEK37YhcN#dv#lAEYEC<Mf zfP8j7LAc-)(J2GI5{TE&_%+yon5g4;qJVoX83&6M;J1O0t*ytqiQRU@OxGLNZ{G)y zSAD(P;RYLF)?&1dO1Xxv-rl$m8qGP$#7Cw9o1+VFU_!(w93hwH=$H3OvxDRh@lhL3 IJVWQ`52i<1p#T5? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/core.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5e09a67c247dbf0ce0842cbea0e46666b44a2add GIT binary patch literal 948 zcmbVKOOMkq5VrGZv!z91g%C$p;;@m}hF3)wA%sAPTMy7vC1i!zT_tiJJ5DQYo1WMo zvU}t&<;uU{#Ei>U1;GVJ^UcH_k3WCow}U~C;mD@<KKC5PzSGam@Gy9TX6_<<V3J9G ziKf_BcgCgjiG^;0E4zXFxA_k-Pz-a}%#oOR$!4x}rH9^=zU-j)Wf%7c?ZLFn^?QI4 z68~2r@?ErdXl95|vn$@PhBr>*Hr}<*DQ3dKe<oa<W5R1ZL|-y2$|qr`?SEVpb($+% zx($R#i?kM^?dHmu_)N8)P7Bq#NvYdlo@!OZxeEQ(GfK~aZVto)It0Y#8-oLMKXg<< zx{PZTEn|r0rIrdzltc6-6Jl&e#fznUo``Ds^l?2OpJkw*%txoE(KM>k>Le{p9cz68 z$!PqnK96bAnpmnrmJn4JH3||XC8%L_0WKa%vKreZe#kraTOICX8{S+k;h0B*JkhrL z-N!)kE7q_KHOo-34E4&qYY&xjCac@)&GCBk=)rmuz9jJ5&b)*?uI;7wG$2Vr4goqV z#1@EF+ZDppAOz`Sh%Mu*JNpFf>i_XO+SNH;9{~~l1H;gVTX^K(diD>#_!>Y}NVva8 z_%}tj%k+*gmtF?GoSqPQDHodJz7Xe&SZ`NslYnZ$fPiG!1Cj`+CuD{i6Y!uLxOQ$5 YIzWoqpS?}Ch7~t>wLSH<-Hxg3Cr7Z&P5=M^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/parser.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1cfd4a201ebbc3d53f24448364f13127a0eae4d GIT binary patch literal 10963 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 USkDQRm5?7;)9h0A2ujBPA85QIod5s; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/__pycache__/writer.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..098c5076f692930fbbb06f3fce06cd18ab34c692 GIT binary patch literal 3850 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py new file mode 100644 index 000000000..0fcada48c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/core.py @@ -0,0 +1,13 @@ +class TomlError(RuntimeError): + def __init__(self, message, line, col, filename): + RuntimeError.__init__(self, message, line, col, filename) + self.message = message + self.line = line + self.col = col + self.filename = filename + + def __str__(self): + return '{}({}, {}): {}'.format(self.filename, self.line, self.col, self.message) + + def __repr__(self): + return 'TomlError({!r}, {!r}, {!r}, {!r})'.format(self.message, self.line, self.col, self.filename) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py new file mode 100644 index 000000000..c416ed56f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/parser.py @@ -0,0 +1,374 @@ +import string, re, sys, datetime +from .core import TomlError + +if sys.version_info[0] == 2: + _chr = unichr +else: + _chr = chr + +def load(fin, translate=lambda t, x, v: v): + return loads(fin.read(), translate=translate, filename=getattr(fin, 'name', repr(fin))) + +def loads(s, filename='<string>', translate=lambda t, x, v: v): + if isinstance(s, bytes): + s = s.decode('utf-8') + + s = s.replace('\r\n', '\n') + + root = {} + tables = {} + scope = root + + src = _Source(s, filename=filename) + ast = _p_toml(src) + + def error(msg): + raise TomlError(msg, pos[0], pos[1], filename) + + def process_value(v): + kind, text, value, pos = v + if kind == 'str' and value.startswith('\n'): + value = value[1:] + if kind == 'array': + if value and any(k != value[0][0] for k, t, v, p in value[1:]): + error('array-type-mismatch') + value = [process_value(item) for item in value] + elif kind == 'table': + value = dict([(k, process_value(value[k])) for k in value]) + return translate(kind, text, value) + + for kind, value, pos in ast: + if kind == 'kv': + k, v = value + if k in scope: + error('duplicate_keys. Key "{0}" was used more than once.'.format(k)) + scope[k] = process_value(v) + else: + is_table_array = (kind == 'table_array') + cur = tables + for name in value[:-1]: + if isinstance(cur.get(name), list): + d, cur = cur[name][-1] + else: + d, cur = cur.setdefault(name, (None, {})) + + scope = {} + name = value[-1] + if name not in cur: + if is_table_array: + cur[name] = [(scope, {})] + else: + cur[name] = (scope, {}) + elif isinstance(cur[name], list): + if not is_table_array: + error('table_type_mismatch') + cur[name].append((scope, {})) + else: + if is_table_array: + error('table_type_mismatch') + old_scope, next_table = cur[name] + if old_scope is not None: + error('duplicate_tables') + cur[name] = (scope, next_table) + + def merge_tables(scope, tables): + if scope is None: + scope = {} + for k in tables: + if k in scope: + error('key_table_conflict') + v = tables[k] + if isinstance(v, list): + scope[k] = [merge_tables(sc, tbl) for sc, tbl in v] + else: + scope[k] = merge_tables(v[0], v[1]) + return scope + + return merge_tables(root, tables) + +class _Source: + def __init__(self, s, filename=None): + self.s = s + self._pos = (1, 1) + self._last = None + self._filename = filename + self.backtrack_stack = [] + + def last(self): + return self._last + + def pos(self): + return self._pos + + def fail(self): + return self._expect(None) + + def consume_dot(self): + if self.s: + self._last = self.s[0] + self.s = self[1:] + self._advance(self._last) + return self._last + return None + + def expect_dot(self): + return self._expect(self.consume_dot()) + + def consume_eof(self): + if not self.s: + self._last = '' + return True + return False + + def expect_eof(self): + return self._expect(self.consume_eof()) + + def consume(self, s): + if self.s.startswith(s): + self.s = self.s[len(s):] + self._last = s + self._advance(s) + return True + return False + + def expect(self, s): + return self._expect(self.consume(s)) + + def consume_re(self, re): + m = re.match(self.s) + if m: + self.s = self.s[len(m.group(0)):] + self._last = m + self._advance(m.group(0)) + return m + return None + + def expect_re(self, re): + return self._expect(self.consume_re(re)) + + def __enter__(self): + self.backtrack_stack.append((self.s, self._pos)) + + def __exit__(self, type, value, traceback): + if type is None: + self.backtrack_stack.pop() + else: + self.s, self._pos = self.backtrack_stack.pop() + return type == TomlError + + def commit(self): + self.backtrack_stack[-1] = (self.s, self._pos) + + def _expect(self, r): + if not r: + raise TomlError('msg', self._pos[0], self._pos[1], self._filename) + return r + + def _advance(self, s): + suffix_pos = s.rfind('\n') + if suffix_pos == -1: + self._pos = (self._pos[0], self._pos[1] + len(s)) + else: + self._pos = (self._pos[0] + s.count('\n'), len(s) - suffix_pos) + +_ews_re = re.compile(r'(?:[ \t]|#[^\n]*\n|#[^\n]*\Z|\n)*') +def _p_ews(s): + s.expect_re(_ews_re) + +_ws_re = re.compile(r'[ \t]*') +def _p_ws(s): + s.expect_re(_ws_re) + +_escapes = { 'b': '\b', 'n': '\n', 'r': '\r', 't': '\t', '"': '"', '\'': '\'', + '\\': '\\', '/': '/', 'f': '\f' } + +_basicstr_re = re.compile(r'[^"\\\000-\037]*') +_short_uni_re = re.compile(r'u([0-9a-fA-F]{4})') +_long_uni_re = re.compile(r'U([0-9a-fA-F]{8})') +_escapes_re = re.compile('[bnrt"\'\\\\/f]') +_newline_esc_re = re.compile('\n[ \t\n]*') +def _p_basicstr_content(s, content=_basicstr_re): + res = [] + while True: + res.append(s.expect_re(content).group(0)) + if not s.consume('\\'): + break + if s.consume_re(_newline_esc_re): + pass + elif s.consume_re(_short_uni_re) or s.consume_re(_long_uni_re): + res.append(_chr(int(s.last().group(1), 16))) + else: + s.expect_re(_escapes_re) + res.append(_escapes[s.last().group(0)]) + return ''.join(res) + +_key_re = re.compile(r'[0-9a-zA-Z-_]+') +def _p_key(s): + with s: + s.expect('"') + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return r + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return r + return s.expect_re(_key_re).group(0) + +_float_re = re.compile(r'[+-]?(?:0|[1-9](?:_?\d)*)(?:\.\d(?:_?\d)*)?(?:[eE][+-]?(?:\d(?:_?\d)*))?') +_datetime_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') + +_basicstr_ml_re = re.compile(r'(?:(?:|"|"")[^"\\\000-\011\013-\037])*') +_litstr_re = re.compile(r"[^'\000-\037]*") +_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\011\013-\037]))*") +def _p_value(s): + pos = s.pos() + + if s.consume('true'): + return 'bool', s.last(), True, pos + if s.consume('false'): + return 'bool', s.last(), False, pos + + if s.consume('"'): + if s.consume('""'): + r = _p_basicstr_content(s, _basicstr_ml_re) + s.expect('"""') + else: + r = _p_basicstr_content(s, _basicstr_re) + s.expect('"') + return 'str', r, r, pos + + if s.consume('\''): + if s.consume('\'\''): + r = s.expect_re(_litstr_ml_re).group(0) + s.expect('\'\'\'') + else: + r = s.expect_re(_litstr_re).group(0) + s.expect('\'') + return 'str', r, r, pos + + if s.consume_re(_datetime_re): + m = s.last() + s0 = m.group(0) + r = map(int, m.groups()[:6]) + if m.group(7): + micro = float(m.group(7)) + else: + micro = 0 + + if m.group(8): + g = int(m.group(8), 10) * 60 + int(m.group(9), 10) + tz = _TimeZone(datetime.timedelta(0, g * 60)) + else: + tz = _TimeZone(datetime.timedelta(0, 0)) + + y, m, d, H, M, S = r + dt = datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) + return 'datetime', s0, dt, pos + + if s.consume_re(_float_re): + m = s.last().group(0) + r = m.replace('_','') + if '.' in m or 'e' in m or 'E' in m: + return 'float', m, float(r), pos + else: + return 'int', m, int(r, 10), pos + + if s.consume('['): + items = [] + with s: + while True: + _p_ews(s) + items.append(_p_value(s)) + s.commit() + _p_ews(s) + s.expect(',') + s.commit() + _p_ews(s) + s.expect(']') + return 'array', None, items, pos + + if s.consume('{'): + _p_ws(s) + items = {} + if not s.consume('}'): + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s) + _p_ws(s) + while s.consume(','): + _p_ws(s) + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s) + _p_ws(s) + s.expect('}') + return 'table', None, items, pos + + s.fail() + +def _p_stmt(s): + pos = s.pos() + if s.consume( '['): + is_array = s.consume('[') + _p_ws(s) + keys = [_p_key(s)] + _p_ws(s) + while s.consume('.'): + _p_ws(s) + keys.append(_p_key(s)) + _p_ws(s) + s.expect(']') + if is_array: + s.expect(']') + return 'table_array' if is_array else 'table', keys, pos + + key = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + value = _p_value(s) + return 'kv', (key, value), pos + +_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') +def _p_toml(s): + stmts = [] + _p_ews(s) + with s: + stmts.append(_p_stmt(s)) + while True: + s.commit() + s.expect_re(_stmtsep_re) + stmts.append(_p_stmt(s)) + _p_ews(s) + s.expect_eof() + return stmts + +class _TimeZone(datetime.tzinfo): + def __init__(self, offset): + self._offset = offset + + def utcoffset(self, dt): + return self._offset + + def dst(self, dt): + return None + + def tzname(self, dt): + m = self._offset.total_seconds() // 60 + if m < 0: + res = '-' + m = -m + else: + res = '+' + h = m // 60 + m = m - h * 60 + return '{}{:.02}{:.02}'.format(res, h, m) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py new file mode 100644 index 000000000..19a8c6ec6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/pytoml/writer.py @@ -0,0 +1,127 @@ +from __future__ import unicode_literals +import io, datetime, math, sys + +if sys.version_info[0] == 3: + long = int + unicode = str + + +def dumps(obj, sort_keys=False): + fout = io.StringIO() + dump(obj, fout, sort_keys=sort_keys) + return fout.getvalue() + + +_escapes = {'\n': 'n', '\r': 'r', '\\': '\\', '\t': 't', '\b': 'b', '\f': 'f', '"': '"'} + + +def _escape_string(s): + res = [] + start = 0 + + def flush(): + if start != i: + res.append(s[start:i]) + return i + 1 + + i = 0 + while i < len(s): + c = s[i] + if c in '"\\\n\r\t\b\f': + start = flush() + res.append('\\' + _escapes[c]) + elif ord(c) < 0x20: + start = flush() + res.append('\\u%04x' % ord(c)) + i += 1 + + flush() + return '"' + ''.join(res) + '"' + + +def _escape_id(s): + if any(not c.isalnum() and c not in '-_' for c in s): + return _escape_string(s) + return s + + +def _format_list(v): + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + +# Formula from: +# https://docs.python.org/2/library/datetime.html#datetime.timedelta.total_seconds +# Once support for py26 is dropped, this can be replaced by td.total_seconds() +def _total_seconds(td): + return ((td.microseconds + + (td.seconds + td.days * 24 * 3600) * 10**6) / 10.0**6) + +def _format_value(v): + if isinstance(v, bool): + return 'true' if v else 'false' + if isinstance(v, int) or isinstance(v, long): + return unicode(v) + if isinstance(v, float): + if math.isnan(v) or math.isinf(v): + raise ValueError("{0} is not a valid TOML value".format(v)) + else: + return repr(v) + elif isinstance(v, unicode) or isinstance(v, bytes): + return _escape_string(v) + elif isinstance(v, datetime.datetime): + offs = v.utcoffset() + offs = _total_seconds(offs) // 60 if offs is not None else 0 + + if offs == 0: + suffix = 'Z' + else: + if offs > 0: + suffix = '+' + else: + suffix = '-' + offs = -offs + suffix = '{0}{1:.02}{2:.02}'.format(suffix, offs // 60, offs % 60) + + if v.microsecond: + return v.strftime('%Y-%m-%dT%H:%M:%S.%f') + suffix + else: + return v.strftime('%Y-%m-%dT%H:%M:%S') + suffix + elif isinstance(v, list): + return _format_list(v) + else: + raise RuntimeError(v) + + +def dump(obj, fout, sort_keys=False): + tables = [((), obj, False)] + + while tables: + name, table, is_array = tables.pop() + if name: + section_name = '.'.join(_escape_id(c) for c in name) + if is_array: + fout.write('[[{0}]]\n'.format(section_name)) + else: + fout.write('[{0}]\n'.format(section_name)) + + table_keys = sorted(table.keys()) if sort_keys else table.keys() + new_tables = [] + has_kv = False + for k in table_keys: + v = table[k] + if isinstance(v, dict): + new_tables.append((name + (k,), v, False)) + elif isinstance(v, list) and v and all(isinstance(o, dict) for o in v): + new_tables.extend((name + (k,), d, True) for d in v) + elif v is None: + # based on mojombo's comment: https://github.com/toml-lang/toml/issues/146#issuecomment-25019344 + fout.write( + '#{} = null # To use: uncomment and replace null with value\n'.format(_escape_id(k))) + has_kv = True + else: + fout.write('{0} = {1}\n'.format(_escape_id(k), _format_value(v))) + has_kv = True + + tables.extend(reversed(new_tables)) + + if (name or has_kv) and tables: + fout.write('\n') diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py new file mode 100644 index 000000000..f9565cb97 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py @@ -0,0 +1,123 @@ +# -*- coding: utf-8 -*- + +# __ +# /__) _ _ _ _ _/ _ +# / ( (- (/ (/ (- _) / _) +# / + +""" +Requests HTTP Library +~~~~~~~~~~~~~~~~~~~~~ + +Requests is an HTTP library, written in Python, for human beings. Basic GET +usage: + + >>> import requests + >>> r = requests.get('https://www.python.org') + >>> r.status_code + 200 + >>> 'Python is a programming language' in r.content + True + +... or POST: + + >>> payload = dict(key1='value1', key2='value2') + >>> r = requests.post('http://httpbin.org/post', data=payload) + >>> print(r.text) + { + ... + "form": { + "key2": "value2", + "key1": "value1" + }, + ... + } + +The other HTTP methods are supported - see `requests.api`. Full documentation +is at <http://python-requests.org>. + +:copyright: (c) 2017 by Kenneth Reitz. +:license: Apache 2.0, see LICENSE for more details. +""" + +from pip._vendor import urllib3 +from pip._vendor import chardet +import warnings +from .exceptions import RequestsDependencyWarning + + +def check_compatibility(urllib3_version, chardet_version): + urllib3_version = urllib3_version.split('.') + assert urllib3_version != ['dev'] # Verify urllib3 isn't installed from git. + + # Sometimes, urllib3 only reports its version as 16.1. + if len(urllib3_version) == 2: + urllib3_version.append('0') + + # Check urllib3 for compatibility. + major, minor, patch = urllib3_version # noqa: F811 + major, minor, patch = int(major), int(minor), int(patch) + # urllib3 >= 1.21.1, <= 1.22 + assert major == 1 + assert minor >= 21 + assert minor <= 22 + + # Check chardet for compatibility. + major, minor, patch = chardet_version.split('.')[:3] + major, minor, patch = int(major), int(minor), int(patch) + # chardet >= 3.0.2, < 3.1.0 + assert major == 3 + assert minor < 1 + assert patch >= 2 + + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +from pip._internal.compat import WINDOWS +if not WINDOWS: + try: + from pip._vendor.urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + except ImportError: + pass + +# urllib3's DependencyWarnings should be silenced. +from pip._vendor.urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + +from .__version__ import __title__, __description__, __url__, __version__ +from .__version__ import __build__, __author__, __author_email__, __license__ +from .__version__ import __copyright__, __cake__ + +from . import utils +from . import packages +from .models import Request, Response, PreparedRequest +from .api import request, get, head, post, patch, put, delete, options +from .sessions import session, Session +from .status_codes import codes +from .exceptions import ( + RequestException, Timeout, URLRequired, + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout +) + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b600b0c7bab5bf8ccc83a9436577afcfd331aede GIT binary patch literal 3390 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 G8S}r^u(*Q& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a191ec6ad67d1aa2d9d1fdfbc0289b146a3d4926 GIT binary patch literal 559 zcmZ8e&2AGh5Z<Ku*=&hGtwa&x;A<taPC}!m2%!R(N=T@JoGc;BT{~H)UaxC=SIWKv zZ-B&=-gpKcBgggyICEk)B?z!Jqwo7hpFLy0?)Rer)^hgn<M&1o+}32ffCr}#?kOZ5 zkbpNxgEvW&?~ondA}!t~ZQdar-X&cgl92aEk4GPZ!`*dg#Z@7kch$l9%BQ(TXS3Nk zn&%ds6&cemt{$h}o97stO?|L6#JOEmopC&x#z(UCs2NoKw?b>-Q}kX)Usd~=IK8}6 zY%OdI(JRA}RG@J@te(8d&C1F}>d|;OI!6E4i+eE4&F8P^$Cppv5P)}w(Yi;emtF}< z*Y_#q!X;K3FLMn-m(s#20K1fy!n!*Z92bRD9Q24%R=|iB@Pj{CWK8~cDVYfE>cjh# zCfnYChCtaR6s`kXx3x(>3v8?`nHRWZ7SD6V;Z~eke6gf->L&WQ<VOiL<#_1l)5X%N z(R^}pf@j!BGmzSOrqsYDlj$>m#cFXA(7fik#oKqre~lBH)jE8U<-AbhWxM|JJxHy_ G|N9q~kFl!& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39c0e5d7b4ac2457a4646210de470040a122f395 GIT binary patch literal 1317 zcmZ8h&5qne5O&+1pP1}u6(J5BqCPSb8Ha_1%?cqx2q*`lh+QN!5^{RnHS6BkZKt|D z8?S~OLLLN;TsZL-yn(Nrcm+;Ww`UNfr0(f1S65Yk-`DfS!9fy`U7o-51I9t{r`zl; zqQ&Pl%z`EvECb18Sh6ZyhE=qTs(2Z*K;DqC9KB}CksQm(>tH#S)3acnT>q9JJa55R zv&fXTfLfGUYgK8Im;bXQd4lyuNif`fR<`5oR_9jL+HhM4%LM|@Y1dXD`94?K@m0sa z-PK603Y8aJLIYazT61_|5h|dlHC(x!Z-5t2Hh_k|XIcsuhVoX8u=C_EMwgsN{aBf- z>5lrhR;?<n(wVW?M{XJklPi^n6z9yL<HiFT9w8fS1IvC2@o*db80vRzh<qFT9BtVz zjP?nw<6*rG2_bg<$Jc5DnhQ?ZmA>Hh>JoDMK1a9^C`&Mg*K2OO2At2fNO%ZZH3$Z@ z6%HYaNI03tX_rT7+5*=Uuz`K@Ar0ufmadi{lqBpnR|O#WG#YX$E3jMe^FmQM<3Kn3 z{@H^^k9eznQ?@P%Vk&`G%D}=OoR9iM8KsRCItO&XphK!3`;yR)eKl|h4{i3-eKUPj zxAxZnZ&Li<UD}}92n*>(V7jJKL|0m2y1LA=6LYLT*~pLbtl1phwd<3MODsQFAK$x| zo~Mm!?)V1E@($+5Cm-79!a4oO2x(bky4Pg-h9(zH*B{zC8$ffU6G}5jt?McnC2SnV z>}HsR=)Ad8i!=8-rQucZF)j8gFf$vzV%^LsK#~IJr4Z|JVB=>A-eq)<JkeS3eIR2} z!|3|=FM%{#DGgk$32H^;{L5agNyzjBte_k2*vJckBBwKEk$4VH8*)^RaNh22aQbE< zTl2ht{Mmwk(;CZHun+JVoRXX}bZz;Q&K9JvBmR^UJ{?#-MJJ<EzN+ieAHWe^`TVQL z^AV0|<^Do~es<p&K&Q@!h&AHGId6S8+~}cGAove+)=&41dh&<qz=a>~0LbV$`geDm zyaN}L84Fp$Vm4!Vi@cBL%(pS0^ph-;b)IGYczD)cf`b@cXP!EL=0D{ezvydDKdoxn SmhjmPSIgZe4&RQF!+!ukz<pu> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..346472e39ac4f2fc76c74a61e34f5467140f2af2 GIT binary patch literal 16518 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ͅTQpV8U^Np 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/api.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..628414087809e51aafc74c0a2f2c0fab6676502b GIT binary patch literal 6484 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 NGQT*#Sh+%f{{=r?lV<<` literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8cef2b74541147c299f06866805a025ceb494e0 GIT binary patch literal 7845 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c593198c057e8aca2f2bb914676bd30bc1faf90f GIT binary patch literal 642 zcmY*WO^eh(5bb1VbZA^Jg6G16I53;|H8=~4_yK|-9&}C%()6S&nVwC$v(=sGTtwKv z;Ggg><>;RL3!dy`vIh&g=zes)davru@iAv1cI*3Jt|P{-`^Qbh;qodR_b?>I&Y6l- zTt-!V9!Ct1)X_yu4{(C<6}yTerY4`+eA>JVG@S6VLFZkPA$iBY{}-IEx7tBvRZ}7m z`i6`HzeT7Cb0k6q3Uk?%9^Sr&o<iq3lOAEy7*%2d>n#$3cHEkB57r?3{_%65=<hk% zYIuyLP|NH>7MO7UK8L++K!)lAs7(Q%MzssTq(~N!TLK9mv}wM9($16KG+tW+171lJ zxD-dzYO<z6;}-*ICJkg;X$l;g2MgNhLtPGEd&Q6D;O*!*bZ}Tp3bx8U9~G+J@Mx0% z31esTsGAP8-Asr|Y9qwQ`Lw$>D0s-Mw1ZiD=O%OT)CosHopu|KG?8!=GtQ+W23L zW&t14Uz-N34ZYJ=QkvURA-S}obh8s;<(B3}tDa|~Zl6B(`Ks7a`6OSSo~G+G^gGeU td0Cbxlr2}!{H5%{;fzAkoBgN5{*!v&&CU+{et9=&aJNF5M0es@^bc0m&LjW; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99b62d9a8f5182fb138511da9dab32766cf385d5 GIT binary patch literal 1539 zcmZuw-EQMV6t?5UaU7@VZ@MilYnFw@u#LOzR&*tV(8A4Lz#?t0MnaZjPm)PzJnqaS z5H5HCE)aLT05`nS+#(_M6}aMzor)}Utoi0U^K<;2nR8zDdcFm1b~X6!x3*>dX^gw( z0QmyC{KdAc+(K4v=M8GJ25Q)bJJdlAc4ke~!mZpsu=3`01Gy{S0^Y86dC0@A_zSp8 zJIqHu>!L0TP{4Yq$2QOg>!Uu~M4N02ZLw{%U3qWQ9kzpZ*e=>-duWdh(17iu{c6pl z57+@ZSgANfhv2(I-(g4SsG9TXF*`=b74On_*+cZuws45vgZ>D=k3#$yJ;op45Al<+ zgFZ5B+(1$BJ8u7Ki=V+;KtKN9-;L7$s=rgzqn{W>_eQcopRyBlSgGmI;hM^LP37rZ zDntATlmdb-qx1=kpmS`aD0kjiQUAvqU*MZLmP!sY&dOBzKfT?2|7uEP$ap@dIGm<M zPO%ILE4ff%eT0k%C2AQGDZx`X!s>gBi}2f}n(`t%3*n5vGR}wotx1f?*6nPXiX5wN zZW}OhYtkg@=+@1gE3Dh|q9%SdBqg0o9jqp6t1}lA7a7m7_9s}Cg8x7;Y%*k-jFx38 zrGBt(CAe4+!3%~9r3e3>S)Y$u+5^XBDkS&?HZN-420r7YsFr030c)cm$77LBAe?@+ zEtx7+CX`48Q|{Lsyij1?8zo3FdG#82_ccT<aQ+p^ROE{dh+FgxY#P`y&@s?5;2MC6 zvV><~8z5?l9m7q<iLQabKo0=CcQVee37(}QdZyb+lJhJ{bhjksFj?Rt=R%n4){b1l zT`jPXgck`Z##}dHgU~LKNx3{*jpw>Klf2L_gi6WiUQw0Wd(_+;nu!2jxAJyY1#%}D z+-vvCO1;=M5$yq>XifRBK6XAV)9gB(U^(RVRVF#yr5Mz4DWSWgIiZRai3FoHS}Mp3 z$S6`L%P5tQ@8&(ULm(5Hlml&zDNmK|6?29K$r80J;ZzSc;0YEhGpH4S0FxdYD{ECj zx@jI?>>C+@p-@rgEu?M`uDcnh6lV&qTmE5*=O#h}f0uD7$RbrZUZf%(b4V#6V<zI! zEJ-fqMe*q(f1V}f;_Ot7FDElWpN%hGyoj%2xSA7ENR?80BC?Cib9IxN$*QkjJH9LL zxUSV<xzyfgbv1u(UQWIQXf}d|*LI!22|AwJw4XXhc3^wZ16XO=_2=7u!?jOsvsQhp I6%Tg)1NUCJ!2kdN literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bee0749180d5d9650e7c6f1e1c1a248c675e0e0d GIT binary patch literal 18567 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 A`2YX_ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a35136de96f7507674e2c8cb9954c36109d062ab GIT binary patch literal 5330 zcmb_gTW{OQ6(%L>V#OE5PVB^Sypy|~Cen7dL9@Z4wVh;}6iFJ`+O`l{(6nY`(V<9X zW@KA}yAMr(ed}-NKJ=mJKjLej`WO1t?+hu0K^G{9lmcmfhr{7_&YU?H@665BEF4Fz z<v;#y*0TOdU~-gjvxQT=w=IiXZHwEy5ZL`fyJ%a#vUrg@?=9{K=UuT~0xt0~a9Naq z3&0g#1+E%g2A<(H;F>7oc?I|!p9P*ZxC%VS=Yi+V_!-~@UI(s=vY2`2v}=%@=Zlam z0vFrofS33M;0xxBS>TI&8F<;?Ip7t33HXvIiFwSh0Lf*(3dw3JsY7ywuR*ewO3p)a zm9Imxo=O%W`HVA2n3;D8_!_?sd>tc-nD+uCH~39RZbEVql4VG4@!OExHt(ze-{Bj; z8wOtj-sE?I?~2RNWfk}*{2uT<u_~@$hBZj;^9Cdhv5FB_d2`R&{CvD$lj7}AD6Jae zv?B)Ek3v=Z?!S*(t=01t>qmST2-b;0?fIc%x+j<tnnhi<n@)6xeVD0H`xmYLrX9~b zYqefKl`@hYl1z?bdZQR_gw?j;7X@y&i{D#acn2@OueP1<Eyrq?z}JcE=~tdk$c|gB zo{)l_c#3%;^ZEz=;V>Gi4<x|R1Hn#bD5c=+q~}9{o)_}K4-eTW8p;~Ok=mhQKnEUb z4hL5{7jUZI<8oH`tMS_(3V$k|70)c!Hj*MQ{7?WYoZ;@xjNCc1jtXi=V+=38D;R7a znGxF2r8DbY;i!CucmHDB7B7%)<DKWBuYE7@$6{j4shaG>*FCnMlH7-?oRAt|xx_w; z4vs_zYZzB2vR82>9lTkIi-Tw&NexMRFs}4G<!LSBk{S+#l(YzO)pdP*-*sVSM~R>t zJDxmLarw;&{WY)CI=XHr@RV}hzgz#-&4KifJuRBYo@{obfD5Ubec3!Xa@~jOLHP4y z{<DrdIR4^u-F<j?B!i!JAAI#yv(+5<gZuCw?FGSo*?I8rOa0a(p*h`S5%NejQw3Br z<4}W<oB`eQIMqBZR$<mI+w=I<@Ec#=O}ubwxW-hiGN~APec`%s&2<w`#{I18z8!i& z`lRBzJnFcv`AR&OYTFS(02zJITsCbvNB86w#(ao%mLdyRi%!8vK5}z%r!5*%$0h6L zX6cKv0P%QbJ7ly=7?vcGQ;%)D+H@qnCrN3!NS7tLOxYxNh6_!!hEvf^)ix97VG=Jq zj=~VWgg9V!>v(OOeGq*LwTocHGSmp?qE>q?qtj8sYGs=Z2z?5nWe~WTAw)PAq3Yh= zi-gWHmJZ-k*sS2|8yPl)bFrzk{Jw~Wdi)PW#7Q_~8bZz>Zq!U<d+g~>j{={jaGrSD zi5~>4Ll4+Nq<d!EBkZ|H``=BrU?w{>Qg=u{XJXO+dSzF5d^+BIR3(8nk8fXsMea>4 zRF;HuS!n)a=HoyAsG-sfq2<V!DWYUYJA&!Rq&q44k*2ICkA+OFnnoSUhsZVXOg`+u z>=_$-$WhAc3YtX<OrBr=%h311RDVYj&ZYmk%rcC(Ncltw#(mDhNCP6Rc;Sd~PkYP{ zjlKxck=D@0>qo=Tq<V6yTw!SyRKK25w<Y0x)W6+*K}PnG!pC>F*)h^2XAm-YF*zwc zAlvr6H-dQ+_s>Q03P^2bND|IPvfhfKmoVS1;GlziJYIqXlweWNOJunyQ7C_sp+q<r zrMZ{BQt;!wPEYi`ag!FEtfmZR8=`U8U_Gq|3>k<1s!g(JKY1$`*Q?<6EW?#>KCaJ0 zv#crC>w7{lF1p?@KxH!+u`Vbk>z=Szx#+Ef&Wj8^!nx?xQhG4o_}0XZ*y_hVhwD-O zsiMB<MJL!ehGs5$pMlQn3_ZfR=*^|{o*~o<Ic^Zcp1CKZ4FyG|{|{9LYOM@a!nvqk zc-$L?Zv=lDb|MbvOmgTivjIt<$fO<JNk%e}4rK>J6Q(p3`>CCiLAk7b4V0;xpOi_2 zbE<$2NQC-{$f|Jd8xPHei9?(oP#R83bki|me4c!F9i;w{AxStF$)!Clh1W;cQ$th% ziJ8A3Gb5!Dd$XlXlA7`~eN=$g_=rZC7xR$50h0R}(u8x7uI*BGOt@ZoJXAXB!-`t^ zLa`t^^gFC;jGTuQRe3x^if}Gc7rzaqIPpX79Ry-0;wisJ)4WgqiR6e*loIHquIdS- z&}ki!%)mSpS$vd-{w>h$W#|*mMSo$!^LL&MvEjz6JD#GR*&yQulM%VL(QOb3iI{^+ z)pl%2l6=&@!H#)}tumqZ>uuJh4xJn^8i)`Er9woUYWnAcxMw23ge~#|Y~J_HD6QCm zA9`}c0udhSUM^MckQyJULXupnOnOiCM1VJkON=H;ZJ|H#`-4bQ9mS`Q8IObt??5wC zd~57XaXLWdfKeze6`C+6z3?z!v9$r>ryr?8l2@DSrfqDmqs?xlEp}rlgTO!dGE?50 zmNA|q2buoMCaygHjoFc=vz64jN$Qp)H7TYJH^rza>m-#;k_wf$_FGCk$%|ACNXogA zGMi*{p{Oe<s>L&{(I6dogM_p}CAoQANlj=xD_(?YQCWG^o=zUnI!V&-#~R|e`gPLi k|DuW!s)37R&lc<Tx|9B97Awi!qLcjU<}YOBdTFurA0d^RdjJ3c literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/help.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bd85e407989a1d44579fc19d1bd55c2174aa9d5 GIT binary patch literal 2703 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 No8`amU-cc|{1+EY>@)xX literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad030209684a0b0ae19ebc7ebef9f0418596ab25 GIT binary patch literal 1006 zcmY*Y$!^;)5GA#E5$Xb6kY0*{1$w9tk-DW#f*|OULxBJekQglxAdnf6k`>FAOfqg9 z$h|n{enWfgvA?5h|01Uj89PlzctdJ9e42TrKDJsO0z2uh96hxW`m0}-X2Ik=Kt2J- z&>><t!H1Yx%)UT}7IT;jqs?jus9it*;|V@K<x)w%pXUSVeZOU%*X^g040CpxaZ-qU zk}@ud>T?p&f*z+?s!|BVxiG=~1sO49L{6pRL*Mg0OlX?XW8g3go1WL}2`-C#Bzdp5 z=@GClkS=2+;Ug}n;*7*19}-Fy%)VDOmPrvbcx@m9`UH^o!6|5(Sr<s*9W=*t46WLo z2rrVgLONY)tbi-g(cKv?ae`v&3&Ln@F$7z1=QnCwmF2&vTt49=CG<|?F7u!e=>!T4 zCR7A*o-r<DFciV@Nf@rnwb8o?dlQAl<kbrmuO}xWdl|27Yy{n)NQ>2UBo)oFRS~VN zzgA<ag9agdhUFqy9!g;3@{8$Zb4yEdR)}rgpwyK(=$tSf)6-0aS9x1m9??v0``5`( zzr)f<Rqp4#z1@TV9bC;^ps8B7NbW7^5f)9DM_MXvHGl)y1;~AHB`z8Y&5@SwCoa)1 ztY@O5tP(Rkx5RUh6k=!3N;rq3$1|sNN-M^t{R7Y3(q-15Dg4r%S!4ezDlL6V=WlmX zSx^=A;Z{*|TZpbd%|}#BNj`#Ll7dR4NO{Cb9ur0t^{Yl0LhD%=cG|Y6Lv@v%a8=d& zR8plxyH?o)KCN6MRMpf&sCQPi!8a-rSvfjXc}7XIazm?yOpD4)$|J49LvYCQu!kK$ x4R8lH;1LfX-f25kJq%eMg`sFbz{qKqZcv*mW%wIgSHIbI3v#7V8`tbc?H_Pg384T0 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb8c6530b4cc8b04ca6eb367e968e3c8f1a087c4 GIT binary patch literal 23935 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 SN8TFQJ#u;UE5=uhGye+#n7Qu& literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8f30aa83d9f8b2a72e3fbaf552945ba289ec7b5 GIT binary patch literal 519 zcmYjM!A=`75FPI(*>qc?^g_gidk(CjBqB%=s;V9<E+8STge<e35C>=1v7K$;&`ZRB z&||-(|KMv+{e_<D0I53Cycs{uc;5T8vy(!I+2!u_&j{ex=CO@dXg-Ft-vS5_L_rQK zEuznGJ<W-Tk@O&sFve(2u(1XtV_1E`Cc><>CSmF<PcXsgF0$vCJhd?rjUId_W)Rpn zB3=_g9-}?T)6E7Zd$6gZiD?hUuozsyqH`7QUO>O~J7|FOe(aN_QA*w%`-T)H_enA3 zMxc9mr=`wVjisne=1KOj|36`Hu|(@^rg?G4Z_#G`w?4M_)+euw@4oD!U|S|-OwM&> z9Amzvs)8%)8%kQ|lX)eU3ayVr<5TOnarUcpQy(iVeP>x}gA=(5pM`-RVBQDy&+x}k zZDh?I(wZAOsgyut>D<tp8Dk?mEKh1ND44E49J<Nqc4pMkWO#Z?FKO^|Aj@z|sRL6C qN5^i#H{^4^I;UHs^q*0E@7v=Sy=NrIu$=(yW=h(m6L-lj>5{+fESjPK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d71f34911095905fd922a86707cd72319f2884b4 GIT binary patch literal 18494 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cae35e57211fa208edb9d5f963d6791f3c801c98 GIT binary patch literal 3064 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 F@4rI97svnr literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ded0ccc86349346804664e3608990645af74032 GIT binary patch literal 4414 zcma)9OLODK5ype0AnIXzcO$Qy7pk@#ijG9CH`&VCkyTc-PO^T;DO*WZXsbX7Gn62K z05vnDA{I9nsmizf2JJC_3CHB*zu=R<9uOcYQ;8vA0C0Nx^>z33{9$FKYT!COSUcQW zHjMw$M}C#?@*!@ygMk?>gPF{V%$CV)R*I~y-Lg&NPX;Tq%C*5N+&nE^*{w2uSzr!+ zad-va3(We`s4osbuL^$N=TgarRH7fKzTmR@&mUgZ>T_TD?u5uyC%$rf$pshg7demW zw@}L1|JKA<H`Arh1>=IV=V71%n#nI4FCXHTM;N#P<&Bob%$CjGBr~qfRw*-}RnF9I zRoEh{UK>z+i7n&luobq7=OTNJy^d#<y}|C`xy0_X2Y4>CpRhGNSG1uI)BAhA<S$~$ zV;QP&z)2<lKhR^>4KTA6PNv*;n_;%y-ipFA?j}d4JW!2l)y4Iq+lzRY$4a_>6uDil zP7;Rqn7K)h3txpvEZwA|iQDZUi6Shf9~+<bm46iR&-`95jE~!G*O%@E2NOI=UQI%9 zkn}Fw?S{J>$wc$$iDVEmPID3Y+6xu$N|0pw>|*^Hzk~*YyZj$L2;<CEiF?EeD+rPe z_uxc-WazpA`gf1GkU)@Y8RP)yOy6$gOGO-W9$al|>)LGy78`Jr^5cNl+wIM<jU;}9 zzM-O4Zt6o!Cdow^lY&SyxCmiFki^Ol;|z)dBW+p3{WI(yaIxtkP{k!o(h7~2NX<kc zf@va@nuR-s=KJqwo+9*ukhveYb0T4*uGx%fzN+m80q?2WA*gG>D+&XRZ1Yqmac!2= z-`o4>F9$?AkJfb`xd)=3`I*>9p;Q~tqfYcwf^s^|{EvwMm_EfCdG&<*NF(`Gjci8j zZSgor80@VbB8;>H1xMz_1)>8#>T5`SEU)d2mwl8k!z!eC4^he8jQJ*hIQ9jLxXe6? za5zaWbVy_rZtQotdx2n0M0gy=2>(ljSc3G<b0do&D4A7>1dt(6`#t6>PVqrjo%j7H zRF^=!+w(;Te`<@Tl7}Ms7#SL8fvwBTi9bMi(^}%F6M>>kZWb0FanOX2fDq`%jCaDA z6eE}K2NtRfT~v1H{sg!D6$WKo86(3pM<_sNj(89nFU^s0YK_c}IkNs`ny9d-ljeTi z7PK&}c-rK&l37)^(~{&-CoRE7Kdqcy_~Kap+YnU0zf;Yg2nR5}Iq*fZlSG7Kvn!fM zr=IsrK8=4jV80E#-r&h&)p>S&Dx!BgPv3j5dC=^IJ*r3wPTms1(`Ua?=RW<YZx6m< ziD>4PyE!S!joxMIcwQKX%JbeKD;*4m>EN$q4u3W$^cy*OKnBu9PugYnaLY9eBlx0Y z!7q5bF<%+mg;y+5#(Y}Vh`>h+^kpOI)3Odh?T2hwqNyd%lUz{&@Vv+PL26{|;V<Va zR?rp*5<Tgsb-Ra`iB{{_3D*fNYhMsqJyTAsWbdS!Sfzomnbqky*Xb#yGM&u3bSh}) z>-0J}OmzC-mZyG<GK?cZ$U)EkzcK}FKszp7^ei0o03XyITx*pGy647~2^ZP>#R4Lx zThgu3HV#+6wqBYqkp+JPzjJGx1KMYZc&qU^b!g9E1oToD1(LIQaDTVBeavI*N@8c5 zxDzTRW7wPzHjEaY*VvAdz>nlkqgXozGOcJCvTo`yyA30Sz2@-yT$FKlz-z+71>`f* zO$QZ4ha!KO+EYk<E43pY>qx&t_JZeu!t<yl%fsiV^R3i$Gm?J<TEoVt)QOON6dKrW zH{GMYLg`m0x)0I$N04M&X2G9$Qz~n4e}R{gak!R)I|8ulM#mb1OmSi9%-J6!E$(AQ z>S*Q!bp-=3xaE04LGzr1Xnf7#lX;eFCRy|HKOin^^X~BS(iD$fl1G*qcEy^Xs#DZ6 zsalk_Cs+-nO=X^1SC&{)_6V52G~<#geQBuj$hfJzLcZY5%-+tZX+}gWq}5R7tx&o& z)#arN<Ni*Nm~?eNQANwh8MX;DdV+v}t97v~C+NDwEtg`O@%Xvty#V33f-jp@t7Hw| zn&;b$xBz{o1W?7x!uiG`V=@D5t)32P@g`|AKc`C6j($N(5VXjrhx5b}(TwoI!&D5F zp|GW9!VB@KjXg^|!nF7~hC9R~r3LSyDEt*Pxe9meVHqKTvr0Q4H7lN%Rz0tquzp1E z%brIK#CQfN%aQ;BaK17GDJtHef%X*fkcPKtAgILKG*G)BHfWgaANq|pHto*W@S-cI zvtF{Q6{qaj<3Gn)bTXF*peZgLzxa|=9cNBKOWznBeW1HuoO2Rd)@LEJweSs+yX64V zm9+Y4lAQH>bgUV!(}**NFD~6k|C}FUCan+wO4WgGN%mrsH#}gau+d*xH})%({=E4q zr6qD(T9$nra>N$Mwco};EE@O$$Gt_*3vhmr@an`f<lnDxXW432%;Eiss*~n}f|jly z)M7>rnX#5_?86mo4`ioXdt26a5I33Vc{_pzs|}WU<jl&=0%m??prj$GH@Y!=HO_jA z0*ewD!DOQi$gL;psi4sDK(RzvXR__#+KkPU9)jFY7d?x#nHE2?3i0Ay5DBVU<4#Mr zGwA}FUB4fx+bR&@3GUqd)hQK7d!!2f7e$@8zC**WY1pJeCxs4nofO0>T^XYr;LMsM zOfUlkYUPBsn?mF7xFyY?=d@N!$bqsBnYxoPcQKV#^Z`I+UG?hh**Ggsk3g1%nhvJP YK!Q?dJ4@^xYH)RpELo1VY~TC%d(UPz;s5{u literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..708e7dd9d208affa6bcf757c7ebe4a74ec45775f GIT binary patch literal 20605 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 AO8@`> literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py new file mode 100644 index 000000000..d380286de --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.18.4' +__build__ = 0x021804 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2017 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 000000000..405b025d4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/_internal_utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- + +""" +requests._internal_utils +~~~~~~~~~~~~~~ + +Provides utility functions that are consumed internally by Requests +which depend on extremely few external helpers (such as compat) +""" + +from .compat import is_py2, builtin_str, str + + +def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. + """ + if isinstance(string, builtin_str): + out = string + else: + if is_py2: + out = string.encode(encoding) + else: + out = string.decode(encoding) + + return out + + +def unicode_is_ascii(u_string): + """Determine if unicode string only contains ASCII characters. + + :param str u_string: unicode string to check. Must be unicode + and not Python 2 `str`. + :rtype: bool + """ + assert isinstance(u_string, str) + try: + u_string.encode('ascii') + return True + except UnicodeEncodeError: + return False diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py new file mode 100644 index 000000000..c50585ce9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/adapters.py @@ -0,0 +1,525 @@ +# -*- coding: utf-8 -*- + +""" +requests.adapters +~~~~~~~~~~~~~~~~~ + +This module contains the transport adapters that Requests uses to define +and maintain connections. +""" + +import os.path +import socket + +from pip._vendor.urllib3.poolmanager import PoolManager, proxy_from_url +from pip._vendor.urllib3.response import HTTPResponse +from pip._vendor.urllib3.util import Timeout as TimeoutSauce +from pip._vendor.urllib3.util.retry import Retry +from pip._vendor.urllib3.exceptions import ClosedPoolError +from pip._vendor.urllib3.exceptions import ConnectTimeoutError +from pip._vendor.urllib3.exceptions import HTTPError as _HTTPError +from pip._vendor.urllib3.exceptions import MaxRetryError +from pip._vendor.urllib3.exceptions import NewConnectionError +from pip._vendor.urllib3.exceptions import ProxyError as _ProxyError +from pip._vendor.urllib3.exceptions import ProtocolError +from pip._vendor.urllib3.exceptions import ReadTimeoutError +from pip._vendor.urllib3.exceptions import SSLError as _SSLError +from pip._vendor.urllib3.exceptions import ResponseError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, + prepend_scheme_if_needed, get_auth_from_url, urldefragauth, + select_proxy) +from .structures import CaseInsensitiveDict +from .cookies import extract_cookies_to_jar +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema) +from .auth import _basic_auth_str + +try: + from pip._vendor.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + +DEFAULT_POOLBLOCK = False +DEFAULT_POOLSIZE = 10 +DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None + + +class BaseAdapter(object): + """The Base Transport Adapter""" + + def __init__(self): + super(BaseAdapter, self).__init__() + + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ + raise NotImplementedError + + def close(self): + """Cleans up adapter specific items.""" + raise NotImplementedError + + +class HTTPAdapter(BaseAdapter): + """The built-in HTTP Adapter for urllib3. + + Provides a general-case interface for Requests sessions to contact HTTP and + HTTPS urls by implementing the Transport Adapter interface. This class will + usually be created by the :class:`Session <Session>` class under the + covers. + + :param pool_connections: The number of urllib3 connection pools to cache. + :param pool_maxsize: The maximum number of connections to save in the pool. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. + :param pool_block: Whether the connection pool should block for connections. + + Usage:: + + >>> import requests + >>> s = requests.Session() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) + >>> s.mount('http://', a) + """ + __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', + '_pool_block'] + + def __init__(self, pool_connections=DEFAULT_POOLSIZE, + pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, + pool_block=DEFAULT_POOLBLOCK): + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) + self.config = {} + self.proxy_manager = {} + + super(HTTPAdapter, self).__init__() + + self._pool_connections = pool_connections + self._pool_maxsize = pool_maxsize + self._pool_block = pool_block + + self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) + + def __getstate__(self): + return dict((attr, getattr(self, attr, None)) for attr in + self.__attrs__) + + def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + + for attr, value in state.items(): + setattr(self, attr, value) + + self.init_poolmanager(self._pool_connections, self._pool_maxsize, + block=self._pool_block) + + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param connections: The number of urllib3 connection pools to cache. + :param maxsize: The maximum number of connections to save in the pool. + :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. + """ + # save these values for pickling + self._pool_connections = connections + self._pool_maxsize = maxsize + self._pool_block = block + + self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager + + def cert_verify(self, conn, url, verify, cert): + """Verify a SSL certificate. This method should not be called from user + code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param conn: The urllib3 connection object associated with the cert. + :param url: The requested URL. + :param verify: Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use + :param cert: The SSL certificate to verify. + """ + if url.lower().startswith('https') and verify: + + cert_loc = None + + # Allow self-specified cert location. + if verify is not True: + cert_loc = verify + + if not cert_loc: + cert_loc = DEFAULT_CA_BUNDLE_PATH + + if not cert_loc or not os.path.exists(cert_loc): + raise IOError("Could not find a suitable TLS CA certificate bundle, " + "invalid path: {0}".format(cert_loc)) + + conn.cert_reqs = 'CERT_REQUIRED' + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc + else: + conn.cert_reqs = 'CERT_NONE' + conn.ca_certs = None + conn.ca_cert_dir = None + + if cert: + if not isinstance(cert, basestring): + conn.cert_file = cert[0] + conn.key_file = cert[1] + else: + conn.cert_file = cert + conn.key_file = None + if conn.cert_file and not os.path.exists(conn.cert_file): + raise IOError("Could not find the TLS certificate file, " + "invalid path: {0}".format(conn.cert_file)) + if conn.key_file and not os.path.exists(conn.key_file): + raise IOError("Could not find the TLS key file, " + "invalid path: {0}".format(conn.key_file)) + + def build_response(self, req, resp): + """Builds a :class:`Response <requests.Response>` object from a urllib3 + response. This should not be called from user code, and is only exposed + for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>` + + :param req: The :class:`PreparedRequest <PreparedRequest>` used to generate the response. + :param resp: The urllib3 response object. + :rtype: requests.Response + """ + response = Response() + + # Fallback to None if there's no status_code, for whatever reason. + response.status_code = getattr(resp, 'status', None) + + # Make headers case-insensitive. + response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) + + # Set encoding. + response.encoding = get_encoding_from_headers(response.headers) + response.raw = resp + response.reason = response.raw.reason + + if isinstance(req.url, bytes): + response.url = req.url.decode('utf-8') + else: + response.url = req.url + + # Add new cookies from the server. + extract_cookies_to_jar(response.cookies, req, resp) + + # Give the Response some context. + response.request = req + response.connection = self + + return response + + def get_connection(self, url, proxies=None): + """Returns a urllib3 connection for the given URL. This should not be + called from user code, and is only exposed for use when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param url: The URL to connect to. + :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: urllib3.ConnectionPool + """ + proxy = select_proxy(url, proxies) + + if proxy: + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) + else: + # Only scheme should be lower case + parsed = urlparse(url) + url = parsed.geturl() + conn = self.poolmanager.connection_from_url(url) + + return conn + + def close(self): + """Disposes of any internal state. + + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. + """ + self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() + + def request_url(self, request, proxies): + """Obtain the url to use when making the final request. + + If the message is being sent through a HTTP proxy, the full URL has to + be used. Otherwise, we should only use the path portion of the URL. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str + """ + proxy = select_proxy(request.url, proxies) + scheme = urlparse(request.url).scheme + + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) + + return url + + def add_headers(self, request, **kwargs): + """Add any headers needed by the connection. As of v2.0 this does + nothing by default, but is left for overriding by users that subclass + the :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param request: The :class:`PreparedRequest <PreparedRequest>` to add headers to. + :param kwargs: The keyword arguments from the call to send(). + """ + pass + + def proxy_headers(self, proxy): + """Returns a dictionary of the headers to add to any request sent + through a proxy. This works with urllib3 magic to ensure that they are + correctly sent to the proxy, rather than in a tunnelled request if + CONNECT is being used. + + This should not be called from user code, and is only exposed for use + when subclassing the + :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`. + + :param proxies: The url of the proxy being used for this request. + :rtype: dict + """ + headers = {} + username, password = get_auth_from_url(proxy) + + if username: + headers['Proxy-Authorization'] = _basic_auth_str(username, + password) + + return headers + + def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest <PreparedRequest>` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple or urllib3 Timeout object + :param verify: (optional) Either a boolean, in which case it controls whether + we verify the server's TLS certificate, or a string, in which case it + must be a path to a CA bundle to use + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response + """ + + conn = self.get_connection(request.url, proxies) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request) + + chunked = not (request.body is None or 'Content-Length' in request.headers) + + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) + elif isinstance(timeout, TimeoutSauce): + pass + else: + timeout = TimeoutSauce(connect=timeout, read=timeout) + + try: + if not chunked: + resp = conn.urlopen( + method=request.method, + url=url, + body=request.body, + headers=request.headers, + redirect=False, + assert_same_host=False, + preload_content=False, + decode_content=False, + retries=self.max_retries, + timeout=timeout + ) + + # Send the request. + else: + if hasattr(conn, 'proxy_pool'): + conn = conn.proxy_pool + + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) + + try: + low_conn.putrequest(request.method, + url, + skip_accept_encoding=True) + + for header, value in request.headers.items(): + low_conn.putheader(header, value) + + low_conn.endheaders() + + for i in request.body: + low_conn.send(hex(len(i))[2:].encode('utf-8')) + low_conn.send(b'\r\n') + low_conn.send(i) + low_conn.send(b'\r\n') + low_conn.send(b'0\r\n\r\n') + + # Receive the response from the server + try: + # For Python 2.7+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + r = low_conn.getresponse() + + resp = HTTPResponse.from_httplib( + r, + pool=conn, + connection=low_conn, + preload_content=False, + decode_content=False + ) + except: + # If we hit any problems here, clean up the connection. + # Then, reraise so that we can handle the actual exception. + low_conn.close() + raise + + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) + + except MaxRetryError as e: + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + if isinstance(e.reason, _SSLError): + # This branch is for urllib3 v1.22 and later. + raise SSLError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) + + except _ProxyError as e: + raise ProxyError(e) + + except (_SSLError, _HTTPError) as e: + if isinstance(e, _SSLError): + # This branch is for urllib3 versions earlier than v1.22 + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) + else: + raise + + return self.build_response(request, resp) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/api.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/api.py new file mode 100644 index 000000000..f9ffabfd7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/api.py @@ -0,0 +1,152 @@ +# -*- coding: utf-8 -*- + +""" +requests.api +~~~~~~~~~~~~ + +This module implements the Requests API. + +:copyright: (c) 2012 by Kenneth Reitz. +:license: Apache2, see LICENSE for more details. +""" + +from . import sessions + + +def request(method, url, **kwargs): + """Constructs and sends a :class:`Request <Request>`. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. + :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How many seconds to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param stream: (optional) if ``False``, the response content will be immediately downloaded. + :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response <Response>` object + :rtype: requests.Response + + Usage:: + + >>> import requests + >>> req = requests.request('GET', 'http://httpbin.org/get') + <Response [200]> + """ + + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) + + +def get(url, params=None, **kwargs): + r"""Sends a GET request. + + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('get', url, params=params, **kwargs) + + +def options(url, **kwargs): + r"""Sends an OPTIONS request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return request('options', url, **kwargs) + + +def head(url, **kwargs): + r"""Sends a HEAD request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return request('head', url, **kwargs) + + +def post(url, data=None, json=None, **kwargs): + r"""Sends a POST request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('post', url, data=data, json=json, **kwargs) + + +def put(url, data=None, **kwargs): + r"""Sends a PUT request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('put', url, data=data, **kwargs) + + +def patch(url, data=None, **kwargs): + r"""Sends a PATCH request. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('patch', url, data=data, **kwargs) + + +def delete(url, **kwargs): + r"""Sends a DELETE request. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response <Response>` object + :rtype: requests.Response + """ + + return request('delete', url, **kwargs) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py new file mode 100644 index 000000000..73e453447 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/auth.py @@ -0,0 +1,293 @@ +# -*- coding: utf-8 -*- + +""" +requests.auth +~~~~~~~~~~~~~ + +This module contains the authentication handlers for Requests. +""" + +import os +import re +import time +import hashlib +import threading +import warnings + +from base64 import b64encode + +from .compat import urlparse, str, basestring +from .cookies import extract_cookies_to_jar +from ._internal_utils import to_native_string +from .utils import parse_dict_header + +CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' +CONTENT_TYPE_MULTI_PART = 'multipart/form-data' + + +def _basic_auth_str(username, password): + """Returns a Basic Auth string.""" + + # "I want us to put a big-ol' comment on top of it that + # says that this behaviour is dumb but we need to preserve + # it because people are relying on it." + # - Lukasa + # + # These are here solely to maintain backwards compatibility + # for things like ints. This will be removed in 3.0.0. + if not isinstance(username, basestring): + warnings.warn( + "Non-string usernames will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(username), + category=DeprecationWarning, + ) + username = str(username) + + if not isinstance(password, basestring): + warnings.warn( + "Non-string passwords will no longer be supported in Requests " + "3.0.0. Please convert the object you've passed in ({0!r}) to " + "a string or bytes object in the near future to avoid " + "problems.".format(password), + category=DeprecationWarning, + ) + password = str(password) + # -- End Removal -- + + if isinstance(username, str): + username = username.encode('latin1') + + if isinstance(password, str): + password = password.encode('latin1') + + authstr = 'Basic ' + to_native_string( + b64encode(b':'.join((username, password))).strip() + ) + + return authstr + + +class AuthBase(object): + """Base class that all auth implementations derive from""" + + def __call__(self, r): + raise NotImplementedError('Auth hooks must be callable.') + + +class HTTPBasicAuth(AuthBase): + """Attaches HTTP Basic Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + + def __call__(self, r): + r.headers['Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPProxyAuth(HTTPBasicAuth): + """Attaches HTTP Proxy Authentication to a given Request object.""" + + def __call__(self, r): + r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) + return r + + +class HTTPDigestAuth(AuthBase): + """Attaches HTTP Digest Authentication to the given Request object.""" + + def __init__(self, username, password): + self.username = username + self.password = password + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None + + def build_digest_header(self, method, url): + """ + :rtype: str + """ + + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None + + if algorithm is None: + _algorithm = 'MD5' + else: + _algorithm = algorithm.upper() + # lambdas assume digest modules are imported at the top level + if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': + def md5_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.md5(x).hexdigest() + hash_utf8 = md5_utf8 + elif _algorithm == 'SHA': + def sha_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha1(x).hexdigest() + hash_utf8 = sha_utf8 + + KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) + + if hash_utf8 is None: + return None + + # XXX not implemented yet + entdig = None + p_parsed = urlparse(url) + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" + if p_parsed.query: + path += '?' + p_parsed.query + + A1 = '%s:%s:%s' % (self.username, realm, self.password) + A2 = '%s:%s' % (method, path) + + HA1 = hash_utf8(A1) + HA2 = hash_utf8(A2) + + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 + else: + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') + s += nonce.encode('utf-8') + s += time.ctime().encode('utf-8') + s += os.urandom(8) + + cnonce = (hashlib.sha1(s).hexdigest()[:16]) + if _algorithm == 'MD5-SESS': + HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) + + if not qop: + respdig = KD(HA1, "%s:%s" % (nonce, HA2)) + elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) + respdig = KD(HA1, noncebit) + else: + # XXX handle auth-int. + return None + + self._thread_local.last_nonce = nonce + + # XXX should the partial digests be encoded too? + base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ + 'response="%s"' % (self.username, realm, nonce, path, respdig) + if opaque: + base += ', opaque="%s"' % opaque + if algorithm: + base += ', algorithm="%s"' % algorithm + if entdig: + base += ', digest="%s"' % entdig + if qop: + base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) + + return 'Digest %s' % (base) + + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 + + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + # If response is not 4xx, do not auth + # See https://github.com/requests/requests/issues/3772 + if not 400 <= r.status_code < 500: + self._thread_local.num_401_calls = 1 + return r + + if self._thread_local.pos is not None: + # Rewind the file position indicator of the body to where + # it was to resend the request. + r.request.body.seek(self._thread_local.pos) + s_auth = r.headers.get('www-authenticate', '') + + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: + + self._thread_local.num_401_calls += 1 + pat = re.compile(r'digest ', flags=re.IGNORECASE) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + + # Consume content and release the original connection + # to allow our new request to reuse the same one. + r.content + r.close() + prep = r.request.copy() + extract_cookies_to_jar(prep._cookies, r.request, r.raw) + prep.prepare_cookies(prep._cookies) + + prep.headers['Authorization'] = self.build_digest_header( + prep.method, prep.url) + _r = r.connection.send(prep, **kwargs) + _r.history.append(r) + _r.request = prep + + return _r + + self._thread_local.num_401_calls = 1 + return r + + def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() + # If we have a saved nonce, skip the 401 + if self._thread_local.last_nonce: + r.headers['Authorization'] = self.build_digest_header(r.method, r.url) + try: + self._thread_local.pos = r.body.tell() + except AttributeError: + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None + r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py new file mode 100644 index 000000000..9742f6ed9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/certs.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +requests.certs +~~~~~~~~~~~~~~ + +This module returns the preferred default CA certificate bundle. There is +only one — the one from the certifi package. + +If you are packaging Requests, e.g., for a Linux distribution or a managed +environment, you can change the definition of where() to return a separately +packaged CA bundle. +""" +from pip._vendor.certifi import where + +if __name__ == '__main__': + print(where()) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py new file mode 100644 index 000000000..4cea25e6e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/compat.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- + +""" +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. +""" + +from pip._vendor import chardet + +import sys + +# ------- +# Pythons +# ------- + +# Syntax sugar. +_ver = sys.version_info + +#: Python 2.x? +is_py2 = (_ver[0] == 2) + +#: Python 3.x? +is_py3 = (_ver[0] == 3) + +# Note: We've patched out simplejson support in pip because it prevents +# upgrading simplejson on Windows. +# try: +# import simplejson as json +# except (ImportError, SyntaxError): +# # simplejson does not support Python 3.2, it throws a SyntaxError +# # because of u'...' Unicode literals. +import json + +# --------- +# Specifics +# --------- + +if is_py2: + from urllib import ( + quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, + proxy_bypass, proxy_bypass_environment, getproxies_environment) + from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag + from urllib2 import parse_http_list + import cookielib + from Cookie import Morsel + from StringIO import StringIO + + from pip._vendor.urllib3.packages.ordered_dict import OrderedDict + + builtin_str = str + bytes = str + str = unicode + basestring = basestring + numeric_types = (int, long, float) + integer_types = (int, long) + +elif is_py3: + from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag + from urllib.request import parse_http_list, getproxies, proxy_bypass, proxy_bypass_environment, getproxies_environment + from http import cookiejar as cookielib + from http.cookies import Morsel + from io import StringIO + from collections import OrderedDict + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py new file mode 100644 index 000000000..e69d22ec5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/cookies.py @@ -0,0 +1,542 @@ +# -*- coding: utf-8 -*- + +""" +requests.cookies +~~~~~~~~~~~~~~~~ + +Compatibility code to be able to use `cookielib.CookieJar` with requests. + +requests.utils imports from here, so be careful with imports. +""" + +import copy +import time +import calendar +import collections + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel + +try: + import threading +except ImportError: + import dummy_threading as threading + + +class MockRequest(object): + """Wraps a `requests.Request` to mimic a `urllib2.Request`. + + The code in `cookielib.CookieJar` expects this interface in order to correctly + manage cookie policies, i.e., determine whether a cookie can be set, given the + domains of the request and the cookie. + + The original request object is read-only. The client is responsible for collecting + the new headers via `get_new_headers()` and interpreting them appropriately. You + probably want `get_cookie_header`, defined below. + """ + + def __init__(self, request): + self._r = request + self._new_headers = {} + self.type = urlparse(self._r.url).scheme + + def get_type(self): + return self.type + + def get_host(self): + return urlparse(self._r.url).netloc + + def get_origin_req_host(self): + return self.get_host() + + def get_full_url(self): + # Only return the response's URL if the user hadn't set the Host + # header + if not self._r.headers.get('Host'): + return self._r.url + # If they did set it, retrieve it and reconstruct the expected domain + host = to_native_string(self._r.headers['Host'], encoding='utf-8') + parsed = urlparse(self._r.url) + # Reconstruct the URL as we expect it + return urlunparse([ + parsed.scheme, host, parsed.path, parsed.params, parsed.query, + parsed.fragment + ]) + + def is_unverifiable(self): + return True + + def has_header(self, name): + return name in self._r.headers or name in self._new_headers + + def get_header(self, name, default=None): + return self._r.headers.get(name, self._new_headers.get(name, default)) + + def add_header(self, key, val): + """cookielib has no legitimate use for this method; add it back if you find one.""" + raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") + + def add_unredirected_header(self, name, value): + self._new_headers[name] = value + + def get_new_headers(self): + return self._new_headers + + @property + def unverifiable(self): + return self.is_unverifiable() + + @property + def origin_req_host(self): + return self.get_origin_req_host() + + @property + def host(self): + return self.get_host() + + +class MockResponse(object): + """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. + + ...what? Basically, expose the parsed HTTP headers from the server response + the way `cookielib` expects to see them. + """ + + def __init__(self, headers): + """Make a MockResponse for `cookielib` to read. + + :param headers: a httplib.HTTPMessage or analogous carrying the headers + """ + self._headers = headers + + def info(self): + return self._headers + + def getheaders(self, name): + self._headers.getheaders(name) + + +def extract_cookies_to_jar(jar, request, response): + """Extract the cookies from the response into a CookieJar. + + :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) + :param request: our own requests.Request object + :param response: urllib3.HTTPResponse object + """ + if not (hasattr(response, '_original_response') and + response._original_response): + return + # the _original_response field is the wrapped httplib.HTTPResponse object, + req = MockRequest(request) + # pull out the HTTPMessage with the headers and put it in the mock: + res = MockResponse(response._original_response.msg) + jar.extract_cookies(res, req) + + +def get_cookie_header(jar, request): + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ + r = MockRequest(request) + jar.add_cookie_header(r) + return r.get_new_headers().get('Cookie') + + +def remove_cookie_by_name(cookiejar, name, domain=None, path=None): + """Unsets a cookie by name, by default over all domains and paths. + + Wraps CookieJar.clear(), is O(n). + """ + clearables = [] + for cookie in cookiejar: + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) + + for domain, path, name in clearables: + cookiejar.clear(domain, path, name) + + +class CookieConflictError(RuntimeError): + """There are two cookies that meet the criteria specified in the cookie jar. + Use .get and .set and include domain and path args in order to be more specific. + """ + + +class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. + + This is the CookieJar we create by default for requests and sessions that + don't specify one, since some clients may expect response.cookies and + session.cookies to support dict operations. + + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. + + Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). + """ + + def get(self, name, default=None, domain=None, path=None): + """Dict-like get() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ + try: + return self._find_no_duplicates(name, domain, path) + except KeyError: + return default + + def set(self, name, value, **kwargs): + """Dict-like set() that also supports optional domain and path args in + order to resolve naming collisions from using one cookie jar over + multiple domains. + """ + # support client code that unsets cookies by assignment of a None value: + if value is None: + remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) + return + + if isinstance(value, Morsel): + c = morsel_to_cookie(value) + else: + c = create_cookie(name, value, **kwargs) + self.set_cookie(c) + return c + + def iterkeys(self): + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ + for cookie in iter(self): + yield cookie.name + + def keys(self): + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ + return list(self.iterkeys()) + + def itervalues(self): + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ + for cookie in iter(self): + yield cookie.value + + def values(self): + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ + return list(self.itervalues()) + + def iteritems(self): + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ + for cookie in iter(self): + yield cookie.name, cookie.value + + def items(self): + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ + return list(self.iteritems()) + + def list_domains(self): + """Utility method to list all the domains in the jar.""" + domains = [] + for cookie in iter(self): + if cookie.domain not in domains: + domains.append(cookie.domain) + return domains + + def list_paths(self): + """Utility method to list all the paths in the jar.""" + paths = [] + for cookie in iter(self): + if cookie.path not in paths: + paths.append(cookie.path) + return paths + + def multiple_domains(self): + """Returns True if there are multiple domains in the jar. + Returns False otherwise. + + :rtype: bool + """ + domains = [] + for cookie in iter(self): + if cookie.domain is not None and cookie.domain in domains: + return True + domains.append(cookie.domain) + return False # there is only one domain in jar + + def get_dict(self, domain=None, path=None): + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ + dictionary = {} + for cookie in iter(self): + if ( + (domain is None or cookie.domain == domain) and + (path is None or cookie.path == path) + ): + dictionary[cookie.name] = cookie.value + return dictionary + + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ + return self._find_no_duplicates(name) + + def __setitem__(self, name, value): + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ + self.set(name, value) + + def __delitem__(self, name): + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ + remove_cookie_by_name(self, name) + + def set_cookie(self, cookie, *args, **kwargs): + if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): + cookie.value = cookie.value.replace('\\"', '') + return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) + + def update(self, other): + """Updates this jar with cookies from another CookieJar or dict-like""" + if isinstance(other, cookielib.CookieJar): + for cookie in other: + self.set_cookie(copy.copy(cookie)) + else: + super(RequestsCookieJar, self).update(other) + + def _find(self, name, domain=None, path=None): + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + return cookie.value + + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def _find_no_duplicates(self, name, domain=None, path=None): + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ + toReturn = None + for cookie in iter(self): + if cookie.name == name: + if domain is None or cookie.domain == domain: + if path is None or cookie.path == path: + if toReturn is not None: # if there are multiple cookies that meet passed in criteria + raise CookieConflictError('There are multiple cookies with name, %r' % (name)) + toReturn = cookie.value # we will eventually return this as long as no cookie conflict + + if toReturn: + return toReturn + raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) + + def __getstate__(self): + """Unlike a normal CookieJar, this class is pickleable.""" + state = self.__dict__.copy() + # remove the unpickleable RLock object + state.pop('_cookies_lock') + return state + + def __setstate__(self, state): + """Unlike a normal CookieJar, this class is pickleable.""" + self.__dict__.update(state) + if '_cookies_lock' not in self.__dict__: + self._cookies_lock = threading.RLock() + + def copy(self): + """Return a copy of this RequestsCookieJar.""" + new_cj = RequestsCookieJar() + new_cj.update(self) + return new_cj + + +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + +def create_cookie(name, value, **kwargs): + """Make a cookie from underspecified parameters. + + By default, the pair of `name` and `value` will be set for the domain '' + and sent on every request (this is sometimes called a "supercookie"). + """ + result = dict( + version=0, + name=name, + value=value, + port=None, + domain='', + path='/', + secure=False, + expires=None, + discard=True, + comment=None, + comment_url=None, + rest={'HttpOnly': None}, + rfc2109=False,) + + badargs = set(kwargs) - set(result) + if badargs: + err = 'create_cookie() got unexpected keyword arguments: %s' + raise TypeError(err % list(badargs)) + + result.update(kwargs) + result['port_specified'] = bool(result['port']) + result['domain_specified'] = bool(result['domain']) + result['domain_initial_dot'] = result['domain'].startswith('.') + result['path_specified'] = bool(result['path']) + + return cookielib.Cookie(**result) + + +def morsel_to_cookie(morsel): + """Convert a Morsel object into a Cookie containing the one k/v pair.""" + + expires = None + if morsel['max-age']: + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) + elif morsel['expires']: + time_template = '%a, %d-%b-%Y %H:%M:%S GMT' + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) + return create_cookie( + comment=morsel['comment'], + comment_url=bool(morsel['comment']), + discard=False, + domain=morsel['domain'], + expires=expires, + name=morsel.key, + path=morsel['path'], + port=None, + rest={'HttpOnly': morsel['httponly']}, + rfc2109=False, + secure=bool(morsel['secure']), + value=morsel.value, + version=morsel['version'] or 0, + ) + + +def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): + """Returns a CookieJar from a key/value dictionary. + + :param cookie_dict: Dict of key/values to insert into CookieJar. + :param cookiejar: (optional) A cookiejar to add the cookies to. + :param overwrite: (optional) If False, will not replace cookies + already in the jar with new ones. + """ + if cookiejar is None: + cookiejar = RequestsCookieJar() + + if cookie_dict is not None: + names_from_jar = [cookie.name for cookie in cookiejar] + for name in cookie_dict: + if overwrite or (name not in names_from_jar): + cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) + + return cookiejar + + +def merge_cookies(cookiejar, cookies): + """Add cookies to cookiejar and returns a merged CookieJar. + + :param cookiejar: CookieJar object to add the cookies to. + :param cookies: Dictionary or CookieJar object to be added. + """ + if not isinstance(cookiejar, cookielib.CookieJar): + raise ValueError('You can only merge into CookieJar') + + if isinstance(cookies, dict): + cookiejar = cookiejar_from_dict( + cookies, cookiejar=cookiejar, overwrite=False) + elif isinstance(cookies, cookielib.CookieJar): + try: + cookiejar.update(cookies) + except AttributeError: + for cookie_in_jar in cookies: + cookiejar.set_cookie(cookie_in_jar) + + return cookiejar diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py new file mode 100644 index 000000000..377c4c24d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/exceptions.py @@ -0,0 +1,122 @@ +# -*- coding: utf-8 -*- + +""" +requests.exceptions +~~~~~~~~~~~~~~~~~~~ + +This module contains the set of Requests' exceptions. +""" +from pip._vendor.urllib3.exceptions import HTTPError as BaseHTTPError + + +class RequestException(IOError): + """There was an ambiguous exception that occurred while handling your + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) + + +class HTTPError(RequestException): + """An HTTP error occurred.""" + + +class ConnectionError(RequestException): + """A Connection error occurred.""" + + +class ProxyError(ConnectionError): + """A proxy error occurred.""" + + +class SSLError(ConnectionError): + """An SSL error occurred.""" + + +class Timeout(RequestException): + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" + + +class URLRequired(RequestException): + """A valid URL is required to make a request.""" + + +class TooManyRedirects(RequestException): + """Too many redirects.""" + + +class MissingSchema(RequestException, ValueError): + """The URL schema (e.g. http or https) is missing.""" + + +class InvalidSchema(RequestException, ValueError): + """See defaults.py for valid schemas.""" + + +class InvalidURL(RequestException, ValueError): + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" + + +class ChunkedEncodingError(RequestException): + """The server declared chunked encoding but sent an invalid chunk.""" + + +class ContentDecodingError(RequestException, BaseHTTPError): + """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +class UnrewindableBodyError(RequestException): + """Requests encountered an error when trying to rewind a body""" + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass + + +class RequestsDependencyWarning(RequestsWarning): + """An imported dependency doesn't match the expected version range.""" + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/help.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/help.py new file mode 100644 index 000000000..28385f85e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/help.py @@ -0,0 +1,120 @@ +"""Module containing bug report helper(s).""" +from __future__ import print_function + +import json +import platform +import sys +import ssl + +from pip._vendor import idna +from pip._vendor import urllib3 +from pip._vendor import chardet + +from . import __version__ as requests_version + +try: + from .packages.urllib3.contrib import pyopenssl +except ImportError: + pyopenssl = None + OpenSSL = None + cryptography = None +else: + import OpenSSL + import cryptography + + +def _implementation(): + """Return a dict with the Python implementation and version. + + Provide both the name and the version of the Python implementation + currently running. For example, on CPython 2.7.5 it will return + {'name': 'CPython', 'version': '2.7.5'}. + + This function works best on CPython and PyPy: in particular, it probably + doesn't work for Jython or IronPython. Future investigation should be done + to work out the correct shape of the code for those platforms. + """ + implementation = platform.python_implementation() + + if implementation == 'CPython': + implementation_version = platform.python_version() + elif implementation == 'PyPy': + implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, + sys.pypy_version_info.minor, + sys.pypy_version_info.micro) + if sys.pypy_version_info.releaselevel != 'final': + implementation_version = ''.join([ + implementation_version, sys.pypy_version_info.releaselevel + ]) + elif implementation == 'Jython': + implementation_version = platform.python_version() # Complete Guess + elif implementation == 'IronPython': + implementation_version = platform.python_version() # Complete Guess + else: + implementation_version = 'Unknown' + + return {'name': implementation, 'version': implementation_version} + + +def info(): + """Generate information for a bug report.""" + try: + platform_info = { + 'system': platform.system(), + 'release': platform.release(), + } + except IOError: + platform_info = { + 'system': 'Unknown', + 'release': 'Unknown', + } + + implementation_info = _implementation() + urllib3_info = {'version': urllib3.__version__} + chardet_info = {'version': chardet.__version__} + + pyopenssl_info = { + 'version': None, + 'openssl_version': '', + } + if OpenSSL: + pyopenssl_info = { + 'version': OpenSSL.__version__, + 'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, + } + cryptography_info = { + 'version': getattr(cryptography, '__version__', ''), + } + idna_info = { + 'version': getattr(idna, '__version__', ''), + } + + # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module. + system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None) + system_ssl_info = { + 'version': '%x' % system_ssl if system_ssl is not None else '' + } + + return { + 'platform': platform_info, + 'implementation': implementation_info, + 'system_ssl': system_ssl_info, + 'using_pyopenssl': pyopenssl is not None, + 'pyOpenSSL': pyopenssl_info, + 'urllib3': urllib3_info, + 'chardet': chardet_info, + 'cryptography': cryptography_info, + 'idna': idna_info, + 'requests': { + 'version': requests_version, + }, + } + + +def main(): + """Pretty-print the bug information as JSON.""" + print(json.dumps(info(), sort_keys=True, indent=2)) + + +if __name__ == '__main__': + main() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py new file mode 100644 index 000000000..14db0c8e6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/hooks.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +""" +requests.hooks +~~~~~~~~~~~~~~ + +This module provides the capabilities for the Requests hooks system. + +Available hooks: + +``response``: + The response generated from a Request. +""" +HOOKS = ['response'] + + +def default_hooks(): + return dict((event, []) for event in HOOKS) + +# TODO: response is the only one + + +def dispatch_hook(key, hooks, hook_data, **kwargs): + """Dispatches a hook dictionary on a given piece of data.""" + hooks = hooks or dict() + hooks = hooks.get(key) + if hooks: + if hasattr(hooks, '__call__'): + hooks = [hooks] + for hook in hooks: + _hook_data = hook(hook_data, **kwargs) + if _hook_data is not None: + hook_data = _hook_data + return hook_data diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/models.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/models.py new file mode 100644 index 000000000..6f5b0fb1b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/models.py @@ -0,0 +1,948 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +import collections +import datetime +import sys + +# Import encoding now, to avoid implicit import later. +# Implicit import within threads may cause LookupError when standard library is in a ZIP, +# such as in Embedded Python. See https://github.com/requests/requests/issues/3578. +import encodings.idna + +from pip._vendor.urllib3.fields import RequestField +from pip._vendor.urllib3.filepost import encode_multipart_formdata +from pip._vendor.urllib3.util import parse_url +from pip._vendor.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) + +from io import UnsupportedOperation +from .hooks import default_hooks +from .structures import CaseInsensitiveDict + +from .auth import HTTPBasicAuth +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar +from .exceptions import ( + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) +from ._internal_utils import to_native_string, unicode_is_ascii +from .utils import ( + guess_filename, get_auth_from_url, requote_uri, + stream_decode_response_unicode, to_key_val_list, parse_header_links, + iter_slices, guess_json_utf, super_len, check_header_validity) +from .compat import ( + cookielib, urlunparse, urlsplit, urlencode, str, bytes, + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes + +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 +CONTENT_CHUNK_SIZE = 10 * 1024 +ITER_CHUNK_SIZE = 512 + + +class RequestEncodingMixin(object): + @property + def path_url(self): + """Build the path URL to use.""" + + url = [] + + p = urlsplit(self.url) + + path = p.path + if not path: + path = '/' + + url.append(path) + + query = p.query + if query: + url.append('?') + url.append(query) + + return ''.join(url) + + @staticmethod + def _encode_params(data): + """Encode parameters in a piece of data. + + Will successfully encode parameters when passed as a dict or a list of + 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + if parameters are supplied as a dict. + """ + + if isinstance(data, (str, bytes)): + return data + elif hasattr(data, 'read'): + return data + elif hasattr(data, '__iter__'): + result = [] + for k, vs in to_key_val_list(data): + if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): + vs = [vs] + for v in vs: + if v is not None: + result.append( + (k.encode('utf-8') if isinstance(k, str) else k, + v.encode('utf-8') if isinstance(v, str) else v)) + return urlencode(result, doseq=True) + else: + return data + + @staticmethod + def _encode_files(files, data): + """Build the body for a multipart/form-data request. + + Will successfully encode files when passed as a dict or a list of + tuples. Order is retained if data is a list of tuples but arbitrary + if parameters are supplied as a dict. + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). + """ + if (not files): + raise ValueError("Files must be provided.") + elif isinstance(data, basestring): + raise ValueError("Data must not be a string.") + + new_fields = [] + fields = to_key_val_list(data or {}) + files = to_key_val_list(files or {}) + + for field, val in fields: + if isinstance(val, basestring) or not hasattr(val, '__iter__'): + val = [val] + for v in val: + if v is not None: + # Don't call str() on bytestrings: in Py3 it all goes wrong. + if not isinstance(v, bytes): + v = str(v) + + new_fields.append( + (field.decode('utf-8') if isinstance(field, bytes) else field, + v.encode('utf-8') if isinstance(v, str) else v)) + + for (k, v) in files: + # support for explicit filename + ft = None + fh = None + if isinstance(v, (tuple, list)): + if len(v) == 2: + fn, fp = v + elif len(v) == 3: + fn, fp, ft = v + else: + fn, fp, ft, fh = v + else: + fn = guess_filename(v) or k + fp = v + + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + else: + fdata = fp.read() + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) + rf.make_multipart(content_type=ft) + new_fields.append(rf) + + body, content_type = encode_multipart_formdata(new_fields) + + return body, content_type + + +class RequestHooksMixin(object): + def register_hook(self, event, hook): + """Properly register a hook.""" + + if event not in self.hooks: + raise ValueError('Unsupported event specified, with event name "%s"' % (event)) + + if isinstance(hook, collections.Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) + + def deregister_hook(self, event, hook): + """Deregister a previously registered hook. + Returns True if the hook existed, False if not. + """ + + try: + self.hooks[event].remove(hook) + return True + except ValueError: + return False + + +class Request(RequestHooksMixin): + """A user-created :class:`Request <Request>` object. + + Used to prepare a :class:`PreparedRequest <PreparedRequest>`, which is sent to the server. + + :param method: HTTP method to use. + :param url: URL to send. + :param headers: dictionary of headers to send. + :param files: dictionary of {filename: fileobject} files to multipart upload. + :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param json: json for the body to attach to the request (if files or data is not specified). + :param params: dictionary of URL parameters to append to the URL. + :param auth: Auth handler or (user, pass) tuple. + :param cookies: dictionary or CookieJar of cookies to attach to this request. + :param hooks: dictionary of callback hooks, for internal usage. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> req.prepare() + <PreparedRequest [GET]> + """ + + def __init__(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + + # Default empty dicts for dict params. + data = [] if data is None else data + files = [] if files is None else files + headers = {} if headers is None else headers + params = {} if params is None else params + hooks = {} if hooks is None else hooks + + self.hooks = default_hooks() + for (k, v) in list(hooks.items()): + self.register_hook(event=k, hook=v) + + self.method = method + self.url = url + self.headers = headers + self.files = files + self.data = data + self.json = json + self.params = params + self.auth = auth + self.cookies = cookies + + def __repr__(self): + return '<Request [%s]>' % (self.method) + + def prepare(self): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for transmission and returns it.""" + p = PreparedRequest() + p.prepare( + method=self.method, + url=self.url, + headers=self.headers, + files=self.files, + data=self.data, + json=self.json, + params=self.params, + auth=self.auth, + cookies=self.cookies, + hooks=self.hooks, + ) + return p + + +class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): + """The fully mutable :class:`PreparedRequest <PreparedRequest>` object, + containing the exact bytes that will be sent to the server. + + Generated from either a :class:`Request <Request>` object or manually. + + Usage:: + + >>> import requests + >>> req = requests.Request('GET', 'http://httpbin.org/get') + >>> r = req.prepare() + <PreparedRequest [GET]> + + >>> s = requests.Session() + >>> s.send(r) + <Response [200]> + """ + + def __init__(self): + #: HTTP verb to send to the server. + self.method = None + #: HTTP URL to send the request to. + self.url = None + #: dictionary of HTTP headers. + self.headers = None + # The `CookieJar` used to create the Cookie header will be stored here + # after prepare_cookies is called + self._cookies = None + #: request body to send to the server. + self.body = None + #: dictionary of callback hooks, for internal usage. + self.hooks = default_hooks() + #: integer denoting starting position of a readable file-like body. + self._body_position = None + + def prepare(self, + method=None, url=None, headers=None, files=None, data=None, + params=None, auth=None, cookies=None, hooks=None, json=None): + """Prepares the entire request with the given parameters.""" + + self.prepare_method(method) + self.prepare_url(url, params) + self.prepare_headers(headers) + self.prepare_cookies(cookies) + self.prepare_body(data, files, json) + self.prepare_auth(auth, url) + + # Note that prepare_auth must be last to enable authentication schemes + # such as OAuth to work on a fully prepared request. + + # This MUST go after prepare_auth. Authenticators could add a hook + self.prepare_hooks(hooks) + + def __repr__(self): + return '<PreparedRequest [%s]>' % (self.method) + + def copy(self): + p = PreparedRequest() + p.method = self.method + p.url = self.url + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) + p.body = self.body + p.hooks = self.hooks + p._body_position = self._body_position + return p + + def prepare_method(self, method): + """Prepares the given HTTP method.""" + self.method = method + if self.method is not None: + self.method = to_native_string(self.method.upper()) + + @staticmethod + def _get_idna_encoded_host(host): + from pip._vendor import idna + + try: + host = idna.encode(host, uts46=True).decode('utf-8') + except idna.IDNAError: + raise UnicodeError + return host + + def prepare_url(self, url, params): + """Prepares the given HTTP URL.""" + #: Accept objects that have string representations. + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/requests/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) + + # Remove leading whitespaces from url + url = url.lstrip() + + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. + if ':' in url and not url.lower().startswith('http'): + self.url = url + return + + # Support for unicode domain names and paths. + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) + + if not scheme: + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) + + if not host: + raise InvalidURL("Invalid URL %r: No host supplied" % url) + + # In general, we want to try IDNA encoding the hostname if the string contains + # non-ASCII characters. This allows users to automatically get the correct IDNA + # behaviour. For strings containing only ASCII characters, we need to also verify + # it doesn't start with a wildcard (*), before allowing the unencoded hostname. + if not unicode_is_ascii(host): + try: + host = self._get_idna_encoded_host(host) + except UnicodeError: + raise InvalidURL('URL has an invalid label.') + elif host.startswith(u'*'): + raise InvalidURL('URL has an invalid label.') + + # Carefully reconstruct the network location + netloc = auth or '' + if netloc: + netloc += '@' + netloc += host + if port: + netloc += ':' + str(port) + + # Bare domains aren't valid URLs. + if not path: + path = '/' + + if is_py2: + if isinstance(scheme, str): + scheme = scheme.encode('utf-8') + if isinstance(netloc, str): + netloc = netloc.encode('utf-8') + if isinstance(path, str): + path = path.encode('utf-8') + if isinstance(query, str): + query = query.encode('utf-8') + if isinstance(fragment, str): + fragment = fragment.encode('utf-8') + + if isinstance(params, (str, bytes)): + params = to_native_string(params) + + enc_params = self._encode_params(params) + if enc_params: + if query: + query = '%s&%s' % (query, enc_params) + else: + query = enc_params + + url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) + self.url = url + + def prepare_headers(self, headers): + """Prepares the given HTTP headers.""" + + self.headers = CaseInsensitiveDict() + if headers: + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value + + def prepare_body(self, data, files, json=None): + """Prepares the given HTTP body data.""" + + # Check if file, fo, generator, iterator. + # If not, run through normal process. + + # Nottin' on you. + body = None + content_type = None + + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + + is_stream = all([ + hasattr(data, '__iter__'), + not isinstance(data, (basestring, list, tuple, collections.Mapping)) + ]) + + try: + length = super_len(data) + except (TypeError, AttributeError, UnsupportedOperation): + length = None + + if is_stream: + body = data + + if getattr(body, 'tell', None) is not None: + # Record the current file position before reading. + # This will allow us to rewind a file in the event + # of a redirect. + try: + self._body_position = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body + self._body_position = object() + + if files: + raise NotImplementedError('Streamed bodies and files are mutually exclusive.') + + if length: + self.headers['Content-Length'] = builtin_str(length) + else: + self.headers['Transfer-Encoding'] = 'chunked' + else: + # Multi-part file uploads. + if files: + (body, content_type) = self._encode_files(files, data) + else: + if data: + body = self._encode_params(data) + if isinstance(data, basestring) or hasattr(data, 'read'): + content_type = None + else: + content_type = 'application/x-www-form-urlencoded' + + self.prepare_content_length(body) + + # Add content-type if it wasn't explicitly provided. + if content_type and ('content-type' not in self.headers): + self.headers['Content-Type'] = content_type + + self.body = body + + def prepare_content_length(self, body): + """Prepare Content-Length header based on request method and body""" + if body is not None: + length = super_len(body) + if length: + # If length exists, set it. Otherwise, we fallback + # to Transfer-Encoding: chunked. + self.headers['Content-Length'] = builtin_str(length) + elif self.method not in ('GET', 'HEAD') and self.headers.get('Content-Length') is None: + # Set Content-Length to 0 for methods that can have a body + # but don't provide one. (i.e. not GET or HEAD) + self.headers['Content-Length'] = '0' + + def prepare_auth(self, auth, url=''): + """Prepares the given HTTP auth data.""" + + # If no Auth is explicitly provided, extract it from the URL first. + if auth is None: + url_auth = get_auth_from_url(self.url) + auth = url_auth if any(url_auth) else None + + if auth: + if isinstance(auth, tuple) and len(auth) == 2: + # special-case basic HTTP auth + auth = HTTPBasicAuth(*auth) + + # Allow auth to make its changes. + r = auth(self) + + # Update self to reflect the auth changes. + self.__dict__.update(r.__dict__) + + # Recompute Content-Length + self.prepare_content_length(self.body) + + def prepare_cookies(self, cookies): + """Prepares the given HTTP cookie data. + + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest <PreparedRequest>` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ + if isinstance(cookies, cookielib.CookieJar): + self._cookies = cookies + else: + self._cookies = cookiejar_from_dict(cookies) + + cookie_header = get_cookie_header(self._cookies, self) + if cookie_header is not None: + self.headers['Cookie'] = cookie_header + + def prepare_hooks(self, hooks): + """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] + for event in hooks: + self.register_hook(event, hooks[event]) + + +class Response(object): + """The :class:`Response <Response>` object, which contains a + server's response to an HTTP request. + """ + + __attrs__ = [ + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' + ] + + def __init__(self): + self._content = False + self._content_consumed = False + self._next = None + + #: Integer Code of responded HTTP Status, e.g. 404 or 200. + self.status_code = None + + #: Case-insensitive Dictionary of Response Headers. + #: For example, ``headers['content-encoding']`` will return the + #: value of a ``'Content-Encoding'`` response header. + self.headers = CaseInsensitiveDict() + + #: File-like object representation of response (for advanced usage). + #: Use of ``raw`` requires that ``stream=True`` be set on the request. + # This requirement does not apply for use internally to Requests. + self.raw = None + + #: Final URL location of Response. + self.url = None + + #: Encoding to decode with when accessing r.text. + self.encoding = None + + #: A list of :class:`Response <Response>` objects from + #: the history of the Request. Any redirect responses will end + #: up here. The list is sorted from the oldest to the most recent request. + self.history = [] + + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". + self.reason = None + + #: A CookieJar of Cookies the server sent back. + self.cookies = cookiejar_from_dict({}) + + #: The amount of time elapsed between sending the request + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. + self.elapsed = datetime.timedelta(0) + + #: The :class:`PreparedRequest <PreparedRequest>` object to which this + #: is a response. + self.request = None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def __getstate__(self): + # Consume everything; accessing the content attribute makes + # sure the content has been fully read. + if not self._content_consumed: + self.content + + return dict( + (attr, getattr(self, attr, None)) + for attr in self.__attrs__ + ) + + def __setstate__(self, state): + for name, value in state.items(): + setattr(self, name, value) + + # pickled objects do not have .raw + setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) + + def __repr__(self): + return '<Response [%s]>' % (self.status_code) + + def __bool__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __nonzero__(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + return self.ok + + def __iter__(self): + """Allows you to use a response as an iterator.""" + return self.iter_content(128) + + @property + def ok(self): + """Returns True if :attr:`status_code` is less than 400. + + This attribute checks if the status code of the response is between + 400 and 600 to see if there was a client error or a server error. If + the status code, is between 200 and 400, this will return True. This + is **not** a check to see if the response code is ``200 OK``. + """ + try: + self.raise_for_status() + except HTTPError: + return False + return True + + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect.""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + + @property + def next(self): + """Returns a PreparedRequest for the next request in a redirect chain, if there is one.""" + return self._next + + @property + def apparent_encoding(self): + """The apparent encoding, provided by the chardet library.""" + return chardet.detect(self.content)['encoding'] + + def iter_content(self, chunk_size=1, decode_unicode=False): + """Iterates over the response data. When stream=True is set on the + request, this avoids reading the content at once into memory for + large responses. The chunk size is the number of bytes it should + read into memory. This is not necessarily the length of each item + returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. + """ + + def generate(): + # Special case for urllib3. + if hasattr(self.raw, 'stream'): + try: + for chunk in self.raw.stream(chunk_size, decode_content=True): + yield chunk + except ProtocolError as e: + raise ChunkedEncodingError(e) + except DecodeError as e: + raise ContentDecodingError(e) + except ReadTimeoutError as e: + raise ConnectionError(e) + else: + # Standard file-like object. + while True: + chunk = self.raw.read(chunk_size) + if not chunk: + break + yield chunk + + self._content_consumed = True + + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks + + if decode_unicode: + chunks = stream_decode_response_unicode(chunks, self) + + return chunks + + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): + """Iterates over the response data, one line at a time. When + stream=True is set on the request, this avoids reading the + content at once into memory for large responses. + + .. note:: This method is not reentrant safe. + """ + + pending = None + + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): + + if pending is not None: + chunk = pending + chunk + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() + + if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: + pending = lines.pop() + else: + pending = None + + for line in lines: + yield line + + if pending is not None: + yield pending + + @property + def content(self): + """Content of the response, in bytes.""" + + if self._content is False: + # Read the contents. + if self._content_consumed: + raise RuntimeError( + 'The content for this response was already consumed') + + if self.status_code == 0 or self.raw is None: + self._content = None + else: + self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() + + self._content_consumed = True + # don't need to release the connection; that's been handled by urllib3 + # since we exhausted the data. + return self._content + + @property + def text(self): + """Content of the response, in unicode. + + If Response.encoding is None, encoding will be guessed using + ``chardet``. + + The encoding of the response content is determined based solely on HTTP + headers, following RFC 2616 to the letter. If you can take advantage of + non-HTTP knowledge to make a better guess at the encoding, you should + set ``r.encoding`` appropriately before accessing this property. + """ + + # Try charset from content-type + content = None + encoding = self.encoding + + if not self.content: + return str('') + + # Fallback to auto-detected encoding. + if self.encoding is None: + encoding = self.apparent_encoding + + # Decode unicode from given encoding. + try: + content = str(self.content, encoding, errors='replace') + except (LookupError, TypeError): + # A LookupError is raised if the encoding was not found which could + # indicate a misspelling or similar mistake. + # + # A TypeError can be raised if encoding is None + # + # So we try blindly encoding. + content = str(self.content, errors='replace') + + return content + + def json(self, **kwargs): + r"""Returns the json-encoded content of a response, if any. + + :param \*\*kwargs: Optional arguments that ``json.loads`` takes. + :raises ValueError: If the response body does not contain valid json. + """ + + if not self.encoding and self.content and len(self.content) > 3: + # No encoding set. JSON RFC 4627 section 3 states we should expect + # UTF-8, -16 or -32. Detect which one to use; If the detection or + # decoding fails, fall back to `self.text` (using chardet to make + # a best guess). + encoding = guess_json_utf(self.content) + if encoding is not None: + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) + + @property + def links(self): + """Returns the parsed header links of the response, if any.""" + + header = self.headers.get('link') + + # l = MultiDict() + l = {} + + if header: + links = parse_header_links(header) + + for link in links: + key = link.get('rel') or link.get('url') + l[key] = link + + return l + + def raise_for_status(self): + """Raises stored :class:`HTTPError`, if one occurred.""" + + http_error_msg = '' + if isinstance(self.reason, bytes): + # We attempt to decode utf-8 first because some servers + # choose to localize their reason strings. If the string + # isn't utf-8, we fall back to iso-8859-1 for all other + # encodings. (See PR #3538) + try: + reason = self.reason.decode('utf-8') + except UnicodeDecodeError: + reason = self.reason.decode('iso-8859-1') + else: + reason = self.reason + + if 400 <= self.status_code < 500: + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) + + elif 500 <= self.status_code < 600: + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) + + if http_error_msg: + raise HTTPError(http_error_msg, response=self) + + def close(self): + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. + + *Note: Should not normally need to be called explicitly.* + """ + if not self._content_consumed: + self.raw.close() + + release_conn = getattr(self.raw, 'release_conn', None) + if release_conn is not None: + release_conn() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py new file mode 100644 index 000000000..c91d9c7a5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/packages.py @@ -0,0 +1,16 @@ +import sys + +# This code exists for backwards compatibility reasons. +# I don't like it either. Just look the other way. :) + +for package in ('urllib3', 'idna', 'chardet'): + vendored_package = "pip._vendor." + package + locals()[package] = __import__(vendored_package) + # This traversal is apparently necessary such that the identities are + # preserved (requests.packages.urllib3.* is urllib3.*) + for mod in list(sys.modules): + if mod == vendored_package or mod.startswith(vendored_package + '.'): + unprefixed_mod = mod[len("pip._vendor."):] + sys.modules['pip._vendor.requests.packages.' + unprefixed_mod] = sys.modules[mod] + +# Kinda cool, though, right? diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py new file mode 100644 index 000000000..d8eafa8d3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/sessions.py @@ -0,0 +1,737 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import platform +import time +from collections import Mapping +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse +from .cookies import ( + cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT +from .hooks import default_hooks, dispatch_hook +from ._internal_utils import to_native_string +from .utils import to_key_val_list, default_headers +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) + +from .structures import CaseInsensitiveDict +from .adapters import HTTPAdapter + +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url, rewind_body +) + +from .status_codes import codes + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +# Preferred clock, based on which one is more accurate on a given system. +if platform.system() == 'Windows': + try: # Python 3.3+ + preferred_clock = time.perf_counter + except AttributeError: # Earlier than Python 3. + preferred_clock = time.clock +else: + preferred_clock = time.time + + +def merge_setting(request_setting, session_setting, dict_class=OrderedDict): + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a + setting is a dictionary, they will be merged together using `dict_class` + """ + + if session_setting is None: + return request_setting + + if request_setting is None: + return session_setting + + # Bypass if not a dictionary (e.g. verify) + if not ( + isinstance(session_setting, Mapping) and + isinstance(request_setting, Mapping) + ): + return request_setting + + merged_setting = dict_class(to_key_val_list(session_setting)) + merged_setting.update(to_key_val_list(request_setting)) + + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] + + return merged_setting + + +def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): + """Properly merges both requests and session hooks. + + This is necessary because when request_hooks == {'response': []}, the + merge breaks Session hooks entirely. + """ + if session_hooks is None or session_hooks.get('response') == []: + return request_hooks + + if request_hooks is None or request_hooks.get('response') == []: + return session_hooks + + return merge_setting(request_hooks, session_hooks, dict_class) + + +class SessionRedirectMixin(object): + + def get_redirect_target(self, resp): + """Receives a Response. Returns a redirect URI or ``None``""" + # Due to the nature of how requests processes redirects this method will + # be called at least once upon the original response and at least twice + # on each subsequent redirect response (if any). + # If a custom mixin is used to handle this logic, it may be advantageous + # to cache the redirect location onto the response object as a private + # attribute. + if resp.is_redirect: + location = resp.headers['location'] + # Currently the underlying http module on py3 decode headers + # in latin1, but empirical evidence suggests that latin1 is very + # rarely used with non-ASCII characters in HTTP headers. + # It is more likely to get UTF8 header rather than latin1. + # This causes incorrect handling of UTF8 encoded location headers. + # To solve this, we re-encode the location in latin1. + if is_py3: + location = location.encode('latin1') + return to_native_string(location, 'utf8') + return None + + def resolve_redirects(self, resp, req, stream=False, timeout=None, + verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs): + """Receives a Response. Returns a generator of Responses or Requests.""" + + hist = [] # keep track of history + + url = self.get_redirect_target(resp) + while url: + prepared_request = req.copy() + + # Update history and keep track of redirects. + # resp.history must ignore the original request in this loop + hist.append(resp) + resp.history = hist[1:] + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) + + if len(resp.history) >= self.max_redirects: + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) + + # Release the connection back into the pool. + resp.close() + + # Handle redirection without scheme (see: RFC 1808 Section 4) + if url.startswith('//'): + parsed_rurl = urlparse(resp.url) + url = '%s:%s' % (to_native_string(parsed_rurl.scheme), url) + + # The scheme should be lower case... + parsed = urlparse(url) + url = parsed.geturl() + + # Facilitate relative 'location' headers, as allowed by RFC 7231. + # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') + # Compliant with RFC3986, we percent encode the url. + if not parsed.netloc: + url = urljoin(resp.url, requote_uri(url)) + else: + url = requote_uri(url) + + prepared_request.url = to_native_string(url) + + self.rebuild_method(prepared_request, resp) + + # https://github.com/requests/requests/issues/1084 + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/requests/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) + prepared_request.body = None + + headers = prepared_request.headers + try: + del headers['Cookie'] + except KeyError: + pass + + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) + merge_cookies(prepared_request._cookies, self.cookies) + prepared_request.prepare_cookies(prepared_request._cookies) + + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # A failed tell() sets `_body_position` to `object()`. This non-None + # value ensures `rewindable` will be True, allowing us to raise an + # UnrewindableBodyError, instead of hanging the connection. + rewindable = ( + prepared_request._body_position is not None and + ('Content-Length' in headers or 'Transfer-Encoding' in headers) + ) + + # Attempt to rewind consumed file-like object. + if rewindable: + rewind_body(prepared_request) + + # Override the original request. + req = prepared_request + + if yield_requests: + yield req + else: + + resp = self.send( + req, + stream=stream, + timeout=timeout, + verify=verify, + cert=cert, + proxies=proxies, + allow_redirects=False, + **adapter_kwargs + ) + + extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) + + # extract redirect url, if any, for the next loop + url = self.get_redirect_target(resp) + yield resp + + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + proxies = proxies if proxies is not None else {} + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() + no_proxy = proxies.get('no_proxy') + + bypass_proxy = should_bypass_proxies(url, no_proxy=no_proxy) + if self.trust_env and not bypass_proxy: + environ_proxies = get_environ_proxies(url, no_proxy=no_proxy) + + proxy = environ_proxies.get(scheme, environ_proxies.get('all')) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # http://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + + +class Session(SessionRedirectMixin): + """A Requests session. + + Provides cookie persistence, connection-pooling, and configuration. + + Basic Usage:: + + >>> import requests + >>> s = requests.Session() + >>> s.get('http://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('http://httpbin.org/get') + <Response [200]> + """ + + __attrs__ = [ + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] + + def __init__(self): + + #: A case-insensitive dictionary of headers to be sent on each + #: :class:`Request <Request>` sent from this + #: :class:`Session <Session>`. + self.headers = default_headers() + + #: Default Authentication tuple or object to attach to + #: :class:`Request <Request>`. + self.auth = None + + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request <Request>`. + self.proxies = {} + + #: Event-handling hooks. + self.hooks = default_hooks() + + #: Dictionary of querystring data to attach to each + #: :class:`Request <Request>`. The dictionary values may be lists for + #: representing multivalued query parameters. + self.params = {} + + #: Stream response content default. + self.stream = False + + #: SSL Verification default. + self.verify = True + + #: SSL client certificate default, if String, path to ssl client + #: cert file (.pem). If Tuple, ('cert', 'key') pair. + self.cert = None + + #: Maximum number of redirects allowed. If the request exceeds this + #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. + self.max_redirects = DEFAULT_REDIRECT_LIMIT + + #: Trust environment settings for proxy configuration, default + #: authentication and similar. + self.trust_env = True + + #: A CookieJar containing all currently outstanding cookies set on this + #: session. By default it is a + #: :class:`RequestsCookieJar <requests.cookies.RequestsCookieJar>`, but + #: may be any other ``cookielib.CookieJar`` compatible object. + self.cookies = cookiejar_from_dict({}) + + # Default connection adapters. + self.adapters = OrderedDict() + self.mount('https://', HTTPAdapter()) + self.mount('http://', HTTPAdapter()) + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + def prepare_request(self, request): + """Constructs a :class:`PreparedRequest <PreparedRequest>` for + transmission and returns it. The :class:`PreparedRequest` has settings + merged from the :class:`Request <Request>` instance and those of the + :class:`Session`. + + :param request: :class:`Request` instance to prepare with this + session's settings. + :rtype: requests.PreparedRequest + """ + cookies = request.cookies or {} + + # Bootstrap CookieJar. + if not isinstance(cookies, cookielib.CookieJar): + cookies = cookiejar_from_dict(cookies) + + # Merge with session cookies + merged_cookies = merge_cookies( + merge_cookies(RequestsCookieJar(), self.cookies), cookies) + + # Set environment's basic authentication if not explicitly set. + auth = request.auth + if self.trust_env and not auth and not self.auth: + auth = get_netrc_auth(request.url) + + p = PreparedRequest() + p.prepare( + method=request.method.upper(), + url=request.url, + files=request.files, + data=request.data, + json=request.json, + headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), + params=merge_setting(request.params, self.params), + auth=merge_setting(auth, self.auth), + cookies=merged_cookies, + hooks=merge_hooks(request.hooks, self.hooks), + ) + return p + + def request(self, method, url, + params=None, data=None, headers=None, cookies=None, files=None, + auth=None, timeout=None, allow_redirects=True, proxies=None, + hooks=None, stream=None, verify=None, cert=None, json=None): + """Constructs a :class:`Request <Request>`, prepares it and sends it. + Returns :class:`Response <Response>` object. + + :param method: method for the new :class:`Request` object. + :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query + string for the :class:`Request`. + :param data: (optional) Dictionary, bytes, or file-like object to send + in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the + :class:`Request`. + :param headers: (optional) Dictionary of HTTP Headers to send with the + :class:`Request`. + :param cookies: (optional) Dict or CookieJar object to send with the + :class:`Request`. + :param files: (optional) Dictionary of ``'filename': file-like-objects`` + for multipart encoding upload. + :param auth: (optional) Auth tuple or callable to enable + Basic/Digest/Custom HTTP Auth. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) <timeouts>` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. + :param stream: (optional) whether to immediately download the response + content. Defaults to ``False``. + :param verify: (optional) Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + :param cert: (optional) if String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. + :rtype: requests.Response + """ + # Create the Request. + req = Request( + method=method.upper(), + url=url, + headers=headers, + files=files, + data=data or {}, + json=json, + params=params or {}, + auth=auth, + cookies=cookies, + hooks=hooks, + ) + prep = self.prepare_request(req) + + proxies = proxies or {} + + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) + + # Send the request. + send_kwargs = { + 'timeout': timeout, + 'allow_redirects': allow_redirects, + } + send_kwargs.update(settings) + resp = self.send(prep, **send_kwargs) + + return resp + + def get(self, url, **kwargs): + r"""Sends a GET request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('GET', url, **kwargs) + + def options(self, url, **kwargs): + r"""Sends a OPTIONS request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', True) + return self.request('OPTIONS', url, **kwargs) + + def head(self, url, **kwargs): + r"""Sends a HEAD request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + kwargs.setdefault('allow_redirects', False) + return self.request('HEAD', url, **kwargs) + + def post(self, url, data=None, json=None, **kwargs): + r"""Sends a POST request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('POST', url, data=data, json=json, **kwargs) + + def put(self, url, data=None, **kwargs): + r"""Sends a PUT request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PUT', url, data=data, **kwargs) + + def patch(self, url, data=None, **kwargs): + r"""Sends a PATCH request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('PATCH', url, data=data, **kwargs) + + def delete(self, url, **kwargs): + r"""Sends a DELETE request. Returns :class:`Response` object. + + :param url: URL for the new :class:`Request` object. + :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response + """ + + return self.request('DELETE', url, **kwargs) + + def send(self, request, **kwargs): + """Send a given PreparedRequest. + + :rtype: requests.Response + """ + # Set defaults that the hooks can utilize to ensure they always have + # the correct parameters to reproduce the previous request. + kwargs.setdefault('stream', self.stream) + kwargs.setdefault('verify', self.verify) + kwargs.setdefault('cert', self.cert) + kwargs.setdefault('proxies', self.proxies) + + # It's possible that users might accidentally send a Request object. + # Guard against that specific failure case. + if isinstance(request, Request): + raise ValueError('You can only send PreparedRequests.') + + # Set up variables needed for resolve_redirects and dispatching of hooks + allow_redirects = kwargs.pop('allow_redirects', True) + stream = kwargs.get('stream') + hooks = request.hooks + + # Get the appropriate adapter to use + adapter = self.get_adapter(url=request.url) + + # Start time (approximately) of the request + start = preferred_clock() + + # Send the request + r = adapter.send(request, **kwargs) + + # Total elapsed time of the request (approximately) + elapsed = preferred_clock() - start + r.elapsed = timedelta(seconds=elapsed) + + # Response manipulation hooks + r = dispatch_hook('response', hooks, r, **kwargs) + + # Persist cookies + if r.history: + + # If the hooks create history then we want those cookies too + for resp in r.history: + extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + + extract_cookies_to_jar(self.cookies, request, r.raw) + + # Redirect resolving generator. + gen = self.resolve_redirects(r, request, **kwargs) + + # Resolve redirects if allowed. + history = [resp for resp in gen] if allow_redirects else [] + + # Shuffle things around if there's history. + if history: + # Insert the first (original) request at the start + history.insert(0, r) + # Get the last request made + r = history.pop() + r.history = history + + # If redirects aren't being followed, store the response on the Request for Response.next(). + if not allow_redirects: + try: + r._next = next(self.resolve_redirects(r, request, yield_requests=True, **kwargs)) + except StopIteration: + pass + + if not stream: + r.content + + return r + + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + no_proxy = proxies.get('no_proxy') if proxies is not None else None + env_proxies = get_environ_proxies(url, no_proxy=no_proxy) + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + + def get_adapter(self, url): + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ + for (prefix, adapter) in self.adapters.items(): + + if url.lower().startswith(prefix): + return adapter + + # Nothing matches :-/ + raise InvalidSchema("No connection adapters were found for '%s'" % url) + + def close(self): + """Closes all adapters and as such the session""" + for v in self.adapters.values(): + v.close() + + def mount(self, prefix, adapter): + """Registers a connection adapter to a prefix. + + Adapters are sorted in descending order by prefix length. + """ + self.adapters[prefix] = adapter + keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + + for key in keys_to_move: + self.adapters[key] = self.adapters.pop(key) + + def __getstate__(self): + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + return state + + def __setstate__(self, state): + for attr, value in state.items(): + setattr(self, attr, value) + + +def session(): + """ + Returns a :class:`Session` for context-management. + + :rtype: Session + """ + + return Session() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py new file mode 100644 index 000000000..85d9bbc27 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/status_codes.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- + +from .structures import LookupDict + +_codes = { + + # Informational. + 100: ('continue',), + 101: ('switching_protocols',), + 102: ('processing',), + 103: ('checkpoint',), + 122: ('uri_too_long', 'request_uri_too_long'), + 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), + 201: ('created',), + 202: ('accepted',), + 203: ('non_authoritative_info', 'non_authoritative_information'), + 204: ('no_content',), + 205: ('reset_content', 'reset'), + 206: ('partial_content', 'partial'), + 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), + 208: ('already_reported',), + 226: ('im_used',), + + # Redirection. + 300: ('multiple_choices',), + 301: ('moved_permanently', 'moved', '\\o-'), + 302: ('found',), + 303: ('see_other', 'other'), + 304: ('not_modified',), + 305: ('use_proxy',), + 306: ('switch_proxy',), + 307: ('temporary_redirect', 'temporary_moved', 'temporary'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 + + # Client Error. + 400: ('bad_request', 'bad'), + 401: ('unauthorized',), + 402: ('payment_required', 'payment'), + 403: ('forbidden',), + 404: ('not_found', '-o-'), + 405: ('method_not_allowed', 'not_allowed'), + 406: ('not_acceptable',), + 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), + 408: ('request_timeout', 'timeout'), + 409: ('conflict',), + 410: ('gone',), + 411: ('length_required',), + 412: ('precondition_failed', 'precondition'), + 413: ('request_entity_too_large',), + 414: ('request_uri_too_large',), + 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), + 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), + 417: ('expectation_failed',), + 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), + 422: ('unprocessable_entity', 'unprocessable'), + 423: ('locked',), + 424: ('failed_dependency', 'dependency'), + 425: ('unordered_collection', 'unordered'), + 426: ('upgrade_required', 'upgrade'), + 428: ('precondition_required', 'precondition'), + 429: ('too_many_requests', 'too_many'), + 431: ('header_fields_too_large', 'fields_too_large'), + 444: ('no_response', 'none'), + 449: ('retry_with', 'retry'), + 450: ('blocked_by_windows_parental_controls', 'parental_controls'), + 451: ('unavailable_for_legal_reasons', 'legal_reasons'), + 499: ('client_closed_request',), + + # Server Error. + 500: ('internal_server_error', 'server_error', '/o\\', '✗'), + 501: ('not_implemented',), + 502: ('bad_gateway',), + 503: ('service_unavailable', 'unavailable'), + 504: ('gateway_timeout',), + 505: ('http_version_not_supported', 'http_version'), + 506: ('variant_also_negotiates',), + 507: ('insufficient_storage',), + 509: ('bandwidth_limit_exceeded', 'bandwidth'), + 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), +} + +codes = LookupDict(name='status_codes') + +for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py new file mode 100644 index 000000000..ce775ba90 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/structures.py @@ -0,0 +1,105 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +import collections + +from .compat import OrderedDict + + +class CaseInsensitiveDict(collections.MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``collections.MutableMapping`` as well as dict's ``copy``. Also + provides ``lower_items``. + + All keys are expected to be strings. The structure remembers the + case of the last key to be set, and ``iter(instance)``, + ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` + will contain case-sensitive keys. However, querying and contains + testing is case insensitive:: + + cid = CaseInsensitiveDict() + cid['Accept'] = 'application/json' + cid['aCCEPT'] == 'application/json' # True + list(cid) == ['Accept'] # True + + For example, ``headers['content-encoding']`` will return the + value of a ``'Content-Encoding'`` response header, regardless + of how the header name was originally stored. + + If the constructor, ``.update``, or equality comparison + operations are given keys that have equal ``.lower()``s, the + behavior is undefined. + """ + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + return ( + (lowerkey, keyval[1]) + for (lowerkey, keyval) + in self._store.items() + ) + + def __eq__(self, other): + if isinstance(other, collections.Mapping): + other = CaseInsensitiveDict(other) + else: + return NotImplemented + # Compare insensitively + return dict(self.lower_items()) == dict(other.lower_items()) + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +class LookupDict(dict): + """Dictionary lookup object.""" + + def __init__(self, name=None): + self.name = name + super(LookupDict, self).__init__() + + def __repr__(self): + return '<lookup \'%s\'>' % (self.name) + + def __getitem__(self, key): + # We allow fall-through here, so values default to None + + return self.__dict__.get(key, None) + + def get(self, key, default=None): + return self.__dict__.get(key, default) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py new file mode 100644 index 000000000..fc4f894d5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/requests/utils.py @@ -0,0 +1,904 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import cgi +import codecs +import collections +import contextlib +import io +import os +import platform +import re +import socket +import struct +import warnings + +from .__version__ import __version__ +from . import certs +# to_native_string is unused here, but imported here for backwards compatibility +from ._internal_utils import to_native_string +from .compat import parse_http_list as _parse_list_header +from .compat import ( + quote, urlparse, bytes, str, OrderedDict, unquote, getproxies, + proxy_bypass, urlunparse, basestring, integer_types, is_py3, + proxy_bypass_environment, getproxies_environment) +from .cookies import cookiejar_from_dict +from .structures import CaseInsensitiveDict +from .exceptions import ( + InvalidURL, InvalidHeader, FileModeWarning, UnrewindableBodyError) + +NETRC_FILES = ('.netrc', '_netrc') + +DEFAULT_CA_BUNDLE_PATH = certs.where() + + +if platform.system() == 'Windows': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + if is_py3: + import winreg + else: + import _winreg as winreg + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + proxyEnable = winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0] + proxyOverride = winreg.QueryValueEx(internetSettings, + 'ProxyOverride')[0] + except OSError: + return False + if not proxyEnable or not proxyOverride: + return False + + # make a check value list from the registry entry: replace the + # '<local>' string by the localhost entry and the corresponding + # canonical entry. + proxyOverride = proxyOverride.split(';') + # now check if we match one of the registry values. + for test in proxyOverride: + if test == '<local>': + if '.' not in host: + return True + test = test.replace(".", r"\.") # mask dots + test = test.replace("*", r".*") # change glob sequence + test = test.replace("?", r".") # change glob char + if re.match(test, host, re.I): + return True + return False + + def proxy_bypass(host): # noqa + """Return True, if the host should be bypassed. + + Checks proxy settings gathered from the environment, if specified, + or the registry. + """ + if getproxies_environment(): + return proxy_bypass_environment(host) + else: + return proxy_bypass_registry(host) + + +def dict_to_sequence(d): + """Returns an internal sequence dictionary update.""" + + if hasattr(d, 'items'): + d = d.items() + + return d + + +def super_len(o): + total_length = None + current_position = 0 + + if hasattr(o, '__len__'): + total_length = len(o) + + elif hasattr(o, 'len'): + total_length = o.len + + elif hasattr(o, 'fileno'): + try: + fileno = o.fileno() + except io.UnsupportedOperation: + pass + else: + total_length = os.fstat(fileno).st_size + + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) + + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + if total_length is not None: + current_position = total_length + else: + if hasattr(o, 'seek') and total_length is None: + # StringIO and BytesIO have seek but no useable fileno + try: + # seek to end of file + o.seek(0, 2) + total_length = o.tell() + + # seek back to current position to support + # partially read file-like objects + o.seek(current_position or 0) + except (OSError, IOError): + total_length = 0 + + if total_length is None: + total_length = 0 + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): + """Returns the Requests tuple auth for a given url from netrc.""" + + try: + from netrc import netrc, NetrcParseError + + netrc_path = None + + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://bugs.python.org/issue20164 & + # https://github.com/requests/requests/issues/1846 + return + + if os.path.exists(loc): + netrc_path = loc + break + + # Abort early if there isn't one. + if netrc_path is None: + return + + ri = urlparse(url) + + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] + + try: + _netrc = netrc(netrc_path).authenticators(host) + if _netrc: + # Return with login / password + login_i = (0 if _netrc[0] else 1) + return (_netrc[login_i], _netrc[2]) + except (NetrcParseError, IOError): + # If there was a parsing error or a permissions issue reading the file, + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise + + # AppEngine hackiness. + except (ImportError, AttributeError): + pass + + +def guess_filename(obj): + """Tries to guess the filename of the given object.""" + name = getattr(obj, 'name', None) + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): + return os.path.basename(name) + + +def from_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. Unless it can not be represented as such, return an + OrderedDict, e.g., + + :: + + >>> from_key_val_list([('key', 'val')]) + OrderedDict([('key', 'val')]) + >>> from_key_val_list('string') + ValueError: need more than 1 value to unpack + >>> from_key_val_list({'key': 'val'}) + OrderedDict([('key', 'val')]) + + :rtype: OrderedDict + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + return OrderedDict(value) + + +def to_key_val_list(value): + """Take an object and test to see if it can be represented as a + dictionary. If it can be, return a list of tuples, e.g., + + :: + + >>> to_key_val_list([('key', 'val')]) + [('key', 'val')] + >>> to_key_val_list({'key': 'val'}) + [('key', 'val')] + >>> to_key_val_list('string') + ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list + """ + if value is None: + return None + + if isinstance(value, (str, bytes, bool, int)): + raise ValueError('cannot encode objects that are not 2-tuples') + + if isinstance(value, collections.Mapping): + value = value.items() + + return list(value) + + +# From mitsuhiko/werkzeug (used with permission). +def parse_list_header(value): + """Parse lists as described by RFC 2068 Section 2. + + In particular, parse comma-separated lists where the elements of + the list may include quoted-strings. A quoted-string could + contain a comma. A non-quoted string could have quotes in the + middle. Quotes are removed automatically after parsing. + + It basically works like :func:`parse_set_header` just that items + may appear multiple times and case sensitivity is preserved. + + The return value is a standard :class:`list`: + + >>> parse_list_header('token, "quoted value"') + ['token', 'quoted value'] + + To create a header from the :class:`list` again, use the + :func:`dump_header` function. + + :param value: a string with a list header. + :return: :class:`list` + :rtype: list + """ + result = [] + for item in _parse_list_header(value): + if item[:1] == item[-1:] == '"': + item = unquote_header_value(item[1:-1]) + result.append(item) + return result + + +# From mitsuhiko/werkzeug (used with permission). +def parse_dict_header(value): + """Parse lists of key, value pairs as described by RFC 2068 Section 2 and + convert them into a python dict: + + >>> d = parse_dict_header('foo="is a fish", bar="as well"') + >>> type(d) is dict + True + >>> sorted(d.items()) + [('bar', 'as well'), ('foo', 'is a fish')] + + If there is no value for a key it will be `None`: + + >>> parse_dict_header('key_without_value') + {'key_without_value': None} + + To create a header from the :class:`dict` again, use the + :func:`dump_header` function. + + :param value: a string with a dict header. + :return: :class:`dict` + :rtype: dict + """ + result = {} + for item in _parse_list_header(value): + if '=' not in item: + result[item] = None + continue + name, value = item.split('=', 1) + if value[:1] == value[-1:] == '"': + value = unquote_header_value(value[1:-1]) + result[name] = value + return result + + +# From mitsuhiko/werkzeug (used with permission). +def unquote_header_value(value, is_filename=False): + r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). + This does not use the real unquoting but what browsers are actually + using for quoting. + + :param value: the header value to unquote. + :rtype: str + """ + if value and value[0] == value[-1] == '"': + # this is not the real unquoting, but fixing this so that the + # RFC is met will result in bugs with internet explorer and + # probably some other browsers as well. IE for example is + # uploading files with "C:\foo\bar.txt" as filename + value = value[1:-1] + + # if this is a filename and the starting characters look like + # a UNC path, then just return the value without quotes. Using the + # replace sequence below on a UNC path has the effect of turning + # the leading double slash into a single slash and then + # _fix_ie_filename() doesn't work correctly. See #458. + if not is_filename or value[:2] != '\\\\': + return value.replace('\\\\', '\\').replace('\\"', '"') + return value + + +def dict_from_cookiejar(cj): + """Returns a key/value dictionary from a CookieJar. + + :param cj: CookieJar object to extract cookies from. + :rtype: dict + """ + + cookie_dict = {} + + for cookie in cj: + cookie_dict[cookie.name] = cookie.value + + return cookie_dict + + +def add_dict_to_cookiejar(cj, cookie_dict): + """Returns a CookieJar from a key/value dictionary. + + :param cj: CookieJar to insert cookies into. + :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar + """ + + return cookiejar_from_dict(cookie_dict, cj) + + +def get_encodings_from_content(content): + """Returns encodings from given content string. + + :param content: bytestring to extract encodings from. + """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + charset_re = re.compile(r'<meta.*?charset=["\']*(.+?)["\'>]', flags=re.I) + pragma_re = re.compile(r'<meta.*?content=["\']*;?charset=(.+?)["\'>]', flags=re.I) + xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') + + return (charset_re.findall(content) + + pragma_re.findall(content) + + xml_re.findall(content)) + + +def get_encoding_from_headers(headers): + """Returns encodings from given HTTP Header Dict. + + :param headers: dictionary to extract encoding from. + :rtype: str + """ + + content_type = headers.get('content-type') + + if not content_type: + return None + + content_type, params = cgi.parse_header(content_type) + + if 'charset' in params: + return params['charset'].strip("'\"") + + if 'text' in content_type: + return 'ISO-8859-1' + + +def stream_decode_response_unicode(iterator, r): + """Stream decodes a iterator.""" + + if r.encoding is None: + for item in iterator: + yield item + return + + decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') + for chunk in iterator: + rv = decoder.decode(chunk) + if rv: + yield rv + rv = decoder.decode(b'', final=True) + if rv: + yield rv + + +def iter_slices(string, slice_length): + """Iterate over slices of a string.""" + pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) + while pos < len(string): + yield string[pos:pos + slice_length] + pos += slice_length + + +def get_unicode_from_response(r): + """Returns the requested content back in unicode. + + :param r: Response object to get unicode content from. + + Tried: + + 1. charset from content-type + 2. fall back and replace all unicode characters + + :rtype: str + """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) + + tried_encodings = [] + + # Try charset from content-type + encoding = get_encoding_from_headers(r.headers) + + if encoding: + try: + return str(r.content, encoding) + except UnicodeError: + tried_encodings.append(encoding) + + # Fall back: + try: + return str(r.content, encoding, errors='replace') + except TypeError: + return r.content + + +# The unreserved URI characters (RFC 3986) +UNRESERVED_SET = frozenset( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") + + +def unquote_unreserved(uri): + """Un-escape any percent-escape sequences in a URI that are unreserved + characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str + """ + parts = uri.split('%') + for i in range(1, len(parts)): + h = parts[i][0:2] + if len(h) == 2 and h.isalnum(): + try: + c = chr(int(h, 16)) + except ValueError: + raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) + + if c in UNRESERVED_SET: + parts[i] = c + parts[i][2:] + else: + parts[i] = '%' + parts[i] + else: + parts[i] = '%' + parts[i] + return ''.join(parts) + + +def requote_uri(uri): + """Re-quote the given URI. + + This function passes the given URI through an unquote/quote cycle to + ensure that it is fully and consistently quoted. + + :rtype: str + """ + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) + + +def address_in_network(ip, net): + """This function allows you to check if an IP belongs to a network subnet + + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 + returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool + """ + ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] + netaddr, bits = net.split('/') + netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] + network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask + return (ipaddr & netmask) == (network & netmask) + + +def dotted_netmask(mask): + """Converts mask from /xx format to xxx.xxx.xxx.xxx + + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str + """ + bits = 0xffffffff ^ (1 << 32 - mask) - 1 + return socket.inet_ntoa(struct.pack('>I', bits)) + + +def is_ipv4_address(string_ip): + """ + :rtype: bool + """ + try: + socket.inet_aton(string_ip) + except socket.error: + return False + return True + + +def is_valid_cidr(string_network): + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ + if string_network.count('/') == 1: + try: + mask = int(string_network.split('/')[1]) + except ValueError: + return False + + if mask < 1 or mask > 32: + return False + + try: + socket.inet_aton(string_network.split('/')[0]) + except socket.error: + return False + else: + return False + return True + + +@contextlib.contextmanager +def set_environ(env_name, value): + """Set the environment variable 'env_name' to 'value' + + Save previous value, yield, and then restore the previous value stored in + the environment variable 'env_name'. + + If 'value' is None, do nothing""" + value_changed = value is not None + if value_changed: + old_value = os.environ.get(env_name) + os.environ[env_name] = value + try: + yield + finally: + if value_changed: + if old_value is None: + del os.environ[env_name] + else: + os.environ[env_name] = old_value + + +def should_bypass_proxies(url, no_proxy): + """ + Returns whether we should bypass proxies or not. + + :rtype: bool + """ + get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) + + # First check whether no_proxy is defined. If it is, check that the URL + # we're getting isn't in the no_proxy list. + no_proxy_arg = no_proxy + if no_proxy is None: + no_proxy = get_proxy('no_proxy') + netloc = urlparse(url).netloc + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the netloc, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + ip = netloc.split(':')[0] + if is_ipv4_address(ip): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(ip, proxy_ip): + return True + elif ip == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True + else: + for host in no_proxy: + if netloc.endswith(host) or netloc.split(':')[0].endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + # If the system proxy settings indicate that this URL should be bypassed, + # don't proxy. + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + with set_environ('no_proxy', no_proxy_arg): + try: + bypass = proxy_bypass(netloc) + except (TypeError, socket.gaierror): + bypass = False + + if bypass: + return True + + return False + + +def get_environ_proxies(url, no_proxy=None): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url, no_proxy=no_proxy): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get(urlparts.scheme, proxies.get('all')) + + proxy_keys = [ + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + 'all://' + urlparts.hostname, + 'all', + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy + + +def default_user_agent(name="python-requests"): + """ + Return a string representing the default user agent. + + :rtype: str + """ + return '%s/%s' % (name, __version__) + + +def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ + return CaseInsensitiveDict({ + 'User-Agent': default_user_agent(), + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', + }) + + +def parse_header_links(value): + """Return a dict of parsed link headers proxies. + + i.e. Link: <http:/.../front.jpeg>; rel=front; type="image/jpeg",<http://.../back.jpeg>; rel=back;type="image/jpeg" + + :rtype: list + """ + + links = [] + + replace_chars = ' \'"' + + for val in re.split(', *<', value): + try: + url, params = val.split(';', 1) + except ValueError: + url, params = val, '' + + link = {'url': url.strip('<> \'"')} + + for param in params.split(';'): + try: + key, value = param.split('=') + except ValueError: + break + + link[key.strip(replace_chars)] = value.strip(replace_chars) + + links.append(link) + + return links + + +# Null bytes; no need to recreate these on each call to guess_json_utf +_null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 +_null2 = _null * 2 +_null3 = _null * 3 + + +def guess_json_utf(data): + """ + :rtype: str + """ + # JSON always starts with two ASCII characters, so detection is as + # easy as counting the nulls and from their location and count + # determine the encoding. Also detect a BOM, if present. + sample = data[:4] + if sample in (codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE): + return 'utf-32' # BOM included + if sample[:3] == codecs.BOM_UTF8: + return 'utf-8-sig' # BOM included, MS style (discouraged) + if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): + return 'utf-16' # BOM included + nullcount = sample.count(_null) + if nullcount == 0: + return 'utf-8' + if nullcount == 2: + if sample[::2] == _null2: # 1st and 3rd are null + return 'utf-16-be' + if sample[1::2] == _null2: # 2nd and 4th are null + return 'utf-16-le' + # Did not detect 2 valid UTF-16 ascii-range characters + if nullcount == 3: + if sample[:3] == _null3: + return 'utf-32-be' + if sample[1:] == _null3: + return 'utf-32-le' + # Did not detect a valid UTF-32 ascii-range character + return None + + +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) + + +def get_auth_from_url(url): + """Given a url with authentication components, extract them into a tuple of + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Value for header {%s: %s} must be of type str or " + "bytes, not %s" % (name, value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) + + +def rewind_body(prepared_request): + """Move file pointer back to its recorded starting position + so it can be read again on redirect. + """ + body_seek = getattr(prepared_request.body, 'seek', None) + if body_seek is not None and isinstance(prepared_request._body_position, integer_types): + try: + body_seek(prepared_request._body_position) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect.") + else: + raise UnrewindableBodyError("Unable to rewind request body for redirect.") diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/retrying.py b/myenv/lib/python3.7/site-packages/pip/_vendor/retrying.py new file mode 100644 index 000000000..f8d743b28 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/retrying.py @@ -0,0 +1,267 @@ +## Copyright 2013-2014 Ray Holder +## +## Licensed under the Apache License, Version 2.0 (the "License"); +## you may not use this file except in compliance with the License. +## You may obtain a copy of the License at +## +## http://www.apache.org/licenses/LICENSE-2.0 +## +## Unless required by applicable law or agreed to in writing, software +## distributed under the License is distributed on an "AS IS" BASIS, +## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +## See the License for the specific language governing permissions and +## limitations under the License. + +import random +from pip._vendor import six +import sys +import time +import traceback + + +# sys.maxint / 2, since Python 3.2 doesn't have a sys.maxint... +MAX_WAIT = 1073741823 + + +def retry(*dargs, **dkw): + """ + Decorator function that instantiates the Retrying object + @param *dargs: positional arguments passed to Retrying object + @param **dkw: keyword arguments passed to the Retrying object + """ + # support both @retry and @retry() as valid syntax + if len(dargs) == 1 and callable(dargs[0]): + def wrap_simple(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying().call(f, *args, **kw) + + return wrapped_f + + return wrap_simple(dargs[0]) + + else: + def wrap(f): + + @six.wraps(f) + def wrapped_f(*args, **kw): + return Retrying(*dargs, **dkw).call(f, *args, **kw) + + return wrapped_f + + return wrap + + +class Retrying(object): + + def __init__(self, + stop=None, wait=None, + stop_max_attempt_number=None, + stop_max_delay=None, + wait_fixed=None, + wait_random_min=None, wait_random_max=None, + wait_incrementing_start=None, wait_incrementing_increment=None, + wait_exponential_multiplier=None, wait_exponential_max=None, + retry_on_exception=None, + retry_on_result=None, + wrap_exception=False, + stop_func=None, + wait_func=None, + wait_jitter_max=None): + + self._stop_max_attempt_number = 5 if stop_max_attempt_number is None else stop_max_attempt_number + self._stop_max_delay = 100 if stop_max_delay is None else stop_max_delay + self._wait_fixed = 1000 if wait_fixed is None else wait_fixed + self._wait_random_min = 0 if wait_random_min is None else wait_random_min + self._wait_random_max = 1000 if wait_random_max is None else wait_random_max + self._wait_incrementing_start = 0 if wait_incrementing_start is None else wait_incrementing_start + self._wait_incrementing_increment = 100 if wait_incrementing_increment is None else wait_incrementing_increment + self._wait_exponential_multiplier = 1 if wait_exponential_multiplier is None else wait_exponential_multiplier + self._wait_exponential_max = MAX_WAIT if wait_exponential_max is None else wait_exponential_max + self._wait_jitter_max = 0 if wait_jitter_max is None else wait_jitter_max + + # TODO add chaining of stop behaviors + # stop behavior + stop_funcs = [] + if stop_max_attempt_number is not None: + stop_funcs.append(self.stop_after_attempt) + + if stop_max_delay is not None: + stop_funcs.append(self.stop_after_delay) + + if stop_func is not None: + self.stop = stop_func + + elif stop is None: + self.stop = lambda attempts, delay: any(f(attempts, delay) for f in stop_funcs) + + else: + self.stop = getattr(self, stop) + + # TODO add chaining of wait behaviors + # wait behavior + wait_funcs = [lambda *args, **kwargs: 0] + if wait_fixed is not None: + wait_funcs.append(self.fixed_sleep) + + if wait_random_min is not None or wait_random_max is not None: + wait_funcs.append(self.random_sleep) + + if wait_incrementing_start is not None or wait_incrementing_increment is not None: + wait_funcs.append(self.incrementing_sleep) + + if wait_exponential_multiplier is not None or wait_exponential_max is not None: + wait_funcs.append(self.exponential_sleep) + + if wait_func is not None: + self.wait = wait_func + + elif wait is None: + self.wait = lambda attempts, delay: max(f(attempts, delay) for f in wait_funcs) + + else: + self.wait = getattr(self, wait) + + # retry on exception filter + if retry_on_exception is None: + self._retry_on_exception = self.always_reject + else: + self._retry_on_exception = retry_on_exception + + # TODO simplify retrying by Exception types + # retry on result filter + if retry_on_result is None: + self._retry_on_result = self.never_reject + else: + self._retry_on_result = retry_on_result + + self._wrap_exception = wrap_exception + + def stop_after_attempt(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the previous attempt >= stop_max_attempt_number.""" + return previous_attempt_number >= self._stop_max_attempt_number + + def stop_after_delay(self, previous_attempt_number, delay_since_first_attempt_ms): + """Stop after the time from the first attempt >= stop_max_delay.""" + return delay_since_first_attempt_ms >= self._stop_max_delay + + def no_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Don't sleep at all before retrying.""" + return 0 + + def fixed_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a fixed amount of time between each retry.""" + return self._wait_fixed + + def random_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """Sleep a random amount of time between wait_random_min and wait_random_max""" + return random.randint(self._wait_random_min, self._wait_random_max) + + def incrementing_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + """ + Sleep an incremental amount of time after each attempt, starting at + wait_incrementing_start and incrementing by wait_incrementing_increment + """ + result = self._wait_incrementing_start + (self._wait_incrementing_increment * (previous_attempt_number - 1)) + if result < 0: + result = 0 + return result + + def exponential_sleep(self, previous_attempt_number, delay_since_first_attempt_ms): + exp = 2 ** previous_attempt_number + result = self._wait_exponential_multiplier * exp + if result > self._wait_exponential_max: + result = self._wait_exponential_max + if result < 0: + result = 0 + return result + + def never_reject(self, result): + return False + + def always_reject(self, result): + return True + + def should_reject(self, attempt): + reject = False + if attempt.has_exception: + reject |= self._retry_on_exception(attempt.value[1]) + else: + reject |= self._retry_on_result(attempt.value) + + return reject + + def call(self, fn, *args, **kwargs): + start_time = int(round(time.time() * 1000)) + attempt_number = 1 + while True: + try: + attempt = Attempt(fn(*args, **kwargs), attempt_number, False) + except: + tb = sys.exc_info() + attempt = Attempt(tb, attempt_number, True) + + if not self.should_reject(attempt): + return attempt.get(self._wrap_exception) + + delay_since_first_attempt_ms = int(round(time.time() * 1000)) - start_time + if self.stop(attempt_number, delay_since_first_attempt_ms): + if not self._wrap_exception and attempt.has_exception: + # get() on an attempt with an exception should cause it to be raised, but raise just in case + raise attempt.get() + else: + raise RetryError(attempt) + else: + sleep = self.wait(attempt_number, delay_since_first_attempt_ms) + if self._wait_jitter_max: + jitter = random.random() * self._wait_jitter_max + sleep = sleep + max(0, jitter) + time.sleep(sleep / 1000.0) + + attempt_number += 1 + + +class Attempt(object): + """ + An Attempt encapsulates a call to a target function that may end as a + normal return value from the function or an Exception depending on what + occurred during the execution. + """ + + def __init__(self, value, attempt_number, has_exception): + self.value = value + self.attempt_number = attempt_number + self.has_exception = has_exception + + def get(self, wrap_exception=False): + """ + Return the return value of this Attempt instance or raise an Exception. + If wrap_exception is true, this Attempt is wrapped inside of a + RetryError before being raised. + """ + if self.has_exception: + if wrap_exception: + raise RetryError(self) + else: + six.reraise(self.value[0], self.value[1], self.value[2]) + else: + return self.value + + def __repr__(self): + if self.has_exception: + return "Attempts: {0}, Error:\n{1}".format(self.attempt_number, "".join(traceback.format_tb(self.value[2]))) + else: + return "Attempts: {0}, Value: {1}".format(self.attempt_number, self.value) + + +class RetryError(Exception): + """ + A RetryError encapsulates the last Attempt instance right before giving up. + """ + + def __init__(self, last_attempt): + self.last_attempt = last_attempt + + def __str__(self): + return "RetryError[{0}]".format(self.last_attempt) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/six.py b/myenv/lib/python3.7/site-packages/pip/_vendor/six.py new file mode 100644 index 000000000..e36380b6a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/six.py @@ -0,0 +1,891 @@ +# Copyright (c) 2010-2017 Benjamin Peterson +# +# 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. + +"""Utilities for writing code that runs on Python 2 and 3""" + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.11.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("getoutput", "commands", "subprocess"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("email_mime_image", "email.MIMEImage", "email.mime.image"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote_to_bytes", "urllib", "urllib.parse", "unquote", "unquote_to_bytes"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("splitvalue", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), + MovedAttribute("parse_http_list", "urllib2", "urllib.request"), + MovedAttribute("parse_keqv_list", "urllib2", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + try: + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + finally: + value = None + tb = None + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + try: + raise tp, value, tb + finally: + tb = None +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + try: + if from_value is None: + raise value + raise value from from_value + finally: + value = None +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + try: + raise value from from_value + finally: + value = None +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(type): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + + @classmethod + def __prepare__(cls, name, this_bases): + return meta.__prepare__(name, bases) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py new file mode 100644 index 000000000..1bffadefc --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,97 @@ +""" +urllib3 - Thread-safe connection pooling and re-using. +""" + +from __future__ import absolute_import +import warnings + +from .connectionpool import ( + HTTPConnectionPool, + HTTPSConnectionPool, + connection_from_url +) + +from . import exceptions +from .filepost import encode_multipart_formdata +from .poolmanager import PoolManager, ProxyManager, proxy_from_url +from .response import HTTPResponse +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry + + +# Set default logging handler to avoid "No handler found" warnings. +import logging +try: # Python 2.7+ + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def emit(self, record): + pass + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.22' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + +logging.getLogger(__name__).addHandler(NullHandler()) + + +def add_stderr_logger(level=logging.DEBUG): + """ + Helper for quickly adding a StreamHandler to the logger. Useful for + debugging. + + Returns the handler after adding it. + """ + # This method needs to be in this __init__.py to get the __name__ correct + # even if urllib3 is vendored within another package. + logger = logging.getLogger(__name__) + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) + logger.addHandler(handler) + logger.setLevel(level) + logger.debug('Added a stderr logging handler to logger: %s', __name__) + return handler + + +# ... Clean up. +del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..988025870f1b7533801928d0e0cadc8b89b23c89 GIT binary patch literal 2431 zcmZ`)OLG%P5Z+m>q}9W+EWfY~WJ6+NC0Gg&Du$v`Ji@CATrMn%WK+~;tr^KHW*?s2 z6-Z@HP~7q#>|_2;j&se4zmQY9XC>@FWmVJa?wOtG>HhlLJ2Nw74W2<~>Baksru~h^ z^f5uX1tb2QXd2aQjS{MJ;_J3fP|xw4oudZLbHmTudB0#6{GwfiIfE9s>6h%1(u=(8 zSL}+?O<wh9>>0mi*Zf&~R{2W2?$6nCN-y(<KX1<~y}}p#MSD@{Rleje+sjIy;b;66 zdj)iiVbxw8)j_NARe#N1BieH<xM*nX?8~zFi)i?JpwU@cf2YwpTOFKxo3qz`)dKw& zjn3KUX~X`4&f6AUu)k!hM;F*v$K>d1w)R##CPahv>pemj>C!u5U;J&2<p$r-WmXz& z&@*)9j~uK(&nkGDpLxFh%=6txPib%o_FbcAVc$)f+tr%q##`l7aPIA0wKlEJzF;oh zjNKlyx?vEoZsLW36@?-9g1+Sj)DmnnjlpP@KVZe0M9#W<amdqzIi4SdBH8``h0~fj z*?8FL?A-mh%?|7$=h3(Osq^G4rzb++frwz^GJD-+5k?S$wZejKNSWiOJn<q|Bu+0B zK6Mipj;i41Pu#%mGa;)xB78lXTD1tR)B9F2hNmo!U}FY5SAF*-bN1opOyEgopC!(I z7$=|?JD$(N6xIAwmWUB3mF<-ChmZ`;L>H4VeRNQ6!H5??FwG_aUmfB5P6Nndx(zW0 zQ(at$5B_7a?!t%-5LAOjWcyF8sY@efyeA8Sbwfc#17?-@=b#-4Z|EkhJ#<C87jg`{ z?Thx_z;U+XYr&60`a{==hF88%dRzU0;Fo*Xu3v9=+L0G+dO@7HoNtQmwXLhkfs0Nx zoFNNnDB2S=v>nF_yu@)@(MTH1_mcA%q>7x3>!(uC!pZHXAx*~#T%S3PEIW=L(v+iK zb)19L<=Ko_nqK4NLShkpn3r?Y6HKD)@y6|d3O2HKAoJnS+JKyc*@~2TE8cg<;j31_ zlBUc(dDIyjms?k^G;0DgDe@>vD3EJJ6-6DzEC@O0QtHGBq)s?I>;r5>0sVFA#qJ&i z{>l{rz&sYnN1}#e1_jWS*2S9PlY@chsQTRpCDD#Zq92nt1hm|-_C`O{j||ZBlpMp4 zXouvea0n}uRy<Vw4nC9W@E$PSp$-Vhjo+6ocpfqyF<}AFt%KC-zT_hd;#RF_?IzHx z{se|r5?aYVv$CtStY<Onr5s;W`%t!*_WP=9l?_NvMG&i3_A?+`ZZCnOCfj>SOD!C) zuWz_9uz=5+v9-Rz*^sGHD$8ea3?0{u$CqwX%Bba9SxQwL80K_y2rmomhP56yOR|U- zERZGWwZ~chmmz<0=0Dex)tDvsq0QX{f|I2awG4qy?k-JO^cVw^d390XgS-k<7P3QS zaT3R;pj(3@ufvG3zFMhFOj0Lh_*IF(IazS|D|Zxkpz8~66hVi`B4s@nIOrn?5DbVo z1p-7Ef`AezEq<`Fa^C#Ea%ON-73JKTGVv6ASrKHx>j$A=+dvBDbP7@fbjw-K<B%GN z&+Gyv^g}WF^pa;Gq!%!<-Zcc;&6X@W4h_3mv-VQJ12n6^_7;~w$l3`fBmJN1Db**M zDB>y;j%N{2rD_vd!KHpi!>4)=dq$dK!nmpx?P{8Myd~H{%HVBmE!$Ks$bo9N$qIxX z@UQAxyF7UbcsT22WDG?WvhqlMeC`Pm3R#>&1Bl2?ll@S@Ju8mGy)FaJ&x|3^CVX4K zfK&h_!u65j1maL!03q`~-@EhdfkJ}VM91td>!!j>M$a>Lkc+$N-T=Omw|TM+)Hii6 zKY~+WCEMX{0!`>oC+2pyA3gD6{D4kf75o}a3{{&`^;4ve^eD}n8KM4!loQ_oVdzz2 o>I;P`fOP@J<Y$;f2N2iD8N(p(%Ng}Xt~Re18+t<rfa{Iizp~z#z5oCK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c04d1a0eb09104cb6bfdef833f1c69a7e5a59c8f GIT binary patch literal 10537 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 TU@Ybe`aWyUK@>TA=9B*ehViIx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75d658e5e3aebf37bbe6d0fc58efbf8d514883ff GIT binary patch literal 8847 zcma)B%WoV<dhgfF^gK9xNTQyW+O}+Kywp(E!<H5Au4szdHLQ#jiGH=$Xf~&6$R74| zkE(k_&1`cQSvp8ATI?-AU<Bj>0kS}_$6NyBkaG^X<kH9?Kyq>ZfE;ql@2l>ap}5|~ za@f_?^{%hJ$M5^<!<m_ig1_$i;#YTXD$0M+$M~;|%w0UuKdXwu6sG!0PqkH*@|v&N zntbcFF5iZ2$aldm$am2$;;s9|Udc9lWxJC1tJ+m&u!3Lf&Db+2Gg#5D_h#)mnJ*zf zZ_lgBa6yi;U@!26?g{(kXG*YSDEt&(>}Wd`@mp1)AJgoGA1Taa<*yZ1=BM{{`{Wl& zpna|kO@78cgI<@>>nwWwN7e(aE3AsvRelbw&t$E!ikg4Ecfr2Ud&PdGchSDsyJTOI zE1L1G-mCVjz1Qs5<agbFy?5EZ+<U`*qxYu$X74Tgt=<*;imaRU8@;#fw`G3L|6Xs& zUQ!jVA6(_lL)Bhp^K5~g_(rp@aqZw8b`rB1hq`?oYdXaiv8F|S18cg8@6+rIzR&PE zlo<9bO3t!#C^^Sx(c%`q&$A2ozQAwc`(5@5yZE(YzsDDTrHX r>eUHevG@SFB6 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bb2be9c64f5d2f123c443e75935a9d32d07b6af GIT binary patch literal 23718 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 V-sIG|sl?1*jfMY`Q~k{8{|jn=u7>~s literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bad45281fc90d4b58f71932c9d19d2d8cb745ae1 GIT binary patch literal 10408 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..390eb0928c55cebfe2c62f94eb9a6335b0d368e5 GIT binary patch literal 5877 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 D+SfsW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18af64c9a6ade0e7c2c8c6476aa027ea8ef60b90 GIT binary patch literal 2678 zcmbtWUvC>l5WiiYoy)~`(litbqO1@V7{zu=|B$++LZw9tQd5amRI(_}`F5RLa{scs z=O)pGmqa}B8Jb7F1E1txdFof_6Ek~`lNKr!vDVJbjdyou=g)8MUZde!Ft(mtc$Ums z)?fH?GAh7)3sW5d;T9*M6_Gw6$kUMaDLgA-C9?ark=bE2s`YEYS9vX*iJZP;_?d7v za{I2~op3Iy_v^$G^hJZu9uw|fwE9gx$LmK{f1WpZ6P^ovo-e@j96!&`@x>$3U*z<$ z)mnN9mRK!P%zHzXgqaqDAW9Rd*FaXyvVdO)X6D|W7Haj;OHwYbs9+bwWC*1Gqu9xW z(%%On<onf3kJ>9Q@uEJSd@^w3cQBO$L|cc}76I*Kf6Zku9%Yh=Xy{4lDHX&U;a*#T z8KGcOq@m}FNW_|r63L<<5;{pj)$uozM2W#L$ztxwy^cAkMJ1{(Dw|^W4@=GgZ^)~i zZYqPZr$u+{$?hl#xsa+G$?kA#Fj!GH;;+a2x<5$AUtQ6om5nVKULD=Ib*uZNn+9n+ zh?Vxjur2)?E7$anhe9(4V-fR2b~71<!SGsl6oev8l<uT^#rzu<Hu3rth-J$LP#=AQ z11+{;qQlf05N+j_CWlmB(DX$mw~omHi5+d{)**1aU*_b#_3YCF3hSt@!n$5gf3k?R z^O>%0)pGi~RlYri3<EFI{ojmpR<)4e0hWw~WFrih>bT~g$61OoS1b&aX32<svAxX3 zEv7Swfnr|F84rA|mJN%G6s$5^dwvKp>#hGfaY1Kt@Y$?bpQu@D%@l3`0S0fzz9?)w zRMz0e#cTk^!HiU4BP%gain)<YqCsgzt5Vd;vkMXwRl}YJSk`g<B5oa+zXr*0OMuDm zfn1^MEypEw>QI-s!~xfWWEugC1V+GQ=rS<V2wdWX(<AF74)-AfkD*3UmRsdp%l6uE zfbmAB!?;ML@WIc#*JD>ZH%kw%zSZ|nHU;xI4|I^k==yhZD2u#p2#nqg6dPr+kDHAF z30AStqQh3f%fjQ!EK`E@a8YmlpYB;-X3sYRe-jE#XEIjr9#b}P@PAC9vQDR-$K1!M zaDE6Rx1KHjOb^Hb%}Gv2WnKd=B3i7Octax4&Xs~}7i9cK0=$~Nvms)!o65U4@j$FL z+uFZ$dT-Ua6DGbFs=J-((*I|Sd>@p^50G3$GQ}K|k`nK<0&`+Z%a)joavlk0zFYv( zBJw=)ukS79&e+|8{}pbq>MmKL@+07UgC@YB9H+_OKY>AnMGtba?Z_p-5({u6*Ax*1 zup>RF<bW*N=CI}h$c~{0>1s|73E)lTMeP_chgf-KYv#b#PHyX2K$%~(o7;durDSfa z4zm5}E*p2mE}okk9ywk?>CUC6fK*1GeMX<ltL57PXnxT+w({x-ds5B&;iR4(#D2n| zJ`DUojswtRjjXSiNU**R*$w>y3PG?a3w4lsQUkopsLeg?v4^V<A7I~zJUz+N9<1=9 z3H<d;x-%H}0f|n}FHdLCZ%zSG>@B}rZMI(5bkd+sb*+wAoM@&};Rm1zN)*hG;gS-7 zHi_8D4)#0<LpBr)a~hGGm$#i7J*n!q_C&y4yxZD-t=+z?8m`H~hP&_JYr75Hzd7yp z)PQd;t5#DYFq(#CFteyWN1T>3AT4SoUo<7OK|tP3037J60PNs=ljubyh;>m>T263Y zi(Ng?d#Na#4WY+gn2A=+WPjnDT)eP{3Ez_l-SQLEQ}>ft!zX~*_-2({6edXq)A$cC z;Ap{Z*sB;2YpzBdQlm|>NEhLW9iUDYs7sr4k=CjF9M%B7w9XgqU@*!63dLX`vAl{J zW}pvu!jGZy>w*S}@k-&Op1<vF2xTtUub;ej;QPpUs4Q#K%W7egY-g$b7!Eykr>SG3 n{>-%u448)I+=&vNh2k!DD1|+%ZcML(`S7F7iZkOZIg5V-4yv(H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9f664261fa735e4f20e4b004e0a2d8968f9c9c9 GIT binary patch literal 12583 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 Y>O3`V*T0TjvSXQbXZ{b2?fKjP1MV2Y_W%F@ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..372c2bdfc27fdf58aac6e8d9563d2e6ca3ea2508 GIT binary patch literal 5573 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..afcc5839918309082638215eed231262ad06194e GIT binary patch literal 16212 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 I*<#^;1Fvrp+5i9m literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py new file mode 100644 index 000000000..ecbf6b045 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,319 @@ +from __future__ import absolute_import +from collections import Mapping, MutableMapping +try: + from threading import RLock +except ImportError: # Platform-specific: No threads available + class RLock: + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +try: # Python 2.7+ + from collections import OrderedDict +except ImportError: + from .packages.ordered_dict import OrderedDict +from .packages.six import iterkeys, itervalues, PY3 + + +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] + + +_Null = object() + + +class RecentlyUsedContainer(MutableMapping): + """ + Provides a thread-safe dict-like container which maintains up to + ``maxsize`` keys while throwing away the least-recently-used keys beyond + ``maxsize``. + + :param maxsize: + Maximum number of recent elements to retain. + + :param dispose_func: + Every time an item is evicted from the container, + ``dispose_func(value)`` is called. Callback which will get called + """ + + ContainerCls = OrderedDict + + def __init__(self, maxsize=10, dispose_func=None): + self._maxsize = maxsize + self.dispose_func = dispose_func + + self._container = self.ContainerCls() + self.lock = RLock() + + def __getitem__(self, key): + # Re-insert the item, moving it to the end of the eviction line. + with self.lock: + item = self._container.pop(key) + self._container[key] = item + return item + + def __setitem__(self, key, value): + evicted_value = _Null + with self.lock: + # Possibly evict the existing value of 'key' + evicted_value = self._container.get(key, _Null) + self._container[key] = value + + # If we didn't evict an existing value, we might have to evict the + # least recently used item from the beginning of the container. + if len(self._container) > self._maxsize: + _key, evicted_value = self._container.popitem(last=False) + + if self.dispose_func and evicted_value is not _Null: + self.dispose_func(evicted_value) + + def __delitem__(self, key): + with self.lock: + value = self._container.pop(key) + + if self.dispose_func: + self.dispose_func(value) + + def __len__(self): + with self.lock: + return len(self._container) + + def __iter__(self): + raise NotImplementedError('Iteration over this class is unlikely to be threadsafe.') + + def clear(self): + with self.lock: + # Copy pointers to all values, then wipe the mapping + values = list(itervalues(self._container)) + self._container.clear() + + if self.dispose_func: + for value in values: + self.dispose_func(value) + + def keys(self): + with self.lock: + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = [key, val] + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = [key, val] + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + vals.append(val) + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key, default=__marker): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + if default is self.__marker: + return [] + return default + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + # Backwards compatibility for http.cookiejar + get_all = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py new file mode 100644 index 000000000..67090e371 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py @@ -0,0 +1,373 @@ +from __future__ import absolute_import +import datetime +import logging +import os +import sys +import socket +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six +from .packages.six.moves.http_client import HTTPConnection as _HTTPConnection +from .packages.six.moves.http_client import HTTPException # noqa: F401 + +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. + ssl = None + + class BaseSSLError(BaseException): + pass + + +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass + + +from .exceptions import ( + NewConnectionError, + ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, +) +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( + resolve_cert_reqs, + resolve_ssl_version, + assert_fingerprint, + create_urllib3_context, + ssl_wrap_socket +) + + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +# When updating RECENT_DATE, move it to +# within two years of the current date, and no +# earlier than 6 months ago. +RECENT_DATE = datetime.date(2016, 1, 1) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address in case we have an older Python like 2.6. + self.source_address = kw.get('source_address') + + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + # Superclass also sets self.source_address in Python 2.7+. + _HTTPConnection.__init__(self, *args, **kw) + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self.host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + # the _tunnel_host attribute was added in python 2.6.3 (via + # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do + # not have them. + if getattr(self, '_tunnel_host', None): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + skip_host = 'host' in headers + self.putrequest( + method, + url, + skip_accept_encoding=skip_accept_encoding, + skip_host=skip_host + ) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (six.binary_type,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, six.binary_type): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + ssl_version = None + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + ssl_context=None, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + self.ssl_context = ssl_context + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(None), + cert_reqs=resolve_cert_reqs(None), + ) + + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ssl_context=self.ssl_context, + ) + + +class VerifiedHTTPSConnection(HTTPSConnection): + """ + Based on httplib.HTTPSConnection but wraps the socket with + SSL certification. + """ + cert_reqs = None + ca_certs = None + ca_cert_dir = None + ssl_version = None + assert_fingerprint = None + + def set_cert(self, key_file=None, cert_file=None, + cert_reqs=None, ca_certs=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + """ + This method should only be called once, before the connection is used. + """ + # If cert_reqs is not provided, we can try to guess. If the user gave + # us a cert database, we assume they want to use it: otherwise, if + # they gave us an SSL Context object we should use whatever is set for + # it. + if cert_reqs is None: + if ca_certs or ca_cert_dir: + cert_reqs = 'CERT_REQUIRED' + elif self.ssl_context is not None: + cert_reqs = self.ssl_context.verify_mode + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) + + def connect(self): + # Add certificate verification + conn = self._new_conn() + + hostname = self.host + if getattr(self, '_tunnel_host', None): + # _tunnel_host was added in Python 2.6.3 + # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + + self.sock = conn + # Calls self._set_hostport(), so self.host is + # self._tunnel_host below. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) + + # Wrap socket using verification with the root certs in + # trusted_root_certs + if self.ssl_context is None: + self.ssl_context = create_urllib3_context( + ssl_version=resolve_ssl_version(self.ssl_version), + cert_reqs=resolve_cert_reqs(self.cert_reqs), + ) + + context = self.ssl_context + context.verify_mode = resolve_cert_reqs(self.cert_reqs) + self.sock = ssl_wrap_socket( + sock=conn, + keyfile=self.key_file, + certfile=self.cert_file, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + server_hostname=hostname, + ssl_context=context) + + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif context.verify_mode != ssl.CERT_NONE \ + and not getattr(context, 'check_hostname', False) \ + and self.assert_hostname is not False: + # While urllib3 attempts to always turn off hostname matching from + # the TLS library, this cannot always be done. So we check whether + # the TLS Library still thinks it's matching hostnames. + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or hostname) + + self.is_verified = ( + context.verify_mode == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None + ) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise + + +if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection + HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 000000000..b099ca8e6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,905 @@ +from __future__ import absolute_import +import errno +import logging +import sys +import warnings + +from socket import error as SocketError, timeout as SocketTimeout +import socket + + +from .exceptions import ( + ClosedPoolError, + ProtocolError, + EmptyPoolError, + HeaderParsingError, + HostChangedError, + LocationValueError, + MaxRetryError, + ProxyError, + ReadTimeoutError, + SSLError, + TimeoutError, + InsecureRequestWarning, + NewConnectionError, +) +from .packages.ssl_match_hostname import CertificateError +from .packages import six +from .packages.six.moves import queue +from .connection import ( + port_by_scheme, + DummyConnection, + HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, + HTTPException, BaseSSLError, +) +from .request import RequestMethods +from .response import HTTPResponse + +from .util.connection import is_connection_dropped +from .util.request import set_file_position +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url + + +if six.PY2: + # Queue is imported for side effects on MS Windows + import Queue as _unused_module_Queue # noqa: F401 + +xrange = six.moves.xrange + +log = logging.getLogger(__name__) + +_Default = object() + + +# Pool objects +class ConnectionPool(object): + """ + Base class for all connection pools, such as + :class:`.HTTPConnectionPool` and :class:`.HTTPSConnectionPool`. + """ + + scheme = None + QueueCls = queue.LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host).lower() + self._proxy_host = host.lower() + self.port = port + + def __str__(self): + return '%s(host=%r, port=%r)' % (type(self).__name__, + self.host, self.port) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + +# This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 +_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) + + +class HTTPConnectionPool(ConnectionPool, RequestMethods): + """ + Thread-safe connection pool for one host. + + :param host: + Host used for this HTTP Connection (e.g. "localhost"), passed into + :class:`httplib.HTTPConnection`. + + :param port: + Port used for this HTTP Connection (None is equivalent to 80), passed + into :class:`httplib.HTTPConnection`. + + :param strict: + Causes BadStatusLine to be raised if the status line can't be parsed + as a valid HTTP/1.0 or 1.1 status line, passed into + :class:`httplib.HTTPConnection`. + + .. note:: + Only works in Python 2. This parameter is ignored in Python 3. + + :param timeout: + Socket timeout in seconds for each individual connection. This can + be a float or integer, which sets the timeout for the HTTP request, + or an instance of :class:`urllib3.util.Timeout` which gives you more + fine-grained control over request timeouts. After the constructor has + been parsed, this is always a `urllib3.util.Timeout` object. + + :param maxsize: + Number of connections to save that can be reused. More than 1 is useful + in multithreaded situations. If ``block`` is set to False, more + connections will be created but they will not be saved once they've + been used. + + :param block: + If set to True, no more than ``maxsize`` connections will be used at + a time. When no free connections are available, the call will block + until a connection has been released. This is a useful side effect for + particular multithreaded situations where one does not want to use more + than maxsize connections per host to prevent flooding. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param retries: + Retry configuration to use by default with requests in this pool. + + :param _proxy: + Parsed proxy URL, should not be used directly, instead, see + :class:`urllib3.connectionpool.ProxyManager`" + + :param _proxy_headers: + A dictionary with proxy headers, should not be used directly, + instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \\**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. + """ + + scheme = 'http' + ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse + + def __init__(self, host, port=None, strict=False, + timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): + ConnectionPool.__init__(self, host, port) + RequestMethods.__init__(self, headers) + + self.strict = strict + + if not isinstance(timeout, Timeout): + timeout = Timeout.from_float(timeout) + + if retries is None: + retries = Retry.DEFAULT + + self.timeout = timeout + self.retries = retries + + self.pool = self.QueueCls(maxsize) + self.block = block + + self.proxy = _proxy + self.proxy_headers = _proxy_headers or {} + + # Fill the queue up so that doing get() on it will block properly + for _ in xrange(maxsize): + self.pool.put(None) + + # These are mostly for testing and debugging purposes. + self.num_connections = 0 + self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) + + def _new_conn(self): + """ + Return a fresh :class:`HTTPConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTP connection (%d): %s", + self.num_connections, self.host) + + conn = self.ConnectionCls(host=self.host, port=self.port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + return conn + + def _get_conn(self, timeout=None): + """ + Get a connection. Will return a pooled connection if one is available. + + If no connections are available and :prop:`.block` is ``False``, then a + fresh connection is returned. + + :param timeout: + Seconds to wait before giving up and raising + :class:`urllib3.exceptions.EmptyPoolError` if the pool is empty and + :prop:`.block` is ``True``. + """ + conn = None + try: + conn = self.pool.get(block=self.block, timeout=timeout) + + except AttributeError: # self.pool is None + raise ClosedPoolError(self, "Pool is closed.") + + except queue.Empty: + if self.block: + raise EmptyPoolError(self, + "Pool reached maximum size and no more " + "connections are allowed.") + pass # Oh well, we'll create a new connection then + + # If this is a persistent connection, check if it got disconnected + if conn and is_connection_dropped(conn): + log.debug("Resetting dropped connection: %s", self.host) + conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None + + return conn or self._new_conn() + + def _put_conn(self, conn): + """ + Put a connection back into the pool. + + :param conn: + Connection object for the current host and port as returned by + :meth:`._new_conn` or :meth:`._get_conn`. + + If the pool is already full, the connection is closed and discarded + because we exceeded maxsize. If connections are discarded frequently, + then maxsize should be increased. + + If the pool is closed, then the connection will be closed and discarded. + """ + try: + self.pool.put(conn, block=False) + return # Everything is dandy, done. + except AttributeError: + # self.pool is None. + pass + except queue.Full: + # This should never happen if self.block == True + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) + + # Connection never got put back into the pool, close it. + if conn: + conn.close() + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + + def _get_timeout(self, timeout): + """ Helper that always returns a :class:`urllib3.util.Timeout` """ + if timeout is _Default: + return self.timeout.clone() + + if isinstance(timeout, Timeout): + return timeout.clone() + else: + # User passed us an int/float. This is for backwards compatibility, + # can be removed later + return Timeout.from_float(timeout) + + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, + **httplib_request_kw): + """ + Perform a request on a given urllib connection object taken from our + pool. + + :param conn: + a connection from one of our connection pools + + :param timeout: + Socket timeout in seconds for the request. This can be a + float or integer, which will set the same timeout value for + the socket connect and the socket read, or an instance of + :class:`urllib3.util.Timeout`, which gives you more fine-grained + control over your timeouts. + """ + self.num_requests += 1 + + timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + + # Trigger any extra validation we need to do. + try: + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: + conn.request(method, url, **httplib_request_kw) + + # Reset the timeout for the recv() on the socket + read_timeout = timeout_obj.read_timeout + + # App Engine doesn't have a sock attr + if getattr(conn, 'sock', None): + # In Python 3 socket.py will catch EAGAIN and return None when you + # try and read into the file pointer created by http.client, which + # instead raises a BadStatusLine exception. Instead of catching + # the exception and assuming all BadStatusLine exceptions are read + # timeouts, check for a zero timeout before making the request. + if read_timeout == 0: + raise ReadTimeoutError( + self, url, "Read timed out. (read timeout=%s)" % read_timeout) + if read_timeout is Timeout.DEFAULT_TIMEOUT: + conn.sock.settimeout(socket.getdefaulttimeout()) + else: # None or a value + conn.sock.settimeout(read_timeout) + + # Receive the response from the server + try: + try: # Python 2.7, use buffering of HTTP responses + httplib_response = conn.getresponse(buffering=True) + except TypeError: # Python 2.6 and older, Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) + raise + + # AppEngine doesn't have a version attr. + http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') + log.debug("%s://%s:%s \"%s %s %s\" %s %s", self.scheme, self.host, self.port, + method, url, http_version, httplib_response.status, + httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except (HeaderParsingError, TypeError) as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + + return httplib_response + + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + # Disable access to the pool + old_pool, self.pool = self.pool, None + + try: + while True: + conn = old_pool.get(block=False) + if conn: + conn.close() + + except queue.Empty: + pass # Done. + + def is_same_host(self, url): + """ + Check if the given ``url`` is a member of the same host as this + connection pool. + """ + if url.startswith('/'): + return True + + # TODO: Add optional support for socket.gethostbyname checking. + scheme, host, port = get_host(url) + + host = _ipv6_host(host).lower() + + # Use explicit default port for comparison when none is given + if self.port and not port: + port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None + + return (scheme, host, port) == (self.scheme, self.host, self.port) + + def urlopen(self, method, url, body=None, headers=None, retries=None, + redirect=True, assert_same_host=True, timeout=_Default, + pool_timeout=None, release_conn=None, chunked=False, + body_pos=None, **response_kw): + """ + Get a connection from the pool and perform an HTTP request. This is the + lowest level call for making a request, so you'll need to specify all + the raw details. + + .. note:: + + More commonly, it's appropriate to use a convenience method provided + by :class:`.RequestMethods`, such as :meth:`request`. + + .. note:: + + `release_conn` will only behave as expected if + `preload_content=False` because we want to make + `preload_content=False` the default behaviour someday soon without + breaking backwards compatibility. + + :param method: + HTTP request method (such as GET, POST, PUT, etc.) + + :param body: + Data to send in the request body (useful for creating + POST requests, see HTTPConnectionPool.post_url for + more convenience). + + :param headers: + Dictionary of custom headers to send, such as User-Agent, + If-None-Match, etc. If None, pool headers are used. If provided, + these headers completely replace any pool-specific headers. + + :param retries: + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. + + :param redirect: + If True, automatically handle redirects (status codes 301, 302, + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. + + :param assert_same_host: + If ``True``, will make sure that the host of the pool requests is + consistent else will raise HostChangedError. When False, you can + use the pool on an HTTP proxy and request foreign hosts. + + :param timeout: + If specified, overrides the default timeout for this one + request. It may be a float (in seconds) or an instance of + :class:`urllib3.util.Timeout`. + + :param pool_timeout: + If set and the pool is set to block=True, then this method will + block for ``pool_timeout`` seconds and raise EmptyPoolError if no + connection is available within the time period. + + :param release_conn: + If False, then the urlopen call will not release the connection + back into the pool once a response is received (but will release if + you read the entire contents of the response such as when + `preload_content=True`). This is useful if you're not preloading + the response's content immediately. You will need to call + ``r.release_conn()`` on the response ``r`` to return the connection + back into the pool. If None, it takes the value of + ``response_kw.get('preload_content', True)``. + + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + + :param int body_pos: + Position to seek to in file-like body in the event of a retry or + redirect. Typically this won't need to be set because urllib3 will + auto-populate the value when needed. + + :param \\**response_kw: + Additional parameters are passed to + :meth:`urllib3.response.HTTPResponse.from_httplib` + """ + if headers is None: + headers = self.headers + + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) + + if release_conn is None: + release_conn = response_kw.get('preload_content', True) + + # Check host + if assert_same_host and not self.is_same_host(url): + raise HostChangedError(self, url, retries) + + conn = None + + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] <https://github.com/shazow/urllib3/issues/651> + release_this_conn = release_conn + + # Merge the proxy headers. Only do this in HTTP. We have to copy the + # headers dict so we can safely change it without those changes being + # reflected in anyone else's copy. + if self.scheme == 'http': + headers = headers.copy() + headers.update(self.proxy_headers) + + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + + # Rewind body position, if needed. Record current position + # for future rewinds in the event of a redirect/retry. + body_pos = set_file_position(body, body_pos) + + try: + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) + conn = self._get_conn(timeout=pool_timeout) + + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. + httplib_response = self._make_request(conn, method, url, + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) + + # If we're going to release the connection in ``finally:``, then + # the response doesn't need to know about the connection. Otherwise + # it will also try to release it and we'll have a double-release + # mess. + response_conn = conn if not release_conn else None + + # Pass method to Response for length checking + response_kw['request_method'] = method + + # Import httplib's response into our own wrapper object + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + retries=retries, + **response_kw) + + # Everything went great! + clean_exit = True + + except queue.Empty: + # Timed out by queue. + raise EmptyPoolError(self, "No pool connections are available.") + + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError, CertificateError) as e: + # Discard the connection for these exceptions. It will be + # replaced during the next _get_conn() call. + clean_exit = False + if isinstance(e, (BaseSSLError, CertificateError)): + e = SSLError(e) + elif isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. + err = e + + finally: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: + # Put the connection back to be reused. If the connection is + # expired then it will be None, which will get replaced with a + # fresh connection during _get_conn. + self._put_conn(conn) + + if not conn: + # Try again + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, + redirect, assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + def drain_and_release_conn(response): + try: + # discard any remaining response body, the connection will be + # released back to the pool once the entire response is read + response.read() + except (TimeoutError, HTTPException, SocketError, ProtocolError, + BaseSSLError, SSLError) as e: + pass + + # Handle redirect? + redirect_location = redirect and response.get_redirect_location() + if redirect_location: + if response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep_for_retry(response) + log.debug("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, body_pos=body_pos, + **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(response.getheader('Retry-After')) + if retries.is_retry(method, response.status, has_retry_after): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Drain and release the connection for this response, since + # we're not returning it to be released manually. + drain_and_release_conn(response) + raise + return response + + # drain and return the connection to the pool before recursing + drain_and_release_conn(response) + + retries.sleep(response) + log.debug("Retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, + body_pos=body_pos, **response_kw) + + return response + + +class HTTPSConnectionPool(HTTPConnectionPool): + """ + Same as :class:`.HTTPConnectionPool`, but HTTPS. + + When Python is compiled with the :mod:`ssl` module, then + :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, + instead of :class:`.HTTPSConnection`. + + :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, + ``assert_hostname`` and ``host`` in this order to verify connections. + If ``assert_hostname`` is False, no verification is done. + + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. + """ + + scheme = 'https' + ConnectionCls = HTTPSConnection + + def __init__(self, host, port=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, + _proxy=None, _proxy_headers=None, + key_file=None, cert_file=None, cert_reqs=None, + ca_certs=None, ssl_version=None, + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): + + HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + + self.key_file = key_file + self.cert_file = cert_file + self.cert_reqs = cert_reqs + self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir + self.ssl_version = ssl_version + self.assert_hostname = assert_hostname + self.assert_fingerprint = assert_fingerprint + + def _prepare_conn(self, conn): + """ + Prepare the ``connection`` for :meth:`urllib3.util.ssl_wrap_socket` + and establish the tunnel if proxy is used. + """ + + if isinstance(conn, VerifiedHTTPSConnection): + conn.set_cert(key_file=self.key_file, + cert_file=self.cert_file, + cert_reqs=self.cert_reqs, + ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, + assert_hostname=self.assert_hostname, + assert_fingerprint=self.assert_fingerprint) + conn.ssl_version = self.ssl_version + return conn + + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self._proxy_host, self.port) + else: + set_tunnel(self._proxy_host, self.port, self.proxy_headers) + + conn.connect() + + def _new_conn(self): + """ + Return a fresh :class:`httplib.HTTPSConnection`. + """ + self.num_connections += 1 + log.debug("Starting new HTTPS connection (%d): %s", + self.num_connections, self.host) + + if not self.ConnectionCls or self.ConnectionCls is DummyConnection: + raise SSLError("Can't connect to HTTPS URL because the SSL " + "module is not available.") + + actual_host = self.host + actual_port = self.port + if self.proxy is not None: + actual_host = self.proxy.host + actual_port = self.proxy.port + + conn = self.ConnectionCls(host=actual_host, port=actual_port, + timeout=self.timeout.connect_timeout, + strict=self.strict, **self.conn_kw) + + return self._prepare_conn(conn) + + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings'), + InsecureRequestWarning) + + +def connection_from_url(url, **kw): + """ + Given a url, return an :class:`.ConnectionPool` instance of its host. + + This is a shortcut for not having to parse out the scheme, host, and port + of the url before creating an :class:`.ConnectionPool` instance. + + :param url: + Absolute URL string that must include the scheme. Port is optional. + + :param \\**kw: + Passes additional parameters to the constructor of the appropriate + :class:`.ConnectionPool`. Useful for specifying things like + timeout, maxsize, headers, etc. + + Example:: + + >>> conn = connection_from_url('http://google.com/') + >>> r = conn.request('GET', '/') + """ + scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) + if scheme == 'https': + return HTTPSConnectionPool(host, port=port, **kw) + else: + return HTTPConnectionPool(host, port=port, **kw) + + +def _ipv6_host(host): + """ + Process IPv6 address literals + """ + + # httplib doesn't like it when we include brackets in IPv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. See http://bugs.python.org/issue28539 + # + # Also if an IPv6 address literal has a zone identifier, the + # percent sign might be URIencoded, convert it back into ASCII + if host.startswith('[') and host.endswith(']'): + host = host.replace('%25', '%').strip('[]') + return host diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f421ef203edfafd23170859ac507a0d4700d8993 GIT binary patch literal 208 zcmYL@K?=e!5JgjPAwsv_!9^Xl7F!Sz58%dbCA3W|DQOxfX`n~)N^ZS{D-%Kd@ZKN( zYEEG|BQ9+|zxsZ8{Svt2=+F}<MlNI#oF4@J{MUN~h1?dV23sIBy<jzJ=n%@5(o`pM zXW6!*%5GMsNpCHRb(3Tn<e<2UxYVW)BEl+3V{<S3_=Vb9vL0bTA$S=>)k}lC1WLK& UhSH@PpVNKUvq97c|B`l)5Bl~u<p2Nx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d9d855b081942c9216516564eebf0c9a4db1a793 GIT binary patch literal 8846 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 K%T~EiF8&WdC!a<D literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24fc3a53a0b7ef6598ced901bdc32079549284fd GIT binary patch literal 3256 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 K;*3hgs(c4={D5cx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..422f4bdeff38fb5791c298594a00f0ceb508430d GIT binary patch literal 14115 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44a15ac5247e21b8a820b0ed797348351c2646c3 GIT binary patch literal 18029 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 S82z@ve|dO(lKFHx@qYjjxrj#q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2bc5915440610a5507d6f47b5c882ea40fc4de7 GIT binary patch literal 4817 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7123c49555b1fffc3d0f8f5c2cd24cee929f9057 GIT binary patch literal 225 zcmYL@L2AP=5JeT}A_TJS9lCI)t!v^y2q6dPCf=4omgFF#NXkeS<O;b-uheaB(N(2F z>4*3J@K<wKE*C6k>>fW#-;4e-%f~(w9<n4mvZvYmC!;d|>-z?tbmCD#;sk>;Qc-|2 zK|dn4p|R^E-vs*f`W%P$G?IB4n#~3}@Y+|}hRBVnNHlF7FT9MuU{Y2(f{BdLeGS6d kNV*3MN=&38aT~m&2#DJ1h`93Cule@u<Yd&Y{1`Iq2Rqh2_y7O^ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..056fc48275c7dda7105fe1048ac7c8e6a47ecb29 GIT binary patch literal 10320 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eba9b6fd89ed3334f86071629e3227506b1c616b GIT binary patch literal 7465 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 a{8=m5u;;j*d)0l#yW;-XrQZ$r?f(O>*6Wo3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 000000000..9787b02af --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py @@ -0,0 +1,593 @@ +""" +This module uses ctypes to bind a whole bunch of functions and constants from +SecureTransport. The goal here is to provide the low-level API to +SecureTransport. These are essentially the C-level functions and constants, and +they're pretty gross to work with. + +This code is a bastardised version of the code found in Will Bond's oscrypto +library. An enormous debt is owed to him for blazing this trail for us. For +that reason, this code should be considered to be covered both by urllib3's +license and by oscrypto's: + + Copyright (c) 2015-2016 Will Bond <will@wbond.net> + + 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. +""" +from __future__ import absolute_import + +import platform +from ctypes.util import find_library +from ctypes import ( + c_void_p, c_int32, c_char_p, c_size_t, c_byte, c_uint32, c_ulong, c_long, + c_bool +) +from ctypes import CDLL, POINTER, CFUNCTYPE + + +security_path = find_library('Security') +if not security_path: + raise ImportError('The library Security could not be found') + + +core_foundation_path = find_library('CoreFoundation') +if not core_foundation_path: + raise ImportError('The library CoreFoundation could not be found') + + +version = platform.mac_ver()[0] +version_info = tuple(map(int, version.split('.'))) +if version_info < (10, 8): + raise OSError( + 'Only OS X 10.8 and newer are supported, not %s.%s' % ( + version_info[0], version_info[1] + ) + ) + +Security = CDLL(security_path, use_errno=True) +CoreFoundation = CDLL(core_foundation_path, use_errno=True) + +Boolean = c_bool +CFIndex = c_long +CFStringEncoding = c_uint32 +CFData = c_void_p +CFString = c_void_p +CFArray = c_void_p +CFMutableArray = c_void_p +CFDictionary = c_void_p +CFError = c_void_p +CFType = c_void_p +CFTypeID = c_ulong + +CFTypeRef = POINTER(CFType) +CFAllocatorRef = c_void_p + +OSStatus = c_int32 + +CFDataRef = POINTER(CFData) +CFStringRef = POINTER(CFString) +CFArrayRef = POINTER(CFArray) +CFMutableArrayRef = POINTER(CFMutableArray) +CFDictionaryRef = POINTER(CFDictionary) +CFArrayCallBacks = c_void_p +CFDictionaryKeyCallBacks = c_void_p +CFDictionaryValueCallBacks = c_void_p + +SecCertificateRef = POINTER(c_void_p) +SecExternalFormat = c_uint32 +SecExternalItemType = c_uint32 +SecIdentityRef = POINTER(c_void_p) +SecItemImportExportFlags = c_uint32 +SecItemImportExportKeyParameters = c_void_p +SecKeychainRef = POINTER(c_void_p) +SSLProtocol = c_uint32 +SSLCipherSuite = c_uint32 +SSLContextRef = POINTER(c_void_p) +SecTrustRef = POINTER(c_void_p) +SSLConnectionRef = c_uint32 +SecTrustResultType = c_uint32 +SecTrustOptionFlags = c_uint32 +SSLProtocolSide = c_uint32 +SSLConnectionType = c_uint32 +SSLSessionOption = c_uint32 + + +try: + Security.SecItemImport.argtypes = [ + CFDataRef, + CFStringRef, + POINTER(SecExternalFormat), + POINTER(SecExternalItemType), + SecItemImportExportFlags, + POINTER(SecItemImportExportKeyParameters), + SecKeychainRef, + POINTER(CFArrayRef), + ] + Security.SecItemImport.restype = OSStatus + + Security.SecCertificateGetTypeID.argtypes = [] + Security.SecCertificateGetTypeID.restype = CFTypeID + + Security.SecIdentityGetTypeID.argtypes = [] + Security.SecIdentityGetTypeID.restype = CFTypeID + + Security.SecKeyGetTypeID.argtypes = [] + Security.SecKeyGetTypeID.restype = CFTypeID + + Security.SecCertificateCreateWithData.argtypes = [ + CFAllocatorRef, + CFDataRef + ] + Security.SecCertificateCreateWithData.restype = SecCertificateRef + + Security.SecCertificateCopyData.argtypes = [ + SecCertificateRef + ] + Security.SecCertificateCopyData.restype = CFDataRef + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SecIdentityCreateWithCertificate.argtypes = [ + CFTypeRef, + SecCertificateRef, + POINTER(SecIdentityRef) + ] + Security.SecIdentityCreateWithCertificate.restype = OSStatus + + Security.SecKeychainCreate.argtypes = [ + c_char_p, + c_uint32, + c_void_p, + Boolean, + c_void_p, + POINTER(SecKeychainRef) + ] + Security.SecKeychainCreate.restype = OSStatus + + Security.SecKeychainDelete.argtypes = [ + SecKeychainRef + ] + Security.SecKeychainDelete.restype = OSStatus + + Security.SecPKCS12Import.argtypes = [ + CFDataRef, + CFDictionaryRef, + POINTER(CFArrayRef) + ] + Security.SecPKCS12Import.restype = OSStatus + + SSLReadFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, c_void_p, POINTER(c_size_t)) + SSLWriteFunc = CFUNCTYPE(OSStatus, SSLConnectionRef, POINTER(c_byte), POINTER(c_size_t)) + + Security.SSLSetIOFuncs.argtypes = [ + SSLContextRef, + SSLReadFunc, + SSLWriteFunc + ] + Security.SSLSetIOFuncs.restype = OSStatus + + Security.SSLSetPeerID.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerID.restype = OSStatus + + Security.SSLSetCertificate.argtypes = [ + SSLContextRef, + CFArrayRef + ] + Security.SSLSetCertificate.restype = OSStatus + + Security.SSLSetCertificateAuthorities.argtypes = [ + SSLContextRef, + CFTypeRef, + Boolean + ] + Security.SSLSetCertificateAuthorities.restype = OSStatus + + Security.SSLSetConnection.argtypes = [ + SSLContextRef, + SSLConnectionRef + ] + Security.SSLSetConnection.restype = OSStatus + + Security.SSLSetPeerDomainName.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t + ] + Security.SSLSetPeerDomainName.restype = OSStatus + + Security.SSLHandshake.argtypes = [ + SSLContextRef + ] + Security.SSLHandshake.restype = OSStatus + + Security.SSLRead.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLRead.restype = OSStatus + + Security.SSLWrite.argtypes = [ + SSLContextRef, + c_char_p, + c_size_t, + POINTER(c_size_t) + ] + Security.SSLWrite.restype = OSStatus + + Security.SSLClose.argtypes = [ + SSLContextRef + ] + Security.SSLClose.restype = OSStatus + + Security.SSLGetNumberSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberSupportedCiphers.restype = OSStatus + + Security.SSLGetSupportedCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetSupportedCiphers.restype = OSStatus + + Security.SSLSetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + c_size_t + ] + Security.SSLSetEnabledCiphers.restype = OSStatus + + Security.SSLGetNumberEnabledCiphers.argtype = [ + SSLContextRef, + POINTER(c_size_t) + ] + Security.SSLGetNumberEnabledCiphers.restype = OSStatus + + Security.SSLGetEnabledCiphers.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite), + POINTER(c_size_t) + ] + Security.SSLGetEnabledCiphers.restype = OSStatus + + Security.SSLGetNegotiatedCipher.argtypes = [ + SSLContextRef, + POINTER(SSLCipherSuite) + ] + Security.SSLGetNegotiatedCipher.restype = OSStatus + + Security.SSLGetNegotiatedProtocolVersion.argtypes = [ + SSLContextRef, + POINTER(SSLProtocol) + ] + Security.SSLGetNegotiatedProtocolVersion.restype = OSStatus + + Security.SSLCopyPeerTrust.argtypes = [ + SSLContextRef, + POINTER(SecTrustRef) + ] + Security.SSLCopyPeerTrust.restype = OSStatus + + Security.SecTrustSetAnchorCertificates.argtypes = [ + SecTrustRef, + CFArrayRef + ] + Security.SecTrustSetAnchorCertificates.restype = OSStatus + + Security.SecTrustSetAnchorCertificatesOnly.argstypes = [ + SecTrustRef, + Boolean + ] + Security.SecTrustSetAnchorCertificatesOnly.restype = OSStatus + + Security.SecTrustEvaluate.argtypes = [ + SecTrustRef, + POINTER(SecTrustResultType) + ] + Security.SecTrustEvaluate.restype = OSStatus + + Security.SecTrustGetCertificateCount.argtypes = [ + SecTrustRef + ] + Security.SecTrustGetCertificateCount.restype = CFIndex + + Security.SecTrustGetCertificateAtIndex.argtypes = [ + SecTrustRef, + CFIndex + ] + Security.SecTrustGetCertificateAtIndex.restype = SecCertificateRef + + Security.SSLCreateContext.argtypes = [ + CFAllocatorRef, + SSLProtocolSide, + SSLConnectionType + ] + Security.SSLCreateContext.restype = SSLContextRef + + Security.SSLSetSessionOption.argtypes = [ + SSLContextRef, + SSLSessionOption, + Boolean + ] + Security.SSLSetSessionOption.restype = OSStatus + + Security.SSLSetProtocolVersionMin.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMin.restype = OSStatus + + Security.SSLSetProtocolVersionMax.argtypes = [ + SSLContextRef, + SSLProtocol + ] + Security.SSLSetProtocolVersionMax.restype = OSStatus + + Security.SecCopyErrorMessageString.argtypes = [ + OSStatus, + c_void_p + ] + Security.SecCopyErrorMessageString.restype = CFStringRef + + Security.SSLReadFunc = SSLReadFunc + Security.SSLWriteFunc = SSLWriteFunc + Security.SSLContextRef = SSLContextRef + Security.SSLProtocol = SSLProtocol + Security.SSLCipherSuite = SSLCipherSuite + Security.SecIdentityRef = SecIdentityRef + Security.SecKeychainRef = SecKeychainRef + Security.SecTrustRef = SecTrustRef + Security.SecTrustResultType = SecTrustResultType + Security.SecExternalFormat = SecExternalFormat + Security.OSStatus = OSStatus + + Security.kSecImportExportPassphrase = CFStringRef.in_dll( + Security, 'kSecImportExportPassphrase' + ) + Security.kSecImportItemIdentity = CFStringRef.in_dll( + Security, 'kSecImportItemIdentity' + ) + + # CoreFoundation time! + CoreFoundation.CFRetain.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRetain.restype = CFTypeRef + + CoreFoundation.CFRelease.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFRelease.restype = None + + CoreFoundation.CFGetTypeID.argtypes = [ + CFTypeRef + ] + CoreFoundation.CFGetTypeID.restype = CFTypeID + + CoreFoundation.CFStringCreateWithCString.argtypes = [ + CFAllocatorRef, + c_char_p, + CFStringEncoding + ] + CoreFoundation.CFStringCreateWithCString.restype = CFStringRef + + CoreFoundation.CFStringGetCStringPtr.argtypes = [ + CFStringRef, + CFStringEncoding + ] + CoreFoundation.CFStringGetCStringPtr.restype = c_char_p + + CoreFoundation.CFStringGetCString.argtypes = [ + CFStringRef, + c_char_p, + CFIndex, + CFStringEncoding + ] + CoreFoundation.CFStringGetCString.restype = c_bool + + CoreFoundation.CFDataCreate.argtypes = [ + CFAllocatorRef, + c_char_p, + CFIndex + ] + CoreFoundation.CFDataCreate.restype = CFDataRef + + CoreFoundation.CFDataGetLength.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetLength.restype = CFIndex + + CoreFoundation.CFDataGetBytePtr.argtypes = [ + CFDataRef + ] + CoreFoundation.CFDataGetBytePtr.restype = c_void_p + + CoreFoundation.CFDictionaryCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + POINTER(CFTypeRef), + CFIndex, + CFDictionaryKeyCallBacks, + CFDictionaryValueCallBacks + ] + CoreFoundation.CFDictionaryCreate.restype = CFDictionaryRef + + CoreFoundation.CFDictionaryGetValue.argtypes = [ + CFDictionaryRef, + CFTypeRef + ] + CoreFoundation.CFDictionaryGetValue.restype = CFTypeRef + + CoreFoundation.CFArrayCreate.argtypes = [ + CFAllocatorRef, + POINTER(CFTypeRef), + CFIndex, + CFArrayCallBacks, + ] + CoreFoundation.CFArrayCreate.restype = CFArrayRef + + CoreFoundation.CFArrayCreateMutable.argtypes = [ + CFAllocatorRef, + CFIndex, + CFArrayCallBacks + ] + CoreFoundation.CFArrayCreateMutable.restype = CFMutableArrayRef + + CoreFoundation.CFArrayAppendValue.argtypes = [ + CFMutableArrayRef, + c_void_p + ] + CoreFoundation.CFArrayAppendValue.restype = None + + CoreFoundation.CFArrayGetCount.argtypes = [ + CFArrayRef + ] + CoreFoundation.CFArrayGetCount.restype = CFIndex + + CoreFoundation.CFArrayGetValueAtIndex.argtypes = [ + CFArrayRef, + CFIndex + ] + CoreFoundation.CFArrayGetValueAtIndex.restype = c_void_p + + CoreFoundation.kCFAllocatorDefault = CFAllocatorRef.in_dll( + CoreFoundation, 'kCFAllocatorDefault' + ) + CoreFoundation.kCFTypeArrayCallBacks = c_void_p.in_dll(CoreFoundation, 'kCFTypeArrayCallBacks') + CoreFoundation.kCFTypeDictionaryKeyCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryKeyCallBacks' + ) + CoreFoundation.kCFTypeDictionaryValueCallBacks = c_void_p.in_dll( + CoreFoundation, 'kCFTypeDictionaryValueCallBacks' + ) + + CoreFoundation.CFTypeRef = CFTypeRef + CoreFoundation.CFArrayRef = CFArrayRef + CoreFoundation.CFStringRef = CFStringRef + CoreFoundation.CFDictionaryRef = CFDictionaryRef + +except (AttributeError): + raise ImportError('Error initializing ctypes') + + +class CFConst(object): + """ + A class object that acts as essentially a namespace for CoreFoundation + constants. + """ + kCFStringEncodingUTF8 = CFStringEncoding(0x08000100) + + +class SecurityConst(object): + """ + A class object that acts as essentially a namespace for Security constants. + """ + kSSLSessionOptionBreakOnServerAuth = 0 + + kSSLProtocol2 = 1 + kSSLProtocol3 = 2 + kTLSProtocol1 = 4 + kTLSProtocol11 = 7 + kTLSProtocol12 = 8 + + kSSLClientSide = 1 + kSSLStreamType = 0 + + kSecFormatPEMSequence = 10 + + kSecTrustResultInvalid = 0 + kSecTrustResultProceed = 1 + # This gap is present on purpose: this was kSecTrustResultConfirm, which + # is deprecated. + kSecTrustResultDeny = 3 + kSecTrustResultUnspecified = 4 + kSecTrustResultRecoverableTrustFailure = 5 + kSecTrustResultFatalTrustFailure = 6 + kSecTrustResultOtherError = 7 + + errSSLProtocol = -9800 + errSSLWouldBlock = -9803 + errSSLClosedGraceful = -9805 + errSSLClosedNoNotify = -9816 + errSSLClosedAbort = -9806 + + errSSLXCertChainInvalid = -9807 + errSSLCrypto = -9809 + errSSLInternal = -9810 + errSSLCertExpired = -9814 + errSSLCertNotYetValid = -9815 + errSSLUnknownRootCert = -9812 + errSSLNoRootCert = -9813 + errSSLHostNameMismatch = -9843 + errSSLPeerHandshakeFail = -9824 + errSSLPeerUserCancelled = -9839 + errSSLWeakPeerEphemeralDHKey = -9850 + errSSLServerAuthCompleted = -9841 + errSSLRecordOverflow = -9847 + + errSecVerifyFailed = -67808 + errSecNoTrustSettings = -25263 + errSecItemNotFound = -25300 + errSecInvalidTrustSettings = -25262 + + # Cipher suites. We only pick the ones our default cipher string allows. + TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030 + TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F + TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3 + TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F + TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2 + TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024 + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028 + TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A + TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014 + TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B + TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A + TLS_DHE_RSA_WITH_AES_256_CBC_SHA = 0x0039 + TLS_DHE_DSS_WITH_AES_256_CBC_SHA = 0x0038 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027 + TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009 + TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040 + TLS_DHE_RSA_WITH_AES_128_CBC_SHA = 0x0033 + TLS_DHE_DSS_WITH_AES_128_CBC_SHA = 0x0032 + TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D + TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C + TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D + TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C + TLS_RSA_WITH_AES_256_CBC_SHA = 0x0035 + TLS_RSA_WITH_AES_128_CBC_SHA = 0x002F + TLS_AES_128_GCM_SHA256 = 0x1301 + TLS_AES_256_GCM_SHA384 = 0x1302 + TLS_CHACHA20_POLY1305_SHA256 = 0x1303 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 000000000..4e5c0db7b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,343 @@ +""" +Low-level helpers for the SecureTransport bindings. + +These are Python functions that are not directly related to the high-level APIs +but are necessary to get them to work. They include a whole bunch of low-level +CoreFoundation messing about and memory management. The concerns in this module +are almost entirely about trying to avoid memory leaks and providing +appropriate and useful assistance to the higher-level code. +""" +import base64 +import ctypes +import itertools +import re +import os +import ssl +import tempfile + +from .bindings import Security, CoreFoundation, CFConst + + +# This regular expression is used to grab PEM data out of a PEM bundle. +_PEM_CERTS_RE = re.compile( + b"-----BEGIN CERTIFICATE-----\n(.*?)\n-----END CERTIFICATE-----", re.DOTALL +) + + +def _cf_data_from_bytes(bytestring): + """ + Given a bytestring, create a CFData object from it. This CFData object must + be CFReleased by the caller. + """ + return CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, bytestring, len(bytestring) + ) + + +def _cf_dictionary_from_tuples(tuples): + """ + Given a list of Python tuples, create an associated CFDictionary. + """ + dictionary_size = len(tuples) + + # We need to get the dictionary keys and values out in the same order. + keys = (t[0] for t in tuples) + values = (t[1] for t in tuples) + cf_keys = (CoreFoundation.CFTypeRef * dictionary_size)(*keys) + cf_values = (CoreFoundation.CFTypeRef * dictionary_size)(*values) + + return CoreFoundation.CFDictionaryCreate( + CoreFoundation.kCFAllocatorDefault, + cf_keys, + cf_values, + dictionary_size, + CoreFoundation.kCFTypeDictionaryKeyCallBacks, + CoreFoundation.kCFTypeDictionaryValueCallBacks, + ) + + +def _cf_string_to_unicode(value): + """ + Creates a Unicode string from a CFString object. Used entirely for error + reporting. + + Yes, it annoys me quite a lot that this function is this complex. + """ + value_as_void_p = ctypes.cast(value, ctypes.POINTER(ctypes.c_void_p)) + + string = CoreFoundation.CFStringGetCStringPtr( + value_as_void_p, + CFConst.kCFStringEncodingUTF8 + ) + if string is None: + buffer = ctypes.create_string_buffer(1024) + result = CoreFoundation.CFStringGetCString( + value_as_void_p, + buffer, + 1024, + CFConst.kCFStringEncodingUTF8 + ) + if not result: + raise OSError('Error copying C string from CFStringRef') + string = buffer.value + if string is not None: + string = string.decode('utf-8') + return string + + +def _assert_no_error(error, exception_class=None): + """ + Checks the return code and throws an exception if there is an error to + report + """ + if error == 0: + return + + cf_error_string = Security.SecCopyErrorMessageString(error, None) + output = _cf_string_to_unicode(cf_error_string) + CoreFoundation.CFRelease(cf_error_string) + + if output is None or output == u'': + output = u'OSStatus %s' % error + + if exception_class is None: + exception_class = ssl.SSLError + + raise exception_class(output) + + +def _cert_array_from_pem(pem_bundle): + """ + Given a bundle of certs in PEM format, turns them into a CFArray of certs + that can be used to validate a cert chain. + """ + der_certs = [ + base64.b64decode(match.group(1)) + for match in _PEM_CERTS_RE.finditer(pem_bundle) + ] + if not der_certs: + raise ssl.SSLError("No root certificates specified") + + cert_array = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks) + ) + if not cert_array: + raise ssl.SSLError("Unable to allocate memory!") + + try: + for der_bytes in der_certs: + certdata = _cf_data_from_bytes(der_bytes) + if not certdata: + raise ssl.SSLError("Unable to allocate memory!") + cert = Security.SecCertificateCreateWithData( + CoreFoundation.kCFAllocatorDefault, certdata + ) + CoreFoundation.CFRelease(certdata) + if not cert: + raise ssl.SSLError("Unable to build cert object!") + + CoreFoundation.CFArrayAppendValue(cert_array, cert) + CoreFoundation.CFRelease(cert) + except Exception: + # We need to free the array before the exception bubbles further. + # We only want to do that if an error occurs: otherwise, the caller + # should free. + CoreFoundation.CFRelease(cert_array) + + return cert_array + + +def _is_cert(item): + """ + Returns True if a given CFTypeRef is a certificate. + """ + expected = Security.SecCertificateGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _is_identity(item): + """ + Returns True if a given CFTypeRef is an identity. + """ + expected = Security.SecIdentityGetTypeID() + return CoreFoundation.CFGetTypeID(item) == expected + + +def _temporary_keychain(): + """ + This function creates a temporary Mac keychain that we can use to work with + credentials. This keychain uses a one-time password and a temporary file to + store the data. We expect to have one keychain per socket. The returned + SecKeychainRef must be freed by the caller, including calling + SecKeychainDelete. + + Returns a tuple of the SecKeychainRef and the path to the temporary + directory that contains it. + """ + # Unfortunately, SecKeychainCreate requires a path to a keychain. This + # means we cannot use mkstemp to use a generic temporary file. Instead, + # we're going to create a temporary directory and a filename to use there. + # This filename will be 8 random bytes expanded into base64. We also need + # some random bytes to password-protect the keychain we're creating, so we + # ask for 40 random bytes. + random_bytes = os.urandom(40) + filename = base64.b64encode(random_bytes[:8]).decode('utf-8') + password = base64.b64encode(random_bytes[8:]) # Must be valid UTF-8 + tempdirectory = tempfile.mkdtemp() + + keychain_path = os.path.join(tempdirectory, filename).encode('utf-8') + + # We now want to create the keychain itself. + keychain = Security.SecKeychainRef() + status = Security.SecKeychainCreate( + keychain_path, + len(password), + password, + False, + None, + ctypes.byref(keychain) + ) + _assert_no_error(status) + + # Having created the keychain, we want to pass it off to the caller. + return keychain, tempdirectory + + +def _load_items_from_file(keychain, path): + """ + Given a single file, loads all the trust objects from it into arrays and + the keychain. + Returns a tuple of lists: the first list is a list of identities, the + second a list of certs. + """ + certificates = [] + identities = [] + result_array = None + + with open(path, 'rb') as f: + raw_filedata = f.read() + + try: + filedata = CoreFoundation.CFDataCreate( + CoreFoundation.kCFAllocatorDefault, + raw_filedata, + len(raw_filedata) + ) + result_array = CoreFoundation.CFArrayRef() + result = Security.SecItemImport( + filedata, # cert data + None, # Filename, leaving it out for now + None, # What the type of the file is, we don't care + None, # what's in the file, we don't care + 0, # import flags + None, # key params, can include passphrase in the future + keychain, # The keychain to insert into + ctypes.byref(result_array) # Results + ) + _assert_no_error(result) + + # A CFArray is not very useful to us as an intermediary + # representation, so we are going to extract the objects we want + # and then free the array. We don't need to keep hold of keys: the + # keychain already has them! + result_count = CoreFoundation.CFArrayGetCount(result_array) + for index in range(result_count): + item = CoreFoundation.CFArrayGetValueAtIndex( + result_array, index + ) + item = ctypes.cast(item, CoreFoundation.CFTypeRef) + + if _is_cert(item): + CoreFoundation.CFRetain(item) + certificates.append(item) + elif _is_identity(item): + CoreFoundation.CFRetain(item) + identities.append(item) + finally: + if result_array: + CoreFoundation.CFRelease(result_array) + + CoreFoundation.CFRelease(filedata) + + return (identities, certificates) + + +def _load_client_cert_chain(keychain, *paths): + """ + Load certificates and maybe keys from a number of files. Has the end goal + of returning a CFArray containing one SecIdentityRef, and then zero or more + SecCertificateRef objects, suitable for use as a client certificate trust + chain. + """ + # Ok, the strategy. + # + # This relies on knowing that macOS will not give you a SecIdentityRef + # unless you have imported a key into a keychain. This is a somewhat + # artificial limitation of macOS (for example, it doesn't necessarily + # affect iOS), but there is nothing inside Security.framework that lets you + # get a SecIdentityRef without having a key in a keychain. + # + # So the policy here is we take all the files and iterate them in order. + # Each one will use SecItemImport to have one or more objects loaded from + # it. We will also point at a keychain that macOS can use to work with the + # private key. + # + # Once we have all the objects, we'll check what we actually have. If we + # already have a SecIdentityRef in hand, fab: we'll use that. Otherwise, + # we'll take the first certificate (which we assume to be our leaf) and + # ask the keychain to give us a SecIdentityRef with that cert's associated + # key. + # + # We'll then return a CFArray containing the trust chain: one + # SecIdentityRef and then zero-or-more SecCertificateRef objects. The + # responsibility for freeing this CFArray will be with the caller. This + # CFArray must remain alive for the entire connection, so in practice it + # will be stored with a single SSLSocket, along with the reference to the + # keychain. + certificates = [] + identities = [] + + # Filter out bad paths. + paths = (path for path in paths if path) + + try: + for file_path in paths: + new_identities, new_certs = _load_items_from_file( + keychain, file_path + ) + identities.extend(new_identities) + certificates.extend(new_certs) + + # Ok, we have everything. The question is: do we have an identity? If + # not, we want to grab one from the first cert we have. + if not identities: + new_identity = Security.SecIdentityRef() + status = Security.SecIdentityCreateWithCertificate( + keychain, + certificates[0], + ctypes.byref(new_identity) + ) + _assert_no_error(status) + identities.append(new_identity) + + # We now want to release the original certificate, as we no longer + # need it. + CoreFoundation.CFRelease(certificates.pop(0)) + + # We now need to build a new CFArray that holds the trust chain. + trust_chain = CoreFoundation.CFArrayCreateMutable( + CoreFoundation.kCFAllocatorDefault, + 0, + ctypes.byref(CoreFoundation.kCFTypeArrayCallBacks), + ) + for item in itertools.chain(identities, certificates): + # ArrayAppendValue does a CFRetain on the item. That's fine, + # because the finally block will release our other refs to them. + CoreFoundation.CFArrayAppendValue(trust_chain, item) + + return trust_chain + finally: + for obj in itertools.chain(identities, certificates): + CoreFoundation.CFRelease(obj) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 000000000..fc00d1731 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,296 @@ +""" +This module provides a pool manager that uses Google App Engine's +`URLFetch Service <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + +Example usage:: + + from pip._vendor.urllib3 import PoolManager + from pip._vendor.urllib3.contrib.appengine import AppEngineManager, is_appengine_sandbox + + if is_appengine_sandbox(): + # AppEngineManager uses AppEngine's URLFetch API behind the scenes + http = AppEngineManager() + else: + # PoolManager uses a socket-level API behind the scenes + http = PoolManager() + + r = http.request('GET', 'https://google.com/') + +There are `limitations <https://cloud.google.com/appengine/docs/python/\ +urlfetch/#Python_Quotas_and_limits>`_ to the URLFetch service and it may not be +the best choice for your application. There are three options for using +urllib3 on Google App Engine: + +1. You can use :class:`AppEngineManager` with URLFetch. URLFetch is + cost-effective in many circumstances as long as your usage is within the + limitations. +2. You can use a normal :class:`~urllib3.PoolManager` by enabling sockets. + Sockets also have `limitations and restrictions + <https://cloud.google.com/appengine/docs/python/sockets/\ + #limitations-and-restrictions>`_ and have a lower free quota than URLFetch. + To use sockets, be sure to specify the following in your ``app.yaml``:: + + env_variables: + GAE_USE_SOCKETS_HTTPLIB : 'true' + +3. If you are using `App Engine Flexible +<https://cloud.google.com/appengine/docs/flexible/>`_, you can use the standard +:class:`PoolManager` without any configuration or special environment variables. +""" + +from __future__ import absolute_import +import logging +import os +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..packages.six import BytesIO +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation `here + <https://cloud.google.com/appengine/docs/python/urlfetch>`_. + + Notably it will raise an :class:`AppEnginePlatformError` if: + * URLFetch is not available. + * If you attempt to use this on App Engine Flexible, as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True, + urlfetch_retries=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/reference/urllib3.contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + self.urlfetch_retries = urlfetch_retries + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + follow_redirects = ( + redirect and + retries.redirect != 0 and + retries.total) + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=self.urlfetch_retries and follow_redirects, + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, retries=retries, **response_kw) + + # Handle redirect? + redirect_location = redirect and http_response.get_redirect_location() + if redirect_location: + # Check for redirect response + if (self.urlfetch_retries and retries.raise_on_redirect): + raise MaxRetryError(self, url, "too many redirects") + else: + if http_response.status == 303: + method = 'GET' + + try: + retries = retries.increment(method, url, response=http_response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + raise MaxRetryError(self, url, "too many redirects") + return http_response + + retries.sleep_for_retry(http_response) + log.debug("Redirecting %s -> %s", url, redirect_location) + redirect_url = urljoin(url, redirect_location) + return self.urlopen( + method, redirect_url, body, headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + # Check if we should retry the HTTP response. + has_retry_after = bool(http_response.getheader('Retry-After')) + if retries.is_retry(method, http_response.status, has_retry_after): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.debug("Retry: %s", url) + retries.sleep(http_response) + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + return HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return None # Defer to URLFetch's default. + if isinstance(timeout, Timeout): + if timeout._read is not None or timeout._connect is not None: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total or default URLFetch timeout.", + AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 000000000..888e0adba --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,112 @@ +""" +NTLM authenticating pool, contributed by erikcederstran + +Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 +""" +from __future__ import absolute_import + +from logging import getLogger +from ntlm import ntlm + +from .. import HTTPSConnectionPool +from ..packages.six.moves.http_client import HTTPSConnection + + +log = getLogger(__name__) + + +class NTLMConnectionPool(HTTPSConnectionPool): + """ + Implements an NTLM authentication version of an urllib3 connection pool + """ + + scheme = 'https' + + def __init__(self, user, pw, authurl, *args, **kwargs): + """ + authurl is a random URL on the server that is protected by NTLM. + user is the Windows user, probably in the DOMAIN\\username format. + pw is the password for the user. + """ + super(NTLMConnectionPool, self).__init__(*args, **kwargs) + self.authurl = authurl + self.rawuser = user + user_parts = user.split('\\', 1) + self.domain = user_parts[0].upper() + self.user = user_parts[1] + self.pw = pw + + def _new_conn(self): + # Performs the NTLM handshake that secures the connection. The socket + # must be kept open while requests are performed. + self.num_connections += 1 + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) + + headers = {} + headers['Connection'] = 'Keep-Alive' + req_header = 'Authorization' + resp_header = 'www-authenticate' + + conn = HTTPSConnection(host=self.host, port=self.port) + + # Send negotiation message + headers[req_header] = ( + 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + reshdr = dict(res.getheaders()) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) + + # Remove the reference to the socket, so that it can not be closed by + # the response object (we want to keep the socket open) + res.fp = None + + # Server should respond with a challenge message + auth_header_values = reshdr[resp_header].split(', ') + auth_header_value = None + for s in auth_header_values: + if s[:5] == 'NTLM ': + auth_header_value = s[5:] + if auth_header_value is None: + raise Exception('Unexpected %s response header: %s' % + (resp_header, reshdr[resp_header])) + + # Send authentication message + ServerChallenge, NegotiateFlags = \ + ntlm.parse_NTLM_CHALLENGE_MESSAGE(auth_header_value) + auth_msg = ntlm.create_NTLM_AUTHENTICATE_MESSAGE(ServerChallenge, + self.user, + self.domain, + self.pw, + NegotiateFlags) + headers[req_header] = 'NTLM %s' % auth_msg + log.debug('Request headers: %s', headers) + conn.request('GET', self.authurl, None, headers) + res = conn.getresponse() + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) + if res.status != 200: + if res.status == 401: + raise Exception('Server rejected request: wrong ' + 'username or password') + raise Exception('Wrong server response: %s %s' % + (res.status, res.reason)) + + res.fp = None + log.debug('Connection established') + return conn + + def urlopen(self, method, url, body=None, headers=None, retries=3, + redirect=True, assert_same_host=True): + if headers is None: + headers = {} + headers['Connection'] = 'Keep-Alive' + return super(NTLMConnectionPool, self).urlopen(method, url, body, + headers, retries, + redirect, + assert_same_host) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 000000000..f13e2bc92 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,455 @@ +""" +SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. + +This needs the following packages installed: + +* pyOpenSSL (tested with 16.0.0) +* cryptography (minimum 1.3.4, from pyopenssl) +* idna (minimum 2.0, from cryptography) + +However, pyopenssl depends on cryptography, which depends on idna, so while we +use all three directly here we end up having relatively few packages required. + +You can install them with the following command: + + pip install pyopenssl cryptography idna + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: + + try: + import urllib3.contrib.pyopenssl + urllib3.contrib.pyopenssl.inject_into_urllib3() + except ImportError: + pass + +Now you can use :mod:`urllib3` as you normally would, and it will support SNI +when the required modules are installed. + +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) +""" +from __future__ import absolute_import + +import OpenSSL.SSL +from cryptography import x509 +from cryptography.hazmat.backends.openssl import backend as openssl_backend +from cryptography.hazmat.backends.openssl.x509 import _Certificate + +from socket import timeout, error as SocketError +from io import BytesIO + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +import logging +import ssl +from ..packages import six +import sys + +from .. import util + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works. +HAS_SNI = True + +# Map from urllib3 to PyOpenSSL compatible parameter-values. +_openssl_versions = { + ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, + ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, +} + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + +_stdlib_to_openssl_verify = { + ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, + ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, +} +_openssl_to_stdlib_verify = dict( + (v, k) for k, v in _stdlib_to_openssl_verify.items() +) + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + + +log = logging.getLogger(__name__) + + +def inject_into_urllib3(): + 'Monkey-patch urllib3 with PyOpenSSL-backed SSL-support.' + + _validate_dependencies_met() + + util.ssl_.SSLContext = PyOpenSSLContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True + util.ssl_.IS_PYOPENSSL = True + + +def extract_from_urllib3(): + 'Undo monkey-patching by :func:`inject_into_urllib3`.' + + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False + util.ssl_.IS_PYOPENSSL = False + + +def _validate_dependencies_met(): + """ + Verifies that PyOpenSSL's package-level dependencies have been met. + Throws `ImportError` if they are not met. + """ + # Method added in `cryptography==1.1`; not available in older versions + from cryptography.x509.extensions import Extensions + if getattr(Extensions, "get_extension_for_class", None) is None: + raise ImportError("'cryptography' module missing required functionality. " + "Try upgrading to v1.3.4 or newer.") + + # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509 + # attribute is only present on those versions. + from OpenSSL.crypto import X509 + x509 = X509() + if getattr(x509, "_x509", None) is None: + raise ImportError("'pyOpenSSL' module missing required functionality. " + "Try upgrading to v0.14 or newer.") + + +def _dnsname_to_stdlib(name): + """ + Converts a dNSName SubjectAlternativeName field to the form used by the + standard library on the given Python version. + + Cryptography produces a dNSName as a unicode string that was idna-decoded + from ASCII bytes. We need to idna-encode that string to get it back, and + then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib + uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8). + """ + def idna_encode(name): + """ + Borrowed wholesale from the Python Cryptography Project. It turns out + that we can't just safely call `idna.encode`: it can explode for + wildcard names. This avoids that problem. + """ + from pip._vendor import idna + + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + + name = idna_encode(name) + if sys.version_info >= (3, 0): + name = name.decode('utf-8') + return name + + +def get_subj_alt_name(peer_cert): + """ + Given an PyOpenSSL certificate, provides all the subject alternative names. + """ + # Pass the cert to cryptography, which has much better APIs for this. + if hasattr(peer_cert, "to_cryptography"): + cert = peer_cert.to_cryptography() + else: + # This is technically using private APIs, but should work across all + # relevant versions before PyOpenSSL got a proper API for this. + cert = _Certificate(openssl_backend, peer_cert._x509) + + # We want to find the SAN extension. Ask Cryptography to locate it (it's + # faster than looping in Python) + try: + ext = cert.extensions.get_extension_for_class( + x509.SubjectAlternativeName + ).value + except x509.ExtensionNotFound: + # No such extension, return the empty list. + return [] + except (x509.DuplicateExtension, x509.UnsupportedExtension, + x509.UnsupportedGeneralNameType, UnicodeError) as e: + # A problem has been found with the quality of the certificate. Assume + # no SAN field is present. + log.warning( + "A problem was encountered with the certificate that prevented " + "urllib3 from finding the SubjectAlternativeName field. This can " + "affect certificate validation. The error was %s", + e, + ) + return [] + + # We want to return dNSName and iPAddress fields. We need to cast the IPs + # back to strings because the match_hostname function wants them as + # strings. + # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8 + # decoded. This is pretty frustrating, but that's what the standard library + # does with certificates, and so we need to attempt to do the same. + names = [ + ('DNS', _dnsname_to_stdlib(name)) + for name in ext.get_values_for_type(x509.DNSName) + ] + names.extend( + ('IP Address', str(name)) + for name in ext.get_values_for_type(x509.IPAddress) + ) + + return names + + +class WrappedSocket(object): + '''API-compatibility wrapper for Python OpenSSL's Connection-class. + + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): + self.connection = connection + self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(self.socket, self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) + + def settimeout(self, timeout): + return self.socket.settimeout(timeout) + + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + wr = util.wait_for_write(self.socket, self.socket.gettimeout()) + if not wr: + raise timeout() + continue + except OpenSSL.SSL.SysCallError as e: + raise SocketError(str(e)) + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() + + def close(self): + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + x509 = self.connection.get_peer_certificate() + + if not x509: + return x509 + + if binary_form: + return OpenSSL.crypto.dump_certificate( + OpenSSL.crypto.FILETYPE_ASN1, + x509) + + return { + 'subject': ( + (('commonName', x509.get_subject().CN),), + ), + 'subjectAltName': get_subj_alt_name(x509) + } + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + + +class PyOpenSSLContext(object): + """ + I am a wrapper class for the PyOpenSSL ``Context`` object. I am responsible + for translating the interface of the standard library ``SSLContext`` object + to calls into PyOpenSSL. + """ + def __init__(self, protocol): + self.protocol = _openssl_versions[protocol] + self._ctx = OpenSSL.SSL.Context(self.protocol) + self._options = 0 + self.check_hostname = False + + @property + def options(self): + return self._options + + @options.setter + def options(self, value): + self._options = value + self._ctx.set_options(value) + + @property + def verify_mode(self): + return _openssl_to_stdlib_verify[self._ctx.get_verify_mode()] + + @verify_mode.setter + def verify_mode(self, value): + self._ctx.set_verify( + _stdlib_to_openssl_verify[value], + _verify_callback + ) + + def set_default_verify_paths(self): + self._ctx.set_default_verify_paths() + + def set_ciphers(self, ciphers): + if isinstance(ciphers, six.text_type): + ciphers = ciphers.encode('utf-8') + self._ctx.set_cipher_list(ciphers) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + if cafile is not None: + cafile = cafile.encode('utf-8') + if capath is not None: + capath = capath.encode('utf-8') + self._ctx.load_verify_locations(cafile, capath) + if cadata is not None: + self._ctx.load_verify_locations(BytesIO(cadata)) + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._ctx.use_certificate_file(certfile) + if password is not None: + self._ctx.set_passwd_cb(lambda max_length, prompt_twice, userdata: password) + self._ctx.use_privatekey_file(keyfile or certfile) + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + cnx = OpenSSL.SSL.Connection(self._ctx, sock) + + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') + + if server_hostname is not None: + cnx.set_tlsext_host_name(server_hostname) + + cnx.set_connect_state() + + while True: + try: + cnx.do_handshake() + except OpenSSL.SSL.WantReadError: + rd = util.wait_for_read(sock, sock.gettimeout()) + if not rd: + raise timeout('select timed out') + continue + except OpenSSL.SSL.Error as e: + raise ssl.SSLError('bad handshake: %r' % e) + break + + return WrappedSocket(cnx, sock) + + +def _verify_callback(cnx, x509, err_no, err_depth, return_code): + return err_no == 0 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 000000000..77cf861c3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,810 @@ +""" +SecureTranport support for urllib3 via ctypes. + +This makes platform-native TLS available to urllib3 users on macOS without the +use of a compiler. This is an important feature because the Python Package +Index is moving to become a TLSv1.2-or-higher server, and the default OpenSSL +that ships with macOS is not capable of doing TLSv1.2. The only way to resolve +this is to give macOS users an alternative solution to the problem, and that +solution is to use SecureTransport. + +We use ctypes here because this solution must not require a compiler. That's +because pip is not allowed to require a compiler either. + +This is not intended to be a seriously long-term solution to this problem. +The hope is that PEP 543 will eventually solve this issue for us, at which +point we can retire this contrib module. But in the short term, we need to +solve the impending tire fire that is Python on Mac without this kind of +contrib module. So...here we are. + +To use this module, simply import and inject it:: + + import urllib3.contrib.securetransport + urllib3.contrib.securetransport.inject_into_urllib3() + +Happy TLSing! +""" +from __future__ import absolute_import + +import contextlib +import ctypes +import errno +import os.path +import shutil +import socket +import ssl +import threading +import weakref + +from .. import util +from ._securetransport.bindings import ( + Security, SecurityConst, CoreFoundation +) +from ._securetransport.low_level import ( + _assert_no_error, _cert_array_from_pem, _temporary_keychain, + _load_client_cert_chain +) + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from ..packages.backports.makefile import backport_makefile + +try: + memoryview(b'') +except NameError: + raise ImportError("SecureTransport only works on Pythons with memoryview") + +__all__ = ['inject_into_urllib3', 'extract_from_urllib3'] + +# SNI always works +HAS_SNI = True + +orig_util_HAS_SNI = util.HAS_SNI +orig_util_SSLContext = util.ssl_.SSLContext + +# This dictionary is used by the read callback to obtain a handle to the +# calling wrapped socket. This is a pretty silly approach, but for now it'll +# do. I feel like I should be able to smuggle a handle to the wrapped socket +# directly in the SSLConnectionRef, but for now this approach will work I +# guess. +# +# We need to lock around this structure for inserts, but we don't do it for +# reads/writes in the callbacks. The reasoning here goes as follows: +# +# 1. It is not possible to call into the callbacks before the dictionary is +# populated, so once in the callback the id must be in the dictionary. +# 2. The callbacks don't mutate the dictionary, they only read from it, and +# so cannot conflict with any of the insertions. +# +# This is good: if we had to lock in the callbacks we'd drastically slow down +# the performance of this code. +_connection_refs = weakref.WeakValueDictionary() +_connection_ref_lock = threading.Lock() + +# Limit writes to 16kB. This is OpenSSL's limit, but we'll cargo-cult it over +# for no better reason than we need *a* limit, and this one is right there. +SSL_WRITE_BLOCKSIZE = 16384 + +# This is our equivalent of util.ssl_.DEFAULT_CIPHERS, but expanded out to +# individual cipher suites. We need to do this becuase this is how +# SecureTransport wants them. +CIPHER_SUITES = [ + SecurityConst.TLS_AES_256_GCM_SHA384, + SecurityConst.TLS_CHACHA20_POLY1305_SHA256, + SecurityConst.TLS_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_DHE_RSA_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_DHE_DSS_WITH_AES_128_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_256_GCM_SHA384, + SecurityConst.TLS_RSA_WITH_AES_128_GCM_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA256, + SecurityConst.TLS_RSA_WITH_AES_256_CBC_SHA, + SecurityConst.TLS_RSA_WITH_AES_128_CBC_SHA, +] + +# Basically this is simple: for PROTOCOL_SSLv23 we turn it into a low of +# TLSv1 and a high of TLSv1.2. For everything else, we pin to that version. +_protocol_to_min_max = { + ssl.PROTOCOL_SSLv23: (SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol12), +} + +if hasattr(ssl, "PROTOCOL_SSLv2"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv2] = ( + SecurityConst.kSSLProtocol2, SecurityConst.kSSLProtocol2 + ) +if hasattr(ssl, "PROTOCOL_SSLv3"): + _protocol_to_min_max[ssl.PROTOCOL_SSLv3] = ( + SecurityConst.kSSLProtocol3, SecurityConst.kSSLProtocol3 + ) +if hasattr(ssl, "PROTOCOL_TLSv1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1] = ( + SecurityConst.kTLSProtocol1, SecurityConst.kTLSProtocol1 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_1"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_1] = ( + SecurityConst.kTLSProtocol11, SecurityConst.kTLSProtocol11 + ) +if hasattr(ssl, "PROTOCOL_TLSv1_2"): + _protocol_to_min_max[ssl.PROTOCOL_TLSv1_2] = ( + SecurityConst.kTLSProtocol12, SecurityConst.kTLSProtocol12 + ) +if hasattr(ssl, "PROTOCOL_TLS"): + _protocol_to_min_max[ssl.PROTOCOL_TLS] = _protocol_to_min_max[ssl.PROTOCOL_SSLv23] + + +def inject_into_urllib3(): + """ + Monkey-patch urllib3 with SecureTransport-backed SSL-support. + """ + util.ssl_.SSLContext = SecureTransportContext + util.HAS_SNI = HAS_SNI + util.ssl_.HAS_SNI = HAS_SNI + util.IS_SECURETRANSPORT = True + util.ssl_.IS_SECURETRANSPORT = True + + +def extract_from_urllib3(): + """ + Undo monkey-patching by :func:`inject_into_urllib3`. + """ + util.ssl_.SSLContext = orig_util_SSLContext + util.HAS_SNI = orig_util_HAS_SNI + util.ssl_.HAS_SNI = orig_util_HAS_SNI + util.IS_SECURETRANSPORT = False + util.ssl_.IS_SECURETRANSPORT = False + + +def _read_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport read callback. This is called by ST to request that data + be returned from the socket. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + requested_length = data_length_pointer[0] + + timeout = wrapped_socket.gettimeout() + error = None + read_count = 0 + buffer = (ctypes.c_char * requested_length).from_address(data_buffer) + buffer_view = memoryview(buffer) + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + readables = util.wait_for_read([base_socket], timeout) + if not readables: + raise socket.error(errno.EAGAIN, 'timed out') + + # We need to tell ctypes that we have a buffer that can be + # written to. Upsettingly, we do that like this: + chunk_size = base_socket.recv_into( + buffer_view[read_count:requested_length] + ) + read_count += chunk_size + if not chunk_size: + if not read_count: + return SecurityConst.errSSLClosedGraceful + break + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + if error == errno.ECONNRESET: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = read_count + + if read_count != requested_length: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +def _write_callback(connection_id, data_buffer, data_length_pointer): + """ + SecureTransport write callback. This is called by ST to request that data + actually be sent on the network. + """ + wrapped_socket = None + try: + wrapped_socket = _connection_refs.get(connection_id) + if wrapped_socket is None: + return SecurityConst.errSSLInternal + base_socket = wrapped_socket.socket + + bytes_to_write = data_length_pointer[0] + data = ctypes.string_at(data_buffer, bytes_to_write) + + timeout = wrapped_socket.gettimeout() + error = None + sent = 0 + + try: + while sent < bytes_to_write: + if timeout is None or timeout >= 0: + writables = util.wait_for_write([base_socket], timeout) + if not writables: + raise socket.error(errno.EAGAIN, 'timed out') + chunk_sent = base_socket.send(data) + sent += chunk_sent + + # This has some needless copying here, but I'm not sure there's + # much value in optimising this data path. + data = data[chunk_sent:] + except (socket.error) as e: + error = e.errno + + if error is not None and error != errno.EAGAIN: + if error == errno.ECONNRESET: + return SecurityConst.errSSLClosedAbort + raise + + data_length_pointer[0] = sent + if sent != bytes_to_write: + return SecurityConst.errSSLWouldBlock + + return 0 + except Exception as e: + if wrapped_socket is not None: + wrapped_socket._exception = e + return SecurityConst.errSSLInternal + + +# We need to keep these two objects references alive: if they get GC'd while +# in use then SecureTransport could attempt to call a function that is in freed +# memory. That would be...uh...bad. Yeah, that's the word. Bad. +_read_callback_pointer = Security.SSLReadFunc(_read_callback) +_write_callback_pointer = Security.SSLWriteFunc(_write_callback) + + +class WrappedSocket(object): + """ + API-compatibility wrapper for Python's OpenSSL wrapped socket object. + + Note: _makefile_refs, _drop(), and _reuse() are needed for the garbage + collector of PyPy. + """ + def __init__(self, socket): + self.socket = socket + self.context = None + self._makefile_refs = 0 + self._closed = False + self._exception = None + self._keychain = None + self._keychain_dir = None + self._client_cert_chain = None + + # We save off the previously-configured timeout and then set it to + # zero. This is done because we use select and friends to handle the + # timeouts, but if we leave the timeout set on the lower socket then + # Python will "kindly" call select on that socket again for us. Avoid + # that by forcing the timeout to zero. + self._timeout = self.socket.gettimeout() + self.socket.settimeout(0) + + @contextlib.contextmanager + def _raise_on_error(self): + """ + A context manager that can be used to wrap calls that do I/O from + SecureTransport. If any of the I/O callbacks hit an exception, this + context manager will correctly propagate the exception after the fact. + This avoids silently swallowing those exceptions. + + It also correctly forces the socket closed. + """ + self._exception = None + + # We explicitly don't catch around this yield because in the unlikely + # event that an exception was hit in the block we don't want to swallow + # it. + yield + if self._exception is not None: + exception, self._exception = self._exception, None + self.close() + raise exception + + def _set_ciphers(self): + """ + Sets up the allowed ciphers. By default this matches the set in + util.ssl_.DEFAULT_CIPHERS, at least as supported by macOS. This is done + custom and doesn't allow changing at this time, mostly because parsing + OpenSSL cipher strings is going to be a freaking nightmare. + """ + ciphers = (Security.SSLCipherSuite * len(CIPHER_SUITES))(*CIPHER_SUITES) + result = Security.SSLSetEnabledCiphers( + self.context, ciphers, len(CIPHER_SUITES) + ) + _assert_no_error(result) + + def _custom_validate(self, verify, trust_bundle): + """ + Called when we have set custom validation. We do this in two cases: + first, when cert validation is entirely disabled; and second, when + using a custom trust DB. + """ + # If we disabled cert validation, just say: cool. + if not verify: + return + + # We want data in memory, so load it up. + if os.path.isfile(trust_bundle): + with open(trust_bundle, 'rb') as f: + trust_bundle = f.read() + + cert_array = None + trust = Security.SecTrustRef() + + try: + # Get a CFArray that contains the certs we want. + cert_array = _cert_array_from_pem(trust_bundle) + + # Ok, now the hard part. We want to get the SecTrustRef that ST has + # created for this connection, shove our CAs into it, tell ST to + # ignore everything else it knows, and then ask if it can build a + # chain. This is a buuuunch of code. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + raise ssl.SSLError("Failed to copy trust reference") + + result = Security.SecTrustSetAnchorCertificates(trust, cert_array) + _assert_no_error(result) + + result = Security.SecTrustSetAnchorCertificatesOnly(trust, True) + _assert_no_error(result) + + trust_result = Security.SecTrustResultType() + result = Security.SecTrustEvaluate( + trust, ctypes.byref(trust_result) + ) + _assert_no_error(result) + finally: + if trust: + CoreFoundation.CFRelease(trust) + + if cert_array is None: + CoreFoundation.CFRelease(cert_array) + + # Ok, now we can look at what the result was. + successes = ( + SecurityConst.kSecTrustResultUnspecified, + SecurityConst.kSecTrustResultProceed + ) + if trust_result.value not in successes: + raise ssl.SSLError( + "certificate verify failed, error code: %d" % + trust_result.value + ) + + def handshake(self, + server_hostname, + verify, + trust_bundle, + min_version, + max_version, + client_cert, + client_key, + client_key_passphrase): + """ + Actually performs the TLS handshake. This is run automatically by + wrapped socket, and shouldn't be needed in user code. + """ + # First, we do the initial bits of connection setup. We need to create + # a context, set its I/O funcs, and set the connection reference. + self.context = Security.SSLCreateContext( + None, SecurityConst.kSSLClientSide, SecurityConst.kSSLStreamType + ) + result = Security.SSLSetIOFuncs( + self.context, _read_callback_pointer, _write_callback_pointer + ) + _assert_no_error(result) + + # Here we need to compute the handle to use. We do this by taking the + # id of self modulo 2**31 - 1. If this is already in the dictionary, we + # just keep incrementing by one until we find a free space. + with _connection_ref_lock: + handle = id(self) % 2147483647 + while handle in _connection_refs: + handle = (handle + 1) % 2147483647 + _connection_refs[handle] = self + + result = Security.SSLSetConnection(self.context, handle) + _assert_no_error(result) + + # If we have a server hostname, we should set that too. + if server_hostname: + if not isinstance(server_hostname, bytes): + server_hostname = server_hostname.encode('utf-8') + + result = Security.SSLSetPeerDomainName( + self.context, server_hostname, len(server_hostname) + ) + _assert_no_error(result) + + # Setup the ciphers. + self._set_ciphers() + + # Set the minimum and maximum TLS versions. + result = Security.SSLSetProtocolVersionMin(self.context, min_version) + _assert_no_error(result) + result = Security.SSLSetProtocolVersionMax(self.context, max_version) + _assert_no_error(result) + + # If there's a trust DB, we need to use it. We do that by telling + # SecureTransport to break on server auth. We also do that if we don't + # want to validate the certs at all: we just won't actually do any + # authing in that case. + if not verify or trust_bundle is not None: + result = Security.SSLSetSessionOption( + self.context, + SecurityConst.kSSLSessionOptionBreakOnServerAuth, + True + ) + _assert_no_error(result) + + # If there's a client cert, we need to use it. + if client_cert: + self._keychain, self._keychain_dir = _temporary_keychain() + self._client_cert_chain = _load_client_cert_chain( + self._keychain, client_cert, client_key + ) + result = Security.SSLSetCertificate( + self.context, self._client_cert_chain + ) + _assert_no_error(result) + + while True: + with self._raise_on_error(): + result = Security.SSLHandshake(self.context) + + if result == SecurityConst.errSSLWouldBlock: + raise socket.timeout("handshake timed out") + elif result == SecurityConst.errSSLServerAuthCompleted: + self._custom_validate(verify, trust_bundle) + continue + else: + _assert_no_error(result) + break + + def fileno(self): + return self.socket.fileno() + + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, bufsiz): + buffer = ctypes.create_string_buffer(bufsiz) + bytes_read = self.recv_into(buffer, bufsiz) + data = buffer[:bytes_read] + return data + + def recv_into(self, buffer, nbytes=None): + # Read short on EOF. + if self._closed: + return 0 + + if nbytes is None: + nbytes = len(buffer) + + buffer = (ctypes.c_char * nbytes).from_buffer(buffer) + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLRead( + self.context, buffer, nbytes, ctypes.byref(processed_bytes) + ) + + # There are some result codes that we want to treat as "not always + # errors". Specifically, those are errSSLWouldBlock, + # errSSLClosedGraceful, and errSSLClosedNoNotify. + if (result == SecurityConst.errSSLWouldBlock): + # If we didn't process any bytes, then this was just a time out. + # However, we can get errSSLWouldBlock in situations when we *did* + # read some data, and in those cases we should just read "short" + # and return. + if processed_bytes.value == 0: + # Timed out, no data read. + raise socket.timeout("recv timed out") + elif result in (SecurityConst.errSSLClosedGraceful, SecurityConst.errSSLClosedNoNotify): + # The remote peer has closed this connection. We should do so as + # well. Note that we don't actually return here because in + # principle this could actually be fired along with return data. + # It's unlikely though. + self.close() + else: + _assert_no_error(result) + + # Ok, we read and probably succeeded. We should return whatever data + # was actually read. + return processed_bytes.value + + def settimeout(self, timeout): + self._timeout = timeout + + def gettimeout(self): + return self._timeout + + def send(self, data): + processed_bytes = ctypes.c_size_t(0) + + with self._raise_on_error(): + result = Security.SSLWrite( + self.context, data, len(data), ctypes.byref(processed_bytes) + ) + + if result == SecurityConst.errSSLWouldBlock and processed_bytes.value == 0: + # Timed out + raise socket.timeout("send timed out") + else: + _assert_no_error(result) + + # We sent, and probably succeeded. Tell them how much we sent. + return processed_bytes.value + + def sendall(self, data): + total_sent = 0 + while total_sent < len(data): + sent = self.send(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + with self._raise_on_error(): + Security.SSLClose(self.context) + + def close(self): + # TODO: should I do clean shutdown here? Do I have to? + if self._makefile_refs < 1: + self._closed = True + if self.context: + CoreFoundation.CFRelease(self.context) + self.context = None + if self._client_cert_chain: + CoreFoundation.CFRelease(self._client_cert_chain) + self._client_cert_chain = None + if self._keychain: + Security.SecKeychainDelete(self._keychain) + CoreFoundation.CFRelease(self._keychain) + shutil.rmtree(self._keychain_dir) + self._keychain = self._keychain_dir = None + return self.socket.close() + else: + self._makefile_refs -= 1 + + def getpeercert(self, binary_form=False): + # Urgh, annoying. + # + # Here's how we do this: + # + # 1. Call SSLCopyPeerTrust to get hold of the trust object for this + # connection. + # 2. Call SecTrustGetCertificateAtIndex for index 0 to get the leaf. + # 3. To get the CN, call SecCertificateCopyCommonName and process that + # string so that it's of the appropriate type. + # 4. To get the SAN, we need to do something a bit more complex: + # a. Call SecCertificateCopyValues to get the data, requesting + # kSecOIDSubjectAltName. + # b. Mess about with this dictionary to try to get the SANs out. + # + # This is gross. Really gross. It's going to be a few hundred LoC extra + # just to repeat something that SecureTransport can *already do*. So my + # operating assumption at this time is that what we want to do is + # instead to just flag to urllib3 that it shouldn't do its own hostname + # validation when using SecureTransport. + if not binary_form: + raise ValueError( + "SecureTransport only supports dumping binary certs" + ) + trust = Security.SecTrustRef() + certdata = None + der_bytes = None + + try: + # Grab the trust store. + result = Security.SSLCopyPeerTrust( + self.context, ctypes.byref(trust) + ) + _assert_no_error(result) + if not trust: + # Probably we haven't done the handshake yet. No biggie. + return None + + cert_count = Security.SecTrustGetCertificateCount(trust) + if not cert_count: + # Also a case that might happen if we haven't handshaked. + # Handshook? Handshaken? + return None + + leaf = Security.SecTrustGetCertificateAtIndex(trust, 0) + assert leaf + + # Ok, now we want the DER bytes. + certdata = Security.SecCertificateCopyData(leaf) + assert certdata + + data_length = CoreFoundation.CFDataGetLength(certdata) + data_buffer = CoreFoundation.CFDataGetBytePtr(certdata) + der_bytes = ctypes.string_at(data_buffer, data_length) + finally: + if certdata: + CoreFoundation.CFRelease(certdata) + if trust: + CoreFoundation.CFRelease(trust) + + return der_bytes + + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + def makefile(self, mode="r", buffering=None, *args, **kwargs): + # We disable buffering with SecureTransport because it conflicts with + # the buffering that ST does internally (see issue #1153 for more). + buffering = 0 + return backport_makefile(self, mode, buffering, *args, **kwargs) + +WrappedSocket.makefile = makefile + + +class SecureTransportContext(object): + """ + I am a wrapper class for the SecureTransport library, to translate the + interface of the standard library ``SSLContext`` object to calls into + SecureTransport. + """ + def __init__(self, protocol): + self._min_version, self._max_version = _protocol_to_min_max[protocol] + self._options = 0 + self._verify = False + self._trust_bundle = None + self._client_cert = None + self._client_key = None + self._client_key_passphrase = None + + @property + def check_hostname(self): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + return True + + @check_hostname.setter + def check_hostname(self, value): + """ + SecureTransport cannot have its hostname checking disabled. For more, + see the comment on getpeercert() in this file. + """ + pass + + @property + def options(self): + # TODO: Well, crap. + # + # So this is the bit of the code that is the most likely to cause us + # trouble. Essentially we need to enumerate all of the SSL options that + # users might want to use and try to see if we can sensibly translate + # them, or whether we should just ignore them. + return self._options + + @options.setter + def options(self, value): + # TODO: Update in line with above. + self._options = value + + @property + def verify_mode(self): + return ssl.CERT_REQUIRED if self._verify else ssl.CERT_NONE + + @verify_mode.setter + def verify_mode(self, value): + self._verify = True if value == ssl.CERT_REQUIRED else False + + def set_default_verify_paths(self): + # So, this has to do something a bit weird. Specifically, what it does + # is nothing. + # + # This means that, if we had previously had load_verify_locations + # called, this does not undo that. We need to do that because it turns + # out that the rest of the urllib3 code will attempt to load the + # default verify paths if it hasn't been told about any paths, even if + # the context itself was sometime earlier. We resolve that by just + # ignoring it. + pass + + def load_default_certs(self): + return self.set_default_verify_paths() + + def set_ciphers(self, ciphers): + # For now, we just require the default cipher string. + if ciphers != util.ssl_.DEFAULT_CIPHERS: + raise ValueError( + "SecureTransport doesn't support custom cipher strings" + ) + + def load_verify_locations(self, cafile=None, capath=None, cadata=None): + # OK, we only really support cadata and cafile. + if capath is not None: + raise ValueError( + "SecureTransport does not support cert directories" + ) + + self._trust_bundle = cafile or cadata + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._client_cert = certfile + self._client_key = keyfile + self._client_cert_passphrase = password + + def wrap_socket(self, sock, server_side=False, + do_handshake_on_connect=True, suppress_ragged_eofs=True, + server_hostname=None): + # So, what do we do here? Firstly, we assert some properties. This is a + # stripped down shim, so there is some functionality we don't support. + # See PEP 543 for the real deal. + assert not server_side + assert do_handshake_on_connect + assert suppress_ragged_eofs + + # Ok, we're good to go. Now we want to create the wrapped socket object + # and store it in the appropriate place. + wrapped_socket = WrappedSocket(sock) + + # Now we can handshake + wrapped_socket.handshake( + server_hostname, self._verify, self._trust_bundle, + self._min_version, self._max_version, self._client_cert, + self._client_key, self._client_key_passphrase + ) + return wrapped_socket diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 000000000..6c99a75c8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +""" +This module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +The SOCKS implementation supports the full range of urllib3 features. It also +supports the following SOCKS features: + +- SOCKS4 +- SOCKS4a +- SOCKS5 +- Usernames and passwords for the SOCKS proxy + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. You must use a domain + name. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + proxy_rdns=self._socks_options['rdns'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = False + elif parsed.scheme == 'socks5h': + socks_version = socks.PROXY_TYPE_SOCKS5 + rdns = True + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = False + elif parsed.scheme == 'socks4a': + socks_version = socks.PROXY_TYPE_SOCKS4 + rdns = True + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + 'rdns': rdns + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 000000000..670a63e2d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/exceptions.py @@ -0,0 +1,246 @@ +from __future__ import absolute_import +from .packages.six.moves.http_client import ( + IncompleteRead as httplib_IncompleteRead +) +# Base Exceptions + + +class HTTPError(Exception): + "Base exception used by this module." + pass + + +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + +class PoolError(HTTPError): + "Base exception for errors caused within a pool." + def __init__(self, pool, message): + self.pool = pool + HTTPError.__init__(self, "%s: %s" % (pool, message)) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, None) + + +class RequestError(PoolError): + "Base exception for PoolErrors that have associated URLs." + def __init__(self, pool, url, message): + self.url = url + PoolError.__init__(self, pool, message) + + def __reduce__(self): + # For pickling purposes. + return self.__class__, (None, self.url, None) + + +class SSLError(HTTPError): + "Raised when SSL certificate fails in an HTTPS connection." + pass + + +class ProxyError(HTTPError): + "Raised when the connection to a proxy fails." + pass + + +class DecodeError(HTTPError): + "Raised when automatic decoding based on Content-Type fails." + pass + + +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions + +class MaxRetryError(RequestError): + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ + + def __init__(self, pool, url, reason=None): + self.reason = reason + + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) + + RequestError.__init__(self, pool, url, message) + + +class HostChangedError(RequestError): + "Raised when an existing pool gets a request for a foreign host." + + def __init__(self, pool, url, retries=3): + message = "Tried to open a foreign host with url: %s" % url + RequestError.__init__(self, pool, url, message) + self.retries = retries + + +class TimeoutStateError(HTTPError): + """ Raised when passing an invalid state to a timeout """ + pass + + +class TimeoutError(HTTPError): + """ Raised when a socket timeout error occurs. + + Catching this error will catch both :exc:`ReadTimeoutErrors + <ReadTimeoutError>` and :exc:`ConnectTimeoutErrors <ConnectTimeoutError>`. + """ + pass + + +class ReadTimeoutError(TimeoutError, RequestError): + "Raised when a socket timeout occurs while receiving data from a server" + pass + + +# This timeout error does not have a URL attached and needs to inherit from the +# base HTTPError +class ConnectTimeoutError(TimeoutError): + "Raised when a socket timeout occurs while connecting to a server" + pass + + +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + +class EmptyPoolError(PoolError): + "Raised when a pool runs out of connections and no more are allowed." + pass + + +class ClosedPoolError(PoolError): + "Raised when a request enters a pool after the pool has been closed." + pass + + +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): + "Raised when get_host or similar fails to parse the URL input." + + def __init__(self, location): + message = "Failed to parse: %s" % location + HTTPError.__init__(self, message) + + self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when perfoming security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class BodyNotHttplibCompatible(HTTPError): + """ + Body should be httplib.HTTPResponse like (have an fp attribute which + returns raw chunks) for read_chunked(). + """ + pass + + +class IncompleteRead(HTTPError, httplib_IncompleteRead): + """ + Response length doesn't match expected Content-Length + + Subclass of http_client.IncompleteRead to allow int value + for `partial` to avoid creating large objects on streamed + reads. + """ + def __init__(self, partial, expected): + super(IncompleteRead, self).__init__(partial, expected) + + def __repr__(self): + return ('IncompleteRead(%i bytes read, ' + '%i more expected)' % (self.partial, self.expected)) + + +class InvalidHeader(HTTPError): + "The header provided was somehow invalid." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) + + +class UnrewindableBodyError(HTTPError): + "urllib3 encountered an error when trying to rewind a body" + pass diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py new file mode 100644 index 000000000..8e1562160 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/fields.py @@ -0,0 +1,178 @@ +from __future__ import absolute_import +import email.utils +import mimetypes + +from .packages import six + + +def guess_content_type(filename, default='application/octet-stream'): + """ + Guess the "Content-Type" of a file. + + :param filename: + The filename to guess the "Content-Type" of using :mod:`mimetypes`. + :param default: + If no "Content-Type" can be guessed, default to `default`. + """ + if filename: + return mimetypes.guess_type(filename)[0] or default + return default + + +def format_header_param(name, value): + """ + Helper function to format and quote a single header parameter. + + Particularly useful for header parameters which might contain + non-ASCII values, like file names. This follows RFC 2231, as + suggested by RFC 2388 Section 4.4. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + if not any(ch in value for ch in '"\\\r\n'): + result = '%s="%s"' % (name, value) + try: + result.encode('ascii') + except (UnicodeEncodeError, UnicodeDecodeError): + pass + else: + return result + if not six.PY3 and isinstance(value, six.text_type): # Python 2: + value = value.encode('utf-8') + value = email.utils.encode_rfc2231(value, 'utf-8') + value = '%s*=%s' % (name, value) + return value + + +class RequestField(object): + """ + A data container for request body parameters. + + :param name: + The name of this request field. + :param data: + The data/value body. + :param filename: + An optional filename of the request field. + :param headers: + An optional dict-like object of headers to initially use for the field. + """ + def __init__(self, name, data, filename=None, headers=None): + self._name = name + self._filename = filename + self.data = data + self.headers = {} + if headers: + self.headers = dict(headers) + + @classmethod + def from_tuples(cls, fieldname, value): + """ + A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. + + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: + + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + + Field names and filenames must be unicode. + """ + if isinstance(value, tuple): + if len(value) == 3: + filename, data, content_type = value + else: + filename, data = value + content_type = guess_content_type(filename) + else: + filename = None + content_type = None + data = value + + request_param = cls(fieldname, data, filename=filename) + request_param.make_multipart(content_type=content_type) + + return request_param + + def _render_part(self, name, value): + """ + Overridable helper function to format a single header parameter. + + :param name: + The name of the parameter, a string expected to be ASCII only. + :param value: + The value of the parameter, provided as a unicode string. + """ + return format_header_param(name, value) + + def _render_parts(self, header_parts): + """ + Helper function to format and quote a single header. + + Useful for single headers that are composed of multiple items. E.g., + 'Content-Disposition' fields. + + :param header_parts: + A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. + """ + parts = [] + iterable = header_parts + if isinstance(header_parts, dict): + iterable = header_parts.items() + + for name, value in iterable: + if value is not None: + parts.append(self._render_part(name, value)) + + return '; '.join(parts) + + def render_headers(self): + """ + Renders the headers for this request field. + """ + lines = [] + + sort_keys = ['Content-Disposition', 'Content-Type', 'Content-Location'] + for sort_key in sort_keys: + if self.headers.get(sort_key, False): + lines.append('%s: %s' % (sort_key, self.headers[sort_key])) + + for header_name, header_value in self.headers.items(): + if header_name not in sort_keys: + if header_value: + lines.append('%s: %s' % (header_name, header_value)) + + lines.append('\r\n') + return '\r\n'.join(lines) + + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): + """ + Makes this request field into a multipart request field. + + This method overrides "Content-Disposition", "Content-Type" and + "Content-Location" headers to the request parameter. + + :param content_type: + The 'Content-Type' of the request body. + :param content_location: + The 'Content-Location' of the request body. + + """ + self.headers['Content-Disposition'] = content_disposition or 'form-data' + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) + self.headers['Content-Type'] = content_type + self.headers['Content-Location'] = content_location diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py new file mode 100644 index 000000000..e53dedc33 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import +import codecs + +from uuid import uuid4 +from io import BytesIO + +from .packages import six +from .packages.six import b +from .fields import RequestField + +writer = codecs.lookup('utf-8')[3] + + +def choose_boundary(): + """ + Our embarrassingly-simple replacement for mimetools.choose_boundary. + """ + return uuid4().hex + + +def iter_field_objects(fields): + """ + Iterate over fields. + + Supports list of (k, v) tuples and dicts, and lists of + :class:`~urllib3.fields.RequestField`. + + """ + if isinstance(fields, dict): + i = six.iteritems(fields) + else: + i = iter(fields) + + for field in i: + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) + + +def iter_fields(fields): + """ + .. deprecated:: 1.6 + + Iterate over fields. + + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. + + Supports list of (k, v) tuples and dicts. + """ + if isinstance(fields, dict): + return ((k, v) for k, v in six.iteritems(fields)) + + return ((k, v) for k, v in fields) + + +def encode_multipart_formdata(fields, boundary=None): + """ + Encode a dictionary of ``fields`` using the multipart/form-data MIME format. + + :param fields: + Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`). + + :param boundary: + If not specified, then a random boundary will be generated using + :func:`mimetools.choose_boundary`. + """ + body = BytesIO() + if boundary is None: + boundary = choose_boundary() + + for field in iter_field_objects(fields): + body.write(b('--%s\r\n' % (boundary))) + + writer(body).write(field.render_headers()) + data = field.data + + if isinstance(data, int): + data = str(data) # Backwards compatibility + + if isinstance(data, six.text_type): + writer(body).write(data) + else: + body.write(data) + + body.write(b'\r\n') + + body.write(b('--%s--\r\n' % (boundary))) + + content_type = str('multipart/form-data; boundary=%s' % boundary) + + return body.getvalue(), content_type diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 000000000..324c551ed --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__init__.py @@ -0,0 +1,5 @@ +from __future__ import absolute_import + +from . import ssl_match_hostname + +__all__ = ('ssl_match_hostname', ) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..836e7506ee42e64cfa6855a19588bd464227d089 GIT binary patch literal 322 zcmXv}%TB{E5Of|DRn-cK181%|6ayt9l@LOF02g|ygjP=Mv<`M+)=nh&BYr7YPW=T= z*hQ=~voovJKAskf8S&9<&R@~z?_mBT_TtgQUU=e!M~diZ8%2c2JW;Vuwu#rtHs$FH z$tDNiMY3o-Wu@&@?*vF~I&_EVuYP8&0?k~thka*V%d~jTCgTjC?p==p0K>+SU>ed1 z08<L!i{RAzBmI0*gK}U_(19VXJH-WBs*#orKw<OtZs4~SnBnHi)y1wsbzSG{HQi7n z%~H13`I$?s@?z!QStuR>gJ^k&v`3|6xuS+uZ)_(l1(2<D0GH-toZjn>_ewm3e{8sM H9?#=n!V+1h literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/ordered_dict.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a72a2aca6b5950fcbe1247e62e87835f635cc276 GIT binary patch literal 8416 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a88f62f074f4818fc41a1869626cb8cf4f7ba302 GIT binary patch literal 24410 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 CAN?x; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aaffa497c76fb92d98acd5d4374c57ebdff216b4 GIT binary patch literal 219 zcmYL@K?=e!5Je-n5W%f?a8XCC#R?+g0o>TFgtSRZYTCw047m3)UdgSuaAhKhAKshK zU(J3r8WNv68=t~`1^v?VW#=({FHVkR(mOl|hWW4e9W+YEtN_Ol%1&{C1{#FCrZhE4 zyK;P4Q0*2oTc%ZwYF;MmHDsWrj$~^rQ!2tDNn?9qVf;d!XnBWlMWtjOgJ#8<Rl-2- ci|)`Gpj5WfQaaVQ=U~%x{Hnw@d}lo51EVfHHUIzs literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8689354b8e8e2be25d20707fab87d8d1f2591dd2 GIT binary patch literal 1317 zcmZuxPmkL~6rZsj+i{$zK($w<6|9KV#<a_7w+JB`*hnj(ZPjd9DH3>{%y`#{W1E>t z!mcJ9*q-?WAkiZ?4t$J$f;n(OLRvmTFYxSaqDt_rnR)LwZ{FV-cbiQQ0gaEhzW%$0 z(4VESCXmr*FvK=Y6b%r?)JX9F!)m6+)Et-?QHR#3{Q?gxYV=Xtz5Ll5Mx#lQb16F0 zXu{$oW#0GyA<yfs)rdT2<mrVx&oi<^PESQXnlQOJe0oZz3^pl=b53T0kwqfUNtD5f zBs+uCk@OZ(CIyi>8F3a#Mj~=I2IqIl${5LqV>Xf<?;27;M{TU#e&yxxiN<_nmncvZ zM#+B;L)^v)Nu=-<mR07|JTtHG1dI11rk27n-a=RS2dIg{6MJb>T&~5wvVF94lp}h| z7CmWzhFNL2w6?4(hkv8$6z?J6Z9WFxD0yirr0Q43(o@JnV~g5*$Uvc`4C+i={v&ml z2JrO>;y=mS*uIer{=0I;ZxE4J#-hAF0uQgi@+(>U#Zex7#!GYA$hHCh12DHj3_xx} ze1Dbk0a{<9%H^+BqmKadR707{Qni=X(pOmdVMF=Q<HqI39syc6kmT|Ib}i=lbko<) zZl^lLO{lHL3yp`D+etQ$(u9&}P8oThlMnJNy&(J^S==K-5~XRrV6?5#HM9a9UH=2b zOZM{4EE~?^m~lplkkIm}Ak&$UWXQ-c$s&Hy_O&UP)ZSN7I%5Z%=UlfQ3&FTd@~o1% z0j376aD7Wd&SIgBB-ihJanO7G{LAC8`@GjXcoy~#2M4;<z47?$<Y|<EwT;Xo%HEJq zcp^b=9<%S{;gb^{6$OY^nPj`EEy2>5zg<?LzRCeEv36ND%4x~jtc+D?Cu55=$(VK) zV6WV9AkUS`Dn$UIMQK%=z-W7AO<NND{)+g!;Nta*py0_IUPLgDco63)L@I(Q4~F9~ z+!wpq-kg3k3XA!}4`sZ6Hs<Mrc=yqx;5aCf;(n3|30=6)N4xtw^4q8cs}aswMsps_ zc$y}|ouGiX9Gx){Y~Fsbu4<>a&~L5bO|4rHoan-YYFpUAzTx5)_OXjC_{!PE9v~~u zzFAB37VNb^+pjclVH@*1V5MEFF4hrHyQZBmr1>Zexer^~Ui|~Ac2~+(Y2KJfspWnG TrJSYgQx_yrPT<b)O@#ji5b}WK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 000000000..00dee0bb5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= set(["r", "w", "b"]): + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py new file mode 100644 index 000000000..62dcb4260 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ordered_dict.py @@ -0,0 +1,259 @@ +# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. +# Passes Python2.7's test suite and incorporates all the latest updates. +# Copyright 2009 Raymond Hettinger, released under the MIT License. +# http://code.activestate.com/recipes/576693/ +try: + from thread import get_ident as _get_ident +except ImportError: + from dummy_thread import get_ident as _get_ident + +try: + from _abcoll import KeysView, ValuesView, ItemsView +except ImportError: + pass + + +class OrderedDict(dict): + 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. + # The inherited dict provides __getitem__, __len__, __contains__, and get. + # The remaining methods are order-aware. + # Big-O running times for all methods are the same as for regular dictionaries. + + # The internal self.__map dictionary maps keys to links in a doubly linked list. + # The circular doubly linked list starts and ends with a sentinel element. + # The sentinel element never gets deleted (this simplifies the algorithm). + # Each link is stored as a list of length three: [PREV, NEXT, KEY]. + + def __init__(self, *args, **kwds): + '''Initialize an ordered dictionary. Signature is the same as for + regular dictionaries, but keyword arguments are not recommended + because their insertion order is arbitrary. + + ''' + if len(args) > 1: + raise TypeError('expected at most 1 arguments, got %d' % len(args)) + try: + self.__root + except AttributeError: + self.__root = root = [] # sentinel node + root[:] = [root, root, None] + self.__map = {} + self.__update(*args, **kwds) + + def __setitem__(self, key, value, dict_setitem=dict.__setitem__): + 'od.__setitem__(i, y) <==> od[i]=y' + # Setting a new item creates a new link which goes at the end of the linked + # list, and the inherited dictionary is updated with the new key/value pair. + if key not in self: + root = self.__root + last = root[0] + last[1] = root[0] = self.__map[key] = [last, root, key] + dict_setitem(self, key, value) + + def __delitem__(self, key, dict_delitem=dict.__delitem__): + 'od.__delitem__(y) <==> del od[y]' + # Deleting an existing item uses self.__map to find the link which is + # then removed by updating the links in the predecessor and successor nodes. + dict_delitem(self, key) + link_prev, link_next, key = self.__map.pop(key) + link_prev[1] = link_next + link_next[0] = link_prev + + def __iter__(self): + 'od.__iter__() <==> iter(od)' + root = self.__root + curr = root[1] + while curr is not root: + yield curr[2] + curr = curr[1] + + def __reversed__(self): + 'od.__reversed__() <==> reversed(od)' + root = self.__root + curr = root[0] + while curr is not root: + yield curr[2] + curr = curr[0] + + def clear(self): + 'od.clear() -> None. Remove all items from od.' + try: + for node in self.__map.itervalues(): + del node[:] + root = self.__root + root[:] = [root, root, None] + self.__map.clear() + except AttributeError: + pass + dict.clear(self) + + def popitem(self, last=True): + '''od.popitem() -> (k, v), return and remove a (key, value) pair. + Pairs are returned in LIFO order if last is true or FIFO order if false. + + ''' + if not self: + raise KeyError('dictionary is empty') + root = self.__root + if last: + link = root[0] + link_prev = link[0] + link_prev[1] = root + root[0] = link_prev + else: + link = root[1] + link_next = link[1] + root[1] = link_next + link_next[0] = root + key = link[2] + del self.__map[key] + value = dict.pop(self, key) + return key, value + + # -- the following methods do not depend on the internal structure -- + + def keys(self): + 'od.keys() -> list of keys in od' + return list(self) + + def values(self): + 'od.values() -> list of values in od' + return [self[key] for key in self] + + def items(self): + 'od.items() -> list of (key, value) pairs in od' + return [(key, self[key]) for key in self] + + def iterkeys(self): + 'od.iterkeys() -> an iterator over the keys in od' + return iter(self) + + def itervalues(self): + 'od.itervalues -> an iterator over the values in od' + for k in self: + yield self[k] + + def iteritems(self): + 'od.iteritems -> an iterator over the (key, value) items in od' + for k in self: + yield (k, self[k]) + + def update(*args, **kwds): + '''od.update(E, **F) -> None. Update od from dict/iterable E and F. + + If E is a dict instance, does: for k in E: od[k] = E[k] + If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] + Or if E is an iterable of items, does: for k, v in E: od[k] = v + In either case, this is followed by: for k, v in F.items(): od[k] = v + + ''' + if len(args) > 2: + raise TypeError('update() takes at most 2 positional ' + 'arguments (%d given)' % (len(args),)) + elif not args: + raise TypeError('update() takes at least 1 argument (0 given)') + self = args[0] + # Make progressively weaker assumptions about "other" + other = () + if len(args) == 2: + other = args[1] + if isinstance(other, dict): + for key in other: + self[key] = other[key] + elif hasattr(other, 'keys'): + for key in other.keys(): + self[key] = other[key] + else: + for key, value in other: + self[key] = value + for key, value in kwds.items(): + self[key] = value + + __update = update # let subclasses override update without breaking __init__ + + __marker = object() + + def pop(self, key, default=__marker): + '''od.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + + ''' + if key in self: + result = self[key] + del self[key] + return result + if default is self.__marker: + raise KeyError(key) + return default + + def setdefault(self, key, default=None): + 'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od' + if key in self: + return self[key] + self[key] = default + return default + + def __repr__(self, _repr_running={}): + 'od.__repr__() <==> repr(od)' + call_key = id(self), _get_ident() + if call_key in _repr_running: + return '...' + _repr_running[call_key] = 1 + try: + if not self: + return '%s()' % (self.__class__.__name__,) + return '%s(%r)' % (self.__class__.__name__, self.items()) + finally: + del _repr_running[call_key] + + def __reduce__(self): + 'Return state information for pickling' + items = [[k, self[k]] for k in self] + inst_dict = vars(self).copy() + for k in vars(OrderedDict()): + inst_dict.pop(k, None) + if inst_dict: + return (self.__class__, (items,), inst_dict) + return self.__class__, (items,) + + def copy(self): + 'od.copy() -> a shallow copy of od' + return self.__class__(self) + + @classmethod + def fromkeys(cls, iterable, value=None): + '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S + and values equal to v (which defaults to None). + + ''' + d = cls() + for key in iterable: + d[key] = value + return d + + def __eq__(self, other): + '''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive + while comparison to a regular mapping is order-insensitive. + + ''' + if isinstance(other, OrderedDict): + return len(self)==len(other) and self.items() == other.items() + return dict.__eq__(self, other) + + def __ne__(self, other): + return not self == other + + # -- the following methods are only used in Python 2.7 -- + + def viewkeys(self): + "od.viewkeys() -> a set-like object providing a view on od's keys" + return KeysView(self) + + def viewvalues(self): + "od.viewvalues() -> an object providing a view on od's values" + return ValuesView(self) + + def viewitems(self): + "od.viewitems() -> a set-like object providing a view on od's items" + return ItemsView(self) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 000000000..7bd92250c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 000000000..accb9272c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py @@ -0,0 +1,19 @@ +import sys + +try: + # Our match_hostname function is the same as 3.5's, so we only want to + # import the match_hostname function if it's at least that good. + if sys.version_info < (3, 5): + raise ImportError("Fallback to vendored code") + + from ssl import CertificateError, match_hostname +except ImportError: + try: + # Backport of the function from a pypi module + from backports.ssl_match_hostname import CertificateError, match_hostname + except ImportError: + # Our vendored copy + from ._implementation import CertificateError, match_hostname + +# Not needed, but documenting what we provide. +__all__ = ('CertificateError', 'match_hostname') diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bdb4e3cf37e772477edc8ce1677af19a2638426 GIT binary patch literal 563 zcmZWl%Zd~+6irgqGi}d97mXnFq8B3cVkYWLV-JXkqTpsW4yXkZsw=6PbmvjtWC~hb zDY)}P{0{%3wyydYTzNCC$Y8=fdEAq8Pwun5y#c|oIJ^D+2P5QXI{Y0wxOs{Zz9L8> zsUZbf-BV;iC0i00DJHWo^fSd=ZZew}x$PA_O5PB6niIvA1NcNqnycXzXX_g0?jKIO z;m97UZ2x1tBaXc#8<cs`m-IE6Y^~7?Ii0X|hU>bA@bS*e(wKQ!EyvN1Tjit&CC8PQ zYQnl(&lN;n>#B_E1%QWc-<Gku5Eni~S6a2Es4=<GWnmS%-Bv-+-U;n$-|f7zjfc2- zmW5y-M=qqI#V8d_*>H#nab2^xDYR{jvdYCWqF%Qx1ez4$JAvJ#k>J-i-hgh=7;j79 zwKo#0a|?XF5Mmal?olg`E77zM@5g#}z5w%}o}QfWGv4UtK)Vo8^8l*p>?nRH)8$o& zO%M1b7^CM$yg{esxeEM$qg>!mbrj;TS#|x#*2_zyo}`Y1Awr+AY(V>LNcSmA$VS<3 D{V|-7 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__pycache__/_implementation.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e03e743d7d3b888b2ea07f3fa20f74554e11422a GIT binary patch literal 3322 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 Mof)^e=zD(ae-I^xdH?_b literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 000000000..7272d862a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,157 @@ +"""The match_hostname() function from Python 3.3.3, essential when using SSL.""" + +# Note: This file is under the PSF license as the code comes from the python +# stdlib. http://docs.python.org/3/license.html + +import re +import sys + +# ipaddress has been backported to 2.6+ in pypi. If it is installed on the +# system, use it to handle IPAddress ServerAltnames (this was added in +# python-3.5) otherwise only do DNS matching. This allows +# backports.ssl_match_hostname to continue to be used all the way back to +# python-2.4. +try: + from pip._vendor import ipaddress +except ImportError: + ipaddress = None + +__version__ = '3.5.0.1' + + +class CertificateError(ValueError): + pass + + +def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + +def _to_unicode(obj): + if isinstance(obj, str) and sys.version_info < (3,): + obj = unicode(obj, encoding='ascii', errors='strict') + return obj + +def _ipaddress_match(ipname, host_ip): + """Exact matching of IP addresses. + + RFC 6125 explicitly doesn't define an algorithm for this + (section 1.7.2 - "Out of Scope"). + """ + # OpenSSL may add a trailing newline to a subjectAltName's IP address + # Divergence from upstream: ipaddress can't handle byte str + ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) + return ip == host_ip + + +def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate, match_hostname needs a " + "SSL socket or SSL context with either " + "CERT_OPTIONAL or CERT_REQUIRED") + try: + # Divergence from upstream: ipaddress can't handle byte str + host_ip = ipaddress.ip_address(_to_unicode(hostname)) + except ValueError: + # Not an IP address (common case) + host_ip = None + except UnicodeError: + # Divergence from upstream: Have to deal with ipaddress not taking + # byte strings. addresses should be all ascii, so we consider it not + # an ipaddress in this case + host_ip = None + except AttributeError: + # Divergence from upstream: Make ipaddress library optional + if ipaddress is None: + host_ip = None + else: + raise + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if host_ip is None and _dnsname_match(value, hostname): + return + dnsnames.append(value) + elif key == 'IP Address': + if host_ip is not None and _ipaddress_match(value, host_ip): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 000000000..607ae0f70 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,440 @@ +from __future__ import absolute_import +import collections +import functools +import logging + +from ._collections import RecentlyUsedContainer +from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool +from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown +from .packages.six.moves.urllib.parse import urljoin +from .request import RequestMethods +from .util.url import parse_url +from .util.retry import Retry + + +__all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] + + +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir', 'ssl_context') + +# All known keyword arguments that could be provided to the pool manager, its +# pools, or the underlying connections. This is used to construct a pool key. +_key_fields = ( + 'key_scheme', # str + 'key_host', # str + 'key_port', # int + 'key_timeout', # int or float or Timeout + 'key_retries', # int or Retry + 'key_strict', # bool + 'key_block', # bool + 'key_source_address', # str + 'key_key_file', # str + 'key_cert_file', # str + 'key_cert_reqs', # str + 'key_ca_certs', # str + 'key_ssl_version', # str + 'key_ca_cert_dir', # str + 'key_ssl_context', # instance of ssl.SSLContext or urllib3.util.ssl_.SSLContext + 'key_maxsize', # int + 'key_headers', # dict + 'key__proxy', # parsed proxy url + 'key__proxy_headers', # dict + 'key_socket_options', # list of (level (int), optname (int), value (int or str)) tuples + 'key__socks_options', # dict + 'key_assert_hostname', # bool or string + 'key_assert_fingerprint', # str +) + +#: The namedtuple class used to construct keys for the connection pool. +#: All custom key schemes should include the fields in this key at a minimum. +PoolKey = collections.namedtuple('PoolKey', _key_fields) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key out of a request context dictionary. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + :type key_class: namedtuple + :param request_context: + A dictionary-like object that contain the context for a request. + :type request_context: dict + + :return: A namedtuple that can be used as a connection pool key. + :rtype: PoolKey + """ + # Since we mutate the dictionary, make a copy first + context = request_context.copy() + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + + # These are both dictionaries and need to be transformed into frozensets + for key in ('headers', '_proxy_headers', '_socks_options'): + if key in context and context[key] is not None: + context[key] = frozenset(context[key].items()) + + # The socket_options key may be a list and needs to be transformed into a + # tuple. + socket_opts = context.get('socket_options') + if socket_opts is not None: + context['socket_options'] = tuple(socket_opts) + + # Map the kwargs to the names in the namedtuple - this is necessary since + # namedtuples can't have fields starting with '_'. + for key in list(context.keys()): + context['key_' + key] = context.pop(key) + + # Default to ``None`` for keys missing from the context + for field in key_class._fields: + if field not in context: + context[field] = None + + return key_class(**context) + + +#: A dictionary that maps a scheme to a callable that creates a pool key. +#: This can be used to alter the way pool keys are constructed, if desired. +#: Each PoolManager makes a copy of this dictionary so they can be configured +#: globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, PoolKey), + 'https': functools.partial(_default_key_normalizer, PoolKey), +} + +pool_classes_by_scheme = { + 'http': HTTPConnectionPool, + 'https': HTTPSConnectionPool, +} + + +class PoolManager(RequestMethods): + """ + Allows for arbitrary requests while transparently keeping track of + necessary connection pools for you. + + :param num_pools: + Number of connection pools to cache before discarding the least + recently used pool. + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + + :param \\**connection_pool_kw: + Additional parameters are used to create fresh + :class:`urllib3.connectionpool.ConnectionPool` instances. + + Example:: + + >>> manager = PoolManager(num_pools=2) + >>> r = manager.request('GET', 'http://google.com/') + >>> r = manager.request('GET', 'http://google.com/mail') + >>> r = manager.request('GET', 'http://yahoo.com/') + >>> len(manager.pools) + 2 + + """ + + proxy = None + + def __init__(self, num_pools=10, headers=None, **connection_pool_kw): + RequestMethods.__init__(self, headers) + self.connection_pool_kw = connection_pool_kw + self.pools = RecentlyUsedContainer(num_pools, + dispose_func=lambda p: p.close()) + + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + + def _new_pool(self, scheme, host, port, request_context=None): + """ + Create a new :class:`ConnectionPool` based on host, port, scheme, and + any additional pool keyword arguments. + + If ``request_context`` is provided, it is provided as keyword arguments + to the pool class used. This method is used to actually create the + connection pools handed out by :meth:`connection_from_url` and + companion methods. It is intended to be overridden for customization. + """ + pool_cls = self.pool_classes_by_scheme[scheme] + if request_context is None: + request_context = self.connection_pool_kw.copy() + + # Although the context has everything necessary to create the pool, + # this function has historically only used the scheme, host, and port + # in the positional args. When an API change is acceptable these can + # be removed. + for key in ('scheme', 'host', 'port'): + request_context.pop(key, None) + + if scheme == 'http': + for kw in SSL_KEYWORDS: + request_context.pop(kw, None) + + return pool_cls(host, port, **request_context) + + def clear(self): + """ + Empty our store of pools and direct them all to close. + + This will not affect in-flight connections, but they will not be + re-used after completion. + """ + self.pools.clear() + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + """ + Get a :class:`ConnectionPool` based on the host, port, and scheme. + + If ``port`` isn't given, it will be derived from the ``scheme`` using + ``urllib3.connectionpool.port_by_scheme``. If ``pool_kwargs`` is + provided, it is merged with the instance's ``connection_pool_kw`` + variable and used to create the new connection pool, if one is + needed. + """ + + if not host: + raise LocationValueError("No host specified.") + + request_context = self._merge_pool_kwargs(pool_kwargs) + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host + + return self.connection_from_context(request_context) + + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key, request_context=request_context) + + def connection_from_pool_key(self, pool_key, request_context=None): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ + with self.pools.lock: + # If the scheme, host, or port doesn't match existing open + # connections, open a new ConnectionPool. + pool = self.pools.get(pool_key) + if pool: + return pool + + # Make a fresh ConnectionPool of the desired type + scheme = request_context['scheme'] + host = request_context['host'] + port = request_context['port'] + pool = self._new_pool(scheme, host, port, request_context=request_context) + self.pools[pool_key] = pool + + return pool + + def connection_from_url(self, url, pool_kwargs=None): + """ + Similar to :func:`urllib3.connectionpool.connection_from_url`. + + If ``pool_kwargs`` is not provided and a new pool needs to be + constructed, ``self.connection_pool_kw`` is used to initialize + the :class:`urllib3.connectionpool.ConnectionPool`. If ``pool_kwargs`` + is provided, it is used instead. Note that if a new pool does not + need to be created for the request, the provided ``pool_kwargs`` are + not used. + """ + u = parse_url(url) + return self.connection_from_host(u.host, port=u.port, scheme=u.scheme, + pool_kwargs=pool_kwargs) + + def _merge_pool_kwargs(self, override): + """ + Merge a dictionary of override values for self.connection_pool_kw. + + This does not modify self.connection_pool_kw and returns a new dict. + Any keys in the override dictionary with a value of ``None`` are + removed from the merged dictionary. + """ + base_pool_kwargs = self.connection_pool_kw.copy() + if override: + for key, value in override.items(): + if value is None: + try: + del base_pool_kwargs[key] + except KeyError: + pass + else: + base_pool_kwargs[key] = value + return base_pool_kwargs + + def urlopen(self, method, url, redirect=True, **kw): + """ + Same as :meth:`urllib3.connectionpool.HTTPConnectionPool.urlopen` + with custom cross-host redirect logic and only sends the request-uri + portion of the ``url``. + + The given ``url`` parameter must be absolute, such that an appropriate + :class:`urllib3.connectionpool.ConnectionPool` can be chosen for it. + """ + u = parse_url(url) + conn = self.connection_from_host(u.host, port=u.port, scheme=u.scheme) + + kw['assert_same_host'] = False + kw['redirect'] = False + if 'headers' not in kw: + kw['headers'] = self.headers + + if self.proxy is not None and u.scheme == "http": + response = conn.urlopen(method, url, **kw) + else: + response = conn.urlopen(method, u.request_uri, **kw) + + redirect_location = redirect and response.get_redirect_location() + if not redirect_location: + return response + + # Support relative URLs for redirecting. + redirect_location = urljoin(url, redirect_location) + + # RFC 7231, Section 6.4.4 + if response.status == 303: + method = 'GET' + + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries + kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen(method, redirect_location, **kw) + + +class ProxyManager(PoolManager): + """ + Behaves just like :class:`PoolManager`, but sends all requests through + the defined proxy, using the CONNECT method for HTTPS URLs. + + :param proxy_url: + The URL of the proxy to be used. + + :param proxy_headers: + A dictionary contaning headers that will be sent to the proxy. In case + of HTTP they are being sent with each request, while in the + HTTPS/CONNECT case they are sent only once. Could be used for proxy + authentication. + + Example: + >>> proxy = urllib3.ProxyManager('http://localhost:3128/') + >>> r1 = proxy.request('GET', 'http://google.com/') + >>> r2 = proxy.request('GET', 'http://httpbin.org/') + >>> len(proxy.pools) + 1 + >>> r3 = proxy.request('GET', 'https://httpbin.org/') + >>> r4 = proxy.request('GET', 'https://twitter.com/') + >>> len(proxy.pools) + 3 + + """ + + def __init__(self, proxy_url, num_pools=10, headers=None, + proxy_headers=None, **connection_pool_kw): + + if isinstance(proxy_url, HTTPConnectionPool): + proxy_url = '%s://%s:%i' % (proxy_url.scheme, proxy_url.host, + proxy_url.port) + proxy = parse_url(proxy_url) + if not proxy.port: + port = port_by_scheme.get(proxy.scheme, 80) + proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + + self.proxy = proxy + self.proxy_headers = proxy_headers or {} + + connection_pool_kw['_proxy'] = self.proxy + connection_pool_kw['_proxy_headers'] = self.proxy_headers + + super(ProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw) + + def connection_from_host(self, host, port=None, scheme='http', pool_kwargs=None): + if scheme == "https": + return super(ProxyManager, self).connection_from_host( + host, port, scheme, pool_kwargs=pool_kwargs) + + return super(ProxyManager, self).connection_from_host( + self.proxy.host, self.proxy.port, self.proxy.scheme, pool_kwargs=pool_kwargs) + + def _set_proxy_headers(self, url, headers=None): + """ + Sets headers needed by proxies: specifically, the Accept and Host + headers. Only sets headers not provided by the user. + """ + headers_ = {'Accept': '*/*'} + + netloc = parse_url(url).netloc + if netloc: + headers_['Host'] = netloc + + if headers: + headers_.update(headers) + return headers_ + + def urlopen(self, method, url, redirect=True, **kw): + "Same as HTTP(S)ConnectionPool.urlopen, ``url`` must be absolute." + u = parse_url(url) + + if u.scheme == "http": + # For proxied HTTPS requests, httplib sets the necessary headers + # on the CONNECT to the proxy. For HTTP, we'll definitely + # need to set 'Host' at the very least. + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) + + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) + + +def proxy_from_url(url, **kw): + return ProxyManager(proxy_url=url, **kw) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py new file mode 100644 index 000000000..9d789d654 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/request.py @@ -0,0 +1,148 @@ +from __future__ import absolute_import + +from .filepost import encode_multipart_formdata +from .packages.six.moves.urllib.parse import urlencode + + +__all__ = ['RequestMethods'] + + +class RequestMethods(object): + """ + Convenience mixin for classes who implement a :meth:`urlopen` method, such + as :class:`~urllib3.connectionpool.HTTPConnectionPool` and + :class:`~urllib3.poolmanager.PoolManager`. + + Provides behavior for making common types of HTTP request methods and + decides which type of request field encoding to use. + + Specifically, + + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). + + :meth:`.request_encode_body` is for sending requests whose fields are + encoded in the *body* of the request using multipart or www-form-urlencoded + (such as for POST, PUT, PATCH). + + :meth:`.request` is for making any kind of request, it will look up the + appropriate encoding format and use one of the above two methods to make + the request. + + Initializer parameters: + + :param headers: + Headers to include with all requests, unless other headers are given + explicitly. + """ + + _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) + + def __init__(self, headers=None): + self.headers = headers or {} + + def urlopen(self, method, url, body=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **kw): # Abstract + raise NotImplemented("Classes extending RequestMethods must implement " + "their own ``urlopen`` method.") + + def request(self, method, url, fields=None, headers=None, **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the appropriate encoding of + ``fields`` based on the ``method`` used. + + This is a convenience method that requires the least amount of manual + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as + :meth:`request_encode_url`, :meth:`request_encode_body`, + or even the lowest level :meth:`urlopen`. + """ + method = method.upper() + + if method in self._encode_url_methods: + return self.request_encode_url(method, url, fields=fields, + headers=headers, + **urlopen_kw) + else: + return self.request_encode_body(method, url, fields=fields, + headers=headers, + **urlopen_kw) + + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the url. This is useful for request methods like GET, HEAD, DELETE, etc. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + + if fields: + url += '?' + urlencode(fields) + + return self.urlopen(method, url, **extra_kw) + + def request_encode_body(self, method, url, fields=None, headers=None, + encode_multipart=True, multipart_boundary=None, + **urlopen_kw): + """ + Make a request using :meth:`urlopen` with the ``fields`` encoded in + the body. This is useful for request methods like POST, PUT, PATCH, etc. + + When ``encode_multipart=True`` (default), then + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise + :meth:`urllib.urlencode` is used with the + 'application/x-www-form-urlencoded' content type. + + Multipart encoding must be used when posting files, and it's reasonably + safe to use it in other times too. However, it may break request + signing, such as with OAuth. + + Supports an optional ``fields`` parameter of key/value strings AND + key/filetuple. A filetuple is a (filename, data, MIME type) tuple where + the MIME type is optional. For example:: + + fields = { + 'foo': 'bar', + 'fakefile': ('foofile.txt', 'contents of foofile'), + 'realfile': ('barfile.txt', open('realfile').read()), + 'typedfile': ('bazfile.bin', open('bazfile').read(), + 'image/jpeg'), + 'nonamefile': 'contents of nonamefile field', + } + + When uploading a file, providing a filename (the first parameter of the + tuple) is optional but recommended to best mimick behavior of browsers. + + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string + which is used to compose the body of the request. The random boundary + string can be explicitly set with the ``multipart_boundary`` parameter. + """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': {}} + + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py new file mode 100644 index 000000000..54799ba55 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/response.py @@ -0,0 +1,626 @@ +from __future__ import absolute_import +from contextlib import contextmanager +import zlib +import io +import logging +from socket import timeout as SocketTimeout +from socket import error as SocketError + +from ._collections import HTTPHeaderDict +from .exceptions import ( + BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError, + ResponseNotChunked, IncompleteRead, InvalidHeader +) +from .packages.six import string_types as basestring, binary_type, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head + +log = logging.getLogger(__name__) + + +class DeflateDecoder(object): + + def __init__(self): + self._first_try = True + self._data = binary_type() + self._obj = zlib.decompressobj() + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + + if not self._first_try: + return self._obj.decompress(data) + + self._data += data + try: + decompressed = self._obj.decompress(data) + if decompressed: + self._first_try = False + self._data = None + return decompressed + except zlib.error: + self._first_try = False + self._obj = zlib.decompressobj(-zlib.MAX_WBITS) + try: + return self.decompress(self._data) + finally: + self._data = None + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + return self._obj.decompress(data) + + +def _get_decoder(mode): + if mode == 'gzip': + return GzipDecoder() + + return DeflateDecoder() + + +class HTTPResponse(io.IOBase): + """ + HTTP Response container. + + Backwards-compatible to httplib's HTTPResponse but the response ``body`` is + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. + + Extra parameters for behaviour not present in httplib.HTTPResponse: + + :param preload_content: + If True, the response's body will be preloaded during construction. + + :param decode_content: + If True, attempts to decode specific content-encoding's based on headers + (like 'gzip' and 'deflate') will be skipped and raw data will be used + instead. + + :param original_response: + When this HTTPResponse wrapper is generated from an httplib.HTTPResponse + object, it's convenient to include the original for debug purposes. It's + otherwise unused. + + :param retries: + The retries contains the last :class:`~urllib3.util.retry.Retry` that + was used during the request. + + :param enforce_content_length: + Enforce content length checking. Body returned by server must match + value of Content-Length header, if present. Otherwise, raise error. + """ + + CONTENT_DECODERS = ['gzip', 'deflate'] + REDIRECT_STATUSES = [301, 302, 303, 307, 308] + + def __init__(self, body='', headers=None, status=0, version=0, reason=None, + strict=0, preload_content=True, decode_content=True, + original_response=None, pool=None, connection=None, + retries=None, enforce_content_length=False, request_method=None): + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) + self.status = status + self.version = version + self.reason = reason + self.strict = strict + self.decode_content = decode_content + self.retries = retries + self.enforce_content_length = enforce_content_length + + self._decoder = None + self._body = None + self._fp = None + self._original_response = original_response + self._fp_bytes_read = 0 + + if body and isinstance(body, (basestring, binary_type)): + self._body = body + + self._pool = pool + self._connection = connection + + if hasattr(body, 'read'): + self._fp = body + + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # Determine length of response + self.length_remaining = self._init_length(request_method) + + # If requested, preload the body. + if preload_content and not self._body: + self._body = self.read(decode_content=decode_content) + + def get_redirect_location(self): + """ + Should we redirect and where to? + + :returns: Truthy redirect location string if we got a redirect status + code and valid location. ``None`` if redirect status and no + location. ``False`` if not a redirect status code. + """ + if self.status in self.REDIRECT_STATUSES: + return self.headers.get('location') + + return False + + def release_conn(self): + if not self._pool or not self._connection: + return + + self._pool._put_conn(self._connection) + self._connection = None + + @property + def data(self): + # For backwords-compat with earlier urllib3 0.4 and earlier. + if self._body: + return self._body + + if self._fp: + return self.read(cache_content=True) + + @property + def connection(self): + return self._connection + + def tell(self): + """ + Obtain the number of bytes pulled over the wire so far. May differ from + the amount of content returned by :meth:``HTTPResponse.read`` if bytes + are encoded on the wire (e.g, compressed). + """ + return self._fp_bytes_read + + def _init_length(self, request_method): + """ + Set initial length value for Response content if available. + """ + length = self.headers.get('content-length') + + if length is not None and self.chunked: + # This Response will fail with an IncompleteRead if it can't be + # received as chunked. This method falls back to attempt reading + # the response before raising an exception. + log.warning("Received response with both Content-Length and " + "Transfer-Encoding set. This is expressly forbidden " + "by RFC 7230 sec 3.3.2. Ignoring Content-Length and " + "attempting to process response as Transfer-Encoding: " + "chunked.") + return None + + elif length is not None: + try: + # RFC 7230 section 3.3.2 specifies multiple content lengths can + # be sent in a single Content-Length header + # (e.g. Content-Length: 42, 42). This line ensures the values + # are all valid ints and that as long as the `set` length is 1, + # all values are the same. Otherwise, the header is invalid. + lengths = set([int(val) for val in length.split(',')]) + if len(lengths) > 1: + raise InvalidHeader("Content-Length contained multiple " + "unmatching values (%s)" % length) + length = lengths.pop() + except ValueError: + length = None + else: + if length < 0: + length = None + + # Convert status to int for comparison + # In some cases, httplib returns a status of "_UNKNOWN" + try: + status = int(self.status) + except ValueError: + status = 0 + + # Check for responses that shouldn't include a body + if status in (204, 304) or 100 <= status < 200 or request_method == 'HEAD': + length = 0 + + return length + + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessary. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None and content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + + def read(self, amt=None, decode_content=None, cache_content=False): + """ + Similar to :meth:`httplib.HTTPResponse.read`, but with two additional + parameters: ``decode_content`` and ``cache_content``. + + :param amt: + How much of the content to read. If specified, caching is skipped + because it doesn't make sense to cache partial content as the full + response. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + + :param cache_content: + If True, will save the returned data such that the same result is + returned despite of the state of the underlying file object. This + is useful if you want the ``.data`` property to continue working + after having ``.read()`` the file object. (Overridden if ``amt`` is + set.) + """ + self._init_decoder() + if decode_content is None: + decode_content = self.decode_content + + if self._fp is None: + return + + flush_decoder = False + data = None + + with self._error_catcher(): + if amt is None: + # cStringIO doesn't like amt=None + data = self._fp.read() + flush_decoder = True + else: + cache_content = False + data = self._fp.read(amt) + if amt != 0 and not data: # Platform-specific: Buggy versions of Python. + # Close the connection when no data is returned + # + # This is redundant to what httplib/http.client _should_ + # already do. However, versions of python released before + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. + self._fp.close() + flush_decoder = True + if self.enforce_content_length and self.length_remaining not in (0, None): + # This is an edge case that httplib failed to cover due + # to concerns of backward compatibility. We're + # addressing it here to make sure IncompleteRead is + # raised during streaming, so all calls with incorrect + # Content-Length are caught. + raise IncompleteRead(self._fp_bytes_read, self.length_remaining) + + if data: + self._fp_bytes_read += len(data) + if self.length_remaining is not None: + self.length_remaining -= len(data) + + data = self._decode(data, decode_content, flush_decoder) + + if cache_content: + self._body = data + + return data + + def stream(self, amt=2**16, decode_content=None): + """ + A generator wrapper for the read() method. A call will block until + ``amt`` bytes have been read from the connection or until the + connection is closed. + + :param amt: + How much of the content to read. The generator will return up to + much data per iteration, but may return less. This is particularly + likely when using compressed data. However, the empty string will + never be returned. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + if self.chunked and self.supports_chunked_reads(): + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + + if data: + yield data + + @classmethod + def from_httplib(ResponseCls, r, **response_kw): + """ + Given an :class:`httplib.HTTPResponse` instance ``r``, return a + corresponding :class:`urllib3.response.HTTPResponse` object. + + Remaining parameters are passed to the HTTPResponse constructor, along + with ``original_response=r``. + """ + headers = r.msg + + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) + + # HTTPResponse objects in Python 3 don't have a .strict attribute + strict = getattr(r, 'strict', 0) + resp = ResponseCls(body=r, + headers=headers, + status=r.status, + version=r.version, + reason=r.reason, + strict=strict, + original_response=r, + **response_kw) + return resp + + # Backwards-compatibility methods for httplib.HTTPResponse + def getheaders(self): + return self.headers + + def getheader(self, name, default=None): + return self.headers.get(name, default) + + # Backwards compatibility for http.cookiejar + def info(self): + return self.headers + + # Overrides from io.IOBase + def close(self): + if not self.closed: + self._fp.close() + + if self._connection: + self._connection.close() + + @property + def closed(self): + if self._fp is None: + return True + elif hasattr(self._fp, 'isclosed'): + return self._fp.isclosed() + elif hasattr(self._fp, 'closed'): + return self._fp.closed + else: + return True + + def fileno(self): + if self._fp is None: + raise IOError("HTTPResponse has no file to get a fileno from") + elif hasattr(self._fp, "fileno"): + return self._fp.fileno() + else: + raise IOError("The file-like object this HTTPResponse is wrapped " + "around has no file descriptor") + + def flush(self): + if self._fp is not None and hasattr(self._fp, 'flush'): + return self._fp.flush() + + def readable(self): + # This method is required for `io` module compatibility. + return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def supports_chunked_reads(self): + """ + Checks if the underlying file-like object looks like a + httplib.HTTPResponse object. We do this by testing for the fp + attribute. If it is present we assume it returns raw chunks as + processed by read_chunked(). + """ + return hasattr(self._fp, 'fp') + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + if not self.supports_chunked_reads(): + raise BodyNotHttplibCompatible( + "Body should be httplib.HTTPResponse like. " + "It should have have an fp attribute which returns raw chunks.") + + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + with self._error_catcher(): + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 000000000..a84b00516 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py @@ -0,0 +1,54 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + IS_SECURETRANSPORT, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) +from .wait import ( + wait_for_read, + wait_for_write +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'IS_SECURETRANSPORT', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', + 'wait_for_read', + 'wait_for_write' +) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2773a06edec76a788ef5a1a12f6ccc0f47263e2f GIT binary patch literal 1000 zcmZ9KU2oGc6o!+2rA^bdYu9}-K;nvCi~wU|lMrG|lNdtX)N~hELROZzTQ)n%Y^P)Y zha3KqZ@JoE;EHoHjUf`{(K*MC{rdI!*y*?yJQvgDZ=Y+H^$U~xrvkwT_|y+TY{fRW zgiUPQiYsxIS45Rm%ecmCqE6~%T;~np5T}eAyeV3wC0yc)Hfalwc%nl(Vu37(F6oLM z>6P;wz9{;nF9u{#=1smNhGbaAExs&P$ck7ct746;iFLAG)?NNcY>*A{m^_BOO`gPF zV2wJrpwt@KrW>BBj2D{GMC6&&xAt9qm?#=$Y04s<WGRhhmgg*nA3PCWGJ4L!m`Q~> zOq}I3;+cZ+rg4Md%YK$>_FWt2(_TP>@uBe!1A6@R==fj^qoxm8aIk+eIhaoN#=-H? zWNP}MQcP+(OVTqYbD5;tEJ_C2=8Q%-BH5KPgZq+FoX$Z3h%;SGu4R~0l|`3Kk1EEC z3MpBtsZInl&J>sx8syd|Ov{^5%{0%LrstW`rj>_MF<MA&+A8M>ijYvRo=6T$b*@7! zWfByGv03<=Udu$Y(UNR}W3q+74v`LG5z#{o5p6^l0j*=n2BMD`AnFJY(LpRB77)vb z6~K7()VP$+3SCG>sl<je?!*0*%NhqPDwxvcf~E;p<yi`@;&!HnCf$kqPjD&jVSC)! zIOrQVb|)GSV(Jo|D^F&sVAekeC>7&DO%2_7&}|$_L(VDvX~}0WUgG!Mhx?s}n)&lk z`m>B<EBQkDrx%p&sO|LaJbn|=eE#~Sp6#4nNd9WJy}RpA{XEGxlT>L~b5lm!J6rlH z#A5kDKcsOcebB~}(=ETy3HK>YQn)_)BEK=scOr`m&fa5>EA-#1cs9Pz-Co_ZR~x;? EA1M6}wEzGB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2749e173e7eb9903f999e72b4964d819e9ba4279 GIT binary patch literal 3136 zcmaJ@&u<&Y72aPYmy}4!PHMY_3ryPpF;!c1>{xY#wy0uDwNOVEOgdJS7|SJRD6O>I zUC#_9QP|BP%CYTV(1UdBwfPtNC-k(}0tIsKDW`rjyOL!i=n}J>U;Ez7d++<+`?T3? z7<l%2*IvzCF^qq!!TDpO^9M8$;YAH<hQ`?3Hci#HLTlTiHg!UK>})%jvuP!)jH}z# zac#SXah2A-HMU)5?bWG8t&vS#TL0GEZqNpu!O9GsrA_?L(iWY=f0H%o{E4~UqE^>v zU-=$7jkcN3`2!J$6Un?_oWxvid~X&D%|kzs-YDiCXFhFPdE?1S*Xyo6U47Kcn_U*N zp^W(|=P@6uPt;?fxoD5j#OHWPBgMU_bz)~`ivN9=-%$F|x6%KAI$cAW;<lQb&Pz+$ zSgFwJU#t_eYdD5<_8WZDG}KS+-GUu(`kGImvO(}XXL7<LL3(_`NH8LDmyux{ML1m$ zM<fu0@;FHtC4NMS*o`M4B?IgUW5MWRLkn3>eD06+cguQ0NnRd?z7Wg(T`7|=7%V>N z^)??}NbZw(um>fjgpF9TWwI7?l7zm5)y9H^!9F7^NwOO41QEN9qv14%K^PK0JoKl6 zaD8^t@2~lxVEsOkvDO|ksqb+vitOU-;am6OY∾L9|08_alMxvq*+h0?lM17PXk% z5%F+;ZKJmXPv{5!uE}7`;)!fm^4boQzLcC-u$Vi8I1agkF0bMRhdauSyoSNw4L*y% zAC5W+4-S0EItM=QjN*_oE;?i08SHu9L-8Q`%>n&*=p_gD?#j`_ojo3YG<xvKC!Jm= z36eWOB%~jPclhwZ!~62JuO@Z#4p>BE-kI<ahQ8mK$RO;zapGb!&3_UI@6C)?`c$1w zT*J#~%$lz0sAf56mN{>>Oy0uEP+dtq^Jp_@IynD}PHKE*WlmN}ol^wqnaOXWhaf#O zGl$w)Raz%TRy+EKv`?MXNh@hh+Iy8V=dtnXZ<(9AUsbYt*2reE*{q5Et?3i&w9|Up zNN3J4mesVC+9#HYaL1Rm{W||TZJoL)bYafof5xbuLLWx0(?;4XdOGm!y%~i5zf2>W zGmYb$>0AbB08O3$6MJXR6d<7Er6LA9oBMih%lN{0y}X6?(nza%=YP`bH_&`KL!C48 z8$b@wsrVEqE#nvgM;3faITK<*1EdT|g(4L^2*kI-9N)oL0gHx=j3$xB*dif6D(;p~ z?%k1-1cBS{-`b6Zysg7hu}r()Z~uRNglqzRI>2$3I8kW!LoHyT4B-W$Vap`r1*}Ag zn{u51|CcVJ!w(17G6oDtVFcmN#*nRW6rb}3F0?)(5lnNT2*4GS1T?^?!f_#ECyWPv zNGKcmlMsk4fJJZ$EwC^ph-WY*%gR{GeE_c9U2g8{!$A5(k&)KBAmRxhGVj7IN;fVR zNHU%XskqB0g<0bfDeOwLO|>jV0GBR}TMYsbpD*xLA(@ntAxYa{?C+nO`3=Gf23d)S z@*9Do4?iS|+~7NMmq-?dLaTY!Rffaq^{BjD@$nDlm&ewZuQrZ<p?C&C7DS`C<UE`v zBFgepu%wXfX5Iida48N0xtmvn<Ux{O1zE(0jCwnM;Enuo5Ki-I5taGOC7Jn5_t~RA zdEMUg)s@fk_dHn3E4Fz>+=%?T_s6HtK3#e0JziZ~dGWO8_0~UIefFXUwaQzX5y614 zR9-8MkXM+>ZFxm!iuQb7EA7TrhRa)TyGe}|TrM;^%5b@(43^uFlvm3e*Z^B@`J>!b zU&v{~@=C&E8Rzw(AAxcGG0QFCYvRpKrkS^RHI?EkL*!$m>o>mo0Mp_gUPj9`8~8bu zs&xbW=a`n+vKyA3D^{$lnk8NHXO`kh{%d?SRB2m1cG)yT-ogOM*g%?|rAF5{x|W(? zzE)<X#va(~uVA3pSHVA6YnvNLEy|YaPB41gE{<P2cYuw~J2&BqxVO-RGN_@syJ70t zp_)*SDlAmfCwd<pY3!MqAuT?So}GcimG<NBdMdY`Gm_5wOawa-(1-9mjQKtZ3NnD% zBs)?et>JPhjBb;|T?S4l{PerRpNlJN-iwXy=ISFQQ~~Q8?nud6f==iO<G|9G_~h|M z7jX6Ya98KzK`eL4`sTrsW;=8~1_FjLr(&_~@b_?|yapBP8>_wCRRz}i=I2X!{X%Qo z<iEnEcTIN{bA7bJbd@TcS~a<vy{N@(4Bo26sF@+TWtK7_Uz`3?8mG#fD&3(rL*haz z8R=w1oy>Y^MDLgN*W;r8`of5;ErbMrj@=cNfKpXSR*si`v<MSZ0d6IT>5_q>(hfzs zStJ{4T)DQ_t`>H1cYWan$-z?YmKIs!KgEW;zIrrdIsx#T7$dd_{&awG7548KC$D?w zlJ>DGZs29;s-Rl6%vs>VMXO@QHTeUq9ox&xAGPQ5hUbkYs3w``aRrIuSdOZLbzPL# zMOpO<T{7u9N!J+sy4tR=q{CM`LW|~i)tsuGF1<92-QSL5ItkhDl?{XnZB@a{n)9~% ObH{AmcU^bJz5YL7uv>Hh literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3729f82c88f7ccf711898414a7560871374a3495 GIT binary patch literal 3230 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50878523207a7f6798517af40f817b0d1b311f6f GIT binary patch literal 1911 zcmZXVPj4eN6u|A7Niv<L-K7f%A;elMgcOM;3#FnPAw=1&R3s=B8&Ii0Q)lc+CUs_} zwkO+^^g_Av9oi!|KF?e^^(%1V*^~6o?nt(u|33S@-+S}T%1VIX8};7(?Q{vDe@$oc zIUsxuMVX2rh6NhqLyQq~m@AyId+1r&6SZ;uunuyK)&E3?4c1^jv_4y60klhO`6X&K zui+Hb!sP?nSD7d@50i18Nquef!1(e|>pYA^!cz_1wOvjbm-|$zBpvKXnaK#7Bj7Ww z59K)&6+<=kXXp}Lp_j-*8XpJp0}P8W`UR!V0h-olXyn|?ZQYv-V9sUu*uR-SxI3>s z=3L-EFvIW$_e=)_zUM<89V_x`$n}s*LdhVR@RY=f;Oine<|ONnc%(_9NF*}FSv#=% zx;d3}Y-YQ*Z_ers`I{ScMk1r5ZI|txwSG!zUvL8BjB75(Ny=~3$N3#aty<|Ps?u7n zZfh-*KG@pYudL6<oj5OppQ$LSaj>=vclsO2CfM@7Nhg=dglgWIP}zwy0d7#8vF!9m zVYsC>(=R6M^C-+GpFP#_)?g&Xr}5^qXPsUrPxAF7RhkO1E~Cw@4Shn*pe-Soh-I=< zNFkE`MyJq;=t!>eELFUnPs?Va!q^aCEY>iteIF|1JFbscaous8deyptZRIM=-Z0@o zrv}9`@hb=#&47iGbK$5DHF)^a)3q78z*pG#Qv(x*;|uq^l07TK$hkXn<cpbefk49Q zyO}EwbYq5RF01|J00}OTP^bF<q4mzTQe5ggGzdY4mR&`LbizrW0~@M{BCb?i2r(sq zfrY~Of9F(78o_>^Mp==9b2%g2;I2q4voQh02$-o5nq;xv3h}VeFbC_06i$7WNq{m- z$^KLiq1m`k-TY2nQU#VWFip5j;%P-$S5I@kIJZlVOgMt0+Pl5p{`YWoI^ai(6D3U) zS7h$WHb0Gct`l%%`^~7mMg7~`>(3uZCBP4_h5#|PID5iRa|j%;z(V_6^Cx7GY4ZEi z^LE)_Jcc!DuUsB*9p-c@GRj(xd;m@_SBkW<Zpf&nEx!yB$RB`Y8u79*Keb%G^QdyE z2M?bINSw(r)um@_Q8wUw3K1j?S1k{=S8lbM<U<&gZ<)$OO;xRcRK7zk5n;6&E@(5@ z$1tVdh6+7w;yP|RO(-7r0Bj#iL;4NMCLy{|EXp5&04WLqrg(-m;4I&pK{`5ygf_#M z?iFBcWJpf`SR=lcoGN@y3a%_a)Uaej4&YQ3o0RPCY`<8S+^(uzu}f1Xz{O_!Ns(Bx zVzQm*JLv$D&jN%hp+#AmR&K5!vVGEx1X!Yb52PRG%8%?-ugxn<&uBO14abmAGbY!} zsGFp^tQC3AWy>l3#jVTwe9>!0e+0>6u_n}+HU18qqs)H-E!A;=!OTxU-fIPA5QcG~ z3(3P!8fzb}<up15!c|)(r|oez;Yyl}A|F9j2DgA)7HsCRKC>s@0l?nMQs93%&R8M% TSLSD>%wN_xyy^On{m1_U2XYa< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d704ebab94914e18284f9d6d5cd2f553756c02 GIT binary patch literal 12326 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/selectors.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/selectors.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb731a0d50d1ddaf91cafe07bdc1ff6939df6cd2 GIT binary patch literal 16397 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 Viij}1fa?UVbGWV{RnK;({txY}L(%{M literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7eedf2e62223b93c56077dba2f1ac9c8e8f0b401 GIT binary patch literal 8958 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 RyZB~tO4G|fmj4w*{~sa^zLNj| literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a7f54e244993686a234ac69e06f91288a1fd7a9f GIT binary patch literal 8779 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39cf1281786844586ebe96b85a73912db3a9bf77 GIT binary patch literal 5189 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e14819c051198e3c0e313169c6e6cc07c918558 GIT binary patch literal 1673 zcmd5+QEwYX5Z=8z+m}lMl?qi;gtQ<e@I!rpHX=n)L}@Hh2?dC)23d+u>)SnN)4e-q zckPhq@`91*8{!|(M+9&D6yENYr~ZXLF=IC&NL9rftUTkn-I=+W@0-2PR#zhe>!^R@ z;Ex6&f8xW%^1=8N#C`%w5J5G`>44_mz{~xCp9h1060szF5qwVv4H1ckXoA%g%c3Ph zuv)_Fk@m_n3JKal9esYkm-M<{bRYEV*LP&bC))L-mZ>XE9d#ddcl*g+_x?`3ys-E8 z9`?JtDb|4t>LW`a_-q|0N9>BDg3jo7)Oi(g{>-!ME~tp`W}f+=A|rZEiqQELnStdR zGxFozbN}0$71<#N*Up2=|G8NOPsme`lH=`t@&n1}yq^$GT9x;d?m%RZd`<SqH$*g` zo95Z?Y@aJ<SymeM@JlAAvVbR7vY}*r%9Z9rEm>yDoN=a=b*#*oEz`%+*@(e{xN_`N zS#YgS!N;m%1Q81trZP6>)=I%t(P4YiO-y0`&NR>PA{%pu+_97w_-a)+X?W@&@I<*o zrt(}0#huir9d`E4SDHJhIA@}imKCLAhkObJGkd{6GgDd?Wr}R!@<0NR>mc@BP$N>2 zgInjcqJpfEComi)0GqCnBl44X8~{3=!RTioq)qD<W-NzCZLjt^>$U$_p2BW(f!HtP zxrxU{O`*hi%1xY=T1aE#+{DA9B-ykZ#m7@|H%-RVkJeqbIXW`>!))W;y|^Eb)%dn5 ztOEpZn{;FIjyvYKIhO<&5v7SIMr$>^6HlDd@d<F&8J|9nwvdvv%*WenP^HBVo5Z7M z?<eSz07i)_lSPf4EnTKu+ifr|qITP%L1^me5!VyhH3p|w0f|sfk;*zi*SdAcEqBfs zAALh3N3bhR-CW?^ZqyBA(VAsEZ#k9Aa^mXnl8yk6%?g~h>D<YzqUZIOl!>>(-T*~{ zfQB^kA{zQ3TJ#!-!A4W885jOz(+@x_rguQA15#%`5J=B{y)xcLask8n-w!tyvba+J z7;Bg}?9E_5V84kr;xLD8q2{2iUQ&yR-Ubglha)hz!2Z|J{B{MJ6QkV!0vasD$pSfg zDK_}od=)mYU1Eco<a<}Zc?(17?u%boFI^0$o!@}@XwR`X_>u(`2&lopD;(gIEv7fz V%1bfPavMJrwh8KH7`+j-{sMO{!%qMJ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 000000000..31ecd8372 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,130 @@ +from __future__ import absolute_import +import socket +from .wait import wait_for_read +from .selectors import HAS_SELECT, SelectorError + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + + if not HAS_SELECT: + return False + + try: + return bool(wait_for_read(sock, timeout=0.0)) + except SelectorError: + return True + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + + +HAS_IPV6 = _has_ipv6('::1') diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py new file mode 100644 index 000000000..22882b86c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/request.py @@ -0,0 +1,118 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b, integer_types +from ..exceptions import UnrewindableBodyError + +ACCEPT_ENCODING = 'gzip,deflate' +_FAILEDTELL = object() + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers + + +def set_file_position(body, pos): + """ + If a position is provided, move file to that point. + Otherwise, we'll attempt to record a position for future use. + """ + if pos is not None: + rewind_body(body, pos) + elif getattr(body, 'tell', None) is not None: + try: + pos = body.tell() + except (IOError, OSError): + # This differentiates from None, allowing us to catch + # a failed `tell()` later when trying to rewind the body. + pos = _FAILEDTELL + + return pos + + +def rewind_body(body, body_pos): + """ + Attempt to rewind body to a certain position. + Primarily used for request redirects and retries. + + :param body: + File-like object that supports seek. + + :param int pos: + Position to seek to in file. + """ + body_seek = getattr(body, 'seek', None) + if body_seek is not None and isinstance(body_pos, integer_types): + try: + body_seek(body_pos) + except (IOError, OSError): + raise UnrewindableBodyError("An error occurred when rewinding request " + "body for redirect/retry.") + elif body_pos is _FAILEDTELL: + raise UnrewindableBodyError("Unable to record file position for rewinding " + "request body during a redirect/retry.") + else: + raise ValueError("body_pos must be of type integer, " + "instead it was %s." % type(body_pos)) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py new file mode 100644 index 000000000..c2eb49c82 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,81 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check `isclosed()` first, in case Python3 doesn't set `closed`. + # GH Issue #928 + return obj.isclosed() + except AttributeError: + pass + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: # Platform-specific: Python 3. + unparsed_data = get_payload() + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 000000000..2a7e8c184 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,401 @@ +from __future__ import absolute_import +import time +import logging +from collections import namedtuple +from itertools import takewhile +import email +import re + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, + InvalidHeader, +) +from ..packages import six + + +log = logging.getLogger(__name__) + +# Data structure for representing the metadata of requests that result in a retry. +RequestHistory = namedtuple('RequestHistory', ["method", "url", "error", + "status", "redirect_location"]) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int status: + How many times to retry on bad status codes. + + These are retries made on responses, where status code matches + ``status_forcelist``. + + Set to ``0`` to fail on the first retry of this type. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ^ ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + + :param tuple history: The history of the request encountered during + each call to :meth:`~Retry.increment`. The list is in the order + the requests occurred. Each list item is of class :class:`RequestHistory`. + + :param bool respect_retry_after_header: + Whether to respect Retry-After header on status codes defined as + :attr:`Retry.RETRY_AFTER_STATUS_CODES` or not. + + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, status=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + history=None, respect_retry_after_header=True): + + self.total = total + self.connect = connect + self.read = read + self.status = status + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self.history = history or tuple() + self.respect_retry_after_header = respect_retry_after_header + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, status=self.status, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + history=self.history, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + # We want to consider only the last consecutive errors sequence (Ignore redirects). + consecutive_errors_len = len(list(takewhile(lambda x: x.redirect_location is None, + reversed(self.history)))) + if consecutive_errors_len <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (consecutive_errors_len - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def parse_retry_after(self, retry_after): + # Whitespace: https://tools.ietf.org/html/rfc7230#section-3.2.4 + if re.match(r"^\s*[0-9]+\s*$", retry_after): + seconds = int(retry_after) + else: + retry_date_tuple = email.utils.parsedate(retry_after) + if retry_date_tuple is None: + raise InvalidHeader("Invalid Retry-After header: %s" % retry_after) + retry_date = time.mktime(retry_date_tuple) + seconds = retry_date - time.time() + + if seconds < 0: + seconds = 0 + + return seconds + + def get_retry_after(self, response): + """ Get the value of Retry-After in seconds. """ + + retry_after = response.getheader("Retry-After") + + if retry_after is None: + return None + + return self.parse_retry_after(retry_after) + + def sleep_for_retry(self, response=None): + retry_after = self.get_retry_after(response) + if retry_after: + time.sleep(retry_after) + return True + + return False + + def _sleep_backoff(self): + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def sleep(self, response=None): + """ Sleep between retry attempts. + + This method will respect a server's ``Retry-After`` response header + and sleep the duration of the time requested. If that is not present, it + will use an exponential backoff. By default, the backoff factor is 0 and + this method will return immediately. + """ + + if response: + slept = self.sleep_for_retry(response) + if slept: + return + + self._sleep_backoff() + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def _is_method_retryable(self, method): + """ Checks if a given HTTP method should be retried upon, depending if + it is included on the method whitelist. + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return True + + def is_retry(self, method, status_code, has_retry_after=False): + """ Is this method/status code retryable? (Based on whitelists and control + variables such as the number of total retries to allow, whether to + respect the Retry-After header, whether this header is present, and + whether the returned status code is on the list of status codes to + be retried upon on the presence of the aforementioned header) + """ + if not self._is_method_retryable(method): + return False + + if self.status_forcelist and status_code in self.status_forcelist: + return True + + return (self.total and self.respect_retry_after_header and + has_retry_after and (status_code in self.RETRY_AFTER_STATUS_CODES)) + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect, self.status) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + connect = self.connect + read = self.read + redirect = self.redirect + status_count = self.status + cause = 'unknown' + status = None + redirect_location = None + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False or not self._is_method_retryable(method): + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + redirect_location = response.get_redirect_location() + status = response.status + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + cause = ResponseError.GENERIC_ERROR + if response and response.status: + if status_count is not None: + status_count -= 1 + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + status = response.status + + history = self.history + (RequestHistory(method, url, error, status, redirect_location),) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, status=status_count, + history=history) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect}, status={self.status})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/selectors.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/selectors.py new file mode 100644 index 000000000..9f16c668d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/selectors.py @@ -0,0 +1,581 @@ +# Backport of selectors.py from Python 3.5+ to support Python < 3.4 +# Also has the behavior specified in PEP 475 which is to retry syscalls +# in the case of an EINTR error. This module is required because selectors34 +# does not follow this behavior and instead returns that no dile descriptor +# events have occurred rather than retry the syscall. The decision to drop +# support for select.devpoll is made to maintain 100% test coverage. + +import errno +import math +import select +import socket +import sys +import time +from collections import namedtuple, Mapping + +try: + monotonic = time.monotonic +except (AttributeError, ImportError): # Python 3.3< + monotonic = time.time + +EVENT_READ = (1 << 0) +EVENT_WRITE = (1 << 1) + +HAS_SELECT = True # Variable that shows whether the platform has a selector. +_SYSCALL_SENTINEL = object() # Sentinel in case a system call returns None. +_DEFAULT_SELECTOR = None + + +class SelectorError(Exception): + def __init__(self, errcode): + super(SelectorError, self).__init__() + self.errno = errcode + + def __repr__(self): + return "<SelectorError errno={0}>".format(self.errno) + + def __str__(self): + return self.__repr__() + + +def _fileobj_to_fd(fileobj): + """ Return a file descriptor from a file object. If + given an integer will simply return that integer back. """ + if isinstance(fileobj, int): + fd = fileobj + else: + try: + fd = int(fileobj.fileno()) + except (AttributeError, TypeError, ValueError): + raise ValueError("Invalid file object: {0!r}".format(fileobj)) + if fd < 0: + raise ValueError("Invalid file descriptor: {0}".format(fd)) + return fd + + +# Determine which function to use to wrap system calls because Python 3.5+ +# already handles the case when system calls are interrupted. +if sys.version_info >= (3, 5): + def _syscall_wrapper(func, _, *args, **kwargs): + """ This is the short-circuit version of the below logic + because in Python 3.5+ all system calls automatically restart + and recalculate their timeouts. """ + try: + return func(*args, **kwargs) + except (OSError, IOError, select.error) as e: + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + raise SelectorError(errcode) +else: + def _syscall_wrapper(func, recalc_timeout, *args, **kwargs): + """ Wrapper function for syscalls that could fail due to EINTR. + All functions should be retried if there is time left in the timeout + in accordance with PEP 475. """ + timeout = kwargs.get("timeout", None) + if timeout is None: + expires = None + recalc_timeout = False + else: + timeout = float(timeout) + if timeout < 0.0: # Timeout less than 0 treated as no timeout. + expires = None + else: + expires = monotonic() + timeout + + args = list(args) + if recalc_timeout and "timeout" not in kwargs: + raise ValueError( + "Timeout must be in args or kwargs to be recalculated") + + result = _SYSCALL_SENTINEL + while result is _SYSCALL_SENTINEL: + try: + result = func(*args, **kwargs) + # OSError is thrown by select.select + # IOError is thrown by select.epoll.poll + # select.error is thrown by select.poll.poll + # Aren't we thankful for Python 3.x rework for exceptions? + except (OSError, IOError, select.error) as e: + # select.error wasn't a subclass of OSError in the past. + errcode = None + if hasattr(e, "errno"): + errcode = e.errno + elif hasattr(e, "args"): + errcode = e.args[0] + + # Also test for the Windows equivalent of EINTR. + is_interrupt = (errcode == errno.EINTR or (hasattr(errno, "WSAEINTR") and + errcode == errno.WSAEINTR)) + + if is_interrupt: + if expires is not None: + current_time = monotonic() + if current_time > expires: + raise OSError(errno=errno.ETIMEDOUT) + if recalc_timeout: + if "timeout" in kwargs: + kwargs["timeout"] = expires - current_time + continue + if errcode: + raise SelectorError(errcode) + else: + raise + return result + + +SelectorKey = namedtuple('SelectorKey', ['fileobj', 'fd', 'events', 'data']) + + +class _SelectorMapping(Mapping): + """ Mapping of file objects to selector keys """ + + def __init__(self, selector): + self._selector = selector + + def __len__(self): + return len(self._selector._fd_to_key) + + def __getitem__(self, fileobj): + try: + fd = self._selector._fileobj_lookup(fileobj) + return self._selector._fd_to_key[fd] + except KeyError: + raise KeyError("{0!r} is not registered.".format(fileobj)) + + def __iter__(self): + return iter(self._selector._fd_to_key) + + +class BaseSelector(object): + """ Abstract Selector class + + A selector supports registering file objects to be monitored + for specific I/O events. + + A file object is a file descriptor or any object with a + `fileno()` method. An arbitrary object can be attached to the + file object which can be used for example to store context info, + a callback, etc. + + A selector can use various implementations (select(), poll(), epoll(), + and kqueue()) depending on the platform. The 'DefaultSelector' class uses + the most efficient implementation for the current platform. + """ + def __init__(self): + # Maps file descriptors to keys. + self._fd_to_key = {} + + # Read-only mapping returned by get_map() + self._map = _SelectorMapping(self) + + def _fileobj_lookup(self, fileobj): + """ Return a file descriptor from a file object. + This wraps _fileobj_to_fd() to do an exhaustive + search in case the object is invalid but we still + have it in our map. Used by unregister() so we can + unregister an object that was previously registered + even if it is closed. It is also used by _SelectorMapping + """ + try: + return _fileobj_to_fd(fileobj) + except ValueError: + + # Search through all our mapped keys. + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + return key.fd + + # Raise ValueError after all. + raise + + def register(self, fileobj, events, data=None): + """ Register a file object for a set of events to monitor. """ + if (not events) or (events & ~(EVENT_READ | EVENT_WRITE)): + raise ValueError("Invalid events: {0!r}".format(events)) + + key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) + + if key.fd in self._fd_to_key: + raise KeyError("{0!r} (FD {1}) is already registered" + .format(fileobj, key.fd)) + + self._fd_to_key[key.fd] = key + return key + + def unregister(self, fileobj): + """ Unregister a file object from being monitored. """ + try: + key = self._fd_to_key.pop(self._fileobj_lookup(fileobj)) + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + # Getting the fileno of a closed socket on Windows errors with EBADF. + except socket.error as e: # Platform-specific: Windows. + if e.errno != errno.EBADF: + raise + else: + for key in self._fd_to_key.values(): + if key.fileobj is fileobj: + self._fd_to_key.pop(key.fd) + break + else: + raise KeyError("{0!r} is not registered".format(fileobj)) + return key + + def modify(self, fileobj, events, data=None): + """ Change a registered file object monitored events and data. """ + # NOTE: Some subclasses optimize this operation even further. + try: + key = self._fd_to_key[self._fileobj_lookup(fileobj)] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + if events != key.events: + self.unregister(fileobj) + key = self.register(fileobj, events, data) + + elif data != key.data: + # Use a shortcut to update the data. + key = key._replace(data=data) + self._fd_to_key[key.fd] = key + + return key + + def select(self, timeout=None): + """ Perform the actual selection until some monitored file objects + are ready or the timeout expires. """ + raise NotImplementedError() + + def close(self): + """ Close the selector. This must be called to ensure that all + underlying resources are freed. """ + self._fd_to_key.clear() + self._map = None + + def get_key(self, fileobj): + """ Return the key associated with a registered file object. """ + mapping = self.get_map() + if mapping is None: + raise RuntimeError("Selector is closed") + try: + return mapping[fileobj] + except KeyError: + raise KeyError("{0!r} is not registered".format(fileobj)) + + def get_map(self): + """ Return a mapping of file objects to selector keys """ + return self._map + + def _key_from_fd(self, fd): + """ Return the key associated to a given file descriptor + Return None if it is not found. """ + try: + return self._fd_to_key[fd] + except KeyError: + return None + + def __enter__(self): + return self + + def __exit__(self, *args): + self.close() + + +# Almost all platforms have select.select() +if hasattr(select, "select"): + class SelectSelector(BaseSelector): + """ Select-based selector. """ + def __init__(self): + super(SelectSelector, self).__init__() + self._readers = set() + self._writers = set() + + def register(self, fileobj, events, data=None): + key = super(SelectSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + self._readers.add(key.fd) + if events & EVENT_WRITE: + self._writers.add(key.fd) + return key + + def unregister(self, fileobj): + key = super(SelectSelector, self).unregister(fileobj) + self._readers.discard(key.fd) + self._writers.discard(key.fd) + return key + + def _select(self, r, w, timeout=None): + """ Wrapper for select.select because timeout is a positional arg """ + return select.select(r, w, [], timeout) + + def select(self, timeout=None): + # Selecting on empty lists on Windows errors out. + if not len(self._readers) and not len(self._writers): + return [] + + timeout = None if timeout is None else max(timeout, 0.0) + ready = [] + r, w, _ = _syscall_wrapper(self._select, True, self._readers, + self._writers, timeout) + r = set(r) + w = set(w) + for fd in r | w: + events = 0 + if fd in r: + events |= EVENT_READ + if fd in w: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + +if hasattr(select, "poll"): + class PollSelector(BaseSelector): + """ Poll-based selector """ + def __init__(self): + super(PollSelector, self).__init__() + self._poll = select.poll() + + def register(self, fileobj, events, data=None): + key = super(PollSelector, self).register(fileobj, events, data) + event_mask = 0 + if events & EVENT_READ: + event_mask |= select.POLLIN + if events & EVENT_WRITE: + event_mask |= select.POLLOUT + self._poll.register(key.fd, event_mask) + return key + + def unregister(self, fileobj): + key = super(PollSelector, self).unregister(fileobj) + self._poll.unregister(key.fd) + return key + + def _wrap_poll(self, timeout=None): + """ Wrapper function for select.poll.poll() so that + _syscall_wrapper can work with only seconds. """ + if timeout is not None: + if timeout <= 0: + timeout = 0 + else: + # select.poll.poll() has a resolution of 1 millisecond, + # round away from zero to wait *at least* timeout seconds. + timeout = math.ceil(timeout * 1e3) + + result = self._poll.poll(timeout) + return result + + def select(self, timeout=None): + ready = [] + fd_events = _syscall_wrapper(self._wrap_poll, True, timeout=timeout) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.POLLIN: + events |= EVENT_WRITE + if event_mask & ~select.POLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + + return ready + + +if hasattr(select, "epoll"): + class EpollSelector(BaseSelector): + """ Epoll-based selector """ + def __init__(self): + super(EpollSelector, self).__init__() + self._epoll = select.epoll() + + def fileno(self): + return self._epoll.fileno() + + def register(self, fileobj, events, data=None): + key = super(EpollSelector, self).register(fileobj, events, data) + events_mask = 0 + if events & EVENT_READ: + events_mask |= select.EPOLLIN + if events & EVENT_WRITE: + events_mask |= select.EPOLLOUT + _syscall_wrapper(self._epoll.register, False, key.fd, events_mask) + return key + + def unregister(self, fileobj): + key = super(EpollSelector, self).unregister(fileobj) + try: + _syscall_wrapper(self._epoll.unregister, False, key.fd) + except SelectorError: + # This can occur when the fd was closed since registry. + pass + return key + + def select(self, timeout=None): + if timeout is not None: + if timeout <= 0: + timeout = 0.0 + else: + # select.epoll.poll() has a resolution of 1 millisecond + # but luckily takes seconds so we don't need a wrapper + # like PollSelector. Just for better rounding. + timeout = math.ceil(timeout * 1e3) * 1e-3 + timeout = float(timeout) + else: + timeout = -1.0 # epoll.poll() must have a float. + + # We always want at least 1 to ensure that select can be called + # with no file descriptors registered. Otherwise will fail. + max_events = max(len(self._fd_to_key), 1) + + ready = [] + fd_events = _syscall_wrapper(self._epoll.poll, True, + timeout=timeout, + maxevents=max_events) + for fd, event_mask in fd_events: + events = 0 + if event_mask & ~select.EPOLLIN: + events |= EVENT_WRITE + if event_mask & ~select.EPOLLOUT: + events |= EVENT_READ + + key = self._key_from_fd(fd) + if key: + ready.append((key, events & key.events)) + return ready + + def close(self): + self._epoll.close() + super(EpollSelector, self).close() + + +if hasattr(select, "kqueue"): + class KqueueSelector(BaseSelector): + """ Kqueue / Kevent-based selector """ + def __init__(self): + super(KqueueSelector, self).__init__() + self._kqueue = select.kqueue() + + def fileno(self): + return self._kqueue.fileno() + + def register(self, fileobj, events, data=None): + key = super(KqueueSelector, self).register(fileobj, events, data) + if events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + if events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_ADD) + + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + + return key + + def unregister(self, fileobj): + key = super(KqueueSelector, self).unregister(fileobj) + if key.events & EVENT_READ: + kevent = select.kevent(key.fd, + select.KQ_FILTER_READ, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + if key.events & EVENT_WRITE: + kevent = select.kevent(key.fd, + select.KQ_FILTER_WRITE, + select.KQ_EV_DELETE) + try: + _syscall_wrapper(self._kqueue.control, False, [kevent], 0, 0) + except SelectorError: + pass + + return key + + def select(self, timeout=None): + if timeout is not None: + timeout = max(timeout, 0) + + max_events = len(self._fd_to_key) * 2 + ready_fds = {} + + kevent_list = _syscall_wrapper(self._kqueue.control, True, + None, max_events, timeout) + + for kevent in kevent_list: + fd = kevent.ident + event_mask = kevent.filter + events = 0 + if event_mask == select.KQ_FILTER_READ: + events |= EVENT_READ + if event_mask == select.KQ_FILTER_WRITE: + events |= EVENT_WRITE + + key = self._key_from_fd(fd) + if key: + if key.fd not in ready_fds: + ready_fds[key.fd] = (key, events & key.events) + else: + old_events = ready_fds[key.fd][1] + ready_fds[key.fd] = (key, (events | old_events) & key.events) + + return list(ready_fds.values()) + + def close(self): + self._kqueue.close() + super(KqueueSelector, self).close() + + +if not hasattr(select, 'select'): # Platform-specific: AppEngine + HAS_SELECT = False + + +def _can_allocate(struct): + """ Checks that select structs can be allocated by the underlying + operating system, not just advertised by the select module. We don't + check select() because we'll be hopeful that most platforms that + don't have it available will not advertise it. (ie: GAE) """ + try: + # select.poll() objects won't fail until used. + if struct == 'poll': + p = select.poll() + p.poll(0) + + # All others will fail on allocation. + else: + getattr(select, struct)().close() + return True + except (OSError, AttributeError) as e: + return False + + +# Choose the best implementation, roughly: +# kqueue == epoll > poll > select. Devpoll not supported. (See above) +# select() also can't accept a FD > FD_SETSIZE (usually around 1024) +def DefaultSelector(): + """ This function serves as a first call for DefaultSelector to + detect if the select module is being monkey-patched incorrectly + by eventlet, greenlet, and preserve proper behavior. """ + global _DEFAULT_SELECTOR + if _DEFAULT_SELECTOR is None: + if _can_allocate('kqueue'): + _DEFAULT_SELECTOR = KqueueSelector + elif _can_allocate('epoll'): + _DEFAULT_SELECTOR = EpollSelector + elif _can_allocate('poll'): + _DEFAULT_SELECTOR = PollSelector + elif hasattr(select, 'select'): + _DEFAULT_SELECTOR = SelectSelector + else: # Platform-specific: AppEngine + raise ValueError('Platform does not have a selector') + return _DEFAULT_SELECTOR() diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 000000000..c11dff227 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,341 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning + + +SSLContext = None +HAS_SNI = False +IS_PYOPENSSL = False +IS_SECURETRANSPORT = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer TLS 1.3 cipher suites +# - prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM and ChaCha20 over any AES-CBC for better performance and +# security, +# - prefer AES-GCM over ChaCha20 because hardware-accelerated AES is common, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ':'.join([ + 'TLS13-AES-256-GCM-SHA384', + 'TLS13-CHACHA20-POLY1305-SHA256', + 'TLS13-AES-128-GCM-SHA256', + 'ECDH+AESGCM', + 'ECDH+CHACHA20', + 'DH+AESGCM', + 'DH+CHACHA20', + 'ECDH+AES256', + 'DH+AES256', + 'ECDH+AES128', + 'DH+AES', + 'RSA+AESGCM', + 'RSA+AES', + '!aNULL', + '!eNULL', + '!MD5', +]) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 & 3.1 + supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or + (3, 2) <= sys.version_info) + + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from pip._vendor.urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. This is not + supported on Python 2.6 as the ssl module does not support it. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + # Note: This branch of code and all the variables in it are no longer + # used by urllib3 itself. We should consider deprecating and removing + # this code. + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + elif getattr(context, 'load_default_certs', None) is not None: + # try to load OS default certs; works well on Windows (require Python3.4+) + context.load_default_certs() + + if certfile: + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Subject Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/advanced-usage.html' + '#ssl-warnings', + SNIMissingWarning + ) + return context.wrap_socket(sock) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 000000000..9c2e6efd2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +# Use time.monotonic if available. +current_time = getattr(time, "monotonic", time.time) + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + <http://hg.python.org/cpython/file/603b4d593758/Lib/socket.py#l535>`_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If it is a numeric value less than or equal to + zero, or the type is not an integer, float, or None. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + if isinstance(value, bool): + raise ValueError("Timeout cannot be a boolean value. It must " + "be an int, float or None.") + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + try: + if value <= 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than or equal to 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int, float or None." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py new file mode 100644 index 000000000..60f826af9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/url.py @@ -0,0 +1,230 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + +# We only want to normalize urls with an HTTP(S) scheme. +# urllib3 infers URLs without a scheme (None) to be http. +NORMALIZABLE_SCHEMES = ('http', 'https', None) + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. Both the scheme and host are normalized as they are + both case-insensitive according to RFC 3986. + """ + __slots__ = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + if scheme: + scheme = scheme.lower() + if host and scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. No whitespace, no plus or + # minus prefixes, no non-integer digits such as ^2 (superscript). + if not port.isdigit(): + raise LocationParseError(url) + try: + port = int(port) + except ValueError: + raise LocationParseError(url) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 000000000..46392f218 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,40 @@ +from .selectors import ( + HAS_SELECT, + DefaultSelector, + EVENT_READ, + EVENT_WRITE +) + + +def _wait_for_io_events(socks, events, timeout=None): + """ Waits for IO events to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be interacted with immediately. """ + if not HAS_SELECT: + raise ValueError('Platform does not have a selector') + if not isinstance(socks, list): + # Probably just a single socket. + if hasattr(socks, "fileno"): + socks = [socks] + # Otherwise it might be a non-list iterable. + else: + socks = list(socks) + with DefaultSelector() as selector: + for sock in socks: + selector.register(sock, events) + return [key[0].fileobj for key in + selector.select(timeout) if key[1] & events] + + +def wait_for_read(socks, timeout=None): + """ Waits for reading to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be read from immediately. """ + return _wait_for_io_events(socks, EVENT_READ, timeout) + + +def wait_for_write(socks, timeout=None): + """ Waits for writing to be available from a list of sockets + or optionally a single socket if passed in. Returns a list of + sockets that can be written to immediately. """ + return _wait_for_io_events(socks, EVENT_WRITE, timeout) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py new file mode 100644 index 000000000..16671efe0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__init__.py @@ -0,0 +1,342 @@ +# coding: utf-8 +""" + + webencodings + ~~~~~~~~~~~~ + + This is a Python implementation of the `WHATWG Encoding standard + <http://encoding.spec.whatwg.org/>`. See README for details. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + +from .labels import LABELS + + +VERSION = '0.5.1' + + +# Some names in Encoding are not valid Python aliases. Remap these. +PYTHON_NAMES = { + 'iso-8859-8-i': 'iso-8859-8', + 'x-mac-cyrillic': 'mac-cyrillic', + 'macintosh': 'mac-roman', + 'windows-874': 'cp874'} + +CACHE = {} + + +def ascii_lower(string): + r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z. + + :param string: An Unicode string. + :returns: A new Unicode string. + + This is used for `ASCII case-insensitive + <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_ + matching of encoding labels. + The same matching is also used, among other things, + for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_. + + This is different from the :meth:`~py:str.lower` method of Unicode strings + which also affect non-ASCII characters, + sometimes mapping them into the ASCII range: + + >>> keyword = u'Bac\N{KELVIN SIGN}ground' + >>> assert keyword.lower() == u'background' + >>> assert ascii_lower(keyword) != keyword.lower() + >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground' + + """ + # This turns out to be faster than unicode.translate() + return string.encode('utf8').lower().decode('utf8') + + +def lookup(label): + """ + Look for an encoding by its label. + This is the spec’s `get an encoding + <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm. + Supported labels are listed there. + + :param label: A string. + :returns: + An :class:`Encoding` object, or :obj:`None` for an unknown label. + + """ + # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020. + label = ascii_lower(label.strip('\t\n\f\r ')) + name = LABELS.get(label) + if name is None: + return None + encoding = CACHE.get(name) + if encoding is None: + if name == 'x-user-defined': + from .x_user_defined import codec_info + else: + python_name = PYTHON_NAMES.get(name, name) + # Any python_name value that gets to here should be valid. + codec_info = codecs.lookup(python_name) + encoding = Encoding(name, codec_info) + CACHE[name] = encoding + return encoding + + +def _get_encoding(encoding_or_label): + """ + Accept either an encoding object or label. + + :param encoding: An :class:`Encoding` object or a label string. + :returns: An :class:`Encoding` object. + :raises: :exc:`~exceptions.LookupError` for an unknown label. + + """ + if hasattr(encoding_or_label, 'codec_info'): + return encoding_or_label + + encoding = lookup(encoding_or_label) + if encoding is None: + raise LookupError('Unknown encoding label: %r' % encoding_or_label) + return encoding + + +class Encoding(object): + """Reresents a character encoding such as UTF-8, + that can be used for decoding or encoding. + + .. attribute:: name + + Canonical name of the encoding + + .. attribute:: codec_info + + The actual implementation of the encoding, + a stdlib :class:`~codecs.CodecInfo` object. + See :func:`codecs.register`. + + """ + def __init__(self, name, codec_info): + self.name = name + self.codec_info = codec_info + + def __repr__(self): + return '<Encoding %s>' % self.name + + +#: The UTF-8 encoding. Should be used for new content and formats. +UTF8 = lookup('utf-8') + +_UTF16LE = lookup('utf-16le') +_UTF16BE = lookup('utf-16be') + + +def decode(input, fallback_encoding, errors='replace'): + """ + Decode a single string. + + :param input: A byte string + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: + A ``(output, encoding)`` tuple of an Unicode string + and an :obj:`Encoding`. + + """ + # Fail early if `encoding` is an invalid label. + fallback_encoding = _get_encoding(fallback_encoding) + bom_encoding, input = _detect_bom(input) + encoding = bom_encoding or fallback_encoding + return encoding.codec_info.decode(input, errors)[0], encoding + + +def _detect_bom(input): + """Return (bom_encoding, input), with any BOM removed from the input.""" + if input.startswith(b'\xFF\xFE'): + return _UTF16LE, input[2:] + if input.startswith(b'\xFE\xFF'): + return _UTF16BE, input[2:] + if input.startswith(b'\xEF\xBB\xBF'): + return UTF8, input[3:] + return None, input + + +def encode(input, encoding=UTF8, errors='strict'): + """ + Encode a single string. + + :param input: An Unicode string. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :return: A byte string. + + """ + return _get_encoding(encoding).codec_info.encode(input, errors)[0] + + +def iter_decode(input, fallback_encoding, errors='replace'): + """ + "Pull"-based decoder. + + :param input: + An iterable of byte strings. + + The input is first consumed just enough to determine the encoding + based on the precense of a BOM, + then consumed on demand when the return value is. + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: + An ``(output, encoding)`` tuple. + :obj:`output` is an iterable of Unicode strings, + :obj:`encoding` is the :obj:`Encoding` that is being used. + + """ + + decoder = IncrementalDecoder(fallback_encoding, errors) + generator = _iter_decode_generator(input, decoder) + encoding = next(generator) + return generator, encoding + + +def _iter_decode_generator(input, decoder): + """Return a generator that first yields the :obj:`Encoding`, + then yields output chukns as Unicode strings. + + """ + decode = decoder.decode + input = iter(input) + for chunck in input: + output = decode(chunck) + if output: + assert decoder.encoding is not None + yield decoder.encoding + yield output + break + else: + # Input exhausted without determining the encoding + output = decode(b'', final=True) + assert decoder.encoding is not None + yield decoder.encoding + if output: + yield output + return + + for chunck in input: + output = decode(chunck) + if output: + yield output + output = decode(b'', final=True) + if output: + yield output + + +def iter_encode(input, encoding=UTF8, errors='strict'): + """ + “Pull”-based encoder. + + :param input: An iterable of Unicode strings. + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + :returns: An iterable of byte strings. + + """ + # Fail early if `encoding` is an invalid label. + encode = IncrementalEncoder(encoding, errors).encode + return _iter_encode_generator(input, encode) + + +def _iter_encode_generator(input, encode): + for chunck in input: + output = encode(chunck) + if output: + yield output + output = encode('', final=True) + if output: + yield output + + +class IncrementalDecoder(object): + """ + “Push”-based decoder. + + :param fallback_encoding: + An :class:`Encoding` object or a label string. + The encoding to use if :obj:`input` does note have a BOM. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + """ + def __init__(self, fallback_encoding, errors='replace'): + # Fail early if `encoding` is an invalid label. + self._fallback_encoding = _get_encoding(fallback_encoding) + self._errors = errors + self._buffer = b'' + self._decoder = None + #: The actual :class:`Encoding` that is being used, + #: or :obj:`None` if that is not determined yet. + #: (Ie. if there is not enough input yet to determine + #: if there is a BOM.) + self.encoding = None # Not known yet. + + def decode(self, input, final=False): + """Decode one chunk of the input. + + :param input: A byte string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: An Unicode string. + + """ + decoder = self._decoder + if decoder is not None: + return decoder(input, final) + + input = self._buffer + input + encoding, input = _detect_bom(input) + if encoding is None: + if len(input) < 3 and not final: # Not enough data yet. + self._buffer = input + return '' + else: # No BOM + encoding = self._fallback_encoding + decoder = encoding.codec_info.incrementaldecoder(self._errors).decode + self._decoder = decoder + self.encoding = encoding + return decoder(input, final) + + +class IncrementalEncoder(object): + """ + “Push”-based encoder. + + :param encoding: An :class:`Encoding` object or a label string. + :param errors: Type of error handling. See :func:`codecs.register`. + :raises: :exc:`~exceptions.LookupError` for an unknown encoding label. + + .. method:: encode(input, final=False) + + :param input: An Unicode string. + :param final: + Indicate that no more input is available. + Must be :obj:`True` if this is the last call. + :returns: A byte string. + + """ + def __init__(self, encoding=UTF8, errors='strict'): + encoding = _get_encoding(encoding) + self.encode = encoding.codec_info.incrementalencoder(errors).encode diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ca02bd206c80192546b2646ec54be670085952f0 GIT binary patch literal 9684 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 b=Uyq(=cPhrzC1NMTY0U_X6MS4x%d7bDRC}? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e72f9f35499ca7857c08bd942076eee521e1d3ac GIT binary patch literal 4098 zcmeHKOOM+&5ca-oulJQln?BR3O`CSxXl*?$EsCN|nnQs!m(3|aA;==vrY%dZDDQ4` z=r8FXDA02c{UIs9YyU+~9g?y{?Pig4f%?O)XUHLE$QjOzAMWk-TJV`ZyYus_d#%<# zoLPPT2I4#TqkpZnTB!BBh1LYtk;DeNj7@YITj(;{sEH1`9$oZ$Y@^qqhd6c`*hL(B z0{f`O0lHD)Cc0JPHmdO!;&@x&4tf*bK^*U1gZB`}`vM;zjt>RyqPys$EBF{`=#vVc zB9422&l>m~UB!KLAANzo1RSETetY?R4SjvmI($(4+3RWWImaWML@6T4m>$L92**^6 z|9bT!7yJ}1wABhtF3|E+%O{v*S`yCjk(4`*(#4C6j3@cA_Gm?F=D;wu(F^T_%+o|W z2^S<0>W*U);e_I2?cvD}4>XFg_T<M$kDs1A)=tw*LpTpfOkwL{Ynh+w9&3})+;iQc zM`)^hp5yDLLR$)LE3~7~>e`_)?iIV$o}NyMor*ICDr2dPtul_vxJ7%G5>L;{?<L!w zhY?BglunABbCRI+oa)}tE_PRpVLF2bXEZpo!C4Kixr@`7a~s^S!Fk30g${P<5%??y zXRwX&XvR9@k>L%jLD8EO`go+9mSM8Z5g9v08!sb$x{yaT2c`)O+olt8ng>%t<@_vD z=7H&Q=Naw@uc#Pv#Y>7a9pO`wV08GhxVcOSge2AtfN=N9>zlxNYy%w6wxR|9>PA#X zLIw$`#dd(DX&mMxQRAVcNv0bEqu2%!88WO}l2RZj1L*)pOZwRGy&+qVP1csXsw&hl zD`}y^uT@x;3MnABwTfDW#Z`Eq!YWl*stPrFOPZ^IP^?a2S1P1{RADPB?3D_;RAIAQ z^+i=K@2)82HIy%g>$L4!r&H;a0#c`==yascc9?}D5*6K$&QpCj@XEvSn|86v5O$-s zX|)PR^AJv}-U5U%xJSNuSH}&GNXxmk=CHOF!ld-GeDu;<SFzTWem<xz7-tyIif(Cu z$GSL9^T0Pfwk4)mTYP!SU6olxXm@Mv!%DjpklKfe_Mz0iOP5K2mx0`0hBCh=535%* z!J`bHv$p(J)Hf3suCK!KYGdFa<yA<_r7@mjj8{7DjL>BmD<1NQa@UX<Stm}%B&uY@ z`*79V2YG|LieHE$&n_OAF<`6U1#&%h%cyLumCr@WTebY9tjqV8GIlLvs}IOm4U)ks z7dZ6-nXu(m7!Fv}Smd%!M0pO+*am#DO-`?}IuqGFsIxn`t;+9g1ITP05>v4w(`%N_ z!=&h-RHl5Twix2Bq-jQNno)FeLUq@K+Ow(;P%KzGT3jg;gQ9z(%kgr)SvZVp-YE9N zgp%OGI<j@ccOj@l8WB=1GeveaeDxj;S#k|ui8yJq@b5rLNJbT7QlPw8CB_UH@ar+` zD#8X#TT)%v(5OphWiljSakOT=v#NQ>o?^b?e6`+}hKo$5JP5xsRtiXCeZ^Rx8|y<< zIHj@8vT9c*th~~kcdB_<FHCF}Vz-)ycOd4QrFmG*56gLY=&MkG81Sn3D@D9GkWsgs zWg$sOm_Q^?pvY3p>*jbQ%DK#Wjwe}f0EtabK=BW_MA0h=-5X>ZJec|G<z5HfTNlt5 z%(6{BtTYMPmKfljf<Bqih!&kF(K!oeprV0*SiO)Vw<8M8#A1d{=lL{TgxtWYzW_1W zX_UdpTaC+YM=zqH@qoUAb>}pgg~^l@vKi4~Fl&P~Y?A_6zaq<+7VQh25Ap{NN@f|` zgO^St#~m2F?pIArZ<WSupFj8v!z13G(I5)AD7+w$ZSp?rlpC=w5JIlj?ZZAYzw_f< z-zBwWzjS@K^z?9@b%Fq;Q4p~9lkXosesc1AD~sT~;@_*hzsSg0nB)FgnDtN77~zce z=UIO=4FZok$?y!>QLs2O2hduLr&(;AI=<h3)?bi?P7<1jaja*N<5~GHAs-Zf!5N0e pHS4QCANumwz|rCb>wYs&(K5#0?tmfm4`|Ic+v{up<G*nO{{rEhYPA3W literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac5f1da237adfe8b76319583c5d8417208974d47 GIT binary patch literal 1920 zcmcIl%}yLg5bo}oogK!QAmUhd>_Zy|DJ#LQjZK0PK`}oEON2ufB?JYHhV9;EV0LEc zZorV;90F33W8Ppn<~8ydea$Jaz$sNTEWwJETYA*h|J7ereO<GB_ijL->~G%R*{l%q zCk}?iht8K!bsK~r+eA>o61q)K$D!vWtm|w$lzdB4?h@%91Zt5I{EF2|x%wSR*%lG5 zs9cb3Pk5pVZB_chKVWKCj>xJQIj83oPO&Db1!sQ*0f%xTcV*hjM4WbXy?c;EyE4(m z%8&0W<)N=-N2ZaAjO1odzN@3uz`L0^N@Ts<ztGC^Qx$ji%mQB-cKPhH=d*nGlsDsU zmhxtl$7yl#LK3%Rs^tP-Zmv#qEhS%nv$D3)T;uIbaUo3<CmK}$1^yx%HEOFzD#>!N zgW?PnY#pd8Q1v|!J@^LXk{mESZs<?6N5BbmqsD9{$xfuQW3RQA%EVc^rc|atsi%zs zul!Dw2MVr^8@Y;)!Q{qqq#Erk5mM<!S2cF`!*E{DrJo;*m#r{Ao_%K8^PPQ_Ja5mv zdezu$<Z(U|r`kkGGNW2^^DoR{gp)-Lk7X({)wmsp#xM@`{M3#{1+cJyiKb{51fk<p zA#rX@MspD;wk4BjhxUO<!nq)Z45(o}a!v=%B^kKFy`-0P6~=vLDxxC13({jaKBvEu z9vyf;lQtDqnD@*1OJEMnSA~x~F*5LbpaGe*5q${mo}8R~525~>PUV5GqMQ#Y$gkOB zG9*^4cp7#8XA%{_pYpA(ExwxZG&5X^*gOfI^3A<i^LCs_4sCQ~vTkJJ7DVxs1N|k^ zUm$;PMJou_UoWq%H~AO*hu|hO7%+@g6GO8Oq62K)S?$vv733jVB|D$>S&s=?^gr!8 zh8Ws&Fc<?S*d;X(9N|2~@D<}W`^`Okd^mpSLI7MlGIXD|Ug<zfkF1Nnt2x$HGFJsx zU==x?!x2`0X8jge(8<)P^@j@JHDCfL7+;Diz`Y6<lUSQp*3Fk@&<5n0#~2-@XOD-j zs4pfNI7cr*XSmr`BHfDP8%H2F3x1-Kk3oPNCcbBVWFfHYoPGl@_mGL}$4RY|$h79D z4`8dBKrxB}ufK(EWDzmE&DGK@ENBM8C1;P`18lhO9YAQ|3p_Xt0swtd0ulg7&|l!` zAg~AI9>k#S+$Yx%F^M{7W0*px^um+|IUQV44(UjJ1d9HJ8q-uadK-d8|6o`5Ve3o0 zyg*GY?OReCvF^UkQcO*e&<d9@ijlCMkdUjTbwHE#<XZ#D!+KE;xlh2MECz2`2eP59 z<dHI3;a{h?4q!dNK3Z%2p>H0-NTXxPgvUJg*qNX%4T?`q6+6SQ8^viDp4In^$rl=p zAyw)+m#zBAUSv)>^-Ohc7IYoK*8*D&Ly@(@P(4CT9-vC%-O`#nZ@PJ=Op$8sSh-SH z^6*FkLGh{F+>Rs;Lof$&vAGrbf&-;7i{-y&=?<JLjB%My86?OtI^p;g|A|lk1}A{? Ar~m)} literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8e356527d7e495ad245098ad838fa37596c3beb GIT binary patch literal 5061 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7324ce3a02ea70e2a563417ba6b02319831b30e GIT binary patch literal 2673 zcmbtW*?Sa45TDtZJ+m7^L<G<ALZc+BC<^h41W-KU5xmx8oa}U9;_U3wGaC+3)F5~O z-U=#J1XK<W@V@o0@MT_o@~Pf^vU-*c0ps`SXYW@v-M^lx?*7%$yR1|yXxzqD&wX@W zx2FBB2JM#T&Hzhzh?T2VG*@?1zFtdJQo8CJzELr5(OlC_Z`ItiFviRYqhd0WakGqM z8A&seW+dn48Obw}VI;#y!R=tALzs+ZC(KHgv7%dItdw9m#&SHDcRPhSp^X(1-67H< zBXT0^&f1x+6y2^$Nf`S&MQKv6%yNxkt!MV8-wFkb+j=n~f@<CMf;C~^2D=#wX}e<7 z3xu1@KmE_GW#Hz(@@frV)I<<Dkyj6_`luDH71oAcWvutOF{`~wU+c5}YQ3>hdTZ83 z{nlW+Yc0Cs%0<@5Mr+usv7uq7;RVSq`hBk|f>88Z%Z8UPv_c`QJ5~*@7#dz-jn<{* zipcT&kWK%=PSASvxT_g>d@5o4UL>UBheK60({2WL23SIimC!0WJ1*sB-IQx=)hh-& zLb*$?m~Mv2%E#$JwpEQYVI;k3R8^m=rk-h*L6)$SRiy3HH|v{IQEF1LtPk}VaYpT< z8pfT~wT`Sg4Le~%#GP$M?8q7M1;1&A!XJ&(UeIVpaYjg4m*HVecCg_;H<ugI8+Rg6 z9(QDUwC=k?hUJ<pkBr&&l5lZw?YMh&)ozS0x*{4~vSv*BSB@@Ty0pBy-0&K`UJyo( z@At~;;w4u_>l_6pVvmc!t;_QCFeslK27Qf<ycrcE;tX}p6e~^NR7@!8YfbzoMx>(b z1RYEcn~pn^Cx>C14w>WEq)IQTvM-^brHbnNOzXQdxqr%*S`$M(x-@yR{Yb|-+YX$X zu<f{D+qJse^i{uT+v}Q+-<pvnwNjT-iuGwqttpkiPiG00;asX<BuJG9Q%$`xz!J`7 zH5FOusmL-pEHZKTs-P-cDdVq5sFf>c=5P+1IUZHoSSm6m4OgG9v60k})OoJQOz4yu z?zec#D%3c^UYzD^cKlP%qE31qOPjp;f8Ww^=Q5Kkd70U21+IRYJWZ*DshLPpJ3f~s zF`Uz-8vjp<mM0<de<@N4+M;L{_oh=Ml~Ye8NJYU#EHe>wd_#Rxp*90S{}@FoGA?Wz zW`flCB!ZM*2h<BH=%!*wS5A+M!;utD?E$Ik8kd(--7=F$RN7vu?5Wh{1=aY!E_knS zxZ?cF1?TYs3#Top#+y1%z7Tq{v8j^oM9Rh8-ifSe)fIUX)?!=6MJ~h40Sj-bJzAeI z($v%$^^{?zGud3e&`~UP&gz=oecGJU=bkZd{+VZ;ea^Y(S?6DH;YAlOxa88F%PwEo z+gIjG=c=n0Uvuq}rTy1kf5VM84cxqJaQTXrx7@nww%hNxbLg(S@40t)^?mn0@Zdw0 zhaY+LG5c|6q{`RYnzi286MikIH`d88YL2hpuyNCqo1c1m3&Ar4&k{UGFhQ`D;CX^= z1ltK-Ab64BC4!d;b`b0&*hTOP!K(zX5xh?D2Em&IZxOsr@D9Olf;|N961+$7KEYlB zAV7kB1d{~&2@Vi^K=2{KM+6564iOwCI709-!6yWt5`0E*l;9Y_=LBC6d`a*X!Pf-e z5PVDU9l`emKM?##@Dst$1iujcO85-nvxLtPP7rP-e4cO{;da6o2wx<8iST8@9fUgx zcM-lq_$uLRgs&66LHH)&TZC^DzC*a1a1Y_Tgzpi)Pq>#52$66f;UwXH!UKdK5PnGb z5#d3?LxhJ3j}U%L_zB^sgr5-}B|Jv>IpG(CUlM*r_%-1-gx?Z=NBBMA4}?Dw{zUjQ z;V*>0_H@Nr+ji^KR;eFtMor13UaHV&RZBzlRAEYzFG&cgf;7%2x7w<J|5Z#~1#v-L zP*vMgs45+CseP4?G(F#ys^U(o9!Ux&cU12B)-`jZ8ifm3nW<tbm+sDYr@Pa0%sClT TPw5%{rIKGRZ*I}HXz9NI$Tbe$ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py new file mode 100644 index 000000000..9dae10251 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/labels.py @@ -0,0 +1,231 @@ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { + 'unicode-1-1-utf-8': 'utf-8', + 'utf-8': 'utf-8', + 'utf8': 'utf-8', + '866': 'ibm866', + 'cp866': 'ibm866', + 'csibm866': 'ibm866', + 'ibm866': 'ibm866', + 'csisolatin2': 'iso-8859-2', + 'iso-8859-2': 'iso-8859-2', + 'iso-ir-101': 'iso-8859-2', + 'iso8859-2': 'iso-8859-2', + 'iso88592': 'iso-8859-2', + 'iso_8859-2': 'iso-8859-2', + 'iso_8859-2:1987': 'iso-8859-2', + 'l2': 'iso-8859-2', + 'latin2': 'iso-8859-2', + 'csisolatin3': 'iso-8859-3', + 'iso-8859-3': 'iso-8859-3', + 'iso-ir-109': 'iso-8859-3', + 'iso8859-3': 'iso-8859-3', + 'iso88593': 'iso-8859-3', + 'iso_8859-3': 'iso-8859-3', + 'iso_8859-3:1988': 'iso-8859-3', + 'l3': 'iso-8859-3', + 'latin3': 'iso-8859-3', + 'csisolatin4': 'iso-8859-4', + 'iso-8859-4': 'iso-8859-4', + 'iso-ir-110': 'iso-8859-4', + 'iso8859-4': 'iso-8859-4', + 'iso88594': 'iso-8859-4', + 'iso_8859-4': 'iso-8859-4', + 'iso_8859-4:1988': 'iso-8859-4', + 'l4': 'iso-8859-4', + 'latin4': 'iso-8859-4', + 'csisolatincyrillic': 'iso-8859-5', + 'cyrillic': 'iso-8859-5', + 'iso-8859-5': 'iso-8859-5', + 'iso-ir-144': 'iso-8859-5', + 'iso8859-5': 'iso-8859-5', + 'iso88595': 'iso-8859-5', + 'iso_8859-5': 'iso-8859-5', + 'iso_8859-5:1988': 'iso-8859-5', + 'arabic': 'iso-8859-6', + 'asmo-708': 'iso-8859-6', + 'csiso88596e': 'iso-8859-6', + 'csiso88596i': 'iso-8859-6', + 'csisolatinarabic': 'iso-8859-6', + 'ecma-114': 'iso-8859-6', + 'iso-8859-6': 'iso-8859-6', + 'iso-8859-6-e': 'iso-8859-6', + 'iso-8859-6-i': 'iso-8859-6', + 'iso-ir-127': 'iso-8859-6', + 'iso8859-6': 'iso-8859-6', + 'iso88596': 'iso-8859-6', + 'iso_8859-6': 'iso-8859-6', + 'iso_8859-6:1987': 'iso-8859-6', + 'csisolatingreek': 'iso-8859-7', + 'ecma-118': 'iso-8859-7', + 'elot_928': 'iso-8859-7', + 'greek': 'iso-8859-7', + 'greek8': 'iso-8859-7', + 'iso-8859-7': 'iso-8859-7', + 'iso-ir-126': 'iso-8859-7', + 'iso8859-7': 'iso-8859-7', + 'iso88597': 'iso-8859-7', + 'iso_8859-7': 'iso-8859-7', + 'iso_8859-7:1987': 'iso-8859-7', + 'sun_eu_greek': 'iso-8859-7', + 'csiso88598e': 'iso-8859-8', + 'csisolatinhebrew': 'iso-8859-8', + 'hebrew': 'iso-8859-8', + 'iso-8859-8': 'iso-8859-8', + 'iso-8859-8-e': 'iso-8859-8', + 'iso-ir-138': 'iso-8859-8', + 'iso8859-8': 'iso-8859-8', + 'iso88598': 'iso-8859-8', + 'iso_8859-8': 'iso-8859-8', + 'iso_8859-8:1988': 'iso-8859-8', + 'visual': 'iso-8859-8', + 'csiso88598i': 'iso-8859-8-i', + 'iso-8859-8-i': 'iso-8859-8-i', + 'logical': 'iso-8859-8-i', + 'csisolatin6': 'iso-8859-10', + 'iso-8859-10': 'iso-8859-10', + 'iso-ir-157': 'iso-8859-10', + 'iso8859-10': 'iso-8859-10', + 'iso885910': 'iso-8859-10', + 'l6': 'iso-8859-10', + 'latin6': 'iso-8859-10', + 'iso-8859-13': 'iso-8859-13', + 'iso8859-13': 'iso-8859-13', + 'iso885913': 'iso-8859-13', + 'iso-8859-14': 'iso-8859-14', + 'iso8859-14': 'iso-8859-14', + 'iso885914': 'iso-8859-14', + 'csisolatin9': 'iso-8859-15', + 'iso-8859-15': 'iso-8859-15', + 'iso8859-15': 'iso-8859-15', + 'iso885915': 'iso-8859-15', + 'iso_8859-15': 'iso-8859-15', + 'l9': 'iso-8859-15', + 'iso-8859-16': 'iso-8859-16', + 'cskoi8r': 'koi8-r', + 'koi': 'koi8-r', + 'koi8': 'koi8-r', + 'koi8-r': 'koi8-r', + 'koi8_r': 'koi8-r', + 'koi8-u': 'koi8-u', + 'csmacintosh': 'macintosh', + 'mac': 'macintosh', + 'macintosh': 'macintosh', + 'x-mac-roman': 'macintosh', + 'dos-874': 'windows-874', + 'iso-8859-11': 'windows-874', + 'iso8859-11': 'windows-874', + 'iso885911': 'windows-874', + 'tis-620': 'windows-874', + 'windows-874': 'windows-874', + 'cp1250': 'windows-1250', + 'windows-1250': 'windows-1250', + 'x-cp1250': 'windows-1250', + 'cp1251': 'windows-1251', + 'windows-1251': 'windows-1251', + 'x-cp1251': 'windows-1251', + 'ansi_x3.4-1968': 'windows-1252', + 'ascii': 'windows-1252', + 'cp1252': 'windows-1252', + 'cp819': 'windows-1252', + 'csisolatin1': 'windows-1252', + 'ibm819': 'windows-1252', + 'iso-8859-1': 'windows-1252', + 'iso-ir-100': 'windows-1252', + 'iso8859-1': 'windows-1252', + 'iso88591': 'windows-1252', + 'iso_8859-1': 'windows-1252', + 'iso_8859-1:1987': 'windows-1252', + 'l1': 'windows-1252', + 'latin1': 'windows-1252', + 'us-ascii': 'windows-1252', + 'windows-1252': 'windows-1252', + 'x-cp1252': 'windows-1252', + 'cp1253': 'windows-1253', + 'windows-1253': 'windows-1253', + 'x-cp1253': 'windows-1253', + 'cp1254': 'windows-1254', + 'csisolatin5': 'windows-1254', + 'iso-8859-9': 'windows-1254', + 'iso-ir-148': 'windows-1254', + 'iso8859-9': 'windows-1254', + 'iso88599': 'windows-1254', + 'iso_8859-9': 'windows-1254', + 'iso_8859-9:1989': 'windows-1254', + 'l5': 'windows-1254', + 'latin5': 'windows-1254', + 'windows-1254': 'windows-1254', + 'x-cp1254': 'windows-1254', + 'cp1255': 'windows-1255', + 'windows-1255': 'windows-1255', + 'x-cp1255': 'windows-1255', + 'cp1256': 'windows-1256', + 'windows-1256': 'windows-1256', + 'x-cp1256': 'windows-1256', + 'cp1257': 'windows-1257', + 'windows-1257': 'windows-1257', + 'x-cp1257': 'windows-1257', + 'cp1258': 'windows-1258', + 'windows-1258': 'windows-1258', + 'x-cp1258': 'windows-1258', + 'x-mac-cyrillic': 'x-mac-cyrillic', + 'x-mac-ukrainian': 'x-mac-cyrillic', + 'chinese': 'gbk', + 'csgb2312': 'gbk', + 'csiso58gb231280': 'gbk', + 'gb2312': 'gbk', + 'gb_2312': 'gbk', + 'gb_2312-80': 'gbk', + 'gbk': 'gbk', + 'iso-ir-58': 'gbk', + 'x-gbk': 'gbk', + 'gb18030': 'gb18030', + 'hz-gb-2312': 'hz-gb-2312', + 'big5': 'big5', + 'big5-hkscs': 'big5', + 'cn-big5': 'big5', + 'csbig5': 'big5', + 'x-x-big5': 'big5', + 'cseucpkdfmtjapanese': 'euc-jp', + 'euc-jp': 'euc-jp', + 'x-euc-jp': 'euc-jp', + 'csiso2022jp': 'iso-2022-jp', + 'iso-2022-jp': 'iso-2022-jp', + 'csshiftjis': 'shift_jis', + 'ms_kanji': 'shift_jis', + 'shift-jis': 'shift_jis', + 'shift_jis': 'shift_jis', + 'sjis': 'shift_jis', + 'windows-31j': 'shift_jis', + 'x-sjis': 'shift_jis', + 'cseuckr': 'euc-kr', + 'csksc56011987': 'euc-kr', + 'euc-kr': 'euc-kr', + 'iso-ir-149': 'euc-kr', + 'korean': 'euc-kr', + 'ks_c_5601-1987': 'euc-kr', + 'ks_c_5601-1989': 'euc-kr', + 'ksc5601': 'euc-kr', + 'ksc_5601': 'euc-kr', + 'windows-949': 'euc-kr', + 'csiso2022kr': 'iso-2022-kr', + 'iso-2022-kr': 'iso-2022-kr', + 'utf-16be': 'utf-16be', + 'utf-16': 'utf-16le', + 'utf-16le': 'utf-16le', + 'x-user-defined': 'x-user-defined', +} diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 000000000..a7f7e7608 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/mklabels.py @@ -0,0 +1,59 @@ +""" + + webencodings.mklabels + ~~~~~~~~~~~~~~~~~~~~~ + + Regenarate the webencodings.labels module. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +import json +try: + from urllib import urlopen +except ImportError: + from urllib.request import urlopen + + +def assert_lower(string): + assert string == string.lower() + return string + + +def generate(url): + parts = ['''\ +""" + + webencodings.labels + ~~~~~~~~~~~~~~~~~~~ + + Map encoding labels to their name. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +# XXX Do not edit! +# This file is automatically generated by mklabels.py + +LABELS = { +'''] + labels = [ + (repr(assert_lower(label)).lstrip('u'), + repr(encoding['name']).lstrip('u')) + for category in json.loads(urlopen(url).read().decode('ascii')) + for encoding in category['encodings'] + for label in encoding['labels']] + max_len = max(len(label) for label, name in labels) + parts.extend( + ' %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name) + for label, name in labels) + parts.append('}') + return ''.join(parts) + + +if __name__ == '__main__': + print(generate('http://encoding.spec.whatwg.org/encodings.json')) diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py new file mode 100644 index 000000000..f6cdbf96c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/tests.py @@ -0,0 +1,153 @@ +# coding: utf-8 +""" + + webencodings.tests + ~~~~~~~~~~~~~~~~~~ + + A basic test suite for Encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode, + IncrementalDecoder, IncrementalEncoder, UTF8) + + +def assert_raises(exception, function, *args, **kwargs): + try: + function(*args, **kwargs) + except exception: + return + else: # pragma: no cover + raise AssertionError('Did not raise %s.' % exception) + + +def test_labels(): + assert lookup('utf-8').name == 'utf-8' + assert lookup('Utf-8').name == 'utf-8' + assert lookup('UTF-8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8').name == 'utf-8' + assert lookup('utf8 ').name == 'utf-8' + assert lookup(' \r\nutf8\t').name == 'utf-8' + assert lookup('u8') is None # Python label. + assert lookup('utf-8 ') is None # Non-ASCII white space. + + assert lookup('US-ASCII').name == 'windows-1252' + assert lookup('iso-8859-1').name == 'windows-1252' + assert lookup('latin1').name == 'windows-1252' + assert lookup('LATIN1').name == 'windows-1252' + assert lookup('latin-1') is None + assert lookup('LATİN1') is None # ASCII-only case insensitivity. + + +def test_all_labels(): + for label in LABELS: + assert decode(b'', label) == ('', lookup(label)) + assert encode('', label) == b'' + for repeat in [0, 1, 12]: + output, _ = iter_decode([b''] * repeat, label) + assert list(output) == [] + assert list(iter_encode([''] * repeat, label)) == [] + decoder = IncrementalDecoder(label) + assert decoder.decode(b'') == '' + assert decoder.decode(b'', final=True) == '' + encoder = IncrementalEncoder(label) + assert encoder.encode('') == b'' + assert encoder.encode('', final=True) == b'' + # All encoding names are valid labels too: + for name in set(LABELS.values()): + assert lookup(name).name == name + + +def test_invalid_label(): + assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid') + assert_raises(LookupError, encode, 'é', 'invalid') + assert_raises(LookupError, iter_decode, [], 'invalid') + assert_raises(LookupError, iter_encode, [], 'invalid') + assert_raises(LookupError, IncrementalDecoder, 'invalid') + assert_raises(LookupError, IncrementalEncoder, 'invalid') + + +def test_decode(): + assert decode(b'\x80', 'latin1') == ('€', lookup('latin1')) + assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1')) + assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8')) + assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii')) + assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8')) # UTF-8 with BOM + + assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be')) # UTF-16-BE with BOM + assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le')) # UTF-16-LE with BOM + assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be')) + assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le')) + + assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be')) + assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le')) + assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le')) + + assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be')) + assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le')) + assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le')) + + +def test_encode(): + assert encode('é', 'latin1') == b'\xe9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf8') == b'\xc3\xa9' + assert encode('é', 'utf-16') == b'\xe9\x00' + assert encode('é', 'utf-16le') == b'\xe9\x00' + assert encode('é', 'utf-16be') == b'\x00\xe9' + + +def test_iter_decode(): + def iter_decode_to_string(input, fallback_encoding): + output, _encoding = iter_decode(input, fallback_encoding) + return ''.join(output) + assert iter_decode_to_string([], 'latin1') == '' + assert iter_decode_to_string([b''], 'latin1') == '' + assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'hello'], 'latin1') == 'hello' + assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello' + assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello' + assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD' + assert iter_decode_to_string([ + b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == '' + assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»' + assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é' + assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é' + assert iter_decode_to_string([ + b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo' + + +def test_iter_encode(): + assert b''.join(iter_encode([], 'latin1')) == b'' + assert b''.join(iter_encode([''], 'latin1')) == b'' + assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00' + assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9' + assert b''.join(iter_encode([ + '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo' + + +def test_x_user_defined(): + encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca' + decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca' + encoded = b'aa' + decoded = 'aa' + assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined')) + assert encode(decoded, 'x-user-defined') == encoded diff --git a/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 000000000..748e2c9e4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pip/_vendor/webencodings/x_user_defined.py @@ -0,0 +1,325 @@ +# coding: utf-8 +""" + + webencodings.x_user_defined + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + An implementation of the x-user-defined encoding. + + :copyright: Copyright 2012 by Simon Sapin + :license: BSD, see LICENSE for details. + +""" + +from __future__ import unicode_literals + +import codecs + + +### Codec APIs + +class Codec(codecs.Codec): + + def encode(self, input, errors='strict'): + return codecs.charmap_encode(input, errors, encoding_table) + + def decode(self, input, errors='strict'): + return codecs.charmap_decode(input, errors, decoding_table) + + +class IncrementalEncoder(codecs.IncrementalEncoder): + def encode(self, input, final=False): + return codecs.charmap_encode(input, self.errors, encoding_table)[0] + + +class IncrementalDecoder(codecs.IncrementalDecoder): + def decode(self, input, final=False): + return codecs.charmap_decode(input, self.errors, decoding_table)[0] + + +class StreamWriter(Codec, codecs.StreamWriter): + pass + + +class StreamReader(Codec, codecs.StreamReader): + pass + + +### encodings module API + +codec_info = codecs.CodecInfo( + name='x-user-defined', + encode=Codec().encode, + decode=Codec().decode, + incrementalencoder=IncrementalEncoder, + incrementaldecoder=IncrementalDecoder, + streamreader=StreamReader, + streamwriter=StreamWriter, +) + + +### Decoding Table + +# Python 3: +# for c in range(256): print(' %r' % chr(c if c < 128 else c + 0xF700)) +decoding_table = ( + '\x00' + '\x01' + '\x02' + '\x03' + '\x04' + '\x05' + '\x06' + '\x07' + '\x08' + '\t' + '\n' + '\x0b' + '\x0c' + '\r' + '\x0e' + '\x0f' + '\x10' + '\x11' + '\x12' + '\x13' + '\x14' + '\x15' + '\x16' + '\x17' + '\x18' + '\x19' + '\x1a' + '\x1b' + '\x1c' + '\x1d' + '\x1e' + '\x1f' + ' ' + '!' + '"' + '#' + '$' + '%' + '&' + "'" + '(' + ')' + '*' + '+' + ',' + '-' + '.' + '/' + '0' + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' + ':' + ';' + '<' + '=' + '>' + '?' + '@' + 'A' + 'B' + 'C' + 'D' + 'E' + 'F' + 'G' + 'H' + 'I' + 'J' + 'K' + 'L' + 'M' + 'N' + 'O' + 'P' + 'Q' + 'R' + 'S' + 'T' + 'U' + 'V' + 'W' + 'X' + 'Y' + 'Z' + '[' + '\\' + ']' + '^' + '_' + '`' + 'a' + 'b' + 'c' + 'd' + 'e' + 'f' + 'g' + 'h' + 'i' + 'j' + 'k' + 'l' + 'm' + 'n' + 'o' + 'p' + 'q' + 'r' + 's' + 't' + 'u' + 'v' + 'w' + 'x' + 'y' + 'z' + '{' + '|' + '}' + '~' + '\x7f' + '\uf780' + '\uf781' + '\uf782' + '\uf783' + '\uf784' + '\uf785' + '\uf786' + '\uf787' + '\uf788' + '\uf789' + '\uf78a' + '\uf78b' + '\uf78c' + '\uf78d' + '\uf78e' + '\uf78f' + '\uf790' + '\uf791' + '\uf792' + '\uf793' + '\uf794' + '\uf795' + '\uf796' + '\uf797' + '\uf798' + '\uf799' + '\uf79a' + '\uf79b' + '\uf79c' + '\uf79d' + '\uf79e' + '\uf79f' + '\uf7a0' + '\uf7a1' + '\uf7a2' + '\uf7a3' + '\uf7a4' + '\uf7a5' + '\uf7a6' + '\uf7a7' + '\uf7a8' + '\uf7a9' + '\uf7aa' + '\uf7ab' + '\uf7ac' + '\uf7ad' + '\uf7ae' + '\uf7af' + '\uf7b0' + '\uf7b1' + '\uf7b2' + '\uf7b3' + '\uf7b4' + '\uf7b5' + '\uf7b6' + '\uf7b7' + '\uf7b8' + '\uf7b9' + '\uf7ba' + '\uf7bb' + '\uf7bc' + '\uf7bd' + '\uf7be' + '\uf7bf' + '\uf7c0' + '\uf7c1' + '\uf7c2' + '\uf7c3' + '\uf7c4' + '\uf7c5' + '\uf7c6' + '\uf7c7' + '\uf7c8' + '\uf7c9' + '\uf7ca' + '\uf7cb' + '\uf7cc' + '\uf7cd' + '\uf7ce' + '\uf7cf' + '\uf7d0' + '\uf7d1' + '\uf7d2' + '\uf7d3' + '\uf7d4' + '\uf7d5' + '\uf7d6' + '\uf7d7' + '\uf7d8' + '\uf7d9' + '\uf7da' + '\uf7db' + '\uf7dc' + '\uf7dd' + '\uf7de' + '\uf7df' + '\uf7e0' + '\uf7e1' + '\uf7e2' + '\uf7e3' + '\uf7e4' + '\uf7e5' + '\uf7e6' + '\uf7e7' + '\uf7e8' + '\uf7e9' + '\uf7ea' + '\uf7eb' + '\uf7ec' + '\uf7ed' + '\uf7ee' + '\uf7ef' + '\uf7f0' + '\uf7f1' + '\uf7f2' + '\uf7f3' + '\uf7f4' + '\uf7f5' + '\uf7f6' + '\uf7f7' + '\uf7f8' + '\uf7f9' + '\uf7fa' + '\uf7fb' + '\uf7fc' + '\uf7fd' + '\uf7fe' + '\uf7ff' +) + +### Encoding table +encoding_table = codecs.charmap_build(decoding_table) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/__init__.py b/myenv/lib/python3.7/site-packages/pkg_resources/__init__.py new file mode 100644 index 000000000..8d95bd291 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/__init__.py @@ -0,0 +1,3125 @@ +# coding: utf-8 +""" +Package resource API +-------------------- + +A resource is a logical file contained within a package, or a logical +subdirectory thereof. The package resource API expects resource names +to have their path parts separated with ``/``, *not* whatever the local +path separator is. Do not use os.path operations to manipulate resource +names being passed into the API. + +The package resource API is designed to work with normal filesystem packages, +.egg files, and unpacked .egg files. It can also work in a limited way with +.zip files and with custom PEP 302 loaders that support the ``get_data()`` +method. +""" + +from __future__ import absolute_import + +import sys +import os +import io +import time +import re +import types +import zipfile +import zipimport +import warnings +import stat +import functools +import pkgutil +import operator +import platform +import collections +import plistlib +import email.parser +import errno +import tempfile +import textwrap +import itertools +import inspect +from pkgutil import get_importer + +try: + import _imp +except ImportError: + # Python 3.2 compatibility + import imp as _imp + +from pkg_resources.extern import six +from pkg_resources.extern.six.moves import urllib, map, filter + +# capture these to bypass sandboxing +from os import utime +try: + from os import mkdir, rename, unlink + WRITE_SUPPORT = True +except ImportError: + # no write support, probably under GAE + WRITE_SUPPORT = False + +from os import open as os_open +from os.path import isdir, split + +try: + import importlib.machinery as importlib_machinery + # access attribute to force import under delayed import mechanisms. + importlib_machinery.__name__ +except ImportError: + importlib_machinery = None + +from . import py31compat +from pkg_resources.extern import appdirs +from pkg_resources.extern import packaging +__import__('pkg_resources.extern.packaging.version') +__import__('pkg_resources.extern.packaging.specifiers') +__import__('pkg_resources.extern.packaging.requirements') +__import__('pkg_resources.extern.packaging.markers') + + +if (3, 0) < sys.version_info < (3, 3): + raise RuntimeError("Python 3.3 or later is required") + +if six.PY2: + # Those builtin exceptions are only defined in Python 3 + PermissionError = None + NotADirectoryError = None + +# declare some globals that will be defined later to +# satisfy the linters. +require = None +working_set = None +add_activation_listener = None +resources_stream = None +cleanup_resources = None +resource_dir = None +resource_stream = None +set_extraction_path = None +resource_isdir = None +resource_string = None +iter_entry_points = None +resource_listdir = None +resource_filename = None +resource_exists = None +_distribution_finders = None +_namespace_handlers = None +_namespace_packages = None + + +class PEP440Warning(RuntimeWarning): + """ + Used when there is an issue with a version or specifier not complying with + PEP 440. + """ + + +def parse_version(v): + try: + return packaging.version.Version(v) + except packaging.version.InvalidVersion: + return packaging.version.LegacyVersion(v) + + +_state_vars = {} + + +def _declare_state(vartype, **kw): + globals().update(kw) + _state_vars.update(dict.fromkeys(kw, vartype)) + + +def __getstate__(): + state = {} + g = globals() + for k, v in _state_vars.items(): + state[k] = g['_sget_' + v](g[k]) + return state + + +def __setstate__(state): + g = globals() + for k, v in state.items(): + g['_sset_' + _state_vars[k]](k, g[k], v) + return state + + +def _sget_dict(val): + return val.copy() + + +def _sset_dict(key, ob, state): + ob.clear() + ob.update(state) + + +def _sget_object(val): + return val.__getstate__() + + +def _sset_object(key, ob, state): + ob.__setstate__(state) + + +_sget_none = _sset_none = lambda *args: None + + +def get_supported_platform(): + """Return this platform's maximum compatible version. + + distutils.util.get_platform() normally reports the minimum version + of Mac OS X that would be required to *use* extensions produced by + distutils. But what we want when checking compatibility is to know the + version of Mac OS X that we are *running*. To allow usage of packages that + explicitly require a newer version of Mac OS X, we must also know the + current version of the OS. + + If this condition occurs for any other platform with a version in its + platform strings, this function should be extended accordingly. + """ + plat = get_build_platform() + m = macosVersionString.match(plat) + if m is not None and sys.platform == "darwin": + try: + plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3)) + except ValueError: + # not Mac OS X + pass + return plat + + +__all__ = [ + # Basic resource access and distribution/entry point discovery + 'require', 'run_script', 'get_provider', 'get_distribution', + 'load_entry_point', 'get_entry_map', 'get_entry_info', + 'iter_entry_points', + 'resource_string', 'resource_stream', 'resource_filename', + 'resource_listdir', 'resource_exists', 'resource_isdir', + + # Environmental control + 'declare_namespace', 'working_set', 'add_activation_listener', + 'find_distributions', 'set_extraction_path', 'cleanup_resources', + 'get_default_cache', + + # Primary implementation classes + 'Environment', 'WorkingSet', 'ResourceManager', + 'Distribution', 'Requirement', 'EntryPoint', + + # Exceptions + 'ResolutionError', 'VersionConflict', 'DistributionNotFound', + 'UnknownExtra', 'ExtractionError', + + # Warnings + 'PEP440Warning', + + # Parsing functions and string utilities + 'parse_requirements', 'parse_version', 'safe_name', 'safe_version', + 'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections', + 'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker', + + # filesystem utilities + 'ensure_directory', 'normalize_path', + + # Distribution "precedence" constants + 'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST', + + # "Provider" interfaces, implementations, and registration/lookup APIs + 'IMetadataProvider', 'IResourceProvider', 'FileMetadata', + 'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider', + 'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider', + 'register_finder', 'register_namespace_handler', 'register_loader_type', + 'fixup_namespace_packages', 'get_importer', + + # Deprecated/backward compatibility only + 'run_main', 'AvailableDistributions', +] + + +class ResolutionError(Exception): + """Abstract base for dependency resolution errors""" + + def __repr__(self): + return self.__class__.__name__ + repr(self.args) + + +class VersionConflict(ResolutionError): + """ + An already-installed version conflicts with the requested version. + + Should be initialized with the installed Distribution and the requested + Requirement. + """ + + _template = "{self.dist} is installed but {self.req} is required" + + @property + def dist(self): + return self.args[0] + + @property + def req(self): + return self.args[1] + + def report(self): + return self._template.format(**locals()) + + def with_context(self, required_by): + """ + If required_by is non-empty, return a version of self that is a + ContextualVersionConflict. + """ + if not required_by: + return self + args = self.args + (required_by,) + return ContextualVersionConflict(*args) + + +class ContextualVersionConflict(VersionConflict): + """ + A VersionConflict that accepts a third parameter, the set of the + requirements that required the installed Distribution. + """ + + _template = VersionConflict._template + ' by {self.required_by}' + + @property + def required_by(self): + return self.args[2] + + +class DistributionNotFound(ResolutionError): + """A requested distribution was not found""" + + _template = ("The '{self.req}' distribution was not found " + "and is required by {self.requirers_str}") + + @property + def req(self): + return self.args[0] + + @property + def requirers(self): + return self.args[1] + + @property + def requirers_str(self): + if not self.requirers: + return 'the application' + return ', '.join(self.requirers) + + def report(self): + return self._template.format(**locals()) + + def __str__(self): + return self.report() + + +class UnknownExtra(ResolutionError): + """Distribution doesn't have an "extra feature" of the given name""" + + +_provider_factories = {} + +PY_MAJOR = sys.version[:3] +EGG_DIST = 3 +BINARY_DIST = 2 +SOURCE_DIST = 1 +CHECKOUT_DIST = 0 +DEVELOP_DIST = -1 + + +def register_loader_type(loader_type, provider_factory): + """Register `provider_factory` to make providers for `loader_type` + + `loader_type` is the type or class of a PEP 302 ``module.__loader__``, + and `provider_factory` is a function that, passed a *module* object, + returns an ``IResourceProvider`` for that module. + """ + _provider_factories[loader_type] = provider_factory + + +def get_provider(moduleOrReq): + """Return an IResourceProvider for the named module or requirement""" + if isinstance(moduleOrReq, Requirement): + return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0] + try: + module = sys.modules[moduleOrReq] + except KeyError: + __import__(moduleOrReq) + module = sys.modules[moduleOrReq] + loader = getattr(module, '__loader__', None) + return _find_adapter(_provider_factories, loader)(module) + + +def _macosx_vers(_cache=[]): + if not _cache: + version = platform.mac_ver()[0] + # fallback for MacPorts + if version == '': + plist = '/System/Library/CoreServices/SystemVersion.plist' + if os.path.exists(plist): + if hasattr(plistlib, 'readPlist'): + plist_content = plistlib.readPlist(plist) + if 'ProductVersion' in plist_content: + version = plist_content['ProductVersion'] + + _cache.append(version.split('.')) + return _cache[0] + + +def _macosx_arch(machine): + return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine) + + +def get_build_platform(): + """Return this platform's string for platform-specific distributions + + XXX Currently this is the same as ``distutils.util.get_platform()``, but it + needs some hacks for Linux and Mac OS X. + """ + try: + # Python 2.7 or >=3.2 + from sysconfig import get_platform + except ImportError: + from distutils.util import get_platform + + plat = get_platform() + if sys.platform == "darwin" and not plat.startswith('macosx-'): + try: + version = _macosx_vers() + machine = os.uname()[4].replace(" ", "_") + return "macosx-%d.%d-%s" % ( + int(version[0]), int(version[1]), + _macosx_arch(machine), + ) + except ValueError: + # if someone is running a non-Mac darwin system, this will fall + # through to the default implementation + pass + return plat + + +macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)") +darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)") +# XXX backward compat +get_platform = get_build_platform + + +def compatible_platforms(provided, required): + """Can code for the `provided` platform run on the `required` platform? + + Returns true if either platform is ``None``, or the platforms are equal. + + XXX Needs compatibility checks for Linux and other unixy OSes. + """ + if provided is None or required is None or provided == required: + # easy case + return True + + # Mac OS X special cases + reqMac = macosVersionString.match(required) + if reqMac: + provMac = macosVersionString.match(provided) + + # is this a Mac package? + if not provMac: + # this is backwards compatibility for packages built before + # setuptools 0.6. All packages built after this point will + # use the new macosx designation. + provDarwin = darwinVersionString.match(provided) + if provDarwin: + dversion = int(provDarwin.group(1)) + macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2)) + if dversion == 7 and macosversion >= "10.3" or \ + dversion == 8 and macosversion >= "10.4": + return True + # egg isn't macosx or legacy darwin + return False + + # are they the same major version and machine type? + if provMac.group(1) != reqMac.group(1) or \ + provMac.group(3) != reqMac.group(3): + return False + + # is the required OS major update >= the provided one? + if int(provMac.group(2)) > int(reqMac.group(2)): + return False + + return True + + # XXX Linux and other platforms' special cases should go here + return False + + +def run_script(dist_spec, script_name): + """Locate distribution `dist_spec` and run its `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + require(dist_spec)[0].run_script(script_name, ns) + + +# backward compatibility +run_main = run_script + + +def get_distribution(dist): + """Return a current distribution object for a Requirement or string""" + if isinstance(dist, six.string_types): + dist = Requirement.parse(dist) + if isinstance(dist, Requirement): + dist = get_provider(dist) + if not isinstance(dist, Distribution): + raise TypeError("Expected string, Requirement, or Distribution", dist) + return dist + + +def load_entry_point(dist, group, name): + """Return `name` entry point of `group` for `dist` or raise ImportError""" + return get_distribution(dist).load_entry_point(group, name) + + +def get_entry_map(dist, group=None): + """Return the entry point map for `group`, or the full entry map""" + return get_distribution(dist).get_entry_map(group) + + +def get_entry_info(dist, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return get_distribution(dist).get_entry_info(group, name) + + +class IMetadataProvider: + def has_metadata(name): + """Does the package's distribution contain the named metadata?""" + + def get_metadata(name): + """The named metadata resource as a string""" + + def get_metadata_lines(name): + """Yield named metadata resource as list of non-blank non-comment lines + + Leading and trailing whitespace is stripped from each line, and lines + with ``#`` as the first non-blank character are omitted.""" + + def metadata_isdir(name): + """Is the named metadata a directory? (like ``os.path.isdir()``)""" + + def metadata_listdir(name): + """List of metadata names in the directory (like ``os.listdir()``)""" + + def run_script(script_name, namespace): + """Execute the named script in the supplied namespace dictionary""" + + +class IResourceProvider(IMetadataProvider): + """An object that provides access to package resources""" + + def get_resource_filename(manager, resource_name): + """Return a true filesystem path for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_stream(manager, resource_name): + """Return a readable file-like object for `resource_name` + + `manager` must be an ``IResourceManager``""" + + def get_resource_string(manager, resource_name): + """Return a string containing the contents of `resource_name` + + `manager` must be an ``IResourceManager``""" + + def has_resource(resource_name): + """Does the package contain the named resource?""" + + def resource_isdir(resource_name): + """Is the named resource a directory? (like ``os.path.isdir()``)""" + + def resource_listdir(resource_name): + """List of resource names in the directory (like ``os.listdir()``)""" + + +class WorkingSet(object): + """A collection of active distributions on sys.path (or a similar list)""" + + def __init__(self, entries=None): + """Create working set from list of path entries (default=sys.path)""" + self.entries = [] + self.entry_keys = {} + self.by_key = {} + self.callbacks = [] + + if entries is None: + entries = sys.path + + for entry in entries: + self.add_entry(entry) + + @classmethod + def _build_master(cls): + """ + Prepare the master working set. + """ + ws = cls() + try: + from __main__ import __requires__ + except ImportError: + # The main program does not list any requirements + return ws + + # ensure the requirements are met + try: + ws.require(__requires__) + except VersionConflict: + return cls._build_from_requirements(__requires__) + + return ws + + @classmethod + def _build_from_requirements(cls, req_spec): + """ + Build a working set from a requirement spec. Rewrites sys.path. + """ + # try it without defaults already on sys.path + # by starting with an empty path + ws = cls([]) + reqs = parse_requirements(req_spec) + dists = ws.resolve(reqs, Environment()) + for dist in dists: + ws.add(dist) + + # add any missing entries from sys.path + for entry in sys.path: + if entry not in ws.entries: + ws.add_entry(entry) + + # then copy back to sys.path + sys.path[:] = ws.entries + return ws + + def add_entry(self, entry): + """Add a path item to ``.entries``, finding any distributions on it + + ``find_distributions(entry, True)`` is used to find distributions + corresponding to the path entry, and they are added. `entry` is + always appended to ``.entries``, even if it is already present. + (This is because ``sys.path`` can contain the same value more than + once, and the ``.entries`` of the ``sys.path`` WorkingSet should always + equal ``sys.path``.) + """ + self.entry_keys.setdefault(entry, []) + self.entries.append(entry) + for dist in find_distributions(entry, True): + self.add(dist, entry, False) + + def __contains__(self, dist): + """True if `dist` is the active distribution for its project""" + return self.by_key.get(dist.key) == dist + + def find(self, req): + """Find a distribution matching requirement `req` + + If there is an active distribution for the requested project, this + returns it as long as it meets the version requirement specified by + `req`. But, if there is an active distribution for the project and it + does *not* meet the `req` requirement, ``VersionConflict`` is raised. + If there is no active distribution for the requested project, ``None`` + is returned. + """ + dist = self.by_key.get(req.key) + if dist is not None and dist not in req: + # XXX add more info + raise VersionConflict(dist, req) + return dist + + def iter_entry_points(self, group, name=None): + """Yield entry point objects from `group` matching `name` + + If `name` is None, yields all entry points in `group` from all + distributions in the working set, otherwise only ones matching + both `group` and `name` are yielded (in distribution order). + """ + for dist in self: + entries = dist.get_entry_map(group) + if name is None: + for ep in entries.values(): + yield ep + elif name in entries: + yield entries[name] + + def run_script(self, requires, script_name): + """Locate distribution for `requires` and run `script_name` script""" + ns = sys._getframe(1).f_globals + name = ns['__name__'] + ns.clear() + ns['__name__'] = name + self.require(requires)[0].run_script(script_name, ns) + + def __iter__(self): + """Yield distributions for non-duplicate projects in the working set + + The yield order is the order in which the items' path entries were + added to the working set. + """ + seen = {} + for item in self.entries: + if item not in self.entry_keys: + # workaround a cache issue + continue + + for key in self.entry_keys[item]: + if key not in seen: + seen[key] = 1 + yield self.by_key[key] + + def add(self, dist, entry=None, insert=True, replace=False): + """Add `dist` to working set, associated with `entry` + + If `entry` is unspecified, it defaults to the ``.location`` of `dist`. + On exit from this routine, `entry` is added to the end of the working + set's ``.entries`` (if it wasn't already present). + + `dist` is only added to the working set if it's for a project that + doesn't already have a distribution in the set, unless `replace=True`. + If it's added, any callbacks registered with the ``subscribe()`` method + will be called. + """ + if insert: + dist.insert_on(self.entries, entry, replace=replace) + + if entry is None: + entry = dist.location + keys = self.entry_keys.setdefault(entry, []) + keys2 = self.entry_keys.setdefault(dist.location, []) + if not replace and dist.key in self.by_key: + # ignore hidden distros + return + + self.by_key[dist.key] = dist + if dist.key not in keys: + keys.append(dist.key) + if dist.key not in keys2: + keys2.append(dist.key) + self._added_new(dist) + + def resolve(self, requirements, env=None, installer=None, + replace_conflicting=False, extras=None): + """List all distributions needed to (recursively) meet `requirements` + + `requirements` must be a sequence of ``Requirement`` objects. `env`, + if supplied, should be an ``Environment`` instance. If + not supplied, it defaults to all distributions available within any + entry or distribution in the working set. `installer`, if supplied, + will be invoked with each requirement that cannot be met by an + already-installed distribution; it should return a ``Distribution`` or + ``None``. + + Unless `replace_conflicting=True`, raises a VersionConflict exception + if + any requirements are found on the path that have the correct name but + the wrong version. Otherwise, if an `installer` is supplied it will be + invoked to obtain the correct version of the requirement and activate + it. + + `extras` is a list of the extras to be used with these requirements. + This is important because extra requirements may look like `my_req; + extra = "my_extra"`, which would otherwise be interpreted as a purely + optional requirement. Instead, we want to be able to assert that these + requirements are truly required. + """ + + # set up the stack + requirements = list(requirements)[::-1] + # set of processed requirements + processed = {} + # key -> dist + best = {} + to_activate = [] + + req_extras = _ReqExtras() + + # Mapping of requirement to set of distributions that required it; + # useful for reporting info about conflicts. + required_by = collections.defaultdict(set) + + while requirements: + # process dependencies breadth-first + req = requirements.pop(0) + if req in processed: + # Ignore cyclic or redundant dependencies + continue + + if not req_extras.markers_pass(req, extras): + continue + + dist = best.get(req.key) + if dist is None: + # Find the best distribution and add it to the map + dist = self.by_key.get(req.key) + if dist is None or (dist not in req and replace_conflicting): + ws = self + if env is None: + if dist is None: + env = Environment(self.entries) + else: + # Use an empty environment and workingset to avoid + # any further conflicts with the conflicting + # distribution + env = Environment([]) + ws = WorkingSet([]) + dist = best[req.key] = env.best_match( + req, ws, installer, + replace_conflicting=replace_conflicting + ) + if dist is None: + requirers = required_by.get(req, None) + raise DistributionNotFound(req, requirers) + to_activate.append(dist) + if dist not in req: + # Oops, the "best" so far conflicts with a dependency + dependent_req = required_by[req] + raise VersionConflict(dist, req).with_context(dependent_req) + + # push the new requirements onto the stack + new_requirements = dist.requires(req.extras)[::-1] + requirements.extend(new_requirements) + + # Register the new requirements needed by req + for new_requirement in new_requirements: + required_by[new_requirement].add(req.project_name) + req_extras[new_requirement] = req.extras + + processed[req] = True + + # return list of distros to activate + return to_activate + + def find_plugins( + self, plugin_env, full_env=None, installer=None, fallback=True): + """Find all activatable distributions in `plugin_env` + + Example usage:: + + distributions, errors = working_set.find_plugins( + Environment(plugin_dirlist) + ) + # add plugins+libs to sys.path + map(working_set.add, distributions) + # display errors + print('Could not load', errors) + + The `plugin_env` should be an ``Environment`` instance that contains + only distributions that are in the project's "plugin directory" or + directories. The `full_env`, if supplied, should be an ``Environment`` + contains all currently-available distributions. If `full_env` is not + supplied, one is created automatically from the ``WorkingSet`` this + method is called on, which will typically mean that every directory on + ``sys.path`` will be scanned for distributions. + + `installer` is a standard installer callback as used by the + ``resolve()`` method. The `fallback` flag indicates whether we should + attempt to resolve older versions of a plugin if the newest version + cannot be resolved. + + This method returns a 2-tuple: (`distributions`, `error_info`), where + `distributions` is a list of the distributions found in `plugin_env` + that were loadable, along with any other distributions that are needed + to resolve their dependencies. `error_info` is a dictionary mapping + unloadable plugin distributions to an exception instance describing the + error that occurred. Usually this will be a ``DistributionNotFound`` or + ``VersionConflict`` instance. + """ + + plugin_projects = list(plugin_env) + # scan project names in alphabetic order + plugin_projects.sort() + + error_info = {} + distributions = {} + + if full_env is None: + env = Environment(self.entries) + env += plugin_env + else: + env = full_env + plugin_env + + shadow_set = self.__class__([]) + # put all our entries in shadow_set + list(map(shadow_set.add, self)) + + for project_name in plugin_projects: + + for dist in plugin_env[project_name]: + + req = [dist.as_requirement()] + + try: + resolvees = shadow_set.resolve(req, env, installer) + + except ResolutionError as v: + # save error info + error_info[dist] = v + if fallback: + # try the next older version of project + continue + else: + # give up on this project, keep going + break + + else: + list(map(shadow_set.add, resolvees)) + distributions.update(dict.fromkeys(resolvees)) + + # success, no need to try any more versions of this project + break + + distributions = list(distributions) + distributions.sort() + + return distributions, error_info + + def require(self, *requirements): + """Ensure that distributions matching `requirements` are activated + + `requirements` must be a string or a (possibly-nested) sequence + thereof, specifying the distributions and versions required. The + return value is a sequence of the distributions that needed to be + activated to fulfill the requirements; all relevant distributions are + included, even if they were already activated in this working set. + """ + needed = self.resolve(parse_requirements(requirements)) + + for dist in needed: + self.add(dist) + + return needed + + def subscribe(self, callback, existing=True): + """Invoke `callback` for all distributions + + If `existing=True` (default), + call on all existing ones, as well. + """ + if callback in self.callbacks: + return + self.callbacks.append(callback) + if not existing: + return + for dist in self: + callback(dist) + + def _added_new(self, dist): + for callback in self.callbacks: + callback(dist) + + def __getstate__(self): + return ( + self.entries[:], self.entry_keys.copy(), self.by_key.copy(), + self.callbacks[:] + ) + + def __setstate__(self, e_k_b_c): + entries, keys, by_key, callbacks = e_k_b_c + self.entries = entries[:] + self.entry_keys = keys.copy() + self.by_key = by_key.copy() + self.callbacks = callbacks[:] + + +class _ReqExtras(dict): + """ + Map each requirement to the extras that demanded it. + """ + + def markers_pass(self, req, extras=None): + """ + Evaluate markers for req against each extra that + demanded it. + + Return False if the req has a marker and fails + evaluation. Otherwise, return True. + """ + extra_evals = ( + req.marker.evaluate({'extra': extra}) + for extra in self.get(req, ()) + (extras or (None,)) + ) + return not req.marker or any(extra_evals) + + +class Environment(object): + """Searchable snapshot of distributions on a search path""" + + def __init__( + self, search_path=None, platform=get_supported_platform(), + python=PY_MAJOR): + """Snapshot distributions available on a search path + + Any distributions found on `search_path` are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. + + `platform` is an optional string specifying the name of the platform + that platform-specific distributions must be compatible with. If + unspecified, it defaults to the current platform. `python` is an + optional string naming the desired version of Python (e.g. ``'3.3'``); + it defaults to the current version. + + You may explicitly set `platform` (and/or `python`) to ``None`` if you + wish to map *all* distributions, not just those compatible with the + running platform or Python version. + """ + self._distmap = {} + self.platform = platform + self.python = python + self.scan(search_path) + + def can_add(self, dist): + """Is distribution `dist` acceptable for this environment? + + The distribution must match the platform and python version + requirements specified when this environment was created, or False + is returned. + """ + py_compat = ( + self.python is None + or dist.py_version is None + or dist.py_version == self.python + ) + return py_compat and compatible_platforms(dist.platform, self.platform) + + def remove(self, dist): + """Remove `dist` from the environment""" + self._distmap[dist.key].remove(dist) + + def scan(self, search_path=None): + """Scan `search_path` for distributions usable in this environment + + Any distributions found are added to the environment. + `search_path` should be a sequence of ``sys.path`` items. If not + supplied, ``sys.path`` is used. Only distributions conforming to + the platform/python version defined at initialization are added. + """ + if search_path is None: + search_path = sys.path + + for item in search_path: + for dist in find_distributions(item): + self.add(dist) + + def __getitem__(self, project_name): + """Return a newest-to-oldest list of distributions for `project_name` + + Uses case-insensitive `project_name` comparison, assuming all the + project's distributions use their project's name converted to all + lowercase as their key. + + """ + distribution_key = project_name.lower() + return self._distmap.get(distribution_key, []) + + def add(self, dist): + """Add `dist` if we ``can_add()`` it and it has not already been added + """ + if self.can_add(dist) and dist.has_version(): + dists = self._distmap.setdefault(dist.key, []) + if dist not in dists: + dists.append(dist) + dists.sort(key=operator.attrgetter('hashcmp'), reverse=True) + + def best_match( + self, req, working_set, installer=None, replace_conflicting=False): + """Find distribution best matching `req` and usable on `working_set` + + This calls the ``find(req)`` method of the `working_set` to see if a + suitable distribution is already active. (This may raise + ``VersionConflict`` if an unsuitable version of the project is already + active in the specified `working_set`.) If a suitable distribution + isn't active, this method returns the newest distribution in the + environment that meets the ``Requirement`` in `req`. If no suitable + distribution is found, and `installer` is supplied, then the result of + calling the environment's ``obtain(req, installer)`` method will be + returned. + """ + try: + dist = working_set.find(req) + except VersionConflict: + if not replace_conflicting: + raise + dist = None + if dist is not None: + return dist + for dist in self[req.key]: + if dist in req: + return dist + # try to download/install + return self.obtain(req, installer) + + def obtain(self, requirement, installer=None): + """Obtain a distribution matching `requirement` (e.g. via download) + + Obtain a distro that matches requirement (e.g. via download). In the + base ``Environment`` class, this routine just returns + ``installer(requirement)``, unless `installer` is None, in which case + None is returned instead. This method is a hook that allows subclasses + to attempt other ways of obtaining a distribution before falling back + to the `installer` argument.""" + if installer is not None: + return installer(requirement) + + def __iter__(self): + """Yield the unique project names of the available distributions""" + for key in self._distmap.keys(): + if self[key]: + yield key + + def __iadd__(self, other): + """In-place addition of a distribution or environment""" + if isinstance(other, Distribution): + self.add(other) + elif isinstance(other, Environment): + for project in other: + for dist in other[project]: + self.add(dist) + else: + raise TypeError("Can't add %r to environment" % (other,)) + return self + + def __add__(self, other): + """Add an environment or distribution to an environment""" + new = self.__class__([], platform=None, python=None) + for env in self, other: + new += env + return new + + +# XXX backward compatibility +AvailableDistributions = Environment + + +class ExtractionError(RuntimeError): + """An error occurred extracting a resource + + The following attributes are available from instances of this exception: + + manager + The resource manager that raised this exception + + cache_path + The base directory for resource extraction + + original_error + The exception instance that caused extraction to fail + """ + + +class ResourceManager: + """Manage resource extraction and packages""" + extraction_path = None + + def __init__(self): + self.cached_files = {} + + def resource_exists(self, package_or_requirement, resource_name): + """Does the named resource exist?""" + return get_provider(package_or_requirement).has_resource(resource_name) + + def resource_isdir(self, package_or_requirement, resource_name): + """Is the named resource an existing directory?""" + return get_provider(package_or_requirement).resource_isdir( + resource_name + ) + + def resource_filename(self, package_or_requirement, resource_name): + """Return a true filesystem path for specified resource""" + return get_provider(package_or_requirement).get_resource_filename( + self, resource_name + ) + + def resource_stream(self, package_or_requirement, resource_name): + """Return a readable file-like object for specified resource""" + return get_provider(package_or_requirement).get_resource_stream( + self, resource_name + ) + + def resource_string(self, package_or_requirement, resource_name): + """Return specified resource as a string""" + return get_provider(package_or_requirement).get_resource_string( + self, resource_name + ) + + def resource_listdir(self, package_or_requirement, resource_name): + """List the contents of the named resource directory""" + return get_provider(package_or_requirement).resource_listdir( + resource_name + ) + + def extraction_error(self): + """Give an error message for problems extracting file(s)""" + + old_exc = sys.exc_info()[1] + cache_path = self.extraction_path or get_default_cache() + + tmpl = textwrap.dedent(""" + Can't extract file(s) to egg cache + + The following error occurred while trying to extract file(s) + to the Python egg cache: + + {old_exc} + + The Python egg cache directory is currently set to: + + {cache_path} + + Perhaps your account does not have write access to this directory? + You can change the cache directory by setting the PYTHON_EGG_CACHE + environment variable to point to an accessible directory. + """).lstrip() + err = ExtractionError(tmpl.format(**locals())) + err.manager = self + err.cache_path = cache_path + err.original_error = old_exc + raise err + + def get_cache_path(self, archive_name, names=()): + """Return absolute location in cache for `archive_name` and `names` + + The parent directory of the resulting path will be created if it does + not already exist. `archive_name` should be the base filename of the + enclosing egg (which may not be the name of the enclosing zipfile!), + including its ".egg" extension. `names`, if provided, should be a + sequence of path name parts "under" the egg's extraction location. + + This method should only be called by resource providers that need to + obtain an extraction location, and only for names they intend to + extract, as it tracks the generated names for possible cleanup later. + """ + extract_path = self.extraction_path or get_default_cache() + target_path = os.path.join(extract_path, archive_name + '-tmp', *names) + try: + _bypass_ensure_directory(target_path) + except Exception: + self.extraction_error() + + self._warn_unsafe_extraction_path(extract_path) + + self.cached_files[target_path] = 1 + return target_path + + @staticmethod + def _warn_unsafe_extraction_path(path): + """ + If the default extraction path is overridden and set to an insecure + location, such as /tmp, it opens up an opportunity for an attacker to + replace an extracted file with an unauthorized payload. Warn the user + if a known insecure location is used. + + See Distribute #375 for more details. + """ + if os.name == 'nt' and not path.startswith(os.environ['windir']): + # On Windows, permissions are generally restrictive by default + # and temp directories are not writable by other users, so + # bypass the warning. + return + mode = os.stat(path).st_mode + if mode & stat.S_IWOTH or mode & stat.S_IWGRP: + msg = ( + "%s is writable by group/others and vulnerable to attack " + "when " + "used with get_resource_filename. Consider a more secure " + "location (set with .set_extraction_path or the " + "PYTHON_EGG_CACHE environment variable)." % path + ) + warnings.warn(msg, UserWarning) + + def postprocess(self, tempname, filename): + """Perform any platform-specific postprocessing of `tempname` + + This is where Mac header rewrites should be done; other platforms don't + have anything special they should do. + + Resource providers should call this method ONLY after successfully + extracting a compressed resource. They must NOT call it on resources + that are already in the filesystem. + + `tempname` is the current (temporary) name of the file, and `filename` + is the name it will be renamed to by the caller after this routine + returns. + """ + + if os.name == 'posix': + # Make the resource executable + mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777 + os.chmod(tempname, mode) + + def set_extraction_path(self, path): + """Set the base path where resources will be extracted to, if needed. + + If you do not call this routine before any extractions take place, the + path defaults to the return value of ``get_default_cache()``. (Which + is based on the ``PYTHON_EGG_CACHE`` environment variable, with various + platform-specific fallbacks. See that routine's documentation for more + details.) + + Resources are extracted to subdirectories of this path based upon + information given by the ``IResourceProvider``. You may set this to a + temporary directory, but then you must call ``cleanup_resources()`` to + delete the extracted files when done. There is no guarantee that + ``cleanup_resources()`` will be able to remove all extracted files. + + (Note: you may not change the extraction path for a given resource + manager once resources have been extracted, unless you first call + ``cleanup_resources()``.) + """ + if self.cached_files: + raise ValueError( + "Can't change extraction path, files already extracted" + ) + + self.extraction_path = path + + def cleanup_resources(self, force=False): + """ + Delete all extracted resource files and directories, returning a list + of the file and directory names that could not be successfully removed. + This function does not have any concurrency protection, so it should + generally only be called when the extraction path is a temporary + directory exclusive to a single process. This method is not + automatically called; you must call it explicitly or register it as an + ``atexit`` function if you wish to ensure cleanup of a temporary + directory used for extractions. + """ + # XXX + + +def get_default_cache(): + """ + Return the ``PYTHON_EGG_CACHE`` environment variable + or a platform-relevant user cache dir for an app + named "Python-Eggs". + """ + return ( + os.environ.get('PYTHON_EGG_CACHE') + or appdirs.user_cache_dir(appname='Python-Eggs') + ) + + +def safe_name(name): + """Convert an arbitrary string to a standard distribution name + + Any runs of non-alphanumeric/. characters are replaced with a single '-'. + """ + return re.sub('[^A-Za-z0-9.]+', '-', name) + + +def safe_version(version): + """ + Convert an arbitrary string to a standard version string + """ + try: + # normalize the version + return str(packaging.version.Version(version)) + except packaging.version.InvalidVersion: + version = version.replace(' ', '.') + return re.sub('[^A-Za-z0-9.]+', '-', version) + + +def safe_extra(extra): + """Convert an arbitrary string to a standard 'extra' name + + Any runs of non-alphanumeric characters are replaced with a single '_', + and the result is always lowercased. + """ + return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower() + + +def to_filename(name): + """Convert a project or version name to its filename-escaped form + + Any '-' characters are currently replaced with '_'. + """ + return name.replace('-', '_') + + +def invalid_marker(text): + """ + Validate text as a PEP 508 environment marker; return an exception + if invalid or False otherwise. + """ + try: + evaluate_marker(text) + except SyntaxError as e: + e.filename = None + e.lineno = None + return e + return False + + +def evaluate_marker(text, extra=None): + """ + Evaluate a PEP 508 environment marker. + Return a boolean indicating the marker result in this environment. + Raise SyntaxError if marker is invalid. + + This implementation uses the 'pyparsing' module. + """ + try: + marker = packaging.markers.Marker(text) + return marker.evaluate() + except packaging.markers.InvalidMarker as e: + raise SyntaxError(e) + + +class NullProvider: + """Try to implement resources and metadata for arbitrary PEP 302 loaders""" + + egg_name = None + egg_info = None + loader = None + + def __init__(self, module): + self.loader = getattr(module, '__loader__', None) + self.module_path = os.path.dirname(getattr(module, '__file__', '')) + + def get_resource_filename(self, manager, resource_name): + return self._fn(self.module_path, resource_name) + + def get_resource_stream(self, manager, resource_name): + return io.BytesIO(self.get_resource_string(manager, resource_name)) + + def get_resource_string(self, manager, resource_name): + return self._get(self._fn(self.module_path, resource_name)) + + def has_resource(self, resource_name): + return self._has(self._fn(self.module_path, resource_name)) + + def has_metadata(self, name): + return self.egg_info and self._has(self._fn(self.egg_info, name)) + + def get_metadata(self, name): + if not self.egg_info: + return "" + value = self._get(self._fn(self.egg_info, name)) + return value.decode('utf-8') if six.PY3 else value + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + def resource_isdir(self, resource_name): + return self._isdir(self._fn(self.module_path, resource_name)) + + def metadata_isdir(self, name): + return self.egg_info and self._isdir(self._fn(self.egg_info, name)) + + def resource_listdir(self, resource_name): + return self._listdir(self._fn(self.module_path, resource_name)) + + def metadata_listdir(self, name): + if self.egg_info: + return self._listdir(self._fn(self.egg_info, name)) + return [] + + def run_script(self, script_name, namespace): + script = 'scripts/' + script_name + if not self.has_metadata(script): + raise ResolutionError( + "Script {script!r} not found in metadata at {self.egg_info!r}" + .format(**locals()), + ) + script_text = self.get_metadata(script).replace('\r\n', '\n') + script_text = script_text.replace('\r', '\n') + script_filename = self._fn(self.egg_info, script) + namespace['__file__'] = script_filename + if os.path.exists(script_filename): + source = open(script_filename).read() + code = compile(source, script_filename, 'exec') + exec(code, namespace, namespace) + else: + from linecache import cache + cache[script_filename] = ( + len(script_text), 0, script_text.split('\n'), script_filename + ) + script_code = compile(script_text, script_filename, 'exec') + exec(script_code, namespace, namespace) + + def _has(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _isdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _listdir(self, path): + raise NotImplementedError( + "Can't perform this operation for unregistered loader type" + ) + + def _fn(self, base, resource_name): + if resource_name: + return os.path.join(base, *resource_name.split('/')) + return base + + def _get(self, path): + if hasattr(self.loader, 'get_data'): + return self.loader.get_data(path) + raise NotImplementedError( + "Can't perform this operation for loaders without 'get_data()'" + ) + + +register_loader_type(object, NullProvider) + + +class EggProvider(NullProvider): + """Provider based on a virtual filesystem""" + + def __init__(self, module): + NullProvider.__init__(self, module) + self._setup_prefix() + + def _setup_prefix(self): + # we assume here that our metadata may be nested inside a "basket" + # of multiple eggs; that's why we use module_path instead of .archive + path = self.module_path + old = None + while path != old: + if _is_egg_path(path): + self.egg_name = os.path.basename(path) + self.egg_info = os.path.join(path, 'EGG-INFO') + self.egg_root = path + break + old = path + path, base = os.path.split(path) + + +class DefaultProvider(EggProvider): + """Provides access to package resources in the filesystem""" + + def _has(self, path): + return os.path.exists(path) + + def _isdir(self, path): + return os.path.isdir(path) + + def _listdir(self, path): + return os.listdir(path) + + def get_resource_stream(self, manager, resource_name): + return open(self._fn(self.module_path, resource_name), 'rb') + + def _get(self, path): + with open(path, 'rb') as stream: + return stream.read() + + @classmethod + def _register(cls): + loader_cls = getattr( + importlib_machinery, + 'SourceFileLoader', + type(None), + ) + register_loader_type(loader_cls, cls) + + +DefaultProvider._register() + + +class EmptyProvider(NullProvider): + """Provider that returns nothing for all requests""" + + module_path = None + + _isdir = _has = lambda self, path: False + + def _get(self, path): + return '' + + def _listdir(self, path): + return [] + + def __init__(self): + pass + + +empty_provider = EmptyProvider() + + +class ZipManifests(dict): + """ + zip manifest builder + """ + + @classmethod + def build(cls, path): + """ + Build a dictionary similar to the zipimport directory + caches, except instead of tuples, store ZipInfo objects. + + Use a platform-specific path separator (os.sep) for the path keys + for compatibility with pypy on Windows. + """ + with zipfile.ZipFile(path) as zfile: + items = ( + ( + name.replace('/', os.sep), + zfile.getinfo(name), + ) + for name in zfile.namelist() + ) + return dict(items) + + load = build + + +class MemoizedZipManifests(ZipManifests): + """ + Memoized zipfile manifests. + """ + manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime') + + def load(self, path): + """ + Load a manifest at path or return a suitable manifest already loaded. + """ + path = os.path.normpath(path) + mtime = os.stat(path).st_mtime + + if path not in self or self[path].mtime != mtime: + manifest = self.build(path) + self[path] = self.manifest_mod(manifest, mtime) + + return self[path].manifest + + +class ZipProvider(EggProvider): + """Resource support for zips and eggs""" + + eagers = None + _zip_manifests = MemoizedZipManifests() + + def __init__(self, module): + EggProvider.__init__(self, module) + self.zip_pre = self.loader.archive + os.sep + + def _zipinfo_name(self, fspath): + # Convert a virtual filename (full path to file) into a zipfile subpath + # usable with the zipimport directory cache for our target archive + fspath = fspath.rstrip(os.sep) + if fspath == self.loader.archive: + return '' + if fspath.startswith(self.zip_pre): + return fspath[len(self.zip_pre):] + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.zip_pre) + ) + + def _parts(self, zip_path): + # Convert a zipfile subpath into an egg-relative path part list. + # pseudo-fs path + fspath = self.zip_pre + zip_path + if fspath.startswith(self.egg_root + os.sep): + return fspath[len(self.egg_root) + 1:].split(os.sep) + raise AssertionError( + "%s is not a subpath of %s" % (fspath, self.egg_root) + ) + + @property + def zipinfo(self): + return self._zip_manifests.load(self.loader.archive) + + def get_resource_filename(self, manager, resource_name): + if not self.egg_name: + raise NotImplementedError( + "resource_filename() only supported for .egg, not .zip" + ) + # no need to lock for extraction, since we use temp names + zip_path = self._resource_to_zip(resource_name) + eagers = self._get_eager_resources() + if '/'.join(self._parts(zip_path)) in eagers: + for name in eagers: + self._extract_resource(manager, self._eager_to_zip(name)) + return self._extract_resource(manager, zip_path) + + @staticmethod + def _get_date_and_size(zip_stat): + size = zip_stat.file_size + # ymdhms+wday, yday, dst + date_time = zip_stat.date_time + (0, 0, -1) + # 1980 offset already done + timestamp = time.mktime(date_time) + return timestamp, size + + def _extract_resource(self, manager, zip_path): + + if zip_path in self._index(): + for name in self._index()[zip_path]: + last = self._extract_resource( + manager, os.path.join(zip_path, name) + ) + # return the extracted directory name + return os.path.dirname(last) + + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + + if not WRITE_SUPPORT: + raise IOError('"os.rename" and "os.unlink" are not supported ' + 'on this platform') + try: + + real_path = manager.get_cache_path( + self.egg_name, self._parts(zip_path) + ) + + if self._is_current(real_path, zip_path): + return real_path + + outf, tmpnam = _mkstemp( + ".$extract", + dir=os.path.dirname(real_path), + ) + os.write(outf, self.loader.get_data(zip_path)) + os.close(outf) + utime(tmpnam, (timestamp, timestamp)) + manager.postprocess(tmpnam, real_path) + + try: + rename(tmpnam, real_path) + + except os.error: + if os.path.isfile(real_path): + if self._is_current(real_path, zip_path): + # the file became current since it was checked above, + # so proceed. + return real_path + # Windows, del old file and retry + elif os.name == 'nt': + unlink(real_path) + rename(tmpnam, real_path) + return real_path + raise + + except os.error: + # report a user-friendly error + manager.extraction_error() + + return real_path + + def _is_current(self, file_path, zip_path): + """ + Return True if the file_path is current for this zip_path + """ + timestamp, size = self._get_date_and_size(self.zipinfo[zip_path]) + if not os.path.isfile(file_path): + return False + stat = os.stat(file_path) + if stat.st_size != size or stat.st_mtime != timestamp: + return False + # check that the contents match + zip_contents = self.loader.get_data(zip_path) + with open(file_path, 'rb') as f: + file_contents = f.read() + return zip_contents == file_contents + + def _get_eager_resources(self): + if self.eagers is None: + eagers = [] + for name in ('native_libs.txt', 'eager_resources.txt'): + if self.has_metadata(name): + eagers.extend(self.get_metadata_lines(name)) + self.eagers = eagers + return self.eagers + + def _index(self): + try: + return self._dirindex + except AttributeError: + ind = {} + for path in self.zipinfo: + parts = path.split(os.sep) + while parts: + parent = os.sep.join(parts[:-1]) + if parent in ind: + ind[parent].append(parts[-1]) + break + else: + ind[parent] = [parts.pop()] + self._dirindex = ind + return ind + + def _has(self, fspath): + zip_path = self._zipinfo_name(fspath) + return zip_path in self.zipinfo or zip_path in self._index() + + def _isdir(self, fspath): + return self._zipinfo_name(fspath) in self._index() + + def _listdir(self, fspath): + return list(self._index().get(self._zipinfo_name(fspath), ())) + + def _eager_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.egg_root, resource_name)) + + def _resource_to_zip(self, resource_name): + return self._zipinfo_name(self._fn(self.module_path, resource_name)) + + +register_loader_type(zipimport.zipimporter, ZipProvider) + + +class FileMetadata(EmptyProvider): + """Metadata handler for standalone PKG-INFO files + + Usage:: + + metadata = FileMetadata("/path/to/PKG-INFO") + + This provider rejects all data and metadata requests except for PKG-INFO, + which is treated as existing, and will be the contents of the file at + the provided location. + """ + + def __init__(self, path): + self.path = path + + def has_metadata(self, name): + return name == 'PKG-INFO' and os.path.isfile(self.path) + + def get_metadata(self, name): + if name != 'PKG-INFO': + raise KeyError("No metadata except PKG-INFO is available") + + with io.open(self.path, encoding='utf-8', errors="replace") as f: + metadata = f.read() + self._warn_on_replacement(metadata) + return metadata + + def _warn_on_replacement(self, metadata): + # Python 2.7 compat for: replacement_char = '�' + replacement_char = b'\xef\xbf\xbd'.decode('utf-8') + if replacement_char in metadata: + tmpl = "{self.path} could not be properly decoded in UTF-8" + msg = tmpl.format(**locals()) + warnings.warn(msg) + + def get_metadata_lines(self, name): + return yield_lines(self.get_metadata(name)) + + +class PathMetadata(DefaultProvider): + """Metadata provider for egg directories + + Usage:: + + # Development eggs: + + egg_info = "/path/to/PackageName.egg-info" + base_dir = os.path.dirname(egg_info) + metadata = PathMetadata(base_dir, egg_info) + dist_name = os.path.splitext(os.path.basename(egg_info))[0] + dist = Distribution(basedir, project_name=dist_name, metadata=metadata) + + # Unpacked egg directories: + + egg_path = "/path/to/PackageName-ver-pyver-etc.egg" + metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + """ + + def __init__(self, path, egg_info): + self.module_path = path + self.egg_info = egg_info + + +class EggMetadata(ZipProvider): + """Metadata provider for .egg files""" + + def __init__(self, importer): + """Create a metadata provider from a zipimporter""" + + self.zip_pre = importer.archive + os.sep + self.loader = importer + if importer.prefix: + self.module_path = os.path.join(importer.archive, importer.prefix) + else: + self.module_path = importer.archive + self._setup_prefix() + + +_declare_state('dict', _distribution_finders={}) + + +def register_finder(importer_type, distribution_finder): + """Register `distribution_finder` to find distributions in sys.path items + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `distribution_finder` is a callable that, passed a path + item and the importer instance, yields ``Distribution`` instances found on + that path item. See ``pkg_resources.find_on_path`` for an example.""" + _distribution_finders[importer_type] = distribution_finder + + +def find_distributions(path_item, only=False): + """Yield distributions accessible via `path_item`""" + importer = get_importer(path_item) + finder = _find_adapter(_distribution_finders, importer) + return finder(importer, path_item, only) + + +def find_eggs_in_zip(importer, path_item, only=False): + """ + Find eggs in zip files; possibly multiple nested eggs. + """ + if importer.archive.endswith('.whl'): + # wheels are not supported with this finder + # they don't have PKG-INFO metadata, and won't ever contain eggs + return + metadata = EggMetadata(importer) + if metadata.has_metadata('PKG-INFO'): + yield Distribution.from_filename(path_item, metadata=metadata) + if only: + # don't yield nested distros + return + for subitem in metadata.resource_listdir('/'): + if _is_egg_path(subitem): + subpath = os.path.join(path_item, subitem) + dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath) + for dist in dists: + yield dist + elif subitem.lower().endswith('.dist-info'): + subpath = os.path.join(path_item, subitem) + submeta = EggMetadata(zipimport.zipimporter(subpath)) + submeta.egg_info = subpath + yield Distribution.from_location(path_item, subitem, submeta) + + +register_finder(zipimport.zipimporter, find_eggs_in_zip) + + +def find_nothing(importer, path_item, only=False): + return () + + +register_finder(object, find_nothing) + + +def _by_version_descending(names): + """ + Given a list of filenames, return them in descending order + by version number. + + >>> names = 'bar', 'foo', 'Python-2.7.10.egg', 'Python-2.7.2.egg' + >>> _by_version_descending(names) + ['Python-2.7.10.egg', 'Python-2.7.2.egg', 'foo', 'bar'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.egg', 'Setuptools-1.2.3b1.egg'] + >>> names = 'Setuptools-1.2.3b1.egg', 'Setuptools-1.2.3.post1.egg' + >>> _by_version_descending(names) + ['Setuptools-1.2.3.post1.egg', 'Setuptools-1.2.3b1.egg'] + """ + def _by_version(name): + """ + Parse each component of the filename + """ + name, ext = os.path.splitext(name) + parts = itertools.chain(name.split('-'), [ext]) + return [packaging.version.parse(part) for part in parts] + + return sorted(names, key=_by_version, reverse=True) + + +def find_on_path(importer, path_item, only=False): + """Yield distributions accessible on a sys.path directory""" + path_item = _normalize_cached(path_item) + + if _is_unpacked_egg(path_item): + yield Distribution.from_filename( + path_item, metadata=PathMetadata( + path_item, os.path.join(path_item, 'EGG-INFO') + ) + ) + return + + entries = safe_listdir(path_item) + + # for performance, before sorting by version, + # screen entries for only those that will yield + # distributions + filtered = ( + entry + for entry in entries + if dist_factory(path_item, entry, only) + ) + + # scan for .egg and .egg-info in directory + path_item_entries = _by_version_descending(filtered) + for entry in path_item_entries: + fullpath = os.path.join(path_item, entry) + factory = dist_factory(path_item, entry, only) + for dist in factory(fullpath): + yield dist + + +def dist_factory(path_item, entry, only): + """ + Return a dist_factory for a path_item and entry + """ + lower = entry.lower() + is_meta = any(map(lower.endswith, ('.egg-info', '.dist-info'))) + return ( + distributions_from_metadata + if is_meta else + find_distributions + if not only and _is_egg_path(entry) else + resolve_egg_link + if not only and lower.endswith('.egg-link') else + NoDists() + ) + + +class NoDists: + """ + >>> bool(NoDists()) + False + + >>> list(NoDists()('anything')) + [] + """ + def __bool__(self): + return False + if six.PY2: + __nonzero__ = __bool__ + + def __call__(self, fullpath): + return iter(()) + + +def safe_listdir(path): + """ + Attempt to list contents of path, but suppress some exceptions. + """ + try: + return os.listdir(path) + except (PermissionError, NotADirectoryError): + pass + except OSError as e: + # Ignore the directory if does not exist, not a directory or + # permission denied + ignorable = ( + e.errno in (errno.ENOTDIR, errno.EACCES, errno.ENOENT) + # Python 2 on Windows needs to be handled this way :( + or getattr(e, "winerror", None) == 267 + ) + if not ignorable: + raise + return () + + +def distributions_from_metadata(path): + root = os.path.dirname(path) + if os.path.isdir(path): + if len(os.listdir(path)) == 0: + # empty metadata dir; skip + return + metadata = PathMetadata(root, path) + else: + metadata = FileMetadata(path) + entry = os.path.basename(path) + yield Distribution.from_location( + root, entry, metadata, precedence=DEVELOP_DIST, + ) + + +def non_empty_lines(path): + """ + Yield non-empty lines from file at path + """ + with open(path) as f: + for line in f: + line = line.strip() + if line: + yield line + + +def resolve_egg_link(path): + """ + Given a path to an .egg-link, resolve distributions + present in the referenced path. + """ + referenced_paths = non_empty_lines(path) + resolved_paths = ( + os.path.join(os.path.dirname(path), ref) + for ref in referenced_paths + ) + dist_groups = map(find_distributions, resolved_paths) + return next(dist_groups, ()) + + +register_finder(pkgutil.ImpImporter, find_on_path) + +if hasattr(importlib_machinery, 'FileFinder'): + register_finder(importlib_machinery.FileFinder, find_on_path) + +_declare_state('dict', _namespace_handlers={}) +_declare_state('dict', _namespace_packages={}) + + +def register_namespace_handler(importer_type, namespace_handler): + """Register `namespace_handler` to declare namespace packages + + `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item + handler), and `namespace_handler` is a callable like this:: + + def namespace_handler(importer, path_entry, moduleName, module): + # return a path_entry to use for child packages + + Namespace handlers are only called if the importer object has already + agreed that it can handle the relevant path item, and they should only + return a subpath if the module __path__ does not already contain an + equivalent subpath. For an example namespace handler, see + ``pkg_resources.file_ns_handler``. + """ + _namespace_handlers[importer_type] = namespace_handler + + +def _handle_ns(packageName, path_item): + """Ensure that named package includes a subpath of path_item (if needed)""" + + importer = get_importer(path_item) + if importer is None: + return None + loader = importer.find_module(packageName) + if loader is None: + return None + module = sys.modules.get(packageName) + if module is None: + module = sys.modules[packageName] = types.ModuleType(packageName) + module.__path__ = [] + _set_parent_ns(packageName) + elif not hasattr(module, '__path__'): + raise TypeError("Not a package:", packageName) + handler = _find_adapter(_namespace_handlers, importer) + subpath = handler(importer, path_item, packageName, module) + if subpath is not None: + path = module.__path__ + path.append(subpath) + loader.load_module(packageName) + _rebuild_mod_path(path, packageName, module) + return subpath + + +def _rebuild_mod_path(orig_path, package_name, module): + """ + Rebuild module.__path__ ensuring that all entries are ordered + corresponding to their sys.path order + """ + sys_path = [_normalize_cached(p) for p in sys.path] + + def safe_sys_path_index(entry): + """ + Workaround for #520 and #513. + """ + try: + return sys_path.index(entry) + except ValueError: + return float('inf') + + def position_in_sys_path(path): + """ + Return the ordinal of the path based on its position in sys.path + """ + path_parts = path.split(os.sep) + module_parts = package_name.count('.') + 1 + parts = path_parts[:-module_parts] + return safe_sys_path_index(_normalize_cached(os.sep.join(parts))) + + if not isinstance(orig_path, list): + # Is this behavior useful when module.__path__ is not a list? + return + + orig_path.sort(key=position_in_sys_path) + module.__path__[:] = [_normalize_cached(p) for p in orig_path] + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path, parent = sys.path, None + if '.' in packageName: + parent = '.'.join(packageName.split('.')[:-1]) + declare_namespace(parent) + if parent not in _namespace_packages: + __import__(parent) + try: + path = sys.modules[parent].__path__ + except AttributeError: + raise TypeError("Not a package:", parent) + + # Track what packages are namespaces, so when new path items are added, + # they can be updated + _namespace_packages.setdefault(parent, []).append(packageName) + _namespace_packages.setdefault(packageName, []) + + for path_item in path: + # Ensure all the parent's path items are reflected in the child, + # if they apply + _handle_ns(packageName, path_item) + + finally: + _imp.release_lock() + + +def fixup_namespace_packages(path_item, parent=None): + """Ensure that previously-declared namespace packages include path_item""" + _imp.acquire_lock() + try: + for package in _namespace_packages.get(parent, ()): + subpath = _handle_ns(package, path_item) + if subpath: + fixup_namespace_packages(subpath, package) + finally: + _imp.release_lock() + + +def file_ns_handler(importer, path_item, packageName, module): + """Compute an ns-package subpath for a filesystem or zipfile importer""" + + subpath = os.path.join(path_item, packageName.split('.')[-1]) + normalized = _normalize_cached(subpath) + for item in module.__path__: + if _normalize_cached(item) == normalized: + break + else: + # Only return the path if it's not already there + return subpath + + +register_namespace_handler(pkgutil.ImpImporter, file_ns_handler) +register_namespace_handler(zipimport.zipimporter, file_ns_handler) + +if hasattr(importlib_machinery, 'FileFinder'): + register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler) + + +def null_ns_handler(importer, path_item, packageName, module): + return None + + +register_namespace_handler(object, null_ns_handler) + + +def normalize_path(filename): + """Normalize a file/dir name for comparison purposes""" + return os.path.normcase(os.path.realpath(filename)) + + +def _normalize_cached(filename, _cache={}): + try: + return _cache[filename] + except KeyError: + _cache[filename] = result = normalize_path(filename) + return result + + +def _is_egg_path(path): + """ + Determine if given path appears to be an egg. + """ + return path.lower().endswith('.egg') + + +def _is_unpacked_egg(path): + """ + Determine if given path appears to be an unpacked egg. + """ + return ( + _is_egg_path(path) and + os.path.isfile(os.path.join(path, 'EGG-INFO', 'PKG-INFO')) + ) + + +def _set_parent_ns(packageName): + parts = packageName.split('.') + name = parts.pop() + if parts: + parent = '.'.join(parts) + setattr(sys.modules[parent], name, sys.modules[packageName]) + + +def yield_lines(strs): + """Yield non-empty/non-comment lines of a string or sequence""" + if isinstance(strs, six.string_types): + for s in strs.splitlines(): + s = s.strip() + # skip blank lines/comments + if s and not s.startswith('#'): + yield s + else: + for ss in strs: + for s in yield_lines(ss): + yield s + + +MODULE = re.compile(r"\w+(\.\w+)*$").match +EGG_NAME = re.compile( + r""" + (?P<name>[^-]+) ( + -(?P<ver>[^-]+) ( + -py(?P<pyver>[^-]+) ( + -(?P<plat>.+) + )? + )? + )? + """, + re.VERBOSE | re.IGNORECASE, +).match + + +class EntryPoint(object): + """Object representing an advertised importable object""" + + def __init__(self, name, module_name, attrs=(), extras=(), dist=None): + if not MODULE(module_name): + raise ValueError("Invalid module name", module_name) + self.name = name + self.module_name = module_name + self.attrs = tuple(attrs) + self.extras = tuple(extras) + self.dist = dist + + def __str__(self): + s = "%s = %s" % (self.name, self.module_name) + if self.attrs: + s += ':' + '.'.join(self.attrs) + if self.extras: + s += ' [%s]' % ','.join(self.extras) + return s + + def __repr__(self): + return "EntryPoint.parse(%r)" % str(self) + + def load(self, require=True, *args, **kwargs): + """ + Require packages for this EntryPoint, then resolve it. + """ + if not require or args or kwargs: + warnings.warn( + "Parameters to load are deprecated. Call .resolve and " + ".require separately.", + DeprecationWarning, + stacklevel=2, + ) + if require: + self.require(*args, **kwargs) + return self.resolve() + + def resolve(self): + """ + Resolve the entry point from its module and attrs. + """ + module = __import__(self.module_name, fromlist=['__name__'], level=0) + try: + return functools.reduce(getattr, self.attrs, module) + except AttributeError as exc: + raise ImportError(str(exc)) + + def require(self, env=None, installer=None): + if self.extras and not self.dist: + raise UnknownExtra("Can't require() without a distribution", self) + + # Get the requirements for this entry point with all its extras and + # then resolve them. We have to pass `extras` along when resolving so + # that the working set knows what extras we want. Otherwise, for + # dist-info distributions, the working set will assume that the + # requirements for that extra are purely optional and skip over them. + reqs = self.dist.requires(self.extras) + items = working_set.resolve(reqs, env, installer, extras=self.extras) + list(map(working_set.add, items)) + + pattern = re.compile( + r'\s*' + r'(?P<name>.+?)\s*' + r'=\s*' + r'(?P<module>[\w.]+)\s*' + r'(:\s*(?P<attr>[\w.]+))?\s*' + r'(?P<extras>\[.*\])?\s*$' + ) + + @classmethod + def parse(cls, src, dist=None): + """Parse a single entry point from string `src` + + Entry point syntax follows the form:: + + name = some.module:some.attr [extra1, extra2] + + The entry name and module name are required, but the ``:attrs`` and + ``[extras]`` parts are optional + """ + m = cls.pattern.match(src) + if not m: + msg = "EntryPoint must be in 'name=module:attrs [extras]' format" + raise ValueError(msg, src) + res = m.groupdict() + extras = cls._parse_extras(res['extras']) + attrs = res['attr'].split('.') if res['attr'] else () + return cls(res['name'], res['module'], attrs, extras, dist) + + @classmethod + def _parse_extras(cls, extras_spec): + if not extras_spec: + return () + req = Requirement.parse('x' + extras_spec) + if req.specs: + raise ValueError() + return req.extras + + @classmethod + def parse_group(cls, group, lines, dist=None): + """Parse an entry point group""" + if not MODULE(group): + raise ValueError("Invalid group name", group) + this = {} + for line in yield_lines(lines): + ep = cls.parse(line, dist) + if ep.name in this: + raise ValueError("Duplicate entry point", group, ep.name) + this[ep.name] = ep + return this + + @classmethod + def parse_map(cls, data, dist=None): + """Parse a map of entry point groups""" + if isinstance(data, dict): + data = data.items() + else: + data = split_sections(data) + maps = {} + for group, lines in data: + if group is None: + if not lines: + continue + raise ValueError("Entry points must be listed in groups") + group = group.strip() + if group in maps: + raise ValueError("Duplicate group name", group) + maps[group] = cls.parse_group(group, lines, dist) + return maps + + +def _remove_md5_fragment(location): + if not location: + return '' + parsed = urllib.parse.urlparse(location) + if parsed[-1].startswith('md5='): + return urllib.parse.urlunparse(parsed[:-1] + ('',)) + return location + + +def _version_from_file(lines): + """ + Given an iterable of lines from a Metadata file, return + the value of the Version field, if present, or None otherwise. + """ + def is_version_line(line): + return line.lower().startswith('version:') + version_lines = filter(is_version_line, lines) + line = next(iter(version_lines), '') + _, _, value = line.partition(':') + return safe_version(value.strip()) or None + + +class Distribution(object): + """Wrap an actual or potential sys.path entry w/metadata""" + PKG_INFO = 'PKG-INFO' + + def __init__( + self, location=None, metadata=None, project_name=None, + version=None, py_version=PY_MAJOR, platform=None, + precedence=EGG_DIST): + self.project_name = safe_name(project_name or 'Unknown') + if version is not None: + self._version = safe_version(version) + self.py_version = py_version + self.platform = platform + self.location = location + self.precedence = precedence + self._provider = metadata or empty_provider + + @classmethod + def from_location(cls, location, basename, metadata=None, **kw): + project_name, version, py_version, platform = [None] * 4 + basename, ext = os.path.splitext(basename) + if ext.lower() in _distributionImpl: + cls = _distributionImpl[ext.lower()] + + match = EGG_NAME(basename) + if match: + project_name, version, py_version, platform = match.group( + 'name', 'ver', 'pyver', 'plat' + ) + return cls( + location, metadata, project_name=project_name, version=version, + py_version=py_version, platform=platform, **kw + )._reload_version() + + def _reload_version(self): + return self + + @property + def hashcmp(self): + return ( + self.parsed_version, + self.precedence, + self.key, + _remove_md5_fragment(self.location), + self.py_version or '', + self.platform or '', + ) + + def __hash__(self): + return hash(self.hashcmp) + + def __lt__(self, other): + return self.hashcmp < other.hashcmp + + def __le__(self, other): + return self.hashcmp <= other.hashcmp + + def __gt__(self, other): + return self.hashcmp > other.hashcmp + + def __ge__(self, other): + return self.hashcmp >= other.hashcmp + + def __eq__(self, other): + if not isinstance(other, self.__class__): + # It's not a Distribution, so they are not equal + return False + return self.hashcmp == other.hashcmp + + def __ne__(self, other): + return not self == other + + # These properties have to be lazy so that we don't have to load any + # metadata until/unless it's actually needed. (i.e., some distributions + # may not know their name or version without loading PKG-INFO) + + @property + def key(self): + try: + return self._key + except AttributeError: + self._key = key = self.project_name.lower() + return key + + @property + def parsed_version(self): + if not hasattr(self, "_parsed_version"): + self._parsed_version = parse_version(self.version) + + return self._parsed_version + + def _warn_legacy_version(self): + LV = packaging.version.LegacyVersion + is_legacy = isinstance(self._parsed_version, LV) + if not is_legacy: + return + + # While an empty version is technically a legacy version and + # is not a valid PEP 440 version, it's also unlikely to + # actually come from someone and instead it is more likely that + # it comes from setuptools attempting to parse a filename and + # including it in the list. So for that we'll gate this warning + # on if the version is anything at all or not. + if not self.version: + return + + tmpl = textwrap.dedent(""" + '{project_name} ({version})' is being parsed as a legacy, + non PEP 440, + version. You may find odd behavior and sort order. + In particular it will be sorted as less than 0.0. It + is recommended to migrate to PEP 440 compatible + versions. + """).strip().replace('\n', ' ') + + warnings.warn(tmpl.format(**vars(self)), PEP440Warning) + + @property + def version(self): + try: + return self._version + except AttributeError: + version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if version is None: + tmpl = "Missing 'Version:' header and/or %s file" + raise ValueError(tmpl % self.PKG_INFO, self) + return version + + @property + def _dep_map(self): + """ + A map of extra to its list of (direct) requirements + for this distribution, including the null extra. + """ + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._filter_extras(self._build_dep_map()) + return self.__dep_map + + @staticmethod + def _filter_extras(dm): + """ + Given a mapping of extras to dependencies, strip off + environment markers and filter out any dependencies + not matching the markers. + """ + for extra in list(filter(None, dm)): + new_extra = extra + reqs = dm.pop(extra) + new_extra, _, marker = extra.partition(':') + fails_marker = marker and ( + invalid_marker(marker) + or not evaluate_marker(marker) + ) + if fails_marker: + reqs = [] + new_extra = safe_extra(new_extra) or None + + dm.setdefault(new_extra, []).extend(reqs) + return dm + + def _build_dep_map(self): + dm = {} + for name in 'requires.txt', 'depends.txt': + for extra, reqs in split_sections(self._get_metadata(name)): + dm.setdefault(extra, []).extend(parse_requirements(reqs)) + return dm + + def requires(self, extras=()): + """List of Requirements needed for this distro if `extras` are used""" + dm = self._dep_map + deps = [] + deps.extend(dm.get(None, ())) + for ext in extras: + try: + deps.extend(dm[safe_extra(ext)]) + except KeyError: + raise UnknownExtra( + "%s has no such extra feature %r" % (self, ext) + ) + return deps + + def _get_metadata(self, name): + if self.has_metadata(name): + for line in self.get_metadata_lines(name): + yield line + + def activate(self, path=None, replace=False): + """Ensure distribution is importable on `path` (default=sys.path)""" + if path is None: + path = sys.path + self.insert_on(path, replace=replace) + if path is sys.path: + fixup_namespace_packages(self.location) + for pkg in self._get_metadata('namespace_packages.txt'): + if pkg in sys.modules: + declare_namespace(pkg) + + def egg_name(self): + """Return what this distribution's standard .egg filename should be""" + filename = "%s-%s-py%s" % ( + to_filename(self.project_name), to_filename(self.version), + self.py_version or PY_MAJOR + ) + + if self.platform: + filename += '-' + self.platform + return filename + + def __repr__(self): + if self.location: + return "%s (%s)" % (self, self.location) + else: + return str(self) + + def __str__(self): + try: + version = getattr(self, 'version', None) + except ValueError: + version = None + version = version or "[unknown version]" + return "%s %s" % (self.project_name, version) + + def __getattr__(self, attr): + """Delegate all unrecognized public attributes to .metadata provider""" + if attr.startswith('_'): + raise AttributeError(attr) + return getattr(self._provider, attr) + + @classmethod + def from_filename(cls, filename, metadata=None, **kw): + return cls.from_location( + _normalize_cached(filename), os.path.basename(filename), metadata, + **kw + ) + + def as_requirement(self): + """Return a ``Requirement`` that matches this distribution exactly""" + if isinstance(self.parsed_version, packaging.version.Version): + spec = "%s==%s" % (self.project_name, self.parsed_version) + else: + spec = "%s===%s" % (self.project_name, self.parsed_version) + + return Requirement.parse(spec) + + def load_entry_point(self, group, name): + """Return the `name` entry point of `group` or raise ImportError""" + ep = self.get_entry_info(group, name) + if ep is None: + raise ImportError("Entry point %r not found" % ((group, name),)) + return ep.load() + + def get_entry_map(self, group=None): + """Return the entry point map for `group`, or the full entry map""" + try: + ep_map = self._ep_map + except AttributeError: + ep_map = self._ep_map = EntryPoint.parse_map( + self._get_metadata('entry_points.txt'), self + ) + if group is not None: + return ep_map.get(group, {}) + return ep_map + + def get_entry_info(self, group, name): + """Return the EntryPoint object for `group`+`name`, or ``None``""" + return self.get_entry_map(group).get(name) + + def insert_on(self, path, loc=None, replace=False): + """Ensure self.location is on path + + If replace=False (default): + - If location is already in path anywhere, do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent. + - Else: add to the end of path. + If replace=True: + - If location is already on path anywhere (not eggs) + or higher priority than its parent (eggs) + do nothing. + - Else: + - If it's an egg and its parent directory is on path, + insert just ahead of the parent, + removing any lower-priority entries. + - Else: add it to the front of path. + """ + + loc = loc or self.location + if not loc: + return + + nloc = _normalize_cached(loc) + bdir = os.path.dirname(nloc) + npath = [(p and _normalize_cached(p) or p) for p in path] + + for p, item in enumerate(npath): + if item == nloc: + if replace: + break + else: + # don't modify path (even removing duplicates) if + # found and not replace + return + elif item == bdir and self.precedence == EGG_DIST: + # if it's an .egg, give it precedence over its directory + # UNLESS it's already been added to sys.path and replace=False + if (not replace) and nloc in npath[p:]: + return + if path is sys.path: + self.check_version_conflict() + path.insert(p, loc) + npath.insert(p, nloc) + break + else: + if path is sys.path: + self.check_version_conflict() + if replace: + path.insert(0, loc) + else: + path.append(loc) + return + + # p is the spot where we found or inserted loc; now remove duplicates + while True: + try: + np = npath.index(nloc, p + 1) + except ValueError: + break + else: + del npath[np], path[np] + # ha! + p = np + + return + + def check_version_conflict(self): + if self.key == 'setuptools': + # ignore the inevitable setuptools self-conflicts :( + return + + nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt')) + loc = normalize_path(self.location) + for modname in self._get_metadata('top_level.txt'): + if (modname not in sys.modules or modname in nsp + or modname in _namespace_packages): + continue + if modname in ('pkg_resources', 'setuptools', 'site'): + continue + fn = getattr(sys.modules[modname], '__file__', None) + if fn and (normalize_path(fn).startswith(loc) or + fn.startswith(self.location)): + continue + issue_warning( + "Module %s was already imported from %s, but %s is being added" + " to sys.path" % (modname, fn, self.location), + ) + + def has_version(self): + try: + self.version + except ValueError: + issue_warning("Unbuilt egg for " + repr(self)) + return False + return True + + def clone(self, **kw): + """Copy this distribution, substituting in any changed keyword args""" + names = 'project_name version py_version platform location precedence' + for attr in names.split(): + kw.setdefault(attr, getattr(self, attr, None)) + kw.setdefault('metadata', self._provider) + return self.__class__(**kw) + + @property + def extras(self): + return [dep for dep in self._dep_map if dep] + + +class EggInfoDistribution(Distribution): + def _reload_version(self): + """ + Packages installed by distutils (e.g. numpy or scipy), + which uses an old safe_version, and so + their version numbers can get mangled when + converted to filenames (e.g., 1.11.0.dev0+2329eae to + 1.11.0.dev0_2329eae). These distributions will not be + parsed properly + downstream by Distribution and safe_version, so + take an extra step and try to get the version number from + the metadata file itself instead of the filename. + """ + md_version = _version_from_file(self._get_metadata(self.PKG_INFO)) + if md_version: + self._version = md_version + return self + + +class DistInfoDistribution(Distribution): + """ + Wrap an actual or potential sys.path entry + w/metadata, .dist-info style. + """ + PKG_INFO = 'METADATA' + EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])") + + @property + def _parsed_pkg_info(self): + """Parse and cache metadata""" + try: + return self._pkg_info + except AttributeError: + metadata = self.get_metadata(self.PKG_INFO) + self._pkg_info = email.parser.Parser().parsestr(metadata) + return self._pkg_info + + @property + def _dep_map(self): + try: + return self.__dep_map + except AttributeError: + self.__dep_map = self._compute_dependencies() + return self.__dep_map + + def _compute_dependencies(self): + """Recompute this distribution's dependencies.""" + dm = self.__dep_map = {None: []} + + reqs = [] + # Including any condition expressions + for req in self._parsed_pkg_info.get_all('Requires-Dist') or []: + reqs.extend(parse_requirements(req)) + + def reqs_for_extra(extra): + for req in reqs: + if not req.marker or req.marker.evaluate({'extra': extra}): + yield req + + common = frozenset(reqs_for_extra(None)) + dm[None].extend(common) + + for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []: + s_extra = safe_extra(extra.strip()) + dm[s_extra] = list(frozenset(reqs_for_extra(extra)) - common) + + return dm + + +_distributionImpl = { + '.egg': Distribution, + '.egg-info': EggInfoDistribution, + '.dist-info': DistInfoDistribution, +} + + +def issue_warning(*args, **kw): + level = 1 + g = globals() + try: + # find the first stack frame that is *not* code in + # the pkg_resources module, to use for the warning + while sys._getframe(level).f_globals is g: + level += 1 + except ValueError: + pass + warnings.warn(stacklevel=level + 1, *args, **kw) + + +class RequirementParseError(ValueError): + def __str__(self): + return ' '.join(self.args) + + +def parse_requirements(strs): + """Yield ``Requirement`` objects for each specification in `strs` + + `strs` must be a string, or a (possibly-nested) iterable thereof. + """ + # create a steppable iterator, so we can handle \-continuations + lines = iter(yield_lines(strs)) + + for line in lines: + # Drop comments -- a hash without a space may be in a URL. + if ' #' in line: + line = line[:line.find(' #')] + # If there is a line continuation, drop it, and append the next line. + if line.endswith('\\'): + line = line[:-2].strip() + try: + line += next(lines) + except StopIteration: + return + yield Requirement(line) + + +class Requirement(packaging.requirements.Requirement): + def __init__(self, requirement_string): + """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!""" + try: + super(Requirement, self).__init__(requirement_string) + except packaging.requirements.InvalidRequirement as e: + raise RequirementParseError(str(e)) + self.unsafe_name = self.name + project_name = safe_name(self.name) + self.project_name, self.key = project_name, project_name.lower() + self.specs = [ + (spec.operator, spec.version) for spec in self.specifier] + self.extras = tuple(map(safe_extra, self.extras)) + self.hashCmp = ( + self.key, + self.specifier, + frozenset(self.extras), + str(self.marker) if self.marker else None, + ) + self.__hash = hash(self.hashCmp) + + def __eq__(self, other): + return ( + isinstance(other, Requirement) and + self.hashCmp == other.hashCmp + ) + + def __ne__(self, other): + return not self == other + + def __contains__(self, item): + if isinstance(item, Distribution): + if item.key != self.key: + return False + + item = item.version + + # Allow prereleases always in order to match the previous behavior of + # this method. In the future this should be smarter and follow PEP 440 + # more accurately. + return self.specifier.contains(item, prereleases=True) + + def __hash__(self): + return self.__hash + + def __repr__(self): + return "Requirement.parse(%r)" % str(self) + + @staticmethod + def parse(s): + req, = parse_requirements(s) + return req + + +def _always_object(classes): + """ + Ensure object appears in the mro even + for old-style classes. + """ + if object not in classes: + return classes + (object,) + return classes + + +def _find_adapter(registry, ob): + """Return an adapter factory for `ob` from `registry`""" + types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob)))) + for t in types: + if t in registry: + return registry[t] + + +def ensure_directory(path): + """Ensure that the parent directory of `path` exists""" + dirname = os.path.dirname(path) + py31compat.makedirs(dirname, exist_ok=True) + + +def _bypass_ensure_directory(path): + """Sandbox-bypassing version of ensure_directory()""" + if not WRITE_SUPPORT: + raise IOError('"os.mkdir" not supported on this platform.') + dirname, filename = split(path) + if dirname and filename and not isdir(dirname): + _bypass_ensure_directory(dirname) + mkdir(dirname, 0o755) + + +def split_sections(s): + """Split a string or iterable thereof into (section, content) pairs + + Each ``section`` is a stripped version of the section header ("[section]") + and each ``content`` is a list of stripped lines excluding blank lines and + comment-only lines. If there are any such lines before the first section + header, they're returned in a first ``section`` of ``None``. + """ + section = None + content = [] + for line in yield_lines(s): + if line.startswith("["): + if line.endswith("]"): + if section or content: + yield section, content + section = line[1:-1].strip() + content = [] + else: + raise ValueError("Invalid section heading", line) + else: + content.append(line) + + # wrap up last segment + yield section, content + + +def _mkstemp(*args, **kw): + old_open = os.open + try: + # temporarily bypass sandboxing + os.open = os_open + return tempfile.mkstemp(*args, **kw) + finally: + # and then put it back + os.open = old_open + + +# Silence the PEP440Warning by default, so that end users don't get hit by it +# randomly just because they use pkg_resources. We want to append the rule +# because we want earlier uses of filterwarnings to take precedence over this +# one. +warnings.filterwarnings("ignore", category=PEP440Warning, append=True) + + +# from jaraco.functools 1.3 +def _call_aside(f, *args, **kwargs): + f(*args, **kwargs) + return f + + +@_call_aside +def _initialize(g=globals()): + "Set up global resource manager (deliberately not state-saved)" + manager = ResourceManager() + g['_manager'] = manager + g.update( + (name, getattr(manager, name)) + for name in dir(manager) + if not name.startswith('_') + ) + + +@_call_aside +def _initialize_master_working_set(): + """ + Prepare the master working set and make the ``require()`` + API available. + + This function has explicit effects on the global state + of pkg_resources. It is intended to be invoked once at + the initialization of this module. + + Invocation by other packages is unsupported and done + at their own risk. + """ + working_set = WorkingSet._build_master() + _declare_state('object', working_set=working_set) + + require = working_set.require + iter_entry_points = working_set.iter_entry_points + add_activation_listener = working_set.subscribe + run_script = working_set.run_script + # backward compatibility + run_main = run_script + # Activate all distributions already on sys.path with replace=False and + # ensure that all distributions added to the working set in the future + # (e.g. by calling ``require()``) will get activated as well, + # with higher priority (replace=True). + tuple( + dist.activate(replace=False) + for dist in working_set + ) + add_activation_listener( + lambda dist: dist.activate(replace=True), + existing=False, + ) + working_set.entries = [] + # match order + list(map(working_set.add_entry, sys.path)) + globals().update(locals()) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f36e4a271f6a17e1a7c98d01009ea9603518b7fd GIT binary patch literal 95350 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c39ed5f54e80f178c2a0e5da09e3964966b6076d GIT binary patch literal 680 zcmYjO&2AGh5FXpRNl23jE<N-O_E5HI8qrD>s)|y<r5qB8uoA46wbSlT*2{PkH7IaE zJO~_lC0{x1D{#VI8t7R5JTsp)^Lc#P?{~piI@^CYrvSffurp?y3$qm(;J`@^!QYbv zq={)jd6zTpd?Nu9G<CR}LHVAytnUDWjK~Y#&Y*B85X*EPFadwGV**#Wcq>@p2uNE& zi<2pMd$s8c*H^I-)|eG!<-Ramy)>{HRPdc_;Rhk`28t60Dw=iilE7z5;M4w=;L(<* ztYWE?F+BciZW-Z*{X*yP77BwLOe=EjxtdC)JIg2&JVB+~ucs44iP{y2h19LdWd3S8 z^O$zZsJhi1ahIqnl$mDYF8&E<mHn>#5|edQ34a}-zmPc>sQe}RAJQ;9Rpa8>nxDjB zxjsIs7N<8U=EKGK?989}Wl|m{g{q=FKg4)^I;uWKz7o}{tfb79UuHKU3ME$<3lnWd z!&okjlBeZH_rjg*a5QY$=`_DeC>fB)W?|3dJXYHQ)^?h;YZDav=4ilU|NYulxF>7J z`uF4$<JZI{$d%VdTL^6-&D2IUJ#=qv-kZoGOp1lngF*<d{)t1|znRkm*s}#X=S#^~ Vxp;1?tAT+IF^hG3U2;GU=pRGWn&kih literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd317a7d5cc0f106826cedec79b1b9e9f7fe47fd GIT binary patch literal 209 zcmYL@JqiLb6oeyKh+yj-EcE%exPpjy02^)Pv2L=GHE!a2*?`{2E7^JrE3<_-Fy9PQ z&9>L;im39?KQ{Sp@KY<6O*FS7q}Yo=Yxfk?%zu0y;7EteD+n1uVU1M8a3wgEh$$!4 zBFK4;E=<S1NY5piNs%m<Z~&*>P*?0TV}_I`>CE3UVC8G)tu+kpaz;{YYswV^231K* XfT%0&5l8O+>a4C-)<&(HPaG}2V@^3H literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd74ebaa504d7f6137bd70f44dbe5cda63c206bb GIT binary patch literal 18603 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..043b1a3c5fec6962d93b055bf0613b6ea95ce1ed GIT binary patch literal 200960 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16603b88222bea148ff755f1d81ee949df9bfd0b GIT binary patch literal 24410 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 HmX!YsQqBFg literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py new file mode 100644 index 000000000..f4dba0953 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/appdirs.py @@ -0,0 +1,552 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy Petrișor + +"""Utilities for determining application-specific dirs. + +See <http://github.com/ActiveState/appdirs> for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 0) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/<AppName> + Unix: ~/.local/share/<AppName> # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\<username>\Application Data\<AppAuthor>\<AppName> + Win XP (roaming): C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName> + Win 7 (not roaming): C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName> + Win 7 (roaming): C:\Users\<username>\AppData\Roaming\<AppAuthor>\<AppName> + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/<AppName>". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/<AppName>', + if XDG_DATA_DIRS is not set + + Typical user data directories are: + Mac OS X: /Library/Application Support/<AppName> + Unix: /usr/local/share/<AppName> or /usr/share/<AppName> + Win XP: C:\Documents and Settings\All Users\Application Data\<AppAuthor>\<AppName> + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\<AppAuthor>\<AppName> # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> + for a discussion of issues. + + Typical user data directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/<AppName> # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by deafult "~/.config/<AppName>". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/<AppName>', if XDG_CONFIG_DIRS is not set + + Typical user data directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/<AppName> or $XDG_CONFIG_DIRS[i]/<AppName> for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/<AppName> + Unix: ~/.cache/<AppName> (XDG default) + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Cache + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be "<major>.<minor>". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Logs/<AppName> + Unix: ~/.cache/<AppName>/log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\<username>\Local Settings\Application Data\<AppAuthor>\<AppName>\Logs + Vista: C:\Users\<username>\AppData\Local\<AppAuthor>\<AppName>\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname, appauthor=None, version=None, roaming=False, + multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # <http://bugs.activestate.com/show_bug.cgi?id=85099>. + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernal.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", "site_data_dir", + "user_config_dir", "site_config_dir", + "user_cache_dir", "user_log_dir") + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py new file mode 100644 index 000000000..95d330ef8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py new file mode 100644 index 000000000..5ee622020 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a3ac24799b3b02dd66a4f2c6d7f1beb03030ac5 GIT binary patch literal 745 zcmYL{%T60H6ozLqf!qkt7O{4bx`<TbK!Jv;swl9mDkM-BBUP3&$1^c_Y}c2Ol6@bh zZ_{<QUG){Zs!fEjHJ{G0ejlI9Tn>l*B&_?p{qMh9N%AK;Ppcb@i}2Z-07xJeNuB0t z-O5{amS<@KEy$n^8?Xr-=t8gR=56Tb8!*T>VJq*zFz>>4-h-XI54-sQUa;PNl5fGw z+hp|WZ-|<VvegcqStYz<gx6Xbx9S3KxaCT&wzc8Xk<!b;MZZUg<4!O_Rs%w;uWM=+ z!RZj<4PT!&%*4CF=@UY|n=2FSaFf-Pi?v4Zf=L_03<)WeUKn1@U6g5BJkW~EYI$&_ z3`5>=!5wE7mCB%-MF=O+TEy(~_1rmaKVV#OH}|t~p=zubn&Rg$?W42tbUC_Kk_te# z&X=V_R085MmI<B;R4C~TpLwT@UGBo8^uj($$6PHBE^n_<c>QyTI%nw1I{CNg+qzP8 zJf1A~ub!$v$CIOz!+<mN#(o_QV;f5Eyb0x+Fyh2y5$%B3H!4C;%tk!gjOawf$(vq8 z{5#AbVk_WRVs@h)@$V-N(`l$<xS<A@N<hd5*9On-37Ohc`M!aZg6QUW;>u}tZ^Th~ zdVY@Yu;%)ZOY6ehho(54zH>h)w#<3$loA%}hl&_xl{W>mm^4g+GS5B5A?um)VP0ds dSam<v3cO&SVnuc@U@z;Z{j8ma-3mK0{SWBP;WGdL literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9bbdd69b49e6763058e2092be72ba20bbfc699e0 GIT binary patch literal 583 zcmYk2&yLeD5XO_HZPKJ!goJnodRWZAimrrKhzH<8PnOWgjoqxfc5KFWq~3WMUMbf- z?JID?-U@^z|Ky2gzWMTfY1=xB=d^$MJ)dRSLn{8BDn35P>-G^m<GIRoPIEn@GhNUk z&-jcNYOWV_p_g>2OIqrRR(eHOx~8>mXrtG39sA~d!I!+`6<_h1H+@B0zW$bN+Q+Dz zZHnm`J2<0)7a+AY=%<RyQ95ac>B^!UJRHN&`B*>ZX`-5H02ch6L4c_R=!`w1?C*Rm zR{%mYsp7K%P_h$)6PLmTtr?y#O<sDHzLx+2<)vX1n6?676Zc>W2iFO0!ZIPnf~$lw z;_K!rc{v6jFp6OeF~cHZ9+AATg9*{rWjKxer|_izwCUfHWQVC}{#S<2Q+LAepCraG zGB3!;kQ|NT(J0YK4kv(}+YTQ`{-FaqzI)@3yZ(gg?Qwf^L-xc<do2g&qvkbs+ueKr zgApfuu-+Kuh`sLtg);#=;RuXk;0B3h-978&&=UYT$msvIJx|pqZFo@PHvOARX}p-d HTGsg=bwZ#F literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0caa7470783ab548b3af4bee1d1a3994fc854732 GIT binary patch literal 1035 zcmah{OHUL*5bnq9?yxS)K|<o=uwG2|z>b1MNC+`%;*FR{Oq^&s&2$gUGB3J&mMp;& zB=9rz=wIrqC;oybt9xO^c(9VHsj8m-s_LtLy|~y#AmhE2FP|wwKV5Ju1e{l(`Xd;D z1kO=`V_cA!6f~yT<wzdHfegkifgT`1k4W5}M*&0~*->w0nBsV$Y|F0uik4_!p!l93 zAJDLK4cKT%?GoSDRo)oMvZAh(v7yK&na--x_G^`uhNVrJ7>IYTU1QhKElRMv4dQ|} zXa`h31@jJFqD!0-fd#n;1-ZiK^eZvw8$Kg~iXcPZ11R4*jk*JnH%f9N2Yj&4wHzcl z*LrZ0nM24F(r}*``9Bi?pNlK&L_Y*0QH%wO$=$*+6%@(@r%xOj`-8QeR|(Jc&S;)W z0uP0d`#QZ3s(WCr@EN{BXY|}b;oTpAXK9ja8<f0|wrdVE&0OQ!VlgDPHS+@ptsEo2 z&Lg030ux3PuA;Qcg;Y8!RJ1>4Y*TNPFDK$f!s^M|Gm~x}j8*<T-PqcS_M$qgSF=(Z zp69D7+1Ok+$2`)~G_|R!Tu1fM0aH>}jY_1B*hH41Qc=y5BYu#T2N6rEqUL5)Pi=>> zQl2pO*v;iui16v~zqE{QZtcR*A^0#cW46m!QHdsZevh%^hUc>rwFJ0+=pj*#Jhgb6 zP<`<1!kq9&5c)nstQ^;N$w>F~xSBG*@EaH#m}xCN@Q}{nJg~d-ZzW%(|MytSu99DG zXN9U2h=x5kLfV){!3fH+q1<Cq?k`LARNLMJb_CCzWo24f`u@|JGwX0@l<k25dYS7? k+pb@@&v<m-)g9w|3b$vB?YI)!rItxZ`?wzjI3#WQ8!BuG+W-In literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c422da5b37a8664ca42df08f0241ca6e7220790 GIT binary patch literal 2887 zcmcImOK;ma5GEyCmK`T?+Vr{D1@=@3XsW(~rs$%`KCp|u__8?}SP+UxJ91@7At?h5 zdUJvHuk<hJ+SC4pJ?#t~b?rc^ypPf#htiPzW`;AL{KNKkk3gHA-2DB0n~;zAP_`CK zj-jicVBmz)n9S&i&a9C&vqv^1zYuP5`z_(NXf5nfTeKHs)P}b$-iEhr^VSg#ymh$q z8}T}Sz)8fji{0Q<rE#tWi)L9Wb>Z@89;qlzik(bGiDu(G2{k;2xT9<qOpc+e6Bq;; zQBFn{r`&o=MmD#33nXB32V|RfxC_$ZUETxP;aj{9(&gKH2V|G;@&U*m-{aRnZt?42 z;eO%%nvA0)(yv1bAlOi1{}H;vpl}K+t)YZ~kq^Y9MN5fzEFE|>!=LYbaAF>4;m-r< zkJFe7sr;GrPp6C>sl(*ioIed&Hh=t3kB=r(89y2yK7a0?_*s-4M2XTt93RN=@aTy? z4}2wbp6N7=m7l$uFey};%TOqv%|*gf>1RRsDwssc#Aiy&Jk&X?d62y>Tn4K%$ygU{ z$M6w)u~&NdpwzCpYQrMqY9A(=X!?dM=mK4)L(eK&XMs8^T6nBSWe3*$?YMN|5kYYc zV|YLn=u#URb6^R|s`&nF4)!bqQnXWjCgfEthp|{Qw!4C~yW$?|{uz$khNG%b1Y_6g zP(ZhaawUXsAcRx8u*wkjAk*=VlTZ|0*ct~)F?Q)_odM#Uu^Tl8psw109oV5sX+WP` znji=0<sJ+Ts0p}sy9O0?Yp7M1c(Qtlb-qpDn!c(*LEZm^0``7Whl0MK{n${h`Jyl5 zMvK8vOadLvMVVwZHPB%!5fjF~g`>(67?gXU?u>Hi^|4rzU<T+#kFi<G^BCuS#?JE~ zUTP#3uf$@Kc%2fHU1BcE>p1M=fSDn0;qZxtmNTqKLsVF)3U|4dYp?%|J_OaLh9!9n z{R<MUyb0&mhy0RbFS-Y1)Ru`<NjWA$9@=X-g<jmbdQJa^>Lh*|<rWOpmu#-&ego=; zT-R78=IZ?wuv--_ZbWy@P?%tko1m~@OtfJk%FlD&MucOM`mh1`%W$13rK1MujR<e; zt5rpKreI$*KyAc&%}_`SFPoq?qdr3tHHCo0^Zg3U?TXwi8BgNpMBc&SE)M^h+>l4^ zL9Zh>)DOK5^6NOqe@5`H2NPCe#!CD@S2*eERD{~NXn3iLMGN=4B|pE!Jqn3+-yVGJ GK>rJE;Rm1q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c311f991662f014c50f9e96e8e3bc5c159d1fe96 GIT binary patch literal 8895 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 ZI7x;OhB5gU&HRC^ksrvvpU>wf{tw9f+MfUb literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01df13d9250fe46006c7f17720b06f2eb6b7f76b GIT binary patch literal 3900 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 b!ysyrjj<xAMZL&UD5xp$vC0_J3&#Hd>R0f3 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..483ae349928c9af4ac45f12f0b1a1dd220f55c8f GIT binary patch literal 19813 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9337596e50ff1a44dd4bb0a09c1df4afe4bd5c1d GIT binary patch literal 514 zcmY*W&2AGh5VpOWGzt``K)geQQbQqXDpd%z_g?5}QDr%{vvTUS&Dgs@#RZ86Ne(^q zm3-yIEA)h22?<7;&-1HqW_-54KSfzKmoKkwF+#tJ^H-{De8?J(GDsw`K^<;zM;g*q zO@&L0n7XM|y&cJFhnumi<>)7B_9Xd;X5-(v56!Cdl&^v_eN;?$-a$+gsRtdjv+0Qk zZ6jOvR>bUI+>AfX+2PeIk%xJZ^43|;vxa9GBHCh!zoQ-5k{!x4<l-LBGs|-(xOG+w zZuE^}pj!1cRiR&{k#S!X%y6nL@6;WFvh)29nz;ua6&*OxwKGydpdHZFhOuQ>*yBOI z6U+}suj6{zZos@*FHTPACH30RwGELQGY7F)zKx$b4J!6NI%fj)*KMW`t_Pt4WrMQP z0rgy5^H$rI_EDQ~=)a|d|0XWOJuYjK42VFnXOlE#`8=@)#Tb+flz)M8lSDwJJ>fd9 hje>Crm!609{((oObaL7`*&Fq~G=@_9f=sGu^#>B<imm_v literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..312d8d2018f120e91c9bf8e37626a76da59f28f6 GIT binary patch literal 10580 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py new file mode 100644 index 000000000..210bb80b7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py new file mode 100644 index 000000000..ccc27861c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py new file mode 100644 index 000000000..892e578ed --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from pkg_resources.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from pkg_resources.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from pkg_resources.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py new file mode 100644 index 000000000..0c8c4a385 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from pkg_resources.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from pkg_resources.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from pkg_resources.extern.pyparsing import Literal as L # noqa +from pkg_resources.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py new file mode 100644 index 000000000..7f5a76cfd --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py new file mode 100644 index 000000000..942387cef --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py new file mode 100644 index 000000000..83b5ee8c5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py new file mode 100644 index 000000000..a21224359 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/pyparsing.py @@ -0,0 +1,5696 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2016 Paul T. McGuire +# +# 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. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments +""" + +__version__ = "2.1.10" +__versionTime__ = "07 Oct 2016 01:31 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex('&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + """ + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +collections.MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [(frame_summary.filename, frame_summary.lineno)] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [(frame_summary.filename, frame_summary.lineno)] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define action to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or loc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.popitem(False) + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + prints:: + ['More', 'Iron', 'Lead', 'Gold', 'I'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, And._ErrorStop(), other ] ) + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + """ + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, collections.Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, collections.Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + matchExpr.setParseAction( pa ) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py new file mode 100644 index 000000000..190c0239c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py b/myenv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py new file mode 100644 index 000000000..b4156fec2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if sys.version_info > (3, 3): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'packaging', 'pyparsing', 'six', 'appdirs' +VendorImporter(__name__, names).install() diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69a4ae8eaacec8d8e5d3f70085db084fd9beb420 GIT binary patch literal 2424 zcmZ`)TW=gS6t?HKyOT{?A(YSxB1<63N^Q3EB2p-*&{hb6qN<4stf)qlwKth$c094Y zNp{)1un|v)H{P2^egXf*uRQfH@WeTu-A&u59{JegyU+KX&)+OA#st#d*7Eaz8if3d zKeOaR<pE@U9SkR&=A=WuCEVlwDdGOa>rftaJVAvoyovWBI3pBBZIV{_5@wK%F4|d| zul4|11cAAv<8j*Y`4SI!cuG5g2zkV7r({Aq5x>OiyaBB>9`l7$(y8+%Uxc#3ec0i$ zU3w-8F4cGaQYs_V=rm@KzGhDzKVi3T-eP@WQdXvBmu1r-tS1%gWd+ZQ9VSbY$s*13 z;f+JLkl=0s7$VKCP)C^-tVqp3xiMLx4O9e&CA<6Sj?k>9WS=Q1O;V(NvF2v~4VMn4 zH^vh4L&*ALFk?C<2{Cl+O|a&T{c?3oU-+DI@63aifD^cyztM@rF<hyzwWK;*E3}RI zPS)4L*rnO2-R|1flqmDGD{NeKB<222E3knUc~6C~yQ-l9jEO=hocV9qE>(7z8qq#X zRl6s1E|hNfReO6cN!In<;<H13r<;_Aw{Du=`p%xpKkePUcdxzGF0=B+)G0Sq_wM>_ zbC9;-V1v>~nd>%epD3Z_Ky`&~SNCZrNmgVgN!H4tt<QdtfI0$0XhdT=T6y*wuxqn% zU5aBMVd+6edg)~_W3mUlTOrSof1b0*kzn+L0|j}pDN@zl1@x6R4De-@mu6^UQ^8Wr z(i!Hno(fl7!qPQMHd@sA5DGl^xhvHI{MrTW_DPU;m+*Lw3}KUwuD)@rR|a+w4@~HU zIb+u02iSp^qj<S9`ip<!p9Cl2*jKCE+a$&_{y5wVU_>|pPU$<?I(8fy{XW0?QvgL3 z42i&w@S43ro+D)$P+A$yjxq?6IlWj~aCFCfJ`CCshV>;M<bq|I$ztX{2nVyP<X~qP zO6ZwI+PTxzB3xsm71>4!du14Nj*Zq&i=p-VX=&r?7<dZD(N^SKYwNRf+5p{Y13aP) zwo@%^R2}Mq`!Twc>ZB{Mv2KDP;W7>2dk69b7+#ssMNVO=L&i9H2wDFD<^l{J0&!e| z<Gn}Z`PNA|{CpgagB5ZT0VL6cQeuL=a2#DBC$(|S)#-g~i@3KRs7}@UB^lQ?0dZ5? zk5x&5y_Eb+4px7H{3En-f3MynrZFLZ(h2<y)E2dM^!*%~??5FWc$qvD3NZta9nGEW z8Od_l#co72mnokk{{}uS?<G=DT?I4xYYW!7_G{(flWVg$K;V@)7-UNDFIXW}A9ZmG zyJp*if}=V*E;%ktb&_exvK|}C0YetKuA@{HpuyK!R~CAZR{=R45Ay3qE5<WzRJJ`p z&a7>;Vs#nM=%fro%f=uKPT7+LByk85SOKqX6WpO;7N|{6+J)+gc&wCEHi9>xpBfvX zYjWMHS7H1vE{#&6kT&W)Tt6z6=w-)FjMKsZStY+fICSfja38`Xy$Xf|%d|;7T8A&D zaTG%t&?Ops9*z796ntfg*CY-haTG*Y#>9XQ?AO#XmM`G7I0KTo$JQG?Jtsu<OuZhB zEGvKu;Gs2q6P-38B!x6A&6P;`kik{8D9kx8Hd?-VANIA4`5YUiWeL*!7U`=^UxNoQ ztCGC{#C-V;*_#e(dCrrdrT{EH1*k`WBVbyA2=!)?91K#YRPa|z5-z(*qA;Xwy;QOk z$_y1!L0v)f5t?gg9GTAzDzn1iMs0PHP!9qx4x9D3S^vQGz)J}Ng%3OM5~@Q`D~(lO sXUDb%7w7PDv_j_-H^YW_WUW5I#oxB8t>3S%^A)~X?vbneOOFEjKV3J0ng9R* literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/pkg_resources/py31compat.py b/myenv/lib/python3.7/site-packages/pkg_resources/py31compat.py new file mode 100644 index 000000000..331a51bb0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/pkg_resources/py31compat.py @@ -0,0 +1,22 @@ +import os +import errno +import sys + + +def _makedirs_31(path, exist_ok=False): + try: + os.makedirs(path) + except OSError as exc: + if not exist_ok or exc.errno != errno.EEXIST: + raise + + +# rely on compatibility behavior until mode considerations +# and exists_ok considerations are disentangled. +# See https://github.com/pypa/setuptools/pull/1083#issuecomment-315168663 +needs_makedirs = ( + sys.version_info < (3, 2, 5) or + (3, 3) <= sys.version_info < (3, 3, 6) or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst new file mode 100644 index 000000000..ba3a46bc6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/DESCRIPTION.rst @@ -0,0 +1,36 @@ +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI + :target: https://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/jaraco/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor + :target: https://ci.appveyor.com/project/jaraco/setuptools/branch/master + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +The project is `maintained at GitHub <https://github.com/pypa/setuptools>`_. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/INSTALLER b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/LICENSE.txt b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/LICENSE.txt new file mode 100644 index 000000000..6e0693b4b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (C) 2016 Jason R Coombs <jaraco@jaraco.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/METADATA b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/METADATA new file mode 100644 index 000000000..fdeaeb00d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/METADATA @@ -0,0 +1,71 @@ +Metadata-Version: 2.0 +Name: setuptools +Version: 39.0.1 +Summary: Easily download, build, install, upgrade, and uninstall Python packages +Home-page: https://github.com/pypa/setuptools +Author: Python Packaging Authority +Author-email: distutils-sig@python.org +License: UNKNOWN +Project-URL: Documentation, https://setuptools.readthedocs.io/ +Keywords: CPAN PyPI distutils eggs package management +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: System :: Archiving :: Packaging +Classifier: Topic :: System :: Systems Administration +Classifier: Topic :: Utilities +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.* +Description-Content-Type: text/x-rst; charset=UTF-8 +Provides-Extra: certs +Provides-Extra: ssl +Provides-Extra: certs +Requires-Dist: certifi (==2016.9.26); extra == 'certs' +Provides-Extra: ssl +Requires-Dist: wincertstore (==0.2); sys_platform=='win32' and extra == 'ssl' + +.. image:: https://img.shields.io/pypi/v/setuptools.svg + :target: https://pypi.org/project/setuptools + +.. image:: https://readthedocs.org/projects/setuptools/badge/?version=latest + :target: https://setuptools.readthedocs.io + +.. image:: https://img.shields.io/travis/pypa/setuptools/master.svg?label=Linux%20build%20%40%20Travis%20CI + :target: https://travis-ci.org/pypa/setuptools + +.. image:: https://img.shields.io/appveyor/ci/jaraco/setuptools/master.svg?label=Windows%20build%20%40%20Appveyor + :target: https://ci.appveyor.com/project/jaraco/setuptools/branch/master + +.. image:: https://img.shields.io/pypi/pyversions/setuptools.svg + +See the `Installation Instructions +<https://packaging.python.org/installing/>`_ in the Python Packaging +User's Guide for instructions on installing, upgrading, and uninstalling +Setuptools. + +The project is `maintained at GitHub <https://github.com/pypa/setuptools>`_. + +Questions and comments should be directed to the `distutils-sig +mailing list <http://mail.python.org/pipermail/distutils-sig/>`_. +Bug reports and especially tested patches may be +submitted directly to the `bug tracker +<https://github.com/pypa/setuptools/issues>`_. + + +Code of Conduct +--------------- + +Everyone interacting in the setuptools project's codebases, issue trackers, +chat rooms, and mailing lists is expected to follow the +`PyPA Code of Conduct <https://www.pypa.io/en/latest/code-of-conduct/>`_. + + diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/RECORD b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/RECORD new file mode 100644 index 000000000..a8d030e62 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/RECORD @@ -0,0 +1,188 @@ +easy_install.py,sha256=MDC9vt5AxDsXX5qcKlBz2TnW6Tpuv_AobnfhCJ9X3PM,126 +pkg_resources/__init__.py,sha256=YQ4_WQnPztMsUy1yuvp7ZRBPK9IhOyhgosLpvkFso1I,103551 +pkg_resources/py31compat.py,sha256=-ysVqoxLetAnL94uM0kHkomKQTC1JZLN2ZUjqUhMeKE,600 +pkg_resources/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +pkg_resources/_vendor/appdirs.py,sha256=tgGaL0m4Jo2VeuGfoOOifLv7a7oUEJu2n1vRkqoPw-0,22374 +pkg_resources/_vendor/pyparsing.py,sha256=PifeLY3-WhIcBVzLtv0U4T_pwDtPruBhBCkg5vLqa28,229867 +pkg_resources/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +pkg_resources/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +pkg_resources/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +pkg_resources/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +pkg_resources/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +pkg_resources/_vendor/packaging/markers.py,sha256=uEcBBtGvzqltgnArqb9c4RrcInXezDLos14zbBHhWJo,8248 +pkg_resources/_vendor/packaging/requirements.py,sha256=SikL2UynbsT0qtY9ltqngndha_sfo0w6XGFhAhoSoaQ,4355 +pkg_resources/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +pkg_resources/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +pkg_resources/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +pkg_resources/extern/__init__.py,sha256=JUtlHHvlxHSNuB4pWqNjcx7n6kG-fwXg7qmJ2zNJlIY,2487 +setuptools/__init__.py,sha256=WWIdCbFJnZ9fZoaWDN_x1vDA_Rkm-Sc15iKvPtIYKFs,5700 +setuptools/archive_util.py,sha256=kw8Ib_lKjCcnPKNbS7h8HztRVK0d5RacU3r_KRdVnmM,6592 +setuptools/build_meta.py,sha256=FllaKTr1vSJyiUeRjVJEZmeEaRzhYueNlimtcwaJba8,5671 +setuptools/cli-32.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/cli-64.exe,sha256=KLABu5pyrnokJCv6skjXZ6GsXeyYHGcqOUT3oHI3Xpo,74752 +setuptools/cli.exe,sha256=dfEuovMNnA2HLa3jRfMPVi5tk4R7alCbpTvuxtCyw0Y,65536 +setuptools/config.py,sha256=tVYBM3w1U_uBRRTOZydflxyZ_IrTJT5odlZz3cbuhSw,16381 +setuptools/dep_util.py,sha256=fgixvC1R7sH3r13ktyf7N0FALoqEXL1cBarmNpSEoWg,935 +setuptools/depends.py,sha256=hC8QIDcM3VDpRXvRVA6OfL9AaQfxvhxHcN_w6sAyNq8,5837 +setuptools/dist.py,sha256=_wCSFiGqwyaOUTj0tBjqZF2bqW9aEVu4W1D4gmsveno,42514 +setuptools/extension.py,sha256=uc6nHI-MxwmNCNPbUiBnybSyqhpJqjbhvOQ-emdvt_E,1729 +setuptools/glibc.py,sha256=X64VvGPL2AbURKwYRsWJOXXGAYOiF_v2qixeTkAULuU,3146 +setuptools/glob.py,sha256=Y-fpv8wdHZzv9DPCaGACpMSBWJ6amq_1e0R_i8_el4w,5207 +setuptools/gui-32.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/gui-64.exe,sha256=aYKMhX1IJLn4ULHgWX0sE0yREUt6B3TEHf_jOw6yNyE,75264 +setuptools/gui.exe,sha256=XBr0bHMA6Hpz2s9s9Bzjl-PwXfa9nH4ie0rFn4V2kWA,65536 +setuptools/launch.py,sha256=sd7ejwhBocCDx_wG9rIs0OaZ8HtmmFU8ZC6IR_S0Lvg,787 +setuptools/lib2to3_ex.py,sha256=t5e12hbR2pi9V4ezWDTB4JM-AISUnGOkmcnYHek3xjg,2013 +setuptools/monkey.py,sha256=zZGTH7p0xeXQKLmEwJTPIE4m5m7fJeHoAsxyv5M8e_E,5789 +setuptools/msvc.py,sha256=8EiV9ypb3EQJQssPcH1HZbdNsbRvqsFnJ7wPFEGwFIo,40877 +setuptools/namespaces.py,sha256=F0Nrbv8KCT2OrO7rwa03om4N4GZKAlnce-rr-cgDQa8,3199 +setuptools/package_index.py,sha256=NEsrNXnt_9gGP-nCCYzV-0gk15lXAGO7RghRxpfqLqE,40142 +setuptools/pep425tags.py,sha256=NuGMx1gGif7x6iYemh0LfgBr_FZF5GFORIbgmMdU8J4,10882 +setuptools/py27compat.py,sha256=3mwxRMDk5Q5O1rSXOERbQDXhFqwDJhhUitfMW_qpUCo,536 +setuptools/py31compat.py,sha256=XuU1HCsGE_3zGvBRIhYw2iB-IhCFK4-Pxw_jMiqdNVk,1192 +setuptools/py33compat.py,sha256=NKS84nl4LjLIoad6OQfgmygZn4mMvrok_b1N1tzebew,1182 +setuptools/py36compat.py,sha256=VUDWxmu5rt4QHlGTRtAFu6W5jvfL6WBjeDAzeoBy0OM,2891 +setuptools/sandbox.py,sha256=9UbwfEL5QY436oMI1LtFWohhoZ-UzwHvGyZjUH_qhkw,14276 +setuptools/script (dev).tmpl,sha256=f7MR17dTkzaqkCMSVseyOCMVrPVSMdmTQsaB8cZzfuI,201 +setuptools/script.tmpl,sha256=WGTt5piezO27c-Dbx6l5Q4T3Ff20A5z7872hv3aAhYY,138 +setuptools/site-patch.py,sha256=BVt6yIrDMXJoflA5J6DJIcsJUfW_XEeVhOzelTTFDP4,2307 +setuptools/ssl_support.py,sha256=YBDJsCZjSp62CWjxmSkke9kn9rhHHj25Cus6zhJRW3c,8492 +setuptools/unicode_utils.py,sha256=NOiZ_5hD72A6w-4wVj8awHFM3n51Kmw1Ic_vx15XFqw,996 +setuptools/version.py,sha256=og_cuZQb0QI6ukKZFfZWPlr1HgJBPPn2vO2m_bI9ZTE,144 +setuptools/wheel.py,sha256=yF9usxMvpwnymV-oOo5mfDiv3E8jrKkbDEItT7_kjBs,7230 +setuptools/windows_support.py,sha256=5GrfqSP2-dLGJoZTq2g6dCKkyQxxa2n5IQiXlJCoYEE,714 +setuptools/_vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +setuptools/_vendor/pyparsing.py,sha256=PifeLY3-WhIcBVzLtv0U4T_pwDtPruBhBCkg5vLqa28,229867 +setuptools/_vendor/six.py,sha256=A6hdJZVjI3t_geebZ9BzUvwRrIXo0lfwzQlM2LcKyas,30098 +setuptools/_vendor/packaging/__about__.py,sha256=zkcCPTN_6TcLW0Nrlg0176-R1QQ_WVPTm8sz1R4-HjM,720 +setuptools/_vendor/packaging/__init__.py,sha256=_vNac5TrzwsrzbOFIbF-5cHqc_Y2aPT2D7zrIR06BOo,513 +setuptools/_vendor/packaging/_compat.py,sha256=Vi_A0rAQeHbU-a9X0tt1yQm9RqkgQbDSxzRw8WlU9kA,860 +setuptools/_vendor/packaging/_structures.py,sha256=RImECJ4c_wTlaTYYwZYLHEiebDMaAJmK1oPARhw1T5o,1416 +setuptools/_vendor/packaging/markers.py,sha256=Gvpk9EY20yKaMTiKgQZ8yFEEpodqVgVYtfekoic1Yts,8239 +setuptools/_vendor/packaging/requirements.py,sha256=t44M2HVWtr8phIz2OhnILzuGT3rTATaovctV1dpnVIg,4343 +setuptools/_vendor/packaging/specifiers.py,sha256=SAMRerzO3fK2IkFZCaZkuwZaL_EGqHNOz4pni4vhnN0,28025 +setuptools/_vendor/packaging/utils.py,sha256=3m6WvPm6NNxE8rkTGmn0r75B_GZSGg7ikafxHsBN1WA,421 +setuptools/_vendor/packaging/version.py,sha256=OwGnxYfr2ghNzYx59qWIBkrK3SnB6n-Zfd1XaLpnnM0,11556 +setuptools/command/__init__.py,sha256=NWzJ0A1BEengZpVeqUyWLNm2bk4P3F4iL5QUErHy7kA,594 +setuptools/command/alias.py,sha256=KjpE0sz_SDIHv3fpZcIQK-sCkJz-SrC6Gmug6b9Nkc8,2426 +setuptools/command/bdist_egg.py,sha256=RQ9h8BmSVpXKJQST3i_b_sm093Z-aCXbfMBEM2IrI-Q,18185 +setuptools/command/bdist_rpm.py,sha256=B7l0TnzCGb-0nLlm6rS00jWLkojASwVmdhW2w5Qz_Ak,1508 +setuptools/command/bdist_wininst.py,sha256=_6dz3lpB1tY200LxKPLM7qgwTCceOMgaWFF-jW2-pm0,637 +setuptools/command/build_clib.py,sha256=bQ9aBr-5ZSO-9fGsGsDLz0mnnFteHUZnftVLkhvHDq0,4484 +setuptools/command/build_ext.py,sha256=PCRAZ2xYnqyEof7EFNtpKYl0sZzT0qdKUNTH3sUdPqk,13173 +setuptools/command/build_py.py,sha256=yWyYaaS9F3o9JbIczn064A5g1C5_UiKRDxGaTqYbtLE,9596 +setuptools/command/develop.py,sha256=wKbOw2_qUvcDti2lZmtxbDmYb54yAAibExzXIvToz-A,8046 +setuptools/command/dist_info.py,sha256=5t6kOfrdgALT-P3ogss6PF9k-Leyesueycuk3dUyZnI,960 +setuptools/command/easy_install.py,sha256=I0UOqFrS9U7fmh0uW57IR37keMKSeqXp6z61Oz1nEoA,87054 +setuptools/command/egg_info.py,sha256=3b5Y3t_bl_zZRCkmlGi3igvRze9oOaxd-dVf2w1FBOc,24800 +setuptools/command/install.py,sha256=a0EZpL_A866KEdhicTGbuyD_TYl1sykfzdrri-zazT4,4683 +setuptools/command/install_egg_info.py,sha256=bMgeIeRiXzQ4DAGPV1328kcjwQjHjOWU4FngAWLV78Q,2203 +setuptools/command/install_lib.py,sha256=11mxf0Ch12NsuYwS8PHwXBRvyh671QAM4cTRh7epzG0,3840 +setuptools/command/install_scripts.py,sha256=UD0rEZ6861mTYhIdzcsqKnUl8PozocXWl9VBQ1VTWnc,2439 +setuptools/command/launcher manifest.xml,sha256=xlLbjWrB01tKC0-hlVkOKkiSPbzMml2eOPtJ_ucCnbE,628 +setuptools/command/py36compat.py,sha256=SzjZcOxF7zdFUT47Zv2n7AM3H8koDys_0OpS-n9gIfc,4986 +setuptools/command/register.py,sha256=bHlMm1qmBbSdahTOT8w6UhA-EgeQIz7p6cD-qOauaiI,270 +setuptools/command/rotate.py,sha256=co5C1EkI7P0GGT6Tqz-T2SIj2LBJTZXYELpmao6d4KQ,2164 +setuptools/command/saveopts.py,sha256=za7QCBcQimKKriWcoCcbhxPjUz30gSB74zuTL47xpP4,658 +setuptools/command/sdist.py,sha256=obDTe2BmWt2PlnFPZZh7e0LWvemEsbCCO9MzhrTZjm8,6711 +setuptools/command/setopt.py,sha256=NTWDyx-gjDF-txf4dO577s7LOzHVoKR0Mq33rFxaRr8,5085 +setuptools/command/test.py,sha256=MeBAcXUePGjPKqjz4zvTrHatLvNsjlPFcagt3XnFYdk,9214 +setuptools/command/upload.py,sha256=i1gfItZ3nQOn5FKXb8tLC2Kd7eKC8lWO4bdE6NqGpE4,1172 +setuptools/command/upload_docs.py,sha256=oXiGplM_cUKLwE4CWWw98RzCufAu8tBhMC97GegFcms,7311 +setuptools/extern/__init__.py,sha256=2eKMsBMwsZqolIcYBtLZU3t96s6xSTP4PTaNfM5P-I0,2499 +setuptools-39.0.1.dist-info/DESCRIPTION.rst,sha256=It3a3GRjT5701mqhrpMcLyW_YS2Dokv-X8zWoTaMRe0,1422 +setuptools-39.0.1.dist-info/LICENSE.txt,sha256=wyo6w5WvYyHv0ovnPQagDw22q4h9HCHU_sRhKNIFbVo,1078 +setuptools-39.0.1.dist-info/METADATA,sha256=bUSvsq3nbwr4FDQmI4Cu1Sd17lRO4y4MFANuLmZ70gs,2903 +setuptools-39.0.1.dist-info/RECORD,, +setuptools-39.0.1.dist-info/WHEEL,sha256=kdsN-5OJAZIiHN-iO4Rhl82KyS0bDWf4uBwMbkNafr8,110 +setuptools-39.0.1.dist-info/dependency_links.txt,sha256=HlkCFkoK5TbZ5EMLbLKYhLcY_E31kBWD8TqW2EgmatQ,239 +setuptools-39.0.1.dist-info/entry_points.txt,sha256=jBqCYDlVjl__sjYFGXo1JQGIMAYFJE-prYWUtnMZEew,2990 +setuptools-39.0.1.dist-info/metadata.json,sha256=kJuHY3HestbJAAqqkLVW75x2Uxgxd2qaz4sQAfFCtXM,4969 +setuptools-39.0.1.dist-info/top_level.txt,sha256=2HUXVVwA4Pff1xgTFr3GsTXXKaPaO6vlG6oNJ_4u4Tg,38 +setuptools-39.0.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +../../../bin/easy_install,sha256=ymUDR-fDjNuwvuvTMy9wtx0AADsekmdzLICGRDG79Aw,295 +../../../bin/easy_install-3.7,sha256=ymUDR-fDjNuwvuvTMy9wtx0AADsekmdzLICGRDG79Aw,295 +setuptools-39.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +__pycache__/easy_install.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +setuptools/_vendor/__pycache__/six.cpython-37.pyc,, +setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +setuptools/_vendor/__pycache__/__init__.cpython-37.pyc,, +setuptools/__pycache__/py31compat.cpython-37.pyc,, +setuptools/__pycache__/package_index.cpython-37.pyc,, +setuptools/__pycache__/windows_support.cpython-37.pyc,, +setuptools/__pycache__/sandbox.cpython-37.pyc,, +setuptools/__pycache__/site-patch.cpython-37.pyc,, +setuptools/__pycache__/version.cpython-37.pyc,, +setuptools/__pycache__/wheel.cpython-37.pyc,, +setuptools/__pycache__/unicode_utils.cpython-37.pyc,, +setuptools/__pycache__/launch.cpython-37.pyc,, +setuptools/__pycache__/config.cpython-37.pyc,, +setuptools/__pycache__/depends.cpython-37.pyc,, +setuptools/__pycache__/ssl_support.cpython-37.pyc,, +setuptools/__pycache__/glibc.cpython-37.pyc,, +setuptools/__pycache__/py27compat.cpython-37.pyc,, +setuptools/__pycache__/msvc.cpython-37.pyc,, +setuptools/__pycache__/glob.cpython-37.pyc,, +setuptools/__pycache__/pep425tags.cpython-37.pyc,, +setuptools/__pycache__/py36compat.cpython-37.pyc,, +setuptools/__pycache__/monkey.cpython-37.pyc,, +setuptools/__pycache__/lib2to3_ex.cpython-37.pyc,, +setuptools/__pycache__/py33compat.cpython-37.pyc,, +setuptools/__pycache__/dist.cpython-37.pyc,, +setuptools/__pycache__/build_meta.cpython-37.pyc,, +setuptools/__pycache__/dep_util.cpython-37.pyc,, +setuptools/__pycache__/namespaces.cpython-37.pyc,, +setuptools/__pycache__/archive_util.cpython-37.pyc,, +setuptools/__pycache__/extension.cpython-37.pyc,, +setuptools/__pycache__/__init__.cpython-37.pyc,, +setuptools/command/__pycache__/register.cpython-37.pyc,, +setuptools/command/__pycache__/alias.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_egg.cpython-37.pyc,, +setuptools/command/__pycache__/setopt.cpython-37.pyc,, +setuptools/command/__pycache__/install_lib.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc,, +setuptools/command/__pycache__/dist_info.cpython-37.pyc,, +setuptools/command/__pycache__/develop.cpython-37.pyc,, +setuptools/command/__pycache__/build_clib.cpython-37.pyc,, +setuptools/command/__pycache__/build_py.cpython-37.pyc,, +setuptools/command/__pycache__/sdist.cpython-37.pyc,, +setuptools/command/__pycache__/upload.cpython-37.pyc,, +setuptools/command/__pycache__/py36compat.cpython-37.pyc,, +setuptools/command/__pycache__/egg_info.cpython-37.pyc,, +setuptools/command/__pycache__/install.cpython-37.pyc,, +setuptools/command/__pycache__/easy_install.cpython-37.pyc,, +setuptools/command/__pycache__/upload_docs.cpython-37.pyc,, +setuptools/command/__pycache__/rotate.cpython-37.pyc,, +setuptools/command/__pycache__/build_ext.cpython-37.pyc,, +setuptools/command/__pycache__/saveopts.cpython-37.pyc,, +setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc,, +setuptools/command/__pycache__/test.cpython-37.pyc,, +setuptools/command/__pycache__/__init__.cpython-37.pyc,, +setuptools/command/__pycache__/install_egg_info.cpython-37.pyc,, +setuptools/command/__pycache__/install_scripts.cpython-37.pyc,, +setuptools/extern/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/version.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/markers.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/utils.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-37.pyc,, +pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/appdirs.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/six.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/pyparsing.cpython-37.pyc,, +pkg_resources/_vendor/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/__pycache__/py31compat.cpython-37.pyc,, +pkg_resources/__pycache__/__init__.cpython-37.pyc,, +pkg_resources/extern/__pycache__/__init__.cpython-37.pyc,, diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL new file mode 100644 index 000000000..7332a419c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.30.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/dependency_links.txt b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/dependency_links.txt new file mode 100644 index 000000000..e87d02103 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/dependency_links.txt @@ -0,0 +1,2 @@ +https://files.pythonhosted.org/packages/source/c/certifi/certifi-2016.9.26.tar.gz#md5=baa81e951a29958563689d868ef1064d +https://files.pythonhosted.org/packages/source/w/wincertstore/wincertstore-0.2.zip#md5=ae728f2f007185648d0c7a8679b361e2 diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/entry_points.txt b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/entry_points.txt new file mode 100644 index 000000000..4159fd0a1 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/entry_points.txt @@ -0,0 +1,65 @@ +[console_scripts] +easy_install = setuptools.command.easy_install:main +easy_install-3.6 = setuptools.command.easy_install:main + +[distutils.commands] +alias = setuptools.command.alias:alias +bdist_egg = setuptools.command.bdist_egg:bdist_egg +bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm +bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst +build_clib = setuptools.command.build_clib:build_clib +build_ext = setuptools.command.build_ext:build_ext +build_py = setuptools.command.build_py:build_py +develop = setuptools.command.develop:develop +dist_info = setuptools.command.dist_info:dist_info +easy_install = setuptools.command.easy_install:easy_install +egg_info = setuptools.command.egg_info:egg_info +install = setuptools.command.install:install +install_egg_info = setuptools.command.install_egg_info:install_egg_info +install_lib = setuptools.command.install_lib:install_lib +install_scripts = setuptools.command.install_scripts:install_scripts +register = setuptools.command.register:register +rotate = setuptools.command.rotate:rotate +saveopts = setuptools.command.saveopts:saveopts +sdist = setuptools.command.sdist:sdist +setopt = setuptools.command.setopt:setopt +test = setuptools.command.test:test +upload = setuptools.command.upload:upload +upload_docs = setuptools.command.upload_docs:upload_docs + +[distutils.setup_keywords] +convert_2to3_doctests = setuptools.dist:assert_string_list +dependency_links = setuptools.dist:assert_string_list +eager_resources = setuptools.dist:assert_string_list +entry_points = setuptools.dist:check_entry_points +exclude_package_data = setuptools.dist:check_package_data +extras_require = setuptools.dist:check_extras +include_package_data = setuptools.dist:assert_bool +install_requires = setuptools.dist:check_requirements +namespace_packages = setuptools.dist:check_nsp +package_data = setuptools.dist:check_package_data +packages = setuptools.dist:check_packages +python_requires = setuptools.dist:check_specifier +setup_requires = setuptools.dist:check_requirements +test_loader = setuptools.dist:check_importable +test_runner = setuptools.dist:check_importable +test_suite = setuptools.dist:check_test_suite +tests_require = setuptools.dist:check_requirements +use_2to3 = setuptools.dist:assert_bool +use_2to3_exclude_fixers = setuptools.dist:assert_string_list +use_2to3_fixers = setuptools.dist:assert_string_list +zip_safe = setuptools.dist:assert_bool + +[egg_info.writers] +PKG-INFO = setuptools.command.egg_info:write_pkg_info +dependency_links.txt = setuptools.command.egg_info:overwrite_arg +depends.txt = setuptools.command.egg_info:warn_depends_obsolete +eager_resources.txt = setuptools.command.egg_info:overwrite_arg +entry_points.txt = setuptools.command.egg_info:write_entries +namespace_packages.txt = setuptools.command.egg_info:overwrite_arg +requires.txt = setuptools.command.egg_info:write_requirements +top_level.txt = setuptools.command.egg_info:write_toplevel_names + +[setuptools.installation] +eggsecutable = setuptools.command.easy_install:bootstrap + diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/metadata.json b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/metadata.json new file mode 100644 index 000000000..e28ac237a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/metadata.json @@ -0,0 +1 @@ +{"classifiers": ["Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Archiving :: Packaging", "Topic :: System :: Systems Administration", "Topic :: Utilities"], "description_content_type": "text/x-rst; charset=UTF-8", "extensions": {"python.commands": {"wrap_console": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.6": "setuptools.command.easy_install:main"}}, "python.details": {"contacts": [{"email": "distutils-sig@python.org", "name": "Python Packaging Authority", "role": "author"}], "document_names": {"description": "DESCRIPTION.rst", "license": "LICENSE.txt"}, "project_urls": {"Home": "https://github.com/pypa/setuptools"}}, "python.exports": {"console_scripts": {"easy_install": "setuptools.command.easy_install:main", "easy_install-3.6": "setuptools.command.easy_install:main"}, "distutils.commands": {"alias": "setuptools.command.alias:alias", "bdist_egg": "setuptools.command.bdist_egg:bdist_egg", "bdist_rpm": "setuptools.command.bdist_rpm:bdist_rpm", "bdist_wininst": "setuptools.command.bdist_wininst:bdist_wininst", "build_clib": "setuptools.command.build_clib:build_clib", "build_ext": "setuptools.command.build_ext:build_ext", "build_py": "setuptools.command.build_py:build_py", "develop": "setuptools.command.develop:develop", "dist_info": "setuptools.command.dist_info:dist_info", "easy_install": "setuptools.command.easy_install:easy_install", "egg_info": "setuptools.command.egg_info:egg_info", "install": "setuptools.command.install:install", "install_egg_info": "setuptools.command.install_egg_info:install_egg_info", "install_lib": "setuptools.command.install_lib:install_lib", "install_scripts": "setuptools.command.install_scripts:install_scripts", "register": "setuptools.command.register:register", "rotate": "setuptools.command.rotate:rotate", "saveopts": "setuptools.command.saveopts:saveopts", "sdist": "setuptools.command.sdist:sdist", "setopt": "setuptools.command.setopt:setopt", "test": "setuptools.command.test:test", "upload": "setuptools.command.upload:upload", "upload_docs": "setuptools.command.upload_docs:upload_docs"}, "distutils.setup_keywords": {"convert_2to3_doctests": "setuptools.dist:assert_string_list", "dependency_links": "setuptools.dist:assert_string_list", "eager_resources": "setuptools.dist:assert_string_list", "entry_points": "setuptools.dist:check_entry_points", "exclude_package_data": "setuptools.dist:check_package_data", "extras_require": "setuptools.dist:check_extras", "include_package_data": "setuptools.dist:assert_bool", "install_requires": "setuptools.dist:check_requirements", "namespace_packages": "setuptools.dist:check_nsp", "package_data": "setuptools.dist:check_package_data", "packages": "setuptools.dist:check_packages", "python_requires": "setuptools.dist:check_specifier", "setup_requires": "setuptools.dist:check_requirements", "test_loader": "setuptools.dist:check_importable", "test_runner": "setuptools.dist:check_importable", "test_suite": "setuptools.dist:check_test_suite", "tests_require": "setuptools.dist:check_requirements", "use_2to3": "setuptools.dist:assert_bool", "use_2to3_exclude_fixers": "setuptools.dist:assert_string_list", "use_2to3_fixers": "setuptools.dist:assert_string_list", "zip_safe": "setuptools.dist:assert_bool"}, "egg_info.writers": {"PKG-INFO": "setuptools.command.egg_info:write_pkg_info", "dependency_links.txt": "setuptools.command.egg_info:overwrite_arg", "depends.txt": "setuptools.command.egg_info:warn_depends_obsolete", "eager_resources.txt": "setuptools.command.egg_info:overwrite_arg", "entry_points.txt": "setuptools.command.egg_info:write_entries", "namespace_packages.txt": "setuptools.command.egg_info:overwrite_arg", "requires.txt": "setuptools.command.egg_info:write_requirements", "top_level.txt": "setuptools.command.egg_info:write_toplevel_names"}, "setuptools.installation": {"eggsecutable": "setuptools.command.easy_install:bootstrap"}}}, "extras": ["certs", "ssl"], "generator": "bdist_wheel (0.30.0)", "keywords": ["CPAN", "PyPI", "distutils", "eggs", "package", "management"], "metadata_version": "2.0", "name": "setuptools", "project_url": "Documentation, https://setuptools.readthedocs.io/", "requires_python": ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*", "run_requires": [{"extra": "certs", "requires": ["certifi (==2016.9.26)"]}, {"environment": "sys_platform=='win32'", "extra": "ssl", "requires": ["wincertstore (==0.2)"]}], "summary": "Easily download, build, install, upgrade, and uninstall Python packages", "version": "39.0.1"} \ No newline at end of file diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/top_level.txt b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/top_level.txt new file mode 100644 index 000000000..4577c6a79 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/top_level.txt @@ -0,0 +1,3 @@ +easy_install +pkg_resources +setuptools diff --git a/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/zip-safe b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/zip-safe new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools-39.0.1.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/myenv/lib/python3.7/site-packages/setuptools/__init__.py b/myenv/lib/python3.7/site-packages/setuptools/__init__.py new file mode 100644 index 000000000..7da47fbed --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/__init__.py @@ -0,0 +1,180 @@ +"""Extensions to the 'distutils' for large or complex distributions""" + +import os +import functools +import distutils.core +import distutils.filelist +from distutils.util import convert_path +from fnmatch import fnmatchcase + +from setuptools.extern.six.moves import filter, map + +import setuptools.version +from setuptools.extension import Extension +from setuptools.dist import Distribution, Feature +from setuptools.depends import Require +from . import monkey + +__all__ = [ + 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', + 'find_packages', +] + +__version__ = setuptools.version.__version__ + +bootstrap_install_from = None + +# If we run 2to3 on .py files, should we also convert docstrings? +# Default: yes; assume that we can detect doctests reliably +run_2to3_on_doctests = True +# Standard package names for fixer packages +lib2to3_fixer_packages = ['lib2to3.fixes'] + + +class PackageFinder(object): + """ + Generate a list of all Python packages found within a directory + """ + + @classmethod + def find(cls, where='.', exclude=(), include=('*',)): + """Return a list all Python packages found within directory 'where' + + 'where' is the root directory which will be searched for packages. It + should be supplied as a "cross-platform" (i.e. URL-style) path; it will + be converted to the appropriate local path syntax. + + 'exclude' is a sequence of package names to exclude; '*' can be used + as a wildcard in the names, such that 'foo.*' will exclude all + subpackages of 'foo' (but not 'foo' itself). + + 'include' is a sequence of package names to include. If it's + specified, only the named packages will be included. If it's not + specified, all found packages will be included. 'include' can contain + shell style wildcard patterns just like 'exclude'. + """ + + return list(cls._find_packages_iter( + convert_path(where), + cls._build_filter('ez_setup', '*__pycache__', *exclude), + cls._build_filter(*include))) + + @classmethod + def _find_packages_iter(cls, where, exclude, include): + """ + All the packages found in 'where' that pass the 'include' filter, but + not the 'exclude' filter. + """ + for root, dirs, files in os.walk(where, followlinks=True): + # Copy dirs to iterate over it, then empty dirs. + all_dirs = dirs[:] + dirs[:] = [] + + for dir in all_dirs: + full_path = os.path.join(root, dir) + rel_path = os.path.relpath(full_path, where) + package = rel_path.replace(os.path.sep, '.') + + # Skip directory trees that are not valid packages + if ('.' in dir or not cls._looks_like_package(full_path)): + continue + + # Should this package be included? + if include(package) and not exclude(package): + yield package + + # Keep searching subdirectories, as there may be more packages + # down there, even if the parent was excluded. + dirs.append(dir) + + @staticmethod + def _looks_like_package(path): + """Does a directory look like a package?""" + return os.path.isfile(os.path.join(path, '__init__.py')) + + @staticmethod + def _build_filter(*patterns): + """ + Given a list of patterns, return a callable that will be true only if + the input matches at least one of the patterns. + """ + return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) + + +class PEP420PackageFinder(PackageFinder): + @staticmethod + def _looks_like_package(path): + return True + + +find_packages = PackageFinder.find + + +def _install_setup_requires(attrs): + # Note: do not use `setuptools.Distribution` directly, as + # our PEP 517 backend patch `distutils.core.Distribution`. + dist = distutils.core.Distribution(dict( + (k, v) for k, v in attrs.items() + if k in ('dependency_links', 'setup_requires') + )) + # Honor setup.cfg's options. + dist.parse_config_files(ignore_option_errors=True) + if dist.setup_requires: + dist.fetch_build_eggs(dist.setup_requires) + + +def setup(**attrs): + # Make sure we have any requirements needed to interpret 'attrs'. + _install_setup_requires(attrs) + return distutils.core.setup(**attrs) + +setup.__doc__ = distutils.core.setup.__doc__ + + +_Command = monkey.get_unpatched(distutils.core.Command) + + +class Command(_Command): + __doc__ = _Command.__doc__ + + command_consumes_arguments = False + + def __init__(self, dist, **kw): + """ + Construct the command for dist, updating + vars(self) with any keyword parameters. + """ + _Command.__init__(self, dist) + vars(self).update(kw) + + def reinitialize_command(self, command, reinit_subcommands=0, **kw): + cmd = _Command.reinitialize_command(self, command, reinit_subcommands) + vars(cmd).update(kw) + return cmd + + +def _find_all_simple(path): + """ + Find all files under 'path' + """ + results = ( + os.path.join(base, file) + for base, dirs, files in os.walk(path, followlinks=True) + for file in files + ) + return filter(os.path.isfile, results) + + +def findall(dir=os.curdir): + """ + Find all files under 'dir' and return the list of full filenames. + Unless dir is '.', return full filenames with dir prepended. + """ + files = _find_all_simple(dir) + if dir == os.curdir: + make_rel = functools.partial(os.path.relpath, start=dir) + files = map(make_rel, files) + return list(files) + + +monkey.patch_all() diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fcfce614132e641dc514413f2b2bbe95dfefbe7 GIT binary patch literal 6301 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 XvRS`dFQd0$mulvsSwCsl7Hj_oJC|4? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/archive_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0832dd5b8320362810273ee52ea81cfbf38afc9 GIT binary patch literal 5145 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/build_meta.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b2c1a7055f2e2627efe20c5330d74c690ad73a0 GIT binary patch literal 5925 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/config.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b762c581d8d029cbde10f388f0f45f0bbdad819f GIT binary patch literal 14362 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/dep_util.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73e42815c6eedbb9ef2a586dc6f02df804be7fed GIT binary patch literal 871 zcmY*XPjAyO6t|OhjP8$6h0wV9)<xPH7*uQ$LTJF1158YsG*w>grrsPodv;owvJ2&d zzzOk{a^=KVfD124CvC6t>-+or+3)3WW1~k<&W|3Q{tOBET{|}tpz#`y+d?IXpqga# zgi;~`5q={lf#`fBQTGpKNkpqPBj*yvDcB-U>fTzq%ku{RokrzJNfs0}UC@gVwmcPR zeWfY64)BDZ4}H+qEa+Qux_902VM)r)W9+E)B7k8TeDAceA9$NGM6b!!-sSL^ltCFz z0=!#r_3xPL3wCDxlyOLlOd9W)GA!r7wU&B^dFi||DN_?Bc`{|r7LZ8RJcB96npgE0 zil1`B6!s?;K)T!-Q8#)7mVU@SNMC?)j3c-LW+zN5ht=CHqH8DPc3P~a$wh2Fl^~a- zc(Wy6%he+9FrFY|%VjZx<uc>OtHd=}$TYY$`|W5jY~oj=!5!)W<3_MSi|Pg}E1YL% zvPI;XWLlckPor)XqE+=iab3uF02Zn)aFa@?w_2_6JeNj9-IL8b@UFVIgs$$J@iJAL zH&Lp75m-Zrzc$W6&A6BGj6*!JT1aql2JzYXc)agM=EY1rPsaId?}?x6r{|!bPDTd@ z@ll+sd{-Igae2FtjP{@TOCCF%eD1B)?zSmpJ}$h{!~9G2u$@o6n7MMYUBycMP4-cd zl?QY+?9dMF<8PDp1K7am`zWmX0(V%WxZw?6Gliz0dCV=fj!o6-%gl;G%U2XVS5Iuc F`ybod|91cY literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/depends.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08925139fbab14802aff11885dc3fefd34842221 GIT binary patch literal 5280 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/dist.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..20fb784f6c51d2304664f9ea18ef3cff18f62b43 GIT binary patch literal 36763 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/extension.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e438e800cec95af2a1579ed624d887de818c862c GIT binary patch literal 1991 zcmaJ?QI8un5VpOWWV3fkkG86SR>IH|C2E_LLe;ATsG?9Lgbs<`1FVFsy|t5UZnL|! zz3C;&JzZbnC!qF`pTXa-c;l&mfhT4*xm+t%IP!RG&)VP2eB*rG>4XH@<lxG$e>DmD z2PbFE2jwAjvjicDq#21;BaLW1XOUNr{(5ZGBg>l8R@9<IdeYB=X*+6z-jL1bBnnj+ zZK<~MCfk$FDUG_{5!sT#b0P!PJ@ujv%-b@Ad8j%tzaZ%o(%X6k2*`eqI&T`6uP97F z?~IfcRbIw687rBf2{zmfpg)3c?t+l?gv>8nvLup?sPukg6AFO*C&VX~9fkT9g^wut zh2-pK016j27k5Gq?I&d`o$~`-DV`4bqq!XyIZxu8AHu@4EVNa!Uz;x8U+wn4NsX;+ znwkD#m1a_?W9!-*6>tYbT}(5uI(XdkTqwlqAR%-E(7N`w$B8O!TI4+%Z6)=UXp;R& zbQ=u*EeEAeXR%d-S*!=cB9ls+!Bh_pCqnF*d-?sD{5%om?Cu>q+#5}F_UZ86g9n3y zL7A4f)7;oN%WmuB-ri^SX*@9CV`+;bGq0<FTIB{n^vk*17UOuP#0twc#<dHA_&#N9 zhx)Wjn^bSX$|ec8&7ePoZa4@<kTVgJ6ga}92VC%_FB>odGa%$GbbNj1;{HbEb{tz? z8D;p5esY5k(+t!!=VcZriWfszF6YPVjl_eiuwf*Tzdu4ZpMY5UFMtS=y<|%wsAUsx zNtSfUhThWqgDw5vkrD)Oc>Atf&PA3^Q^>7|%k**2cV1bPx&!AxzBbrg0J+OkD@3p1 ze510V^YeJBT+0-dPLy$etVhPNqi1#IRssu7?|`@t-5^Nfb?M^b=Ggw(sR>dU8ycZU zHKq4KvE-EK5Nl&eCbYaL*$G|J7wjd}+!52e($AS}oG|OX@NHw#l+7i3>797CWrHPn zK53t_Qwou2*Y(v}{9SW+Mfp`^*Dmm9sU33+F;{2lG29mXjeR>-+=8#lZqCW#d{o6F zb^ckOAB<DOrz#o8d1|H{XjnWmd}A3`P+od<dR3O$d~;Z-)$OFnXA0|WbM;|m5eaM# zl?I}y70xxXRav4-`;IKU<mSzV-%rYN!TQOffgbJl!kV=%ID_CCfJkZA9#(l$*Mw`8 zv9@WPIi{8KOm*mdtX+-l)|Wu^eEkj#unZnY;VKMR_4*o`V9A~*-dz)GKLh{}YpB8& z0>AEot-<;t%_j3{NH5bJy7>4tX8g~``@JR-5(y{-J}c8gRvGHsLOiYFY`xPGLKX?U zHpoH!0g7{swN^6}VQ}aM{uW3;eHJt|uDwy>NYIDS4W9L8iDN0b)(`2Sj`e);<@c4b zJWG!hkGWQ(DvLGW_;rh8D)Ei9JT_pFtv-V~H&(@RA7aem2K^z5k5F7k@iyGMu(1c- zV1fdwao*d}S7FfafpA^9d7zU5a@yX^qn(Y~S6TxV-KE!7&gdUqJ%2L$SQI+%oAkIp zEoREpyoj39B0o}djfGoNEDGxvw47^o?0mep4yL|<1_<$OzPR9vRSv(xIGZaV0=oXO OZMN+N7krRA@BRnQ&<<?? literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/glibc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..509e019900ae9dbb1b7a44bc361a73c908543a83 GIT binary patch literal 1556 zcmZ8h-EQPG6t<mACYx=$Ka>gq0!wtIMzoz}*@_k|%g?eELe*%st+Z%h6{WFfCNoK# zwVf%g(yQ_Yyg+-&EBTfyUV$r)J*{Z#k$pVJ_Lt-DJI6mPE=CC2<Y49P&kG3sZU0;~ z0+a8ctDj(Ch~Wa2c!05;lY$J0v);gS)*txHWBwm#&|w`GfDKreg<!kv4vWBsjO?TM z?mvKrVr=fEhe{NU=1E@GLh62I7i{yOhtOX@SFd2u=o~YAfltwK)S?MF#cxox>?7?> zBe{l={V}|ceu146zr{(X#b@Z0=%6LKdq&h=OU~i*fIwOsgm<#@n(IbZijIo>Frzar zRW2&3w9Ko~Iu(-kMa5}8q?ORLQQ)0#-RzrAs<J$f@0cLd$2C{RfAQnqo>?AMO)}y- zv53hfqFMT01Lh&z^QDwRnlMYUaVnGAbR}2zyoqvvS30dSZaj#<1dL~b@z^sDYAG_V zR8plSS9O|k82};X?j?Kz+y6rH9{Bz(dbP}Fsph>|DtkjwFt}8&l)b}Al5DH3>Z=)h znkDt@$zwg-9!+HN#c*q9r+3h+^LoQYP!t<7+uHt8ze{@x2&%OZg}Od<bZyqhaNFzG zv~d7MHks5i45%Anf+M`-1zv~)65)u*2jI`FxVHJ1-HB{7Y%X$(F373ZdTLdZbB~c0 ztsw1R5D?hgN4nE`=K=FC@ELCLl!)C+Pse%4v;*P>{gc(TZ(ltt(}|GJe|@~M^Y-)j zw@v5DtN&dm-@N?2=9%W~RuUZLdQ6|tOh8^%ywZv~sLj%zUZ*3Wzow7WuIV^880(L_ zhDdIGIvbntD3uiu0=Z#lX6bcP>Ad7`=5FKVl{TG`6iprbatW?)mLz}I<dU;w4!a1j zdD)bSgEzQzD$j@e_P~4Dm}k@Eh7PN+pe!8fE?^%AAc2n`V)+SpGF#BLSqUutj(WSI zk*$^%3VIsKhqjV5Zh?BJA|O2`{oQ!3p2LYf`4JqFAKSrx>vmx8kJA}XEPbiY4+}mI z@hR+7wyY6^6+&3@Q<!JgVH<{S1H2g&YN4=QP*AqaYthhJ2r%|f{ydP!R13<u<`PKa zRFC;hDWix&yDIgRLPi&yis5CQE4l_ryna>vF+CdR*%$zaX;Wy6&C6OJU+s2ac}25S z&A(L$F>Pu(O!Go*y48M643ZS?0qWWUiLpz2c<&Z(2z8sY@T!{j;Ov~Hz|lnHXW)Uy zCQ6cF18){j5^0H&RzhiuO|IC%R+rPq@#;=p`-puZq)VIdSt(dk@aG=5T&^sT5CjRm K@Wb$a_`!d@dX@G7 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/glob.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3699a1f17de2f66124559bd66d67c6bee5d5a5 GIT binary patch literal 3857 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/launch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2def45fa86d87d35eada2e42ef75ec9c6d4bb447 GIT binary patch literal 870 zcmYjQ&2AGh5cc0D+qC6^fcEBVkea1HL@QMY!4*{%^pv);oVC+9-SsYBCn8aD3LJTd z_Q)&kl~Z4V6XPt1jy1D0p4svD?T+8??sgE!<oxN?V~WtP5d0GY&O6Ym2S%X*Qdp4; z5Afzm21HTCzM%otOhq@uJ=b)NFjC|*>b4daosV*A(=qpB&Clk3Tv%SE&Xk^m7dF!( z&!ts7Ggfms^4fJO?Wd(Limc+M;=`iwm3Oi%wc;})xyj4I`CjK90HM<~*dQ&?2=oJJ z<-mA=;qinhypLAM(<OikV1LjRZuS-ZPWGD`8vGOFnU7TDTWh)^OR_|3eA~W5E4rk& zv1+OI9a%BIwPesMhMLHCmeCTg2@s}0cx!Ri;UJ%;4Y|Km4UnE!J?XAz7l&6|0<RG_ zo{y#4ln=GG+}K%h0~D?FQzx@*-rMBvF;J;vA#!P~5T{)lf|1Fz5W%xD4_;dcRixms zqSSW5F5RVFkV{)L{Z*&k?RrOu;nZZ_*b1sB;Hg;vR5N8#U$?Kdm)^TN_JG2gg?8<5 zFmqa}y6tqC$yC>E_+2HO?P5rFTlIFsaD$@W3RtQ#)I|Y>s9Q~Xux$&MizcX9S}6S! zxo6Pgcb=5a%%s=JOuA%LWJ<d#$z3v>2ys;P?VFi;or-ey@`WEAT~AzgIO-oCC+A6N z$^#(d;Zq&Bw14!<f04=m(Rt`*n;Gnt^P0M;-Gy_jJuoO@xP!@N#bl4{;AXjf$T_$O ss2jO3R_;+S;f^$^FlHP04@_uS$0vEArkQ@rAgaO(EQ)bV<0mox1MY9{U;qFB literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/lib2to3_ex.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3b18a744e5d383f0b45be08c8381bb698facfb6 GIT binary patch literal 2449 zcmbVNTaOzx6dundnapM{ZI^bnP#Be}QlvJ4mWnMxsG?;n9ta3lDjKO+lh{coJD05O zY_n1Nw0(u2fU=MLB}+W<#9!zW=QxvWTD1k?k&o>eUyi@?oo~KgUk@xOgM-UY{;XQo zUpQD47drQ$%Adh7E3z12c1kikatQXF)XlueGkrI$WYwse`H^qNURsN4k1SSU)fX14 z^6IG*1u*tm4aPO@z}RNqPgWzCoCFU>QWaS;;Vk?v87KK|Ron^XXgDl{`XUIzTVc$Y zT)YW;g$TPve$0hR@_xvQuHsV3AP5egCNj(lHcELY;zV*8#(DT{h8uk&1gtCa@P`xi z6q?)3;BUB?)gZdIJQW5`TJ#&X-u#jG;;t$L9C1(-slL+ZiuRH*7n1fwk<nq?J&gOj z-NjuN#fHv(sPZ}(Zbbxuvk|x#R^%{;xzM`IV-;vURs{fjz4I`UYNV1>zIJ98cf*3A zaG-t<Rc?b()__b&k4){~?cXeb+=87*yI~8Qrag|AZMfQ%Jnd;GlYQ;RqA#_5`0Ni$ z)M3)gqt;L)$FbtA<5;wMMatl6txU8!14{Sg-Td=o_F0z>k8gjXdVBqWNI&h}y?3v5 z&>AMgTS+ceoTj%#_wL>ubriQGSEHc<q~vNhO*$A&%E!&&iLL>*)cAH0Z(^=TCfD9} z|K@V~5(&H>)<?MhKOo^Id9P?V!iV{yh6V|50GOL~80s}VDC1H>Jl}&C3(u~<)3b8H z|Mtyeyff<mt8)f4Gj(UhwReMNrnegv?Nge^8K+bSl+H5)`gKZ=MsYg-A~q0_Ei@RF z6>N|u0s#^gFc+Xo?D)iYe8;@&!f;tIF886z8(@~)uQ8iBF9@(7cyHKmL;=|EWBLmu z!G0IlVnL?k84sXJ0cL6qfa{DL*2EUFd`jdFw#uG4xbw`Nk~4C}IwJ(;&b%|o252j$ zwM9o&2foNv4fY96$#ZAw4A!QwA3W}_AY^%6)o1Hd*!RpX^T=x-Ose}RME&q32|*0J zXChHNT3<*FE%NlFv7ze>GFK!WNZulk{E_4o*=~|hY=ZaN9TZ8fuhON$P}&(KDVr;a ziH+2|tDpI}n~oSSrA7zmc@=GoQEm=^^XbAD69>I!l&Rd$7o~PV(3b~mf3dpZnsm@! zFG;zK{KZb1h?U@*xQB3ut579U&vNR-HP1Ey4nVI$0&>xwTwET~T%6G*xBv=<*Mn*T z+JO!RR0J5pKJ=+I{!o#D{m^={{hZ*pnWG@2rw~+P9ql~E`QD(yEFi!y<8VHD%k2Hf zOChWZbX$A?Cc3;3p*cpSZcAO^W5shO&^>_{j5Ze$EYSx&Md8q7_!=<Lr8mT}2~#EJ zkp;jYICZiOb%RW<o&)rTbxW);2`~W+R&D4gxIH6%>(nvW08R#n8&fiK00|f)O5<x& z0*LHBx2HC|bq_1zCblzgYQ7)cEOD{h(Z;Lv0)?o;e=Sx@%n`V<MBvql;$v{fV5%#E zXT>oubt~E|Czh0!QE*Ph*HPP|@FQ5I_a5vjQD!Uv3ZV+%ne48@_3DClgX}jd;u3m; z@-I-XMTlk>&HHGKZk-#$WaJ^Tp;WNof<Kp@#+t5DOeT=U4NPbABW|KK(j-2DMY^{9 sGXKGDm6U2OGEHFI=1js<Oj5qd5AA<BSK+UaSmx@kjaT2YeP?U!9|0j+@&Et; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/monkey.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a526c1c8da3c2f33bab16ae2159df4c41ed7b98 GIT binary patch literal 5127 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/msvc.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..069c06769f87e9cd2c22d9eee8ecb888b35ff95d GIT binary patch literal 34459 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/namespaces.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e788ecf7c6b13be18a71b58958451d69d8754e6a GIT binary patch literal 3628 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 G-v18<FR$|e literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/package_index.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e358379086bb1f390eea24cdf7c2e53eaa95326a GIT binary patch literal 32143 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/pep425tags.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..617d42f7ba4176fb64ca77b1b584d68d7607ba58 GIT binary patch literal 7196 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py27compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea0faa419d402741713f9b82646577106c8e8ca8 GIT binary patch literal 827 zcma)4O>Yx15Vd!c-R+X9zyTp~@ih|7LLf>ip$O3fIY1Suxv&yiIcq0%>iwwgMA<4w zen@-dFYT2Re}NO@O%N3)Mw;>0_|1D`e>gr45!h<>?CWy}p&xef$6$@#gX<XthGN7p zb0m&2jIMMtH+C^%E!O^q;ud#TZPjDmVTJF!d&K-}rx@Fl*yp~Q@F4eCz>XmQh&h+2 z8{YQA^CBy$5pyAhsmSHJEDL4GqEKX7nX4iv{oat!oDoiy6kLTrfepIo;@Z_>n_80A z?C64@gKMj4hwji0-(x6)ZzmxE`zSU%2P`s~&8DBZ)^y2V62;A0!M2p-ic`jwCK)y9 zmB^Qbl4Wz}npeFB0?PVJZW74uI<=qeL24Hgz9Z#9-Cs9Rsl<jF9&M<K7KOBsQKq8# zDoI9qkPkQPZJLyu{wuQ>EmumuUJTC8qFGdm@>Jy70Qjj&2ctLUhDI9bm8K}9emE_w z{xEGi*DI^~<UlDo2(bEf)0vhEVE%tyvONs}=>XDoR15B^whdO<KKOQKL7#%}i{QHb zN#yHoiebx|9j!NyVL^7tKEp+W09EkzAHX_zCuufkbo>IcH8@fo2;H#ulY|v%lGH&d zseyly#ZUhBq{p|0t6W*J4XfIne(BequC(D<d?GEc1iF<_oeBYe#;Ev_%8cSX(R9Hd j5NR}8dB7$s*jn<j{ZZNqZ8?F{aRcAOLA!%J_c8trdQr*t literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py31compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dcada0489dfef86811a7bb08d8a3fd3fa3268052 GIT binary patch literal 1561 zcmZ`(OK;pZ5GE<Dq+KV@)^T%bimE_SR6ycw9!4CXD1tuF_OdzHNE!hJp%uAnt*M7e zu45TFH97axACTPAzoctV{R=&HhP!J!X-k2_AvMF9`DTXST)jFVFy;q0etGK?@+WTA zBLe0TO!GSsK?I$#l(gG|2~W|IrL6Q)kCLaPy5$q;9}V=6l;8&vzUn!NAPr#O6Z92H zy=SCiKa+L{{{t14Q5rez`z!6=&b33;Px~MhsxS?IAR-d|S48yX;H8&F%UeXaPm)1* zZ6+<x>uOre_(`Ts7vVvZ*~7oUX_7EaVbSb@?>3!8YY*#+t74L)01jL|nBT%QH-Wr> zkdHz=v=Gos`YW{*PP`-F!L&b4SQj=bvv3D63oU^;`(&JzGA<X!#uFK@PUBj~D@omh zi$QbnBvT9dz1FqXfICTO=U1Tm2hn}l{(U@Zba9edIfAH0(^?6s&8XC)$(-{&vs*nl z5%+W6oZS7=PWNVWt?o>BA3hu%jGCgkT~x+qO5N7^?%q9noQ;gMi^kTqGMCw=y>}<C zOF(O<X&pvr+XO%ejo<^Xwhm<3)H>7ccZHU@t#v!jQD8j~+D9<W7eFLQsURs6H1)7f zAnU&HMGw}V2t){LAR>UTuQx#a?Cl_4jVDsKu_?+%$=I$<#$s(Vh8$aYYU47ivYFI7 z=Za4YrD6-pwvL5V(#klSTB)CBTHJ~!3mZR2iA<R~E@oA&W&C(Q&MJY{3YF>en<Qq# z#C5g2r>Lt7EALbZhU}_j8yEp~!ilA?*&D|R0^!kd;%V%kF2Z1@g_2!Z9tqrFs*O}r zm*^$I9_%8{i>k1ke+)Z=ML}pl&p!Hh0(RDt?|6mv>%7AJy&&_IAJqAgP`wGq@7wHi zE&*4~`KR#LU|@uv-TY6JE5Y1(26DJ!h|cC+VA?H9UPF(}A^mTdYwc~HSPveC&zG&e zYF)&MIh@$|Ao07v94>63x<Hp!OSuFte7x`4Bk`T*T_{g;+cq+dfH}eLah%mzF5eFe zpp>Tw<!9iQaW5QYbc=5OKcGwbaS~!4uoF4&2Ar3*SSaMLaDKeV)ap;jxu|o_^))b{ zhe$p|g8g%epk-I+H-Iq+R@C!Z<VT)6O*T5X2pSdc@0->v-?57qtK0Yqd(S!?y6d7a z7I88=7qXZHePwM%e*jz;)RQ@M>Lov%TgxK*Y8lbjSS<$KiWp<tfXt9>28<1XgU)CF E0CKN+7ytkO literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py33compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..99d40d09105b1a355be74d457a7ae0ffdb6a61fc GIT binary patch literal 1419 zcmZux-EZ7P5Z@1fo#V6#3N#f6Sw(6%iROS1HI=HWDLu7F^r+zIhb3e=-o2|YKHFJu zqFm&AA${bL2cA&!f`r6hw68qnU*H91e2S=`dz$g=cxG<qx4-p+<z=71nhf9j;a7{0 zKXG%pJTUHq)IWm~M9`c>izkg}yJr!b1+B#+{+tx+7LnGzukKQUKS3k@k`(L(X0hC! zI*|ijB6#jjy~v|Pva^n`gniB;{}B<6a9<PQ%B52t1#(#u;mH8(D`0cck>1(Wb23>0 z&x)Ymk*<FMosmJ88eV6|@K}1Kr+Hi@s+P*w-&DJ5eBzf?S_&B^YMf&D<zism2dO^* zB?*ocF+l};O(HJ1u;2-;!QVLM>Vuh<SS3!&X_e>{lX2k_<x7wnp=@YFVwe%qC^lwc zR+ky8mib6I5b--vi0oeny-H<AiI%;iMD<2xE~Kh^Q`Os>#PLqOUEDqrU!-w$^!cZH zv@@Ql{Ik*aojbi@uga=hSyAgG&u^)8duK}@B)wYd!%CNBUcYHpv#qT~%bV5AcyXK+ znU3Rku-$eBdb0kX*)}hOQVLPHuw5VrLHO!FKxuLYhue?|ov?E@r<yP9Q#xmY%{hp5 z{A0r#wolY=013ZN=5}LiYhv%)>L>IFevMp5xBzLiguO<tkp}F!13u?Ane#To*=On( z?M^)5LKU}h8drFybdAidgPTPlI&D11c-?92#yMrrfP4oxpA*qRlAPRonaNy)8y}a| zC%}U4Mpz}83P+_1Ws<%M%Sx(5XJrv)Mc8ts+?&W$ha0%rFmz8L6c?>R)GnYtx!`F1 z4J#wCA9Q_VCrTx=_LPmAmOvIE4bNp^xX5a={CM|SKi>WJ(f3dKgP{rfFNXcW!~R2b zDXeRjvqH<URI#2_vQ`Ls*HbROviE?3wc)ZH8D42+0(q=uA*6_5Cd10ga4@1yUKZmv zzopqib+7`SzJ}WIyRfT6P=v40fLYXHKJ!3A3Yz*fpcc2lek(WH5`(Ud^@?OF<JkCd zJT1jxj&=~o2Zu?%c%$%2s1H#giQZ7yk+MOpg48&uM?KzpjCaXM;~f^VPLoP@SJfJ3 zV6<6E%RGnkffK8Zg;(AzeKoC0rTa>iDq8*bE^H!5s%X)T-v6I}6FwW8)A9(g#?v%D zwk_Zy<+26eI145$`f|roCt53Yqm6w$eDd|v_EV!i!rtC8q4Dl6fVqd<sn<cln1Cz; RjIU6i1vKCRU%3(Re*pO!Xo>&; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/py36compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..24c022d08202df112f94cb404c32281650fb0153 GIT binary patch literal 2208 zcmZuy&2Jnv6t`z)=PR?DG)+@LNQ^2WbtRJRCrwd>N}Ey%M5v%NWkofb9eX!UW@je0 zciCOdav(i$0rkj%Lvlpo$N}{qLGqPT|An4-p6xb?T952`etv%M=jZpH@6_u)g0}l` z^~skD2>qug^JW5Z8@hM|13?6*sIC7-iu*>}z?wEwvv0Mninh{P-)`F&-AANG?5Bv> z2S(eWXxAmq9^&5s-#z9N{4HvFFF-fiYGSpr$%Gt8mWr<n$@1(T=Q#(yCnT47C(l!u z)Hd(k`R;zA_srXCl<xtDqBbU|Z4lfx0fR}br?_nq11#C<18sq`4j9R^sEE0sQIcm} z){D9<rDF20A42<zjn-He7Cav^!m?i2&H0ZpCu>RGFJj3$EM;=6xnXyZC0bcrabzBL zXr+Q>Nje~ugq?9nXg40DGR(8^!C3CV@9O%Eb-$9^%)=~~Atg+Pa)*XVPG|_W<qi{J zlEy-Wbd=BnR`YOBkXX{wHY+W$2wA^KX`f~iY{GsrcjbB|u$36Eyw!kz9r|79;vWpx zis3p@A5Y;rrLk*5xAsiFp<SmhkvMQ=9`VTn2}qqZ$YQTPH8ZP+rlzcw<^i6XCAfUg z<qu1AXdj^|mJaU#?UJP<j8SPon4I|)Pp#4KCEi3&o=s~Y@k=GKT-H`mC1o9YWld9~ zZfPC*M+hX_Qyb`o(mujd2jqi_a!0pI2Ua(xUg?pufcAOmmFAuUf9tSb+NF17O#RY3 zY>*Xl4rtI^`dy=ROYauif4+_O|JX(#yLf~!+UMJdtd?kZY0rL!`QM{MO_SAk(czg2 z#cw}=2Ivc*6YVa81rP89<Il?g<R8hiB`O2CQu+rtKnEs9*+sy0zS734Rd2Rhtpzg< zNQ2}y%09A?Jh$hAroS+n)-jp{a<!}<;GZ$zf^S;?ss0#!k22#idWQEeXfA~FJ6jyC z4?#`@cdHnFpyQcO0+tCGr|DWJ7Id;SpA~5=E6&24ld{faaX!(@rx^oIPce3AOehz} zTSUTHA;qylh|XBq1*cs$nk>)}P1a@;W$omBs;mLvQx?y2Ik|8$71!TP#f!~P;AC|M z0nLjXz(JBtf-vNOLZ{@1Lb*|t#eEt@FY%hfk+OSf-igzup`0P*om^1m5I&ChAZwmi z!7R}$OPt%_Ic18m;Etviv}dAMV7)HSCo~gOsxw`dky9mtTUy?Yvn+?yhcjtF$`!OK z1421@Rl9^*>`@ubCJ|wYR3<Q#!zp+g_5pa7F&RZ_5voc*1~c=WH703as34;~IQEe0 z1?2#oSW3=ywNw71I33WcKysbg&4#iBO}om|bxeCj%#PS#y)5UI3UHu++o^&?xpO(K zxPs1g^;9m{dIeWoHHUEuZsLimL4}KjGW(+UC*qet_T_%7;A{vLsWpswtDC1fJX(F; z>g-0*hPa;H7?NvAR1B|NlHHBoE>ACauiw1cde|yh0R?szr98R5aaHceEjZwykWl5t zNwOGU{diV(*Nd@Qelt)O0gCtn2807MFl=mN7YBxAxQ2^e!@|DdV;@_%0i*7EzJvq# zR;-{F;P-(tVAl$)EgMUC8Bea949>T_6K{#vCf;h+cmObzA4UC~3{r?p6-3egAWmm- zs+=eyc@jnZ3dmJXJTY9>yc!HTB83h!*RgQLY2p|9+7sxno6h~)(1o^n{OUnrFseOU zO|yc-ufjUNrU!j%Cx+JswfBS$BNsP4ein%K((waA^)oE0FjI|VwtlE*!MJ$LB(yW= qRVh+oPyr;O&~Giv;I({<edXSo`RY@B9-&_+xIO)ujn90eVf_z^R(T%) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/sandbox.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d2e74bb777c5452ae6d265a55a1b94db2a606027 GIT binary patch literal 15552 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/site-patch.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96594fe77d2623299a571670dea4fa07ad2bac3d GIT binary patch literal 1518 zcmY*ZPjA~c6elTJmSx#V9LH;h9efy2<dC>a7bFFOU|Tz^yJP_xAZ^w_Q$*U4ElV=V z`~`Jcx}7s%AHcb7Uts8QA7Uq-2JF<!K0r=;l#ybk!AHKw_viQiSYI_79)dO8?;Ke* zg#Izi{UUJr0=D=B2t^dXL5GN8N=Ae~VCWiQ^gW{13$$WKpi!<Rpx_5Rg)MyWKruxL zDrP4xu);$!wJ5p81yO{ekt@~}8rswXuUm?UtpO@X>MJs>fUaZoWK|(*$LQKBEYNjj zO_6Kx`x9A4g$-Kn)RT44tX#ZR_A_+!Tj3~2RYpWe<%pjrQdv_=8DCXZg_t$|R#m4y zt$@T;ZYlXgxzmP`V6=xO^0HeZZx%IGGn&d7;9K(AD!igz_y;KM*htQeJpM0+I$(4z zU!jz|M9MQc@w<t<YJ(+sRGz9U|JKIn0II0G>HIC|zbvC1fDh_i;~%kHpjGO=K_<Uv z=o(++qEY5uqZsmTQmjzWy67kZ`85kiE-J9Y=mt;r55USs!<K4pA_7{nt!#>y!OLq> z%oXz#6$?<+)<rV&esm1>ZDSAbi$z<t)%=LuVE(6CFzC$<YTN=03-Hz$IX77R_5ST| z)tWAuYGRbO;oeaTz!8i<!`p;dfazDj)H2avZlF)wKw(bmyYI}DXm9V;{`2p4_rBbJ zt}Ewp`gmP0=Ak?Z;&GmF$#@Wj(FxPGh$XxF^l5gQ(Db3~_T!Xx<q7L@7AD<?=JjEB zoYB*SMc8<TWv14K{Q`D5xdW)qQM<qrDX1z%%Yda%ejyVZ5aD;mZUt+19FCa5utGFh zd!%jfJ^meW^Y^%$^l~1bg_8BoLf-3V31wXL#=Lht41z7Ok#3&R&!ZqeTYn_`TZ17_ zKI?BhdD7eO<#E0mr$UBFvdW{4t;cc__5_osxy-Ued~k(`tAHRnS<5f)yzL|wGRnsJ z&Wg#zq~)NikAvVi%jDX2l0{)6cHnZart3k#1_Ox3xa5vW>mzN6OQA_7bd{xNG0#$M z4Vct!o`kZW@v*LmJc*^Qn$!i$brqgNDY>?dL|X|<b(O|E4aZEoLC}vA76iI(S`o}j zuj@$`zGp1xp{{>hHu7uEGp;L9k_l)gjU&k$fJ=KJrKWk{msgFz3G<w#R68^DD@(iy zVm@bx$^6jD<LIy|BsHiGE8|OJYCbgDy`LHF7#NIm^SRQFkT4`;-Z4ytG7)iIAEnuO z8kDJO2fCO;VK6-;DLt&sA_pN9CuQfQlE%3vX<p92jMPilvmThi5kCMy*oB{uJJ=yU z@o@|L!~>pS59F|cvk8Iw1Kcci2_~csQir&3`fz%<Nt$FH+o0)#ecQZX-||7uS0M(k k0NGucF{TlwAwlpzY-Un<3DDi1HD;%TXePn^#>Ec)4+8y=iU0rr literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/ssl_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ac302f881779756311edd81360096359e3ebb54 GIT binary patch literal 6807 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 O!o`Z`m8&Pb%Krc#!m1bm literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/unicode_utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5188aef791dc541c8f54b6de5f402104472a5c5 GIT binary patch literal 1185 zcmZ8hTW`}a6t<l-ZL_X|ZA^#<l!pma#1?K7orDmAmB)az!MaLQ6=JtbmpYm4bZyl> z!4Fv<`Ad0)7ybfI94FmHIPy8Z9AD1&ea`#URU1JW9B!WcHW2!yJ6DB3;~iAl1Va(U z5$Y5kcQEuxM21Gkz=#^u{DC?qEl~@6iI!;vyhZT=YE=KgYUDL=X2@_HVBLeFeFf?V zsPZcqg=R?M0r^hEePvvl6wlCt9H7b83|*EeS>QRk8J|P+rB#d`A--WERX(%DXAB!- zbc{G@Lj)Xecpbz0xIZnWs<+*2R5Cl1A(zVM0TVjItg6^pb=4$c*-Fa8Af}A^%Fn7i z7DGP@r!2E5)5Dp?c<yUoinx{#v4G6X#8;<3kywHK{wg;S;mB9a9r?oT#Svvfx<lc9 z8+5x(xyxUV=&PWcj9xrby=H$PqUXKcy*>BPO~Pb5zgrY-i(t3;Ql0y*WGYQm97pnY zb9vEjs=`R_B$KSFuQ*I%$uz2R4Gh9H_z1Sa*5R|TScTDR3QXu!q2?5{p>d0XI~qI< z_W~skD4ydPrnpDuWV|yY`{?A++?d#!n3=HvmH~bX;P(pnFP<Eu^CxYnN1zf-!t~g7 zptQJ51#{G?ufQ;;AC4GzG<Z%ZodRU~G!OMYc`fJS6sCFXuyMiy#i*0xAM(C)5sNdK z2QHcQ8f5_jMmeWKrv`eP$n0L9sa_Z{Xe&0nS})2vU~Ng`e$H+|rYZD;=vY13h2YE% zd`?5q1CyBn13ATosp&21%e}kB<u_ogz}~81lhkm9*f|4rEY@Kz(2CPV`)m1cK_^EO z&F~UU3}`+q(A2M}4X+PyBvV(Vf;&t0Z{P^IiXGqSr94n!%>Bp_F-U_muR(-9=Q`I` zuHYh9l37v-fKzC>{GXbw#6)8N!ha0YQg4HZmJ=ki32i{U1Wwe!bnf2hbO+uO6TDzT mD=tqxUvldV{Z>SdVdc#*rfJ09>VJaN@K*r0npvq;*8c(DeIoM! literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f546e74362648d9c24c0206058138785edad57a0 GIT binary patch literal 344 zcmYjN%}N6?5T5L=bh}dNNqmJKYU<Bw3nC(T^<qISNZ4-Dvb$*#lk95W!bi}fuav7N zU%``Espt$d^9_6-^D&pbUIISK>F&depC9e=8?gr$zRZbl6e!{_gLR+5E26<0DuY>g z3t}$<7FCHJA!w6^v+y27aOe3qFo-_A7Oq`ln5~tSk{j2lMJ42u7;L$os+L4EBWs;A z<N8Zx2`!A(#k{tK6t2@SZCbER$OaPPx>wIRQ!U{gbk`sFX<q^>T{M|xxXCnLNKU;N zuQZ;Qgp5rpP8)ih6V)7!>|(quH9uISlL?+;Rj6ShjLkS7>O37E*~bk3S^f_<F80;h X#b+x?YtGJ*w_w_L#X*4jXa{`*%OqsW literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/wheel.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2604d1aa2ba0a1c00bbeb40d6d9832d7a6313f47 GIT binary patch literal 5813 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 Az5oCK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/__pycache__/windows_support.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ca8fa5e5f8adf2d03f095b48938205ea8ccb900 GIT binary patch literal 1027 zcmZWoPfy!06t|N!gu?!z4ed1LxE^Q*j14A)1_J~VDiiHgDbf_u*nzZ89Bj9&s9XlO zeF-@3tL!7>x)Wbvr#+|YhPEg9y`Qb;pPzqz-g@w$iom+9`OiNLgnsJD#7qG1VaS)@ z2qKsve;l!oi9yV3<Qvo=7O7mLE9{#DH&M;LgKX4@unu540yFvmLp}$m&<(x?ww@`T zj#-*$gkY!DD5ly;M)<jmAg?sNQ!@lGqy>)XOx*a6YDQs&;zSm9?_5Wr%PrlnftQP9 z5Gv{oLgB@n5h|pY3a`@*f>pVay&aI(QIHRoUa5HXq$}8Byt20DwY)sZ7m`e>kg)|3 zt*kDqv(S@N^>f8JllS5IxY9uO^PCG+&xeJx&cd`q!i_0iEev$=Vv@!)Hmt8R9)(P9 z02n92C7hgvD&`_BY&n#QrZrqxaX*XxUP#zLRm|R}s^}B+GQzXi!D0r`AIY^&T8&cj z0{{x-zQPzO+%>vp*Sf@jDqXwuQ?W6^fm7mXKviN~!paDZj4R{P9GP-Y;hULT^c53R zKhwpxsteYn%2lV-JxvIqnHwr4l1^Vym&3%369!1QBoQ=HTny{ga@Vflse7ta{?7A2 z=cvaARK$#**CU>KXMHMF!ZYbDuDw}WT3lZC#@mkbP@NvTX<sV0LtRC`sCvnF@hDQm zoXR?=Q-V9)GL717Q4NA5)lU-yg*{FxY^@<<h0~)VqilJ}pMz`cLam#V@@3n1CS1OK z@Uh)&9r=~*_TkZX;XtF6hxpdk;o(6sC7@h5-FMnawj%@=HLI|6ss5Ayc#CJd`v*J0 zW~+6yzxAoL6YTA8Z|^h;Q&9EqTTg?iG|(FAhn0`Pp=k$K@f@ximQlqP7W1%HvxEad hJk(C7maF&J%1=?YkF%a~(r0u-f2Xo_9PF5m{Tm#(3)27q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f16a9a310ccd0e6dba216621033221c5f9b6fd6 GIT binary patch literal 206 zcmZ?b<>g`kf~*j+SP=afM8E(ekl_Ht#VkM~g&~+hlhJP_LlH<ALHsJ$FDS|^ODsv% zFH0=aPs`6qNi8bY&n?nV%8HM-C^pSAFH12=jxQ)PGAK#2NY5(DF-$YHwA2sLFUTy= z&CDw<NzBR7ElM`EFfJ)f)GtmgDJ>|;&(A4FX2zGL=B4Bp>Bq-s=4F<|$LkeT-r}&y Q%}*)KNwotxs2GSD0I@+h2><{9 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b62bfddefb2a4caa869e1b8906b9144d7157d183 GIT binary patch literal 200957 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/__pycache__/six.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e1cbe3ee7675813d6cd451c0ce7deea7cf5107f GIT binary patch literal 24407 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py new file mode 100644 index 000000000..95d330ef8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__about__.py @@ -0,0 +1,21 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] + +__title__ = "packaging" +__summary__ = "Core utilities for Python packages" +__uri__ = "https://github.com/pypa/packaging" + +__version__ = "16.8" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2016 %s" % __author__ diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py new file mode 100644 index 000000000..5ee622020 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__init__.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +from .__about__ import ( + __author__, __copyright__, __email__, __license__, __summary__, __title__, + __uri__, __version__ +) + +__all__ = [ + "__title__", "__summary__", "__uri__", "__version__", "__author__", + "__email__", "__license__", "__copyright__", +] diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74e519fbb3e86639eed924467983f6b8eac4260e GIT binary patch literal 742 zcmYk4OK%e~5XX13Y4d8@09DVX5{F1Mn})We2%*yUh)|_g99BY>v*S%%y!PV9O39IL z!?)p_D<{4JC&rDcVrzezvHl*<V=w#tZiMUp?%?aMMil)H&f{vMae<$`K|lntjLJBR z%SP5HlPrlNXg~r@*n(|nK^r>rcGiS$wgtUx8+Ni5^s_eXW*ykex-iIk@Qim3qHG7A z-$uh1e=uq^OxAmBX0`N=Q&CphxOE#uEv(RLy;~Wf94)-cUGO`UI^iUzbls!W`m$tZ ziB5}BZ^Y)b<|f=lr%NgGZlMj@c$1e*$c;vdoGTl`^eN4CwKQVBa6wkF{2QAKHD4WG zX~T(kLJB9iC51NRW{Kex*@(DZy<9j~*>`C=7jEHaqg<D1wX9hB6sCE6Hkz)6*IF?N z<ktD3aD*u!LWMHHGf8r-oDnncw6UuJJV-C>gLEYH>hSXRn&9gnG3tVoPn+allP{Y} z$z(KM9b7$DK_=tllOx0#d1XHj`=Jemciv#R21gv3B%p~1ePa@PVz$E3c0em2Ox|<? z!rx(f0XvAFkr@O#;O~zVr&BY>)0&yI&=N48v^44Lp3<p3Rc~uJ$!S$j#;%yo?~Obz zPS4NNyR;J3kx<s*+eaopoxXA3S!%iSmD5_<|4mwR1=>6{G{ux>+T*ZB)pFf_Uuy7@ We+cE+eZ+p!jk`%R#@)aj82<w){NNS< literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72609563c4f9ef41b8d9bff677b85e675c9d37cf GIT binary patch literal 580 zcmYjN%Zl7E5R~m1KgSyaA>WWWY@FASSqMwW2jr4D2|}Z>Y_BGg<+LQj9P>H(C13Zn zzmQX;9THZcqDypFm+DJhm&Bjb;pO)zCgeVle<%0FXMfGX11CI^L`5`GF^yG1lZfz` zCvv6MbgfdFs*GkTr@1O<p-Nh+idJevH@<Jh*F5DJ&w0U1UJW^|`Q{th)(>8pY?I{~ zI~pyW?LeqWqg`??W?_ULm#YcIXrXswYdwF6!bHB50L<AtjQ~px(CX=oVz{%O766@M zLi(}-kfQBI(_M&hN-;cNnyj!gyk`Io#ie2HFl+_D%J0Dt4sHU}0nz{=7Ayi}9=>j` zf|uS|hh7YQhy;@WD-Xd7J8I``U53NR6NN|p$4&p21UpQ6^S=o`58VO&{Azp*GqYVY zGi-V-xi{J<Y>p>@z1fW)Xa1puX@2*{_WR+4@@>DnxoHl~B&KUI8tXN$vEA+8+n=m4 yopqDdTAHUN%-zT}HWO=qutAJN10Y7>&A*<`Oa4h|?qqixK4wA`FXC5e8T|!`D4y>C literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba8d500abd546f15b3305c1abc4ea7455d53db5f GIT binary patch literal 1032 zcmah{OKTKC5bnq9?quC;4u*h_!+H_+;EpB+69_?6@D>Dv;Gi^}>E2{E^GbK`h7A#f z1d^YjNB>e^J>@TWvT8P2BOWZMnyTvQud2T4SBr~n0y5fN`TU6!@)Ls_Vc@(3wI9GJ zqG(2P8q=J`Eax$&m}6NG2Raxv6uCzfKV)%p9t9A!bj!Ta;gH4)MN_x&s~W0#PU1U? zy(j(F6=0J-_e*lmmf6^8k>*utoDWqxNo`sdzFV2JaAG(v5(n|l6*hJS-I9djZ4eBa zpe<1Q7|dI8K`!W!DXQ3csMsYv<6oE~-{>h*Tm>ol9zglVN!0Fvyf#`o-IKjNX>~8j zq_w@{)Ez)3*G|@nLH%a};B&#UDE2-WO=7A@%x)Ksx#CbJIC+F<;t$qVRwgpD+k<&3 z32G=p@QZpE)ONsJ(o=d#PWc%^(VZWF=XsJ@9~3gzzU>ZDE3k3vsp>P|nE3%h8)W3y z*9a(_z=Y96nrK*NN*f#HCfXYbv0>MX7Zde75!Gb%sT*$Wk4*M#xW2g=?M78vJxL4e zWR^WK$@<2cJCc#rZd|#t%<OGfOmv}26IC)fl>2G1ABm*QE9nN+)VG8v^sx{RaVXp$ zp(p+Sax%ESwF47};KR5=__h#vsm2-l9U+d!GMk;4CBUsG?lXhTnZ=ug>4N7M=4?NJ zu<j$I28s4dPUE|iW-97!U&HvoO)Fgk_xTL22F5%8R;r71{~l`@E7iMgt#GpfQNM#D z499M4U<89~7<@?v|MJ{Ut?x`=LGac^S`16i-+f#~vj&IG_zoDLS72w>x9e@!nHs(B c>XxZ{3b$sAZDR?Gsbv=OF6{;Z4Ox@_27Yk}z5oCK literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73b64990ddf4978aaec7832e377b4ada7d97310a GIT binary patch literal 2884 zcmcIm&2HN`5GEyCmK`T?+VpQ1EwHCTKvVTEXo@b1v|Vhm7hg6f0}DbCX-BRsDI{&6 zL2u5XuhLi2wWq#9Pdh_LtsO`!cXvyJ97;p-n;Fi0@~h3w4uLj4y8hRPCLy2jp=b@5 z970#W!N3WpF`3W-omc~FVh?Oe-Vkna`<!rFH0Ji8DVlRKXu{hDZ^GNAdFu!V-a6d* zlX$Jqa1!zCd^<Q+X*|_}MUyO*I(K<Ai&T^*`Bo;QM6=;E2{k;2xT9zmOb(%|BNzl3 zP)-IGr`$Rx1Do5t0TQse1G33m+y&|IHt&FJ@eSSu>GDm!1+vYzc@JcV@9--iH~3Ys za5s1VNQO}o>31Oo5Ns&1zlN?bD4fDdt1ls7<RkHD-cTYQN(Uaz@a5bGCuV^b{w$FG zFpas8%AZL8c+A*=+E1R&_>+)jvqul~@L)8S@x$T%vuFO1pGDbTlqem<@tzF#4<75& zz*j;~Go7ZfTAs3*NO&s!EC}BQqbM2qOldg{^;8OVKYN$Ej7gD6#@c8&#*Walox;8Q zg?7bH8x|QqyD-s2)AwXf=jbo(dsf~!3Dim6z+*isTd?Mv*V2VY1jRLs;Q?i!3vFo3 zfh8!*g8REU*s}~s-c0q0ke9I>#$wIb_7c+el6$E8J{-9TN0p%n#;#PMfNlllQV8Ee z2*-486(Q_En&Sm0p~%~?H4c<w?84D11H>s~*D4G^UAX~UutSr=fG)W(LH5wg9T;j* z6L9Tj1uE)RP|GgyX!#PWd>g?v{ak^9y8j6U?7dTkg1(^r*if$cqA%h`^Il(!0v*jn zkz^G$&|)kRBgTG#qlyyf6?>rWjI!@_u~?E|0_b^%u}R9OG0wY;olb*zp^;d;5{pUV zbxKTjiMc4R;;@SYW`?|h!&eGg%&;O2OJSud+~r!Xz4|ly5L90qmgFJyAIP%uI-Fk} z@(Y4JYws0NTO?8`<(LS0Xs_WEdUosbHT@f^llWbf8!(h#vbmCbHK=QHU2U0|tM`|{ zZj`vV7TwiDVS+uXgTjI_(T0U6|C#gFA{>*{`!&EnhU-iz9n?UtMR+S;tun$h1^c`P zYAx2QheBF-Q3tgi^%;_=C<G*)mrF1=OLDVdJc*wZc?*Z1aQM&UhCFf?dKI~$zVEe= xUx!otX9WLxFkvNTti(Taxsx7`MW~I7hL_4%G<Sbp@be4YqmWp4?cQw%`rnV127>?q literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d5eff20636fa6af8f3ca46a69ea38f9c972940e3 GIT binary patch literal 8889 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 OtdSqcAI|6Vlm7?v?$}%a literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd08de291cfb81fcaf7fa985ebe19c8b9564f8d2 GIT binary patch literal 3891 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 NGy!~Ar4MO2{l9*b?iK(5 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b700f72800ec81ae16706b6b0d8ee6e6704c8f26 GIT binary patch literal 19810 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9f42253ad731403bfa05f637c1a5b86d3e2c8c0 GIT binary patch literal 511 zcmY*W%We}f6tz8*GztW$iui{JC5A%ORH{(b?z^F@L6PN*oyfssn`_Si6=KDQB#SQk zOWv~TFLYJA5>mL*IlfQbhc8B>Axg5jezUm62>s2*KPi%Op5TuY2_&#a4X$uQD$*2H zfwPb3vMOb{?TKQCtG*~j?+>aD1o@1{{rgmh#zlO|m)`0&NTwQRA;f`Do$|_>_`-oQ zfvs9ohh$&f^uJ8lbn&)M!#qiT%Y@4W|0+>HTP*M|v?E)xL#Yk9dcc#^<%reXSfgsL z)s18z*YZa!e7lT2ZNEzx<5(Kr$U6ji=ZD`k_3n6(wBtZmRtpK9Hb9pf#^!!zPCD_i zX0AJa7gqE22K4*Y?DUjgQ>WZS86UXT6R2nN58)f9UWV2MYqj53StpIKKpn5Y^0hK+ z+6JZl)cuTy|Bag`d!BbBi4cLTj|Xwc(rrQuk}=2;$e#lFAd!HK2eoaS(h~aFook+U Z+oNYWb#T^L(Q5fA7y6w0nhc6z@d!5^iID&R literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b40fdfa369577531642aa83ddf6ded38e237e16 GIT binary patch literal 10577 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 Yb_%M*95d~M_D$0mTd}_=820f012*%D9smFU literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py new file mode 100644 index 000000000..210bb80b7 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_compat.py @@ -0,0 +1,30 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import sys + + +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 + +# flake8: noqa + +if PY3: + string_types = str, +else: + string_types = basestring, + + +def with_metaclass(meta, *bases): + """ + Create a base class with a metaclass. + """ + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py new file mode 100644 index 000000000..ccc27861c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/_structures.py @@ -0,0 +1,68 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + + +class Infinity(object): + + def __repr__(self): + return "Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return False + + def __le__(self, other): + return False + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return True + + def __ge__(self, other): + return True + + def __neg__(self): + return NegativeInfinity + +Infinity = Infinity() + + +class NegativeInfinity(object): + + def __repr__(self): + return "-Infinity" + + def __hash__(self): + return hash(repr(self)) + + def __lt__(self, other): + return True + + def __le__(self, other): + return True + + def __eq__(self, other): + return isinstance(other, self.__class__) + + def __ne__(self, other): + return not isinstance(other, self.__class__) + + def __gt__(self, other): + return False + + def __ge__(self, other): + return False + + def __neg__(self): + return Infinity + +NegativeInfinity = NegativeInfinity() diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py new file mode 100644 index 000000000..031332a30 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/markers.py @@ -0,0 +1,301 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import operator +import os +import platform +import sys + +from setuptools.extern.pyparsing import ParseException, ParseResults, stringStart, stringEnd +from setuptools.extern.pyparsing import ZeroOrMore, Group, Forward, QuotedString +from setuptools.extern.pyparsing import Literal as L # noqa + +from ._compat import string_types +from .specifiers import Specifier, InvalidSpecifier + + +__all__ = [ + "InvalidMarker", "UndefinedComparison", "UndefinedEnvironmentName", + "Marker", "default_environment", +] + + +class InvalidMarker(ValueError): + """ + An invalid marker was found, users should refer to PEP 508. + """ + + +class UndefinedComparison(ValueError): + """ + An invalid operation was attempted on a value that doesn't support it. + """ + + +class UndefinedEnvironmentName(ValueError): + """ + A name was attempted to be used that does not exist inside of the + environment. + """ + + +class Node(object): + + def __init__(self, value): + self.value = value + + def __str__(self): + return str(self.value) + + def __repr__(self): + return "<{0}({1!r})>".format(self.__class__.__name__, str(self)) + + def serialize(self): + raise NotImplementedError + + +class Variable(Node): + + def serialize(self): + return str(self) + + +class Value(Node): + + def serialize(self): + return '"{0}"'.format(self) + + +class Op(Node): + + def serialize(self): + return str(self) + + +VARIABLE = ( + L("implementation_version") | + L("platform_python_implementation") | + L("implementation_name") | + L("python_full_version") | + L("platform_release") | + L("platform_version") | + L("platform_machine") | + L("platform_system") | + L("python_version") | + L("sys_platform") | + L("os_name") | + L("os.name") | # PEP-345 + L("sys.platform") | # PEP-345 + L("platform.version") | # PEP-345 + L("platform.machine") | # PEP-345 + L("platform.python_implementation") | # PEP-345 + L("python_implementation") | # undocumented setuptools legacy + L("extra") +) +ALIASES = { + 'os.name': 'os_name', + 'sys.platform': 'sys_platform', + 'platform.version': 'platform_version', + 'platform.machine': 'platform_machine', + 'platform.python_implementation': 'platform_python_implementation', + 'python_implementation': 'platform_python_implementation' +} +VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0]))) + +VERSION_CMP = ( + L("===") | + L("==") | + L(">=") | + L("<=") | + L("!=") | + L("~=") | + L(">") | + L("<") +) + +MARKER_OP = VERSION_CMP | L("not in") | L("in") +MARKER_OP.setParseAction(lambda s, l, t: Op(t[0])) + +MARKER_VALUE = QuotedString("'") | QuotedString('"') +MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0])) + +BOOLOP = L("and") | L("or") + +MARKER_VAR = VARIABLE | MARKER_VALUE + +MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR) +MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0])) + +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() + +MARKER_EXPR = Forward() +MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN) +MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR) + +MARKER = stringStart + MARKER_EXPR + stringEnd + + +def _coerce_parse_result(results): + if isinstance(results, ParseResults): + return [_coerce_parse_result(i) for i in results] + else: + return results + + +def _format_marker(marker, first=True): + assert isinstance(marker, (list, tuple, string_types)) + + # Sometimes we have a structure like [[...]] which is a single item list + # where the single item is itself it's own list. In that case we want skip + # the rest of this function so that we don't get extraneous () on the + # outside. + if (isinstance(marker, list) and len(marker) == 1 and + isinstance(marker[0], (list, tuple))): + return _format_marker(marker[0]) + + if isinstance(marker, list): + inner = (_format_marker(m, first=False) for m in marker) + if first: + return " ".join(inner) + else: + return "(" + " ".join(inner) + ")" + elif isinstance(marker, tuple): + return " ".join([m.serialize() for m in marker]) + else: + return marker + + +_operators = { + "in": lambda lhs, rhs: lhs in rhs, + "not in": lambda lhs, rhs: lhs not in rhs, + "<": operator.lt, + "<=": operator.le, + "==": operator.eq, + "!=": operator.ne, + ">=": operator.ge, + ">": operator.gt, +} + + +def _eval_op(lhs, op, rhs): + try: + spec = Specifier("".join([op.serialize(), rhs])) + except InvalidSpecifier: + pass + else: + return spec.contains(lhs) + + oper = _operators.get(op.serialize()) + if oper is None: + raise UndefinedComparison( + "Undefined {0!r} on {1!r} and {2!r}.".format(op, lhs, rhs) + ) + + return oper(lhs, rhs) + + +_undefined = object() + + +def _get_env(environment, name): + value = environment.get(name, _undefined) + + if value is _undefined: + raise UndefinedEnvironmentName( + "{0!r} does not exist in evaluation environment.".format(name) + ) + + return value + + +def _evaluate_markers(markers, environment): + groups = [[]] + + for marker in markers: + assert isinstance(marker, (list, tuple, string_types)) + + if isinstance(marker, list): + groups[-1].append(_evaluate_markers(marker, environment)) + elif isinstance(marker, tuple): + lhs, op, rhs = marker + + if isinstance(lhs, Variable): + lhs_value = _get_env(environment, lhs.value) + rhs_value = rhs.value + else: + lhs_value = lhs.value + rhs_value = _get_env(environment, rhs.value) + + groups[-1].append(_eval_op(lhs_value, op, rhs_value)) + else: + assert marker in ["and", "or"] + if marker == "or": + groups.append([]) + + return any(all(item) for item in groups) + + +def format_full_version(info): + version = '{0.major}.{0.minor}.{0.micro}'.format(info) + kind = info.releaselevel + if kind != 'final': + version += kind[0] + str(info.serial) + return version + + +def default_environment(): + if hasattr(sys, 'implementation'): + iver = format_full_version(sys.implementation.version) + implementation_name = sys.implementation.name + else: + iver = '0' + implementation_name = '' + + return { + "implementation_name": implementation_name, + "implementation_version": iver, + "os_name": os.name, + "platform_machine": platform.machine(), + "platform_release": platform.release(), + "platform_system": platform.system(), + "platform_version": platform.version(), + "python_full_version": platform.python_version(), + "platform_python_implementation": platform.python_implementation(), + "python_version": platform.python_version()[:3], + "sys_platform": sys.platform, + } + + +class Marker(object): + + def __init__(self, marker): + try: + self._markers = _coerce_parse_result(MARKER.parseString(marker)) + except ParseException as e: + err_str = "Invalid marker: {0!r}, parse error at {1!r}".format( + marker, marker[e.loc:e.loc + 8]) + raise InvalidMarker(err_str) + + def __str__(self): + return _format_marker(self._markers) + + def __repr__(self): + return "<Marker({0!r})>".format(str(self)) + + def evaluate(self, environment=None): + """Evaluate a marker. + + Return the boolean from evaluating the given marker against the + environment. environment is an optional argument to override all or + part of the determined environment. + + The environment is determined from the current Python process. + """ + current_environment = default_environment() + if environment is not None: + current_environment.update(environment) + + return _evaluate_markers(self._markers, current_environment) diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py new file mode 100644 index 000000000..5b493416f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/requirements.py @@ -0,0 +1,127 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import string +import re + +from setuptools.extern.pyparsing import stringStart, stringEnd, originalTextFor, ParseException +from setuptools.extern.pyparsing import ZeroOrMore, Word, Optional, Regex, Combine +from setuptools.extern.pyparsing import Literal as L # noqa +from setuptools.extern.six.moves.urllib import parse as urlparse + +from .markers import MARKER_EXPR, Marker +from .specifiers import LegacySpecifier, Specifier, SpecifierSet + + +class InvalidRequirement(ValueError): + """ + An invalid requirement was found, users should refer to PEP 508. + """ + + +ALPHANUM = Word(string.ascii_letters + string.digits) + +LBRACKET = L("[").suppress() +RBRACKET = L("]").suppress() +LPAREN = L("(").suppress() +RPAREN = L(")").suppress() +COMMA = L(",").suppress() +SEMICOLON = L(";").suppress() +AT = L("@").suppress() + +PUNCTUATION = Word("-_.") +IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM) +IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END)) + +NAME = IDENTIFIER("name") +EXTRA = IDENTIFIER + +URI = Regex(r'[^ ]+')("url") +URL = (AT + URI) + +EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA) +EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras") + +VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE) +VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE) + +VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY +VERSION_MANY = Combine(VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), + joinString=",", adjacent=False)("_raw_spec") +_VERSION_SPEC = Optional(((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)) +_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or '') + +VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier") +VERSION_SPEC.setParseAction(lambda s, l, t: t[1]) + +MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker") +MARKER_EXPR.setParseAction( + lambda s, l, t: Marker(s[t._original_start:t._original_end]) +) +MARKER_SEPERATOR = SEMICOLON +MARKER = MARKER_SEPERATOR + MARKER_EXPR + +VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER) +URL_AND_MARKER = URL + Optional(MARKER) + +NAMED_REQUIREMENT = \ + NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER) + +REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd + + +class Requirement(object): + """Parse a requirement. + + Parse a given requirement string into its parts, such as name, specifier, + URL, and extras. Raises InvalidRequirement on a badly-formed requirement + string. + """ + + # TODO: Can we test whether something is contained within a requirement? + # If so how do we do that? Do we need to test against the _name_ of + # the thing as well as the version? What about the markers? + # TODO: Can we normalize the name and extra name? + + def __init__(self, requirement_string): + try: + req = REQUIREMENT.parseString(requirement_string) + except ParseException as e: + raise InvalidRequirement( + "Invalid requirement, parse error at \"{0!r}\"".format( + requirement_string[e.loc:e.loc + 8])) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc): + raise InvalidRequirement("Invalid URL given") + self.url = req.url + else: + self.url = None + self.extras = set(req.extras.asList() if req.extras else []) + self.specifier = SpecifierSet(req.specifier) + self.marker = req.marker if req.marker else None + + def __str__(self): + parts = [self.name] + + if self.extras: + parts.append("[{0}]".format(",".join(sorted(self.extras)))) + + if self.specifier: + parts.append(str(self.specifier)) + + if self.url: + parts.append("@ {0}".format(self.url)) + + if self.marker: + parts.append("; {0}".format(self.marker)) + + return "".join(parts) + + def __repr__(self): + return "<Requirement({0!r})>".format(str(self)) diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py new file mode 100644 index 000000000..7f5a76cfd --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/specifiers.py @@ -0,0 +1,774 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import abc +import functools +import itertools +import re + +from ._compat import string_types, with_metaclass +from .version import Version, LegacyVersion, parse + + +class InvalidSpecifier(ValueError): + """ + An invalid specifier was found, users should refer to PEP 440. + """ + + +class BaseSpecifier(with_metaclass(abc.ABCMeta, object)): + + @abc.abstractmethod + def __str__(self): + """ + Returns the str representation of this Specifier like object. This + should be representative of the Specifier itself. + """ + + @abc.abstractmethod + def __hash__(self): + """ + Returns a hash value for this Specifier like object. + """ + + @abc.abstractmethod + def __eq__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are equal. + """ + + @abc.abstractmethod + def __ne__(self, other): + """ + Returns a boolean representing whether or not the two Specifier like + objects are not equal. + """ + + @abc.abstractproperty + def prereleases(self): + """ + Returns whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @prereleases.setter + def prereleases(self, value): + """ + Sets whether or not pre-releases as a whole are allowed by this + specifier. + """ + + @abc.abstractmethod + def contains(self, item, prereleases=None): + """ + Determines if the given item is contained within this specifier. + """ + + @abc.abstractmethod + def filter(self, iterable, prereleases=None): + """ + Takes an iterable of items and filters them so that only items which + are contained within this specifier are allowed in it. + """ + + +class _IndividualSpecifier(BaseSpecifier): + + _operators = {} + + def __init__(self, spec="", prereleases=None): + match = self._regex.search(spec) + if not match: + raise InvalidSpecifier("Invalid specifier: '{0}'".format(spec)) + + self._spec = ( + match.group("operator").strip(), + match.group("version").strip(), + ) + + # Store whether or not this Specifier should accept prereleases + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<{0}({1!r}{2})>".format( + self.__class__.__name__, + str(self), + pre, + ) + + def __str__(self): + return "{0}{1}".format(*self._spec) + + def __hash__(self): + return hash(self._spec) + + def __eq__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec == other._spec + + def __ne__(self, other): + if isinstance(other, string_types): + try: + other = self.__class__(other) + except InvalidSpecifier: + return NotImplemented + elif not isinstance(other, self.__class__): + return NotImplemented + + return self._spec != other._spec + + def _get_operator(self, op): + return getattr(self, "_compare_{0}".format(self._operators[op])) + + def _coerce_version(self, version): + if not isinstance(version, (LegacyVersion, Version)): + version = parse(version) + return version + + @property + def operator(self): + return self._spec[0] + + @property + def version(self): + return self._spec[1] + + @property + def prereleases(self): + return self._prereleases + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Determine if prereleases are to be allowed or not. + if prereleases is None: + prereleases = self.prereleases + + # Normalize item to a Version or LegacyVersion, this allows us to have + # a shortcut for ``"2.0" in Specifier(">=2") + item = self._coerce_version(item) + + # Determine if we should be supporting prereleases in this specifier + # or not, if we do not support prereleases than we can short circuit + # logic if this version is a prereleases. + if item.is_prerelease and not prereleases: + return False + + # Actually do the comparison to determine if this item is contained + # within this Specifier or not. + return self._get_operator(self.operator)(item, self.version) + + def filter(self, iterable, prereleases=None): + yielded = False + found_prereleases = [] + + kw = {"prereleases": prereleases if prereleases is not None else True} + + # Attempt to iterate over all the values in the iterable and if any of + # them match, yield them. + for version in iterable: + parsed_version = self._coerce_version(version) + + if self.contains(parsed_version, **kw): + # If our version is a prerelease, and we were not set to allow + # prereleases, then we'll store it for later incase nothing + # else matches this specifier. + if (parsed_version.is_prerelease and not + (prereleases or self.prereleases)): + found_prereleases.append(version) + # Either this is not a prerelease, or we should have been + # accepting prereleases from the begining. + else: + yielded = True + yield version + + # Now that we've iterated over everything, determine if we've yielded + # any values, and if we have not and we have any prereleases stored up + # then we will go ahead and yield the prereleases. + if not yielded and found_prereleases: + for version in found_prereleases: + yield version + + +class LegacySpecifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(==|!=|<=|>=|<|>)) + \s* + (?P<version> + [^,;\s)]* # Since this is a "legacy" specifier, and the version + # string can be just about anything, we match everything + # except for whitespace, a semi-colon for marker support, + # a closing paren since versions can be enclosed in + # them, and a comma since it's a version separator. + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + } + + def _coerce_version(self, version): + if not isinstance(version, LegacyVersion): + version = LegacyVersion(str(version)) + return version + + def _compare_equal(self, prospective, spec): + return prospective == self._coerce_version(spec) + + def _compare_not_equal(self, prospective, spec): + return prospective != self._coerce_version(spec) + + def _compare_less_than_equal(self, prospective, spec): + return prospective <= self._coerce_version(spec) + + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= self._coerce_version(spec) + + def _compare_less_than(self, prospective, spec): + return prospective < self._coerce_version(spec) + + def _compare_greater_than(self, prospective, spec): + return prospective > self._coerce_version(spec) + + +def _require_version_compare(fn): + @functools.wraps(fn) + def wrapped(self, prospective, spec): + if not isinstance(prospective, Version): + return False + return fn(self, prospective, spec) + return wrapped + + +class Specifier(_IndividualSpecifier): + + _regex_str = ( + r""" + (?P<operator>(~=|==|!=|<=|>=|<|>|===)) + (?P<version> + (?: + # The identity operators allow for an escape hatch that will + # do an exact string match of the version you wish to install. + # This will not be parsed by PEP 440 and we cannot determine + # any semantic meaning from it. This operator is discouraged + # but included entirely as an escape hatch. + (?<====) # Only match for the identity operator + \s* + [^\s]* # We just match everything, except for whitespace + # since we are only testing for strict identity. + ) + | + (?: + # The (non)equality operators allow for wild card and local + # versions to be specified so we have to define these two + # operators separately to enable that. + (?<===|!=) # Only match for equals and not equals + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + + # You cannot use a wild card and a dev or local version + # together so group them with a | and make them optional. + (?: + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + (?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local + | + \.\* # Wild card syntax of .* + )? + ) + | + (?: + # The compatible operator requires at least two digits in the + # release segment. + (?<=~=) # Only match for the compatible operator + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *) + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + | + (?: + # All other operators only allow a sub set of what the + # (non)equality operators do. Specifically they do not allow + # local versions to be specified nor do they allow the prefix + # matching wild cards. + (?<!==|!=|~=) # We have special cases for these + # operators so we want to make sure they + # don't match here. + + \s* + v? + (?:[0-9]+!)? # epoch + [0-9]+(?:\.[0-9]+)* # release + (?: # pre release + [-_\.]? + (a|b|c|rc|alpha|beta|pre|preview) + [-_\.]? + [0-9]* + )? + (?: # post release + (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*) + )? + (?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release + ) + ) + """ + ) + + _regex = re.compile( + r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE) + + _operators = { + "~=": "compatible", + "==": "equal", + "!=": "not_equal", + "<=": "less_than_equal", + ">=": "greater_than_equal", + "<": "less_than", + ">": "greater_than", + "===": "arbitrary", + } + + @_require_version_compare + def _compare_compatible(self, prospective, spec): + # Compatible releases have an equivalent combination of >= and ==. That + # is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to + # implement this in terms of the other specifiers instead of + # implementing it ourselves. The only thing we need to do is construct + # the other specifiers. + + # We want everything but the last item in the version, but we want to + # ignore post and dev releases and we want to treat the pre-release as + # it's own separate segment. + prefix = ".".join( + list( + itertools.takewhile( + lambda x: (not x.startswith("post") and not + x.startswith("dev")), + _version_split(spec), + ) + )[:-1] + ) + + # Add the prefix notation to the end of our string + prefix += ".*" + + return (self._get_operator(">=")(prospective, spec) and + self._get_operator("==")(prospective, prefix)) + + @_require_version_compare + def _compare_equal(self, prospective, spec): + # We need special logic to handle prefix matching + if spec.endswith(".*"): + # In the case of prefix matching we want to ignore local segment. + prospective = Version(prospective.public) + # Split the spec out by dots, and pretend that there is an implicit + # dot in between a release segment and a pre-release segment. + spec = _version_split(spec[:-2]) # Remove the trailing .* + + # Split the prospective version out by dots, and pretend that there + # is an implicit dot in between a release segment and a pre-release + # segment. + prospective = _version_split(str(prospective)) + + # Shorten the prospective version to be the same length as the spec + # so that we can determine if the specifier is a prefix of the + # prospective version or not. + prospective = prospective[:len(spec)] + + # Pad out our two sides with zeros so that they both equal the same + # length. + spec, prospective = _pad_version(spec, prospective) + else: + # Convert our spec string into a Version + spec = Version(spec) + + # If the specifier does not have a local segment, then we want to + # act as if the prospective version also does not have a local + # segment. + if not spec.local: + prospective = Version(prospective.public) + + return prospective == spec + + @_require_version_compare + def _compare_not_equal(self, prospective, spec): + return not self._compare_equal(prospective, spec) + + @_require_version_compare + def _compare_less_than_equal(self, prospective, spec): + return prospective <= Version(spec) + + @_require_version_compare + def _compare_greater_than_equal(self, prospective, spec): + return prospective >= Version(spec) + + @_require_version_compare + def _compare_less_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is less than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective < spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a pre-release version, that we do not accept pre-release + # versions for the version mentioned in the specifier (e.g. <3.1 should + # not match 3.1.dev0, but should match 3.0.dev0). + if not spec.is_prerelease and prospective.is_prerelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # less than the spec version *and* it's not a pre-release of the same + # version in the spec. + return True + + @_require_version_compare + def _compare_greater_than(self, prospective, spec): + # Convert our spec to a Version instance, since we'll want to work with + # it as a version. + spec = Version(spec) + + # Check to see if the prospective version is greater than the spec + # version. If it's not we can short circuit and just return False now + # instead of doing extra unneeded work. + if not prospective > spec: + return False + + # This special case is here so that, unless the specifier itself + # includes is a post-release version, that we do not accept + # post-release versions for the version mentioned in the specifier + # (e.g. >3.1 should not match 3.0.post0, but should match 3.2.post0). + if not spec.is_postrelease and prospective.is_postrelease: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # Ensure that we do not allow a local version of the version mentioned + # in the specifier, which is techincally greater than, to match. + if prospective.local is not None: + if Version(prospective.base_version) == Version(spec.base_version): + return False + + # If we've gotten to here, it means that prospective version is both + # greater than the spec version *and* it's not a pre-release of the + # same version in the spec. + return True + + def _compare_arbitrary(self, prospective, spec): + return str(prospective).lower() == str(spec).lower() + + @property + def prereleases(self): + # If there is an explicit prereleases set for this, then we'll just + # blindly use that. + if self._prereleases is not None: + return self._prereleases + + # Look at all of our specifiers and determine if they are inclusive + # operators, and if they are if they are including an explicit + # prerelease. + operator, version = self._spec + if operator in ["==", ">=", "<=", "~=", "==="]: + # The == specifier can include a trailing .*, if it does we + # want to remove before parsing. + if operator == "==" and version.endswith(".*"): + version = version[:-2] + + # Parse the version, and if it is a pre-release than this + # specifier allows pre-releases. + if parse(version).is_prerelease: + return True + + return False + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + +_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$") + + +def _version_split(version): + result = [] + for item in version.split("."): + match = _prefix_regex.search(item) + if match: + result.extend(match.groups()) + else: + result.append(item) + return result + + +def _pad_version(left, right): + left_split, right_split = [], [] + + # Get the release segment of our versions + left_split.append(list(itertools.takewhile(lambda x: x.isdigit(), left))) + right_split.append(list(itertools.takewhile(lambda x: x.isdigit(), right))) + + # Get the rest of our versions + left_split.append(left[len(left_split[0]):]) + right_split.append(right[len(right_split[0]):]) + + # Insert our padding + left_split.insert( + 1, + ["0"] * max(0, len(right_split[0]) - len(left_split[0])), + ) + right_split.insert( + 1, + ["0"] * max(0, len(left_split[0]) - len(right_split[0])), + ) + + return ( + list(itertools.chain(*left_split)), + list(itertools.chain(*right_split)), + ) + + +class SpecifierSet(BaseSpecifier): + + def __init__(self, specifiers="", prereleases=None): + # Split on , to break each indidivual specifier into it's own item, and + # strip each item to remove leading/trailing whitespace. + specifiers = [s.strip() for s in specifiers.split(",") if s.strip()] + + # Parsed each individual specifier, attempting first to make it a + # Specifier and falling back to a LegacySpecifier. + parsed = set() + for specifier in specifiers: + try: + parsed.add(Specifier(specifier)) + except InvalidSpecifier: + parsed.add(LegacySpecifier(specifier)) + + # Turn our parsed specifiers into a frozen set and save them for later. + self._specs = frozenset(parsed) + + # Store our prereleases value so we can use it later to determine if + # we accept prereleases or not. + self._prereleases = prereleases + + def __repr__(self): + pre = ( + ", prereleases={0!r}".format(self.prereleases) + if self._prereleases is not None + else "" + ) + + return "<SpecifierSet({0!r}{1})>".format(str(self), pre) + + def __str__(self): + return ",".join(sorted(str(s) for s in self._specs)) + + def __hash__(self): + return hash(self._specs) + + def __and__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + specifier = SpecifierSet() + specifier._specs = frozenset(self._specs | other._specs) + + if self._prereleases is None and other._prereleases is not None: + specifier._prereleases = other._prereleases + elif self._prereleases is not None and other._prereleases is None: + specifier._prereleases = self._prereleases + elif self._prereleases == other._prereleases: + specifier._prereleases = self._prereleases + else: + raise ValueError( + "Cannot combine SpecifierSets with True and False prerelease " + "overrides." + ) + + return specifier + + def __eq__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs == other._specs + + def __ne__(self, other): + if isinstance(other, string_types): + other = SpecifierSet(other) + elif isinstance(other, _IndividualSpecifier): + other = SpecifierSet(str(other)) + elif not isinstance(other, SpecifierSet): + return NotImplemented + + return self._specs != other._specs + + def __len__(self): + return len(self._specs) + + def __iter__(self): + return iter(self._specs) + + @property + def prereleases(self): + # If we have been given an explicit prerelease modifier, then we'll + # pass that through here. + if self._prereleases is not None: + return self._prereleases + + # If we don't have any specifiers, and we don't have a forced value, + # then we'll just return None since we don't know if this should have + # pre-releases or not. + if not self._specs: + return None + + # Otherwise we'll see if any of the given specifiers accept + # prereleases, if any of them do we'll return True, otherwise False. + return any(s.prereleases for s in self._specs) + + @prereleases.setter + def prereleases(self, value): + self._prereleases = value + + def __contains__(self, item): + return self.contains(item) + + def contains(self, item, prereleases=None): + # Ensure that our item is a Version or LegacyVersion instance. + if not isinstance(item, (LegacyVersion, Version)): + item = parse(item) + + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # We can determine if we're going to allow pre-releases by looking to + # see if any of the underlying items supports them. If none of them do + # and this item is a pre-release then we do not allow it and we can + # short circuit that here. + # Note: This means that 1.0.dev1 would not be contained in something + # like >=1.0.devabc however it would be in >=1.0.debabc,>0.0.dev0 + if not prereleases and item.is_prerelease: + return False + + # We simply dispatch to the underlying specs here to make sure that the + # given version is contained within all of them. + # Note: This use of all() here means that an empty set of specifiers + # will always return True, this is an explicit design decision. + return all( + s.contains(item, prereleases=prereleases) + for s in self._specs + ) + + def filter(self, iterable, prereleases=None): + # Determine if we're forcing a prerelease or not, if we're not forcing + # one for this particular filter call, then we'll use whatever the + # SpecifierSet thinks for whether or not we should support prereleases. + if prereleases is None: + prereleases = self.prereleases + + # If we have any specifiers, then we want to wrap our iterable in the + # filter method for each one, this will act as a logical AND amongst + # each specifier. + if self._specs: + for spec in self._specs: + iterable = spec.filter(iterable, prereleases=bool(prereleases)) + return iterable + # If we do not have any specifiers, then we need to have a rough filter + # which will filter out any pre-releases, unless there are no final + # releases, and which will filter out LegacyVersion in general. + else: + filtered = [] + found_prereleases = [] + + for item in iterable: + # Ensure that we some kind of Version class for this item. + if not isinstance(item, (LegacyVersion, Version)): + parsed_version = parse(item) + else: + parsed_version = item + + # Filter out any item which is parsed as a LegacyVersion + if isinstance(parsed_version, LegacyVersion): + continue + + # Store any item which is a pre-release for later unless we've + # already found a final version or we are accepting prereleases + if parsed_version.is_prerelease and not prereleases: + if not filtered: + found_prereleases.append(item) + else: + filtered.append(item) + + # If we've found no items except for pre-releases, then we'll go + # ahead and use the pre-releases + if not filtered and found_prereleases and prereleases is None: + return found_prereleases + + return filtered diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py new file mode 100644 index 000000000..942387cef --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/utils.py @@ -0,0 +1,14 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import re + + +_canonicalize_regex = re.compile(r"[-_.]+") + + +def canonicalize_name(name): + # This is taken from PEP 503. + return _canonicalize_regex.sub("-", name).lower() diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py new file mode 100644 index 000000000..83b5ee8c5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/packaging/version.py @@ -0,0 +1,393 @@ +# This file is dual licensed under the terms of the Apache License, Version +# 2.0, and the BSD License. See the LICENSE file in the root of this repository +# for complete details. +from __future__ import absolute_import, division, print_function + +import collections +import itertools +import re + +from ._structures import Infinity + + +__all__ = [ + "parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN" +] + + +_Version = collections.namedtuple( + "_Version", + ["epoch", "release", "dev", "pre", "post", "local"], +) + + +def parse(version): + """ + Parse the given version string and return either a :class:`Version` object + or a :class:`LegacyVersion` object depending on if the given version is + a valid PEP 440 version or a legacy version. + """ + try: + return Version(version) + except InvalidVersion: + return LegacyVersion(version) + + +class InvalidVersion(ValueError): + """ + An invalid version was found, users should refer to PEP 440. + """ + + +class _BaseVersion(object): + + def __hash__(self): + return hash(self._key) + + def __lt__(self, other): + return self._compare(other, lambda s, o: s < o) + + def __le__(self, other): + return self._compare(other, lambda s, o: s <= o) + + def __eq__(self, other): + return self._compare(other, lambda s, o: s == o) + + def __ge__(self, other): + return self._compare(other, lambda s, o: s >= o) + + def __gt__(self, other): + return self._compare(other, lambda s, o: s > o) + + def __ne__(self, other): + return self._compare(other, lambda s, o: s != o) + + def _compare(self, other, method): + if not isinstance(other, _BaseVersion): + return NotImplemented + + return method(self._key, other._key) + + +class LegacyVersion(_BaseVersion): + + def __init__(self, version): + self._version = str(version) + self._key = _legacy_cmpkey(self._version) + + def __str__(self): + return self._version + + def __repr__(self): + return "<LegacyVersion({0})>".format(repr(str(self))) + + @property + def public(self): + return self._version + + @property + def base_version(self): + return self._version + + @property + def local(self): + return None + + @property + def is_prerelease(self): + return False + + @property + def is_postrelease(self): + return False + + +_legacy_version_component_re = re.compile( + r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE, +) + +_legacy_version_replacement_map = { + "pre": "c", "preview": "c", "-": "final-", "rc": "c", "dev": "@", +} + + +def _parse_version_parts(s): + for part in _legacy_version_component_re.split(s): + part = _legacy_version_replacement_map.get(part, part) + + if not part or part == ".": + continue + + if part[:1] in "0123456789": + # pad for numeric comparison + yield part.zfill(8) + else: + yield "*" + part + + # ensure that alpha/beta/candidate are before final + yield "*final" + + +def _legacy_cmpkey(version): + # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch + # greater than or equal to 0. This will effectively put the LegacyVersion, + # which uses the defacto standard originally implemented by setuptools, + # as before all PEP 440 versions. + epoch = -1 + + # This scheme is taken from pkg_resources.parse_version setuptools prior to + # it's adoption of the packaging library. + parts = [] + for part in _parse_version_parts(version.lower()): + if part.startswith("*"): + # remove "-" before a prerelease tag + if part < "*final": + while parts and parts[-1] == "*final-": + parts.pop() + + # remove trailing zeros from each series of numeric parts + while parts and parts[-1] == "00000000": + parts.pop() + + parts.append(part) + parts = tuple(parts) + + return epoch, parts + +# Deliberately not anchored to the start and end of the string, to make it +# easier for 3rd party code to reuse +VERSION_PATTERN = r""" + v? + (?: + (?:(?P<epoch>[0-9]+)!)? # epoch + (?P<release>[0-9]+(?:\.[0-9]+)*) # release segment + (?P<pre> # pre-release + [-_\.]? + (?P<pre_l>(a|b|c|rc|alpha|beta|pre|preview)) + [-_\.]? + (?P<pre_n>[0-9]+)? + )? + (?P<post> # post release + (?:-(?P<post_n1>[0-9]+)) + | + (?: + [-_\.]? + (?P<post_l>post|rev|r) + [-_\.]? + (?P<post_n2>[0-9]+)? + ) + )? + (?P<dev> # dev release + [-_\.]? + (?P<dev_l>dev) + [-_\.]? + (?P<dev_n>[0-9]+)? + )? + ) + (?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version +""" + + +class Version(_BaseVersion): + + _regex = re.compile( + r"^\s*" + VERSION_PATTERN + r"\s*$", + re.VERBOSE | re.IGNORECASE, + ) + + def __init__(self, version): + # Validate the version and parse it into pieces + match = self._regex.search(version) + if not match: + raise InvalidVersion("Invalid version: '{0}'".format(version)) + + # Store the parsed out pieces of the version + self._version = _Version( + epoch=int(match.group("epoch")) if match.group("epoch") else 0, + release=tuple(int(i) for i in match.group("release").split(".")), + pre=_parse_letter_version( + match.group("pre_l"), + match.group("pre_n"), + ), + post=_parse_letter_version( + match.group("post_l"), + match.group("post_n1") or match.group("post_n2"), + ), + dev=_parse_letter_version( + match.group("dev_l"), + match.group("dev_n"), + ), + local=_parse_local_version(match.group("local")), + ) + + # Generate a key which will be used for sorting + self._key = _cmpkey( + self._version.epoch, + self._version.release, + self._version.pre, + self._version.post, + self._version.dev, + self._version.local, + ) + + def __repr__(self): + return "<Version({0})>".format(repr(str(self))) + + def __str__(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + # Pre-release + if self._version.pre is not None: + parts.append("".join(str(x) for x in self._version.pre)) + + # Post-release + if self._version.post is not None: + parts.append(".post{0}".format(self._version.post[1])) + + # Development release + if self._version.dev is not None: + parts.append(".dev{0}".format(self._version.dev[1])) + + # Local version segment + if self._version.local is not None: + parts.append( + "+{0}".format(".".join(str(x) for x in self._version.local)) + ) + + return "".join(parts) + + @property + def public(self): + return str(self).split("+", 1)[0] + + @property + def base_version(self): + parts = [] + + # Epoch + if self._version.epoch != 0: + parts.append("{0}!".format(self._version.epoch)) + + # Release segment + parts.append(".".join(str(x) for x in self._version.release)) + + return "".join(parts) + + @property + def local(self): + version_string = str(self) + if "+" in version_string: + return version_string.split("+", 1)[1] + + @property + def is_prerelease(self): + return bool(self._version.dev or self._version.pre) + + @property + def is_postrelease(self): + return bool(self._version.post) + + +def _parse_letter_version(letter, number): + if letter: + # We consider there to be an implicit 0 in a pre-release if there is + # not a numeral associated with it. + if number is None: + number = 0 + + # We normalize any letters to their lower case form + letter = letter.lower() + + # We consider some words to be alternate spellings of other words and + # in those cases we want to normalize the spellings to our preferred + # spelling. + if letter == "alpha": + letter = "a" + elif letter == "beta": + letter = "b" + elif letter in ["c", "pre", "preview"]: + letter = "rc" + elif letter in ["rev", "r"]: + letter = "post" + + return letter, int(number) + if not letter and number: + # We assume if we are given a number, but we are not given a letter + # then this is using the implicit post release syntax (e.g. 1.0-1) + letter = "post" + + return letter, int(number) + + +_local_version_seperators = re.compile(r"[\._-]") + + +def _parse_local_version(local): + """ + Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve"). + """ + if local is not None: + return tuple( + part.lower() if not part.isdigit() else int(part) + for part in _local_version_seperators.split(local) + ) + + +def _cmpkey(epoch, release, pre, post, dev, local): + # When we compare a release version, we want to compare it with all of the + # trailing zeros removed. So we'll use a reverse the list, drop all the now + # leading zeros until we come to something non zero, then take the rest + # re-reverse it back into the correct order and make it a tuple and use + # that for our sorting key. + release = tuple( + reversed(list( + itertools.dropwhile( + lambda x: x == 0, + reversed(release), + ) + )) + ) + + # We need to "trick" the sorting algorithm to put 1.0.dev0 before 1.0a0. + # We'll do this by abusing the pre segment, but we _only_ want to do this + # if there is not a pre or a post segment. If we have one of those then + # the normal sorting rules will handle this case correctly. + if pre is None and post is None and dev is not None: + pre = -Infinity + # Versions without a pre-release (except as noted above) should sort after + # those with one. + elif pre is None: + pre = Infinity + + # Versions without a post segment should sort before those with one. + if post is None: + post = -Infinity + + # Versions without a development segment should sort after those with one. + if dev is None: + dev = Infinity + + if local is None: + # Versions without a local segment should sort before those with one. + local = -Infinity + else: + # Versions with a local segment need that segment parsed to implement + # the sorting rules in PEP440. + # - Alpha numeric segments sort before numeric segments + # - Alpha numeric segments sort lexicographically + # - Numeric segments sort numerically + # - Shorter versions sort before longer versions when the prefixes + # match exactly + local = tuple( + (i, "") if isinstance(i, int) else (-Infinity, i) + for i in local + ) + + return epoch, release, pre, post, dev, local diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py new file mode 100644 index 000000000..a21224359 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/pyparsing.py @@ -0,0 +1,5696 @@ +# module pyparsing.py +# +# Copyright (c) 2003-2016 Paul T. McGuire +# +# 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. +# + +__doc__ = \ +""" +pyparsing module - Classes and methods to define and execute parsing grammars + +The pyparsing module is an alternative approach to creating and executing simple grammars, +vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you +don't need to learn a new syntax for defining grammars or matching expressions - the parsing module +provides a library of classes that you use to construct the grammar directly in Python. + +Here is a program to parse "Hello, World!" (or any greeting of the form +C{"<salutation>, <addressee>!"}), built up using L{Word}, L{Literal}, and L{And} elements +(L{'+'<ParserElement.__add__>} operator gives L{And} expressions, strings are auto-converted to +L{Literal} expressions):: + + from pyparsing import Word, alphas + + # define grammar of a greeting + greet = Word(alphas) + "," + Word(alphas) + "!" + + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + +The program outputs the following:: + + Hello, World! -> ['Hello', ',', 'World', '!'] + +The Python representation of the grammar is quite readable, owing to the self-explanatory +class names, and the use of '+', '|' and '^' operators. + +The L{ParseResults} object returned from L{ParserElement.parseString<ParserElement.parseString>} can be accessed as a nested list, a dictionary, or an +object with named attributes. + +The pyparsing module handles some of the problems that are typically vexing when writing text parsers: + - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) + - quoted strings + - embedded comments +""" + +__version__ = "2.1.10" +__versionTime__ = "07 Oct 2016 01:31 UTC" +__author__ = "Paul McGuire <ptmcg@users.sourceforge.net>" + +import string +from weakref import ref as wkref +import copy +import sys +import warnings +import re +import sre_constants +import collections +import pprint +import traceback +import types +from datetime import datetime + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +#~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) + +__all__ = [ +'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', +'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', +'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', +'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', +'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', +'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', +'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', +'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', +'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', +'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'hexnums', +'htmlComment', 'javaStyleComment', 'line', 'lineEnd', 'lineStart', 'lineno', +'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', +'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', +'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', +'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', +'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', +'indentedBlock', 'originalTextFor', 'ungroup', 'infixNotation','locatedExpr', 'withClass', +'CloseMatch', 'tokenMap', 'pyparsing_common', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + _ustr = str + + # build list of single arg builtins, that can be used as parse actions + singleArgBuiltins = [sum, len, sorted, reversed, list, tuple, set, any, all, min, max] + +else: + _MAX_INT = sys.maxint + range = xrange + + def _ustr(obj): + """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries + str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It + then < returns the unicode object | encodes it with the default encoding | ... >. + """ + if isinstance(obj,unicode): + return obj + + try: + # If this works, then _ustr(obj) has the same behaviour as str(obj), so + # it won't break any existing code. + return str(obj) + + except UnicodeEncodeError: + # Else encode it + ret = unicode(obj).encode(sys.getdefaultencoding(), 'xmlcharrefreplace') + xmlcharref = Regex('&#\d+;') + xmlcharref.setParseAction(lambda t: '\\u' + hex(int(t[0][2:-1]))[2:]) + return xmlcharref.transformString(ret) + + # build list of single arg builtins, tolerant of Python version, that can be used as parse actions + singleArgBuiltins = [] + import __builtin__ + for fname in "sum len sorted reversed list tuple set any all min max".split(): + try: + singleArgBuiltins.append(getattr(__builtin__,fname)) + except AttributeError: + continue + +_generatorType = type((y for y in range(1))) + +def _xml_escape(data): + """Escape &, <, >, ", ', etc. in a string of data.""" + + # ampersand must be replaced first + from_symbols = '&><"\'' + to_symbols = ('&'+s+';' for s in "amp gt lt quot apos".split()) + for from_,to_ in zip(from_symbols, to_symbols): + data = data.replace(from_, to_) + return data + +class _Constants(object): + pass + +alphas = string.ascii_uppercase + string.ascii_lowercase +nums = "0123456789" +hexnums = nums + "ABCDEFabcdef" +alphanums = alphas + nums +_bslash = chr(92) +printables = "".join(c for c in string.printable if c not in string.whitespace) + +class ParseBaseException(Exception): + """base exception class for all parsing runtime exceptions""" + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, pstr, loc=0, msg=None, elem=None ): + self.loc = loc + if msg is None: + self.msg = pstr + self.pstr = "" + else: + self.msg = msg + self.pstr = pstr + self.parserElement = elem + self.args = (pstr, loc, msg) + + @classmethod + def _from_exception(cls, pe): + """ + internal factory method to simplify creating one type of ParseException + from another - avoids having __init__ signature conflicts among subclasses + """ + return cls(pe.pstr, pe.loc, pe.msg, pe.parserElement) + + def __getattr__( self, aname ): + """supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + """ + if( aname == "lineno" ): + return lineno( self.loc, self.pstr ) + elif( aname in ("col", "column") ): + return col( self.loc, self.pstr ) + elif( aname == "line" ): + return line( self.loc, self.pstr ) + else: + raise AttributeError(aname) + + def __str__( self ): + return "%s (at char %d), (line:%d, col:%d)" % \ + ( self.msg, self.loc, self.lineno, self.column ) + def __repr__( self ): + return _ustr(self) + def markInputline( self, markerString = ">!<" ): + """Extracts the exception line from the input string, and marks + the location of the exception with a special symbol. + """ + line_str = self.line + line_column = self.column - 1 + if markerString: + line_str = "".join((line_str[:line_column], + markerString, line_str[line_column:])) + return line_str.strip() + def __dir__(self): + return "lineno col line".split() + dir(type(self)) + +class ParseException(ParseBaseException): + """ + Exception thrown when parse expressions don't match class; + supported attributes by name are: + - lineno - returns the line number of the exception text + - col - returns the column number of the exception text + - line - returns the line containing the exception text + + Example:: + try: + Word(nums).setName("integer").parseString("ABC") + except ParseException as pe: + print(pe) + print("column: {}".format(pe.col)) + + prints:: + Expected integer (at char 0), (line:1, col:1) + column: 1 + """ + pass + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like L{ParseFatalException}, but thrown internally when an + L{ErrorStop<And._ErrorStop>} ('-' operator) indicates that parsing is to stop + immediately because an unbacktrackable syntax error has been found""" + pass + +#~ class ReparseException(ParseBaseException): + #~ """Experimental class - parse actions can raise this exception to cause + #~ pyparsing to reparse the input string: + #~ - with a modified input string, and/or + #~ - with a modified start location + #~ Set the values of the ReparseException in the constructor, and raise the + #~ exception in a parse action to cause pyparsing to use the new string/location. + #~ Setting the values as None causes no change to be made. + #~ """ + #~ def __init_( self, newstring, restartLoc ): + #~ self.newParseText = newstring + #~ self.reparseLoc = restartLoc + +class RecursiveGrammarException(Exception): + """exception thrown by L{ParserElement.validate} if the grammar could be improperly recursive""" + def __init__( self, parseElementList ): + self.parseElementTrace = parseElementList + + def __str__( self ): + return "RecursiveGrammarException: %s" % self.parseElementTrace + +class _ParseResultsWithOffset(object): + def __init__(self,p1,p2): + self.tup = (p1,p2) + def __getitem__(self,i): + return self.tup[i] + def __repr__(self): + return repr(self.tup[0]) + def setOffset(self,i): + self.tup = (self.tup[0],i) + +class ParseResults(object): + """ + Structured parse results, to provide multiple means of access to the parsed data: + - as a list (C{len(results)}) + - by list index (C{results[0], results[1]}, etc.) + - by attribute (C{results.<resultsName>} - see L{ParserElement.setResultsName}) + + Example:: + integer = Word(nums) + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + # equivalent form: + # date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + # parseString returns a ParseResults object + result = date_str.parseString("1999/12/31") + + def test(s, fn=repr): + print("%s -> %s" % (s, fn(eval(s)))) + test("list(result)") + test("result[0]") + test("result['month']") + test("result.day") + test("'month' in result") + test("'minutes' in result") + test("result.dump()", str) + prints:: + list(result) -> ['1999', '/', '12', '/', '31'] + result[0] -> '1999' + result['month'] -> '12' + result.day -> '31' + 'month' in result -> True + 'minutes' in result -> False + result.dump() -> ['1999', '/', '12', '/', '31'] + - day: 31 + - month: 12 + - year: 1999 + """ + def __new__(cls, toklist=None, name=None, asList=True, modal=True ): + if isinstance(toklist, cls): + return toklist + retobj = object.__new__(cls) + retobj.__doinit = True + return retobj + + # Performance tuning: we construct a *lot* of these, so keep this + # constructor as small and fast as possible + def __init__( self, toklist=None, name=None, asList=True, modal=True, isinstance=isinstance ): + if self.__doinit: + self.__doinit = False + self.__name = None + self.__parent = None + self.__accumNames = {} + self.__asList = asList + self.__modal = modal + if toklist is None: + toklist = [] + if isinstance(toklist, list): + self.__toklist = toklist[:] + elif isinstance(toklist, _generatorType): + self.__toklist = list(toklist) + else: + self.__toklist = [toklist] + self.__tokdict = dict() + + if name is not None and name: + if not modal: + self.__accumNames[name] = 0 + if isinstance(name,int): + name = _ustr(name) # will always return a str, but use _ustr for consistency + self.__name = name + if not (isinstance(toklist, (type(None), basestring, list)) and toklist in (None,'',[])): + if isinstance(toklist,basestring): + toklist = [ toklist ] + if asList: + if isinstance(toklist,ParseResults): + self[name] = _ParseResultsWithOffset(toklist.copy(),0) + else: + self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) + self[name].__name = name + else: + try: + self[name] = toklist[0] + except (KeyError,TypeError,IndexError): + self[name] = toklist + + def __getitem__( self, i ): + if isinstance( i, (int,slice) ): + return self.__toklist[i] + else: + if i not in self.__accumNames: + return self.__tokdict[i][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[i] ]) + + def __setitem__( self, k, v, isinstance=isinstance ): + if isinstance(v,_ParseResultsWithOffset): + self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] + sub = v[0] + elif isinstance(k,(int,slice)): + self.__toklist[k] = v + sub = v + else: + self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] + sub = v + if isinstance(sub,ParseResults): + sub.__parent = wkref(self) + + def __delitem__( self, i ): + if isinstance(i,(int,slice)): + mylen = len( self.__toklist ) + del self.__toklist[i] + + # convert int to slice + if isinstance(i, int): + if i < 0: + i += mylen + i = slice(i, i+1) + # get removed indices + removed = list(range(*i.indices(mylen))) + removed.reverse() + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for j in removed: + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) + else: + del self.__tokdict[i] + + def __contains__( self, k ): + return k in self.__tokdict + + def __len__( self ): return len( self.__toklist ) + def __bool__(self): return ( not not self.__toklist ) + __nonzero__ = __bool__ + def __iter__( self ): return iter( self.__toklist ) + def __reversed__( self ): return iter( self.__toklist[::-1] ) + def _iterkeys( self ): + if hasattr(self.__tokdict, "iterkeys"): + return self.__tokdict.iterkeys() + else: + return iter(self.__tokdict) + + def _itervalues( self ): + return (self[k] for k in self._iterkeys()) + + def _iteritems( self ): + return ((k, self[k]) for k in self._iterkeys()) + + if PY_3: + keys = _iterkeys + """Returns an iterator of all named result keys (Python 3.x only).""" + + values = _itervalues + """Returns an iterator of all named result values (Python 3.x only).""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples (Python 3.x only).""" + + else: + iterkeys = _iterkeys + """Returns an iterator of all named result keys (Python 2.x only).""" + + itervalues = _itervalues + """Returns an iterator of all named result values (Python 2.x only).""" + + iteritems = _iteritems + """Returns an iterator of all named result key-value tuples (Python 2.x only).""" + + def keys( self ): + """Returns all named result keys (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iterkeys()) + + def values( self ): + """Returns all named result values (as a list in Python 2.x, as an iterator in Python 3.x).""" + return list(self.itervalues()) + + def items( self ): + """Returns all named result key-values (as a list of tuples in Python 2.x, as an iterator in Python 3.x).""" + return list(self.iteritems()) + + def haskeys( self ): + """Since keys() returns an iterator, this method is helpful in bypassing + code that looks for the existence of any defined results names.""" + return bool(self.__tokdict) + + def pop( self, *args, **kwargs): + """ + Removes and returns item at specified index (default=C{last}). + Supports both C{list} and C{dict} semantics for C{pop()}. If passed no + argument or an integer argument, it will use C{list} semantics + and pop tokens from the list of parsed tokens. If passed a + non-integer argument (most likely a string), it will use C{dict} + semantics and pop the corresponding value from any defined + results names. A second default return value argument is + supported, just as in C{dict.pop()}. + + Example:: + def remove_first(tokens): + tokens.pop(0) + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + print(OneOrMore(Word(nums)).addParseAction(remove_first).parseString("0 123 321")) # -> ['123', '321'] + + label = Word(alphas) + patt = label("LABEL") + OneOrMore(Word(nums)) + print(patt.parseString("AAB 123 321").dump()) + + # Use pop() in a parse action to remove named result (note that corresponding value is not + # removed from list form of results) + def remove_LABEL(tokens): + tokens.pop("LABEL") + return tokens + patt.addParseAction(remove_LABEL) + print(patt.parseString("AAB 123 321").dump()) + prints:: + ['AAB', '123', '321'] + - LABEL: AAB + + ['AAB', '123', '321'] + """ + if not args: + args = [-1] + for k,v in kwargs.items(): + if k == 'default': + args = (args[0], v) + else: + raise TypeError("pop() got an unexpected keyword argument '%s'" % k) + if (isinstance(args[0], int) or + len(args) == 1 or + args[0] in self): + index = args[0] + ret = self[index] + del self[index] + return ret + else: + defaultvalue = args[1] + return defaultvalue + + def get(self, key, defaultValue=None): + """ + Returns named result matching the given key, or if there is no + such name, then returns the given C{defaultValue} or C{None} if no + C{defaultValue} is specified. + + Similar to C{dict.get()}. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString("1999/12/31") + print(result.get("year")) # -> '1999' + print(result.get("hour", "not specified")) # -> 'not specified' + print(result.get("hour")) # -> None + """ + if key in self: + return self[key] + else: + return defaultValue + + def insert( self, index, insStr ): + """ + Inserts new element at location index in the list of parsed tokens. + + Similar to C{list.insert()}. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to insert the parse location in the front of the parsed results + def insert_locn(locn, tokens): + tokens.insert(0, locn) + print(OneOrMore(Word(nums)).addParseAction(insert_locn).parseString("0 123 321")) # -> [0, '0', '123', '321'] + """ + self.__toklist.insert(index, insStr) + # fixup indices in token dictionary + for name,occurrences in self.__tokdict.items(): + for k, (value, position) in enumerate(occurrences): + occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) + + def append( self, item ): + """ + Add single element to end of ParseResults list of elements. + + Example:: + print(OneOrMore(Word(nums)).parseString("0 123 321")) # -> ['0', '123', '321'] + + # use a parse action to compute the sum of the parsed integers, and add it to the end + def append_sum(tokens): + tokens.append(sum(map(int, tokens))) + print(OneOrMore(Word(nums)).addParseAction(append_sum).parseString("0 123 321")) # -> ['0', '123', '321', 444] + """ + self.__toklist.append(item) + + def extend( self, itemseq ): + """ + Add sequence of elements to end of ParseResults list of elements. + + Example:: + patt = OneOrMore(Word(alphas)) + + # use a parse action to append the reverse of the matched strings, to make a palindrome + def make_palindrome(tokens): + tokens.extend(reversed([t[::-1] for t in tokens])) + return ''.join(tokens) + print(patt.addParseAction(make_palindrome).parseString("lskdj sdlkjf lksd")) # -> 'lskdjsdlkjflksddsklfjkldsjdksl' + """ + if isinstance(itemseq, ParseResults): + self += itemseq + else: + self.__toklist.extend(itemseq) + + def clear( self ): + """ + Clear all elements and results names. + """ + del self.__toklist[:] + self.__tokdict.clear() + + def __getattr__( self, name ): + try: + return self[name] + except KeyError: + return "" + + if name in self.__tokdict: + if name not in self.__accumNames: + return self.__tokdict[name][-1][0] + else: + return ParseResults([ v[0] for v in self.__tokdict[name] ]) + else: + return "" + + def __add__( self, other ): + ret = self.copy() + ret += other + return ret + + def __iadd__( self, other ): + if other.__tokdict: + offset = len(self.__toklist) + addoffset = lambda a: offset if a<0 else a+offset + otheritems = other.__tokdict.items() + otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) + for (k,vlist) in otheritems for v in vlist] + for k,v in otherdictitems: + self[k] = v + if isinstance(v[0],ParseResults): + v[0].__parent = wkref(self) + + self.__toklist += other.__toklist + self.__accumNames.update( other.__accumNames ) + return self + + def __radd__(self, other): + if isinstance(other,int) and other == 0: + # useful for merging many ParseResults using sum() builtin + return self.copy() + else: + # this may raise a TypeError - so be it + return other + self + + def __repr__( self ): + return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) + + def __str__( self ): + return '[' + ', '.join(_ustr(i) if isinstance(i, ParseResults) else repr(i) for i in self.__toklist) + ']' + + def _asStringList( self, sep='' ): + out = [] + for item in self.__toklist: + if out and sep: + out.append(sep) + if isinstance( item, ParseResults ): + out += item._asStringList() + else: + out.append( _ustr(item) ) + return out + + def asList( self ): + """ + Returns the parse results as a nested list of matching tokens, all converted to strings. + + Example:: + patt = OneOrMore(Word(alphas)) + result = patt.parseString("sldkj lsdkj sldkj") + # even though the result prints in string-like form, it is actually a pyparsing ParseResults + print(type(result), result) # -> <class 'pyparsing.ParseResults'> ['sldkj', 'lsdkj', 'sldkj'] + + # Use asList() to create an actual list + result_list = result.asList() + print(type(result_list), result_list) # -> <class 'list'> ['sldkj', 'lsdkj', 'sldkj'] + """ + return [res.asList() if isinstance(res,ParseResults) else res for res in self.__toklist] + + def asDict( self ): + """ + Returns the named parse results as a nested dictionary. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(type(result), repr(result)) # -> <class 'pyparsing.ParseResults'> (['12', '/', '31', '/', '1999'], {'day': [('1999', 4)], 'year': [('12', 0)], 'month': [('31', 2)]}) + + result_dict = result.asDict() + print(type(result_dict), repr(result_dict)) # -> <class 'dict'> {'day': '1999', 'year': '12', 'month': '31'} + + # even though a ParseResults supports dict-like access, sometime you just need to have a dict + import json + print(json.dumps(result)) # -> Exception: TypeError: ... is not JSON serializable + print(json.dumps(result.asDict())) # -> {"month": "31", "day": "1999", "year": "12"} + """ + if PY_3: + item_fn = self.items + else: + item_fn = self.iteritems + + def toItem(obj): + if isinstance(obj, ParseResults): + if obj.haskeys(): + return obj.asDict() + else: + return [toItem(v) for v in obj] + else: + return obj + + return dict((k,toItem(v)) for k,v in item_fn()) + + def copy( self ): + """ + Returns a new copy of a C{ParseResults} object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = self.__tokdict.copy() + ret.__parent = self.__parent + ret.__accumNames.update( self.__accumNames ) + ret.__name = self.__name + return ret + + def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): + """ + (Deprecated) Returns the parse results as XML. Tags are created for tokens and lists that have defined results names. + """ + nl = "\n" + out = [] + namedItems = dict((v[1],k) for (k,vlist) in self.__tokdict.items() + for v in vlist) + nextLevelIndent = indent + " " + + # collapse out indents if formatting is not desired + if not formatted: + indent = "" + nextLevelIndent = "" + nl = "" + + selfTag = None + if doctag is not None: + selfTag = doctag + else: + if self.__name: + selfTag = self.__name + + if not selfTag: + if namedItemsOnly: + return "" + else: + selfTag = "ITEM" + + out += [ nl, indent, "<", selfTag, ">" ] + + for i,res in enumerate(self.__toklist): + if isinstance(res,ParseResults): + if i in namedItems: + out += [ res.asXML(namedItems[i], + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + out += [ res.asXML(None, + namedItemsOnly and doctag is None, + nextLevelIndent, + formatted)] + else: + # individual token, see if there is a name for it + resTag = None + if i in namedItems: + resTag = namedItems[i] + if not resTag: + if namedItemsOnly: + continue + else: + resTag = "ITEM" + xmlBodyText = _xml_escape(_ustr(res)) + out += [ nl, nextLevelIndent, "<", resTag, ">", + xmlBodyText, + "</", resTag, ">" ] + + out += [ nl, indent, "</", selfTag, ">" ] + return "".join(out) + + def __lookup(self,sub): + for k,vlist in self.__tokdict.items(): + for v,loc in vlist: + if sub is v: + return k + return None + + def getName(self): + """ + Returns the results name for this token expression. Useful when several + different expressions might match at a particular location. + + Example:: + integer = Word(nums) + ssn_expr = Regex(r"\d\d\d-\d\d-\d\d\d\d") + house_number_expr = Suppress('#') + Word(nums, alphanums) + user_data = (Group(house_number_expr)("house_number") + | Group(ssn_expr)("ssn") + | Group(integer)("age")) + user_info = OneOrMore(user_data) + + result = user_info.parseString("22 111-22-3333 #221B") + for item in result: + print(item.getName(), ':', item[0]) + prints:: + age : 22 + ssn : 111-22-3333 + house_number : 221B + """ + if self.__name: + return self.__name + elif self.__parent: + par = self.__parent() + if par: + return par.__lookup(self) + else: + return None + elif (len(self) == 1 and + len(self.__tokdict) == 1 and + next(iter(self.__tokdict.values()))[0][1] in (0,-1)): + return next(iter(self.__tokdict.keys())) + else: + return None + + def dump(self, indent='', depth=0, full=True): + """ + Diagnostic method for listing out the contents of a C{ParseResults}. + Accepts an optional C{indent} argument so that this string can be embedded + in a nested display of other data. + + Example:: + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + result = date_str.parseString('12/31/1999') + print(result.dump()) + prints:: + ['12', '/', '31', '/', '1999'] + - day: 1999 + - month: 31 + - year: 12 + """ + out = [] + NL = '\n' + out.append( indent+_ustr(self.asList()) ) + if full: + if self.haskeys(): + items = sorted((str(k), v) for k,v in self.items()) + for k,v in items: + if out: + out.append(NL) + out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) + if isinstance(v,ParseResults): + if v: + out.append( v.dump(indent,depth+1) ) + else: + out.append(_ustr(v)) + else: + out.append(repr(v)) + elif any(isinstance(vv,ParseResults) for vv in self): + v = self + for i,vv in enumerate(v): + if isinstance(vv,ParseResults): + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),vv.dump(indent,depth+1) )) + else: + out.append("\n%s%s[%d]:\n%s%s%s" % (indent,(' '*(depth)),i,indent,(' '*(depth+1)),_ustr(vv))) + + return "".join(out) + + def pprint(self, *args, **kwargs): + """ + Pretty-printer for parsed results as a list, using the C{pprint} module. + Accepts additional positional or keyword args as defined for the + C{pprint.pprint} method. (U{http://docs.python.org/3/library/pprint.html#pprint.pprint}) + + Example:: + ident = Word(alphas, alphanums) + num = Word(nums) + func = Forward() + term = ident | num | Group('(' + func + ')') + func <<= ident + Group(Optional(delimitedList(term))) + result = func.parseString("fna a,b,(fnb c,d,200),100") + result.pprint(width=40) + prints:: + ['fna', + ['a', + 'b', + ['(', 'fnb', ['c', 'd', '200'], ')'], + '100']] + """ + pprint.pprint(self.asList(), *args, **kwargs) + + # add support for pickle protocol + def __getstate__(self): + return ( self.__toklist, + ( self.__tokdict.copy(), + self.__parent is not None and self.__parent() or None, + self.__accumNames, + self.__name ) ) + + def __setstate__(self,state): + self.__toklist = state[0] + (self.__tokdict, + par, + inAccumNames, + self.__name) = state[1] + self.__accumNames = {} + self.__accumNames.update(inAccumNames) + if par is not None: + self.__parent = wkref(par) + else: + self.__parent = None + + def __getnewargs__(self): + return self.__toklist, self.__name, self.__asList, self.__modal + + def __dir__(self): + return (dir(type(self)) + list(self.keys())) + +collections.MutableMapping.register(ParseResults) + +def col (loc,strg): + """Returns current column within a string, counting newlines as line separators. + The first column is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + s = strg + return 1 if 0<loc<len(s) and s[loc-1] == '\n' else loc - s.rfind("\n", 0, loc) + +def lineno(loc,strg): + """Returns current line number within a string, counting newlines as line separators. + The first line is number 1. + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{ParserElement.parseString}<ParserElement.parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + """ + return strg.count("\n",0,loc) + 1 + +def line( loc, strg ): + """Returns the line of text containing loc within a string, counting newlines as line separators. + """ + lastCR = strg.rfind("\n", 0, loc) + nextCR = strg.find("\n", loc) + if nextCR >= 0: + return strg[lastCR+1:nextCR] + else: + return strg[lastCR+1:] + +def _defaultStartDebugAction( instring, loc, expr ): + print (("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) ))) + +def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): + print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) + +def _defaultExceptionDebugAction( instring, loc, expr, exc ): + print ("Exception raised:" + _ustr(exc)) + +def nullDebugAction(*args): + """'Do-nothing' debug action, to suppress debugging output during parsing.""" + pass + +# Only works on Python 3.x - nonlocal is toxic to Python 2 installs +#~ 'decorator to trim function calls to match the arity of the target' +#~ def _trim_arity(func, maxargs=3): + #~ if func in singleArgBuiltins: + #~ return lambda s,l,t: func(t) + #~ limit = 0 + #~ foundArity = False + #~ def wrapper(*args): + #~ nonlocal limit,foundArity + #~ while 1: + #~ try: + #~ ret = func(*args[limit:]) + #~ foundArity = True + #~ return ret + #~ except TypeError: + #~ if limit == maxargs or foundArity: + #~ raise + #~ limit += 1 + #~ continue + #~ return wrapper + +# this version is Python 2.x-3.x cross-compatible +'decorator to trim function calls to match the arity of the target' +def _trim_arity(func, maxargs=2): + if func in singleArgBuiltins: + return lambda s,l,t: func(t) + limit = [0] + foundArity = [False] + + # traceback return data structure changed in Py3.5 - normalize back to plain tuples + if system_version[:2] >= (3,5): + def extract_stack(limit=0): + # special handling for Python 3.5.0 - extra deep call stack by 1 + offset = -3 if system_version == (3,5,0) else -2 + frame_summary = traceback.extract_stack(limit=-offset+limit-1)[offset] + return [(frame_summary.filename, frame_summary.lineno)] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [(frame_summary.filename, frame_summary.lineno)] + else: + extract_stack = traceback.extract_stack + extract_tb = traceback.extract_tb + + # synthesize what would be returned by traceback.extract_stack at the call to + # user's parse action 'func', so that we don't incur call penalty at parse time + + LINE_DIFF = 6 + # IF ANY CODE CHANGES, EVEN JUST COMMENTS OR BLANK LINES, BETWEEN THE NEXT LINE AND + # THE CALL TO FUNC INSIDE WRAPPER, LINE_DIFF MUST BE MODIFIED!!!! + this_line = extract_stack(limit=2)[-1] + pa_call_line_synth = (this_line[0], this_line[1]+LINE_DIFF) + + def wrapper(*args): + while 1: + try: + ret = func(*args[limit[0]:]) + foundArity[0] = True + return ret + except TypeError: + # re-raise TypeErrors if they did not come from our arity testing + if foundArity[0]: + raise + else: + try: + tb = sys.exc_info()[-1] + if not extract_tb(tb, limit=2)[-1][:2] == pa_call_line_synth: + raise + finally: + del tb + + if limit[0] <= maxargs: + limit[0] += 1 + continue + raise + + # copy func name to wrapper for sensible debug output + func_name = "<parse action>" + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + wrapper.__name__ = func_name + + return wrapper + +class ParserElement(object): + """Abstract base level parser element class.""" + DEFAULT_WHITE_CHARS = " \n\t\r" + verbose_stacktrace = False + + @staticmethod + def setDefaultWhitespaceChars( chars ): + r""" + Overrides the default whitespace chars + + Example:: + # default whitespace chars are space, <TAB> and newline + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def', 'ghi', 'jkl'] + + # change to just treat newline as significant + ParserElement.setDefaultWhitespaceChars(" \t") + OneOrMore(Word(alphas)).parseString("abc def\nghi jkl") # -> ['abc', 'def'] + """ + ParserElement.DEFAULT_WHITE_CHARS = chars + + @staticmethod + def inlineLiteralsUsing(cls): + """ + Set class to be used for inclusion of string literals into a parser. + + Example:: + # default literal class used is Literal + integer = Word(nums) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + + # change to Suppress + ParserElement.inlineLiteralsUsing(Suppress) + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + + date_str.parseString("1999/12/31") # -> ['1999', '12', '31'] + """ + ParserElement._literalStringClass = cls + + def __init__( self, savelist=False ): + self.parseAction = list() + self.failAction = None + #~ self.name = "<unknown>" # don't define self.name, let subclasses try/except upcall + self.strRepr = None + self.resultsName = None + self.saveAsList = savelist + self.skipWhitespace = True + self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + self.copyDefaultWhiteChars = True + self.mayReturnEmpty = False # used when checking for left-recursion + self.keepTabs = False + self.ignoreExprs = list() + self.debug = False + self.streamlined = False + self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index + self.errmsg = "" + self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) + self.debugActions = ( None, None, None ) #custom debug actions + self.re = None + self.callPreparse = True # used to avoid redundant calls to preParse + self.callDuringTry = False + + def copy( self ): + """ + Make a copy of this C{ParserElement}. Useful for defining different parse actions + for the same parsing pattern, using copies of the original parse element. + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + integerK = integer.copy().addParseAction(lambda toks: toks[0]*1024) + Suppress("K") + integerM = integer.copy().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + + print(OneOrMore(integerK | integerM | integer).parseString("5K 100 640K 256M")) + prints:: + [5120, 100, 655360, 268435456] + Equivalent form of C{expr.copy()} is just C{expr()}:: + integerM = integer().addParseAction(lambda toks: toks[0]*1024*1024) + Suppress("M") + """ + cpy = copy.copy( self ) + cpy.parseAction = self.parseAction[:] + cpy.ignoreExprs = self.ignoreExprs[:] + if self.copyDefaultWhiteChars: + cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS + return cpy + + def setName( self, name ): + """ + Define name for this expression, makes debugging and exception messages clearer. + + Example:: + Word(nums).parseString("ABC") # -> Exception: Expected W:(0123...) (at char 0), (line:1, col:1) + Word(nums).setName("integer").parseString("ABC") # -> Exception: Expected integer (at char 0), (line:1, col:1) + """ + self.name = name + self.errmsg = "Expected " + self.name + if hasattr(self,"exception"): + self.exception.msg = self.errmsg + return self + + def setResultsName( self, name, listAllMatches=False ): + """ + Define name for referencing matching tokens as a nested attribute + of the returned parse results. + NOTE: this returns a *copy* of the original C{ParserElement} object; + this is so that the client can define a basic element, such as an + integer, and reference it in multiple places with different names. + + You can also set results names using the abbreviated syntax, + C{expr("name")} in place of C{expr.setResultsName("name")} - + see L{I{__call__}<__call__>}. + + Example:: + date_str = (integer.setResultsName("year") + '/' + + integer.setResultsName("month") + '/' + + integer.setResultsName("day")) + + # equivalent form: + date_str = integer("year") + '/' + integer("month") + '/' + integer("day") + """ + newself = self.copy() + if name.endswith("*"): + name = name[:-1] + listAllMatches=True + newself.resultsName = name + newself.modalResults = not listAllMatches + return newself + + def setBreak(self,breakFlag = True): + """Method to invoke the Python pdb debugger when this element is + about to be parsed. Set C{breakFlag} to True to enable, False to + disable. + """ + if breakFlag: + _parseMethod = self._parse + def breaker(instring, loc, doActions=True, callPreParse=True): + import pdb + pdb.set_trace() + return _parseMethod( instring, loc, doActions, callPreParse ) + breaker._originalParseMethod = _parseMethod + self._parse = breaker + else: + if hasattr(self._parse,"_originalParseMethod"): + self._parse = self._parse._originalParseMethod + return self + + def setParseAction( self, *fns, **kwargs ): + """ + Define action to perform when successfully matching parse element definition. + Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, + C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: + - s = the original string being parsed (see note below) + - loc = the location of the matching substring + - toks = a list of the matched tokens, packaged as a C{L{ParseResults}} object + If the functions in fns modify the tokens, they can return them as the return + value from fn, and the modified list of tokens will replace the original. + Otherwise, fn does not need to return any value. + + Optional keyword arguments: + - callDuringTry = (default=C{False}) indicate if parse action should be run during lookaheads and alternate testing + + Note: the default parsing behavior is to expand tabs in the input string + before starting the parsing process. See L{I{parseString}<parseString>} for more information + on parsing strings containing C{<TAB>}s, and suggested methods to maintain a + consistent view of the parsed string, the parse location, and line and column + positions within the parsed string. + + Example:: + integer = Word(nums) + date_str = integer + '/' + integer + '/' + integer + + date_str.parseString("1999/12/31") # -> ['1999', '/', '12', '/', '31'] + + # use parse action to convert to ints at parse time + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + date_str = integer + '/' + integer + '/' + integer + + # note that integer fields are now ints, not strings + date_str.parseString("1999/12/31") # -> [1999, '/', 12, '/', 31] + """ + self.parseAction = list(map(_trim_arity, list(fns))) + self.callDuringTry = kwargs.get("callDuringTry", False) + return self + + def addParseAction( self, *fns, **kwargs ): + """ + Add parse action to expression's list of parse actions. See L{I{setParseAction}<setParseAction>}. + + See examples in L{I{copy}<copy>}. + """ + self.parseAction += list(map(_trim_arity, list(fns))) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def addCondition(self, *fns, **kwargs): + """Add a boolean predicate function to expression's list of parse actions. See + L{I{setParseAction}<setParseAction>} for function call signatures. Unlike C{setParseAction}, + functions passed to C{addCondition} need to return boolean success/fail of the condition. + + Optional keyword arguments: + - message = define a custom message to be used in the raised exception + - fatal = if True, will raise ParseFatalException to stop parsing immediately; otherwise will raise ParseException + + Example:: + integer = Word(nums).setParseAction(lambda toks: int(toks[0])) + year_int = integer.copy() + year_int.addCondition(lambda toks: toks[0] >= 2000, message="Only support years 2000 and later") + date_str = year_int + '/' + integer + '/' + integer + + result = date_str.parseString("1999/12/31") # -> Exception: Only support years 2000 and later (at char 0), (line:1, col:1) + """ + msg = kwargs.get("message", "failed user-defined condition") + exc_type = ParseFatalException if kwargs.get("fatal", False) else ParseException + for fn in fns: + def pa(s,l,t): + if not bool(_trim_arity(fn)(s,l,t)): + raise exc_type(s,l,msg) + self.parseAction.append(pa) + self.callDuringTry = self.callDuringTry or kwargs.get("callDuringTry", False) + return self + + def setFailAction( self, fn ): + """Define action to perform if parsing fails at this expression. + Fail acton fn is a callable function that takes the arguments + C{fn(s,loc,expr,err)} where: + - s = string being parsed + - loc = location where expression match was attempted and failed + - expr = the parse expression that failed + - err = the exception thrown + The function returns no value. It may throw C{L{ParseFatalException}} + if it is desired to stop parsing immediately.""" + self.failAction = fn + return self + + def _skipIgnorables( self, instring, loc ): + exprsFound = True + while exprsFound: + exprsFound = False + for e in self.ignoreExprs: + try: + while 1: + loc,dummy = e._parse( instring, loc ) + exprsFound = True + except ParseException: + pass + return loc + + def preParse( self, instring, loc ): + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + + if self.skipWhitespace: + wt = self.whiteChars + instrlen = len(instring) + while loc < instrlen and instring[loc] in wt: + loc += 1 + + return loc + + def parseImpl( self, instring, loc, doActions=True ): + return loc, [] + + def postParse( self, instring, loc, tokenlist ): + return tokenlist + + #~ @profile + def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): + debugging = ( self.debug ) #and doActions ) + + if debugging or self.failAction: + #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) + if (self.debugActions[0] ): + self.debugActions[0]( instring, loc, self ) + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + try: + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + except ParseBaseException as err: + #~ print ("Exception raised:", err) + if self.debugActions[2]: + self.debugActions[2]( instring, tokensStart, self, err ) + if self.failAction: + self.failAction( instring, tokensStart, self, err ) + raise + else: + if callPreParse and self.callPreparse: + preloc = self.preParse( instring, loc ) + else: + preloc = loc + tokensStart = preloc + if self.mayIndexError or loc >= len(instring): + try: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + except IndexError: + raise ParseException( instring, len(instring), self.errmsg, self ) + else: + loc,tokens = self.parseImpl( instring, preloc, doActions ) + + tokens = self.postParse( instring, loc, tokens ) + + retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) + if self.parseAction and (doActions or self.callDuringTry): + if debugging: + try: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + except ParseBaseException as err: + #~ print "Exception raised in user parse action:", err + if (self.debugActions[2] ): + self.debugActions[2]( instring, tokensStart, self, err ) + raise + else: + for fn in self.parseAction: + tokens = fn( instring, tokensStart, retTokens ) + if tokens is not None: + retTokens = ParseResults( tokens, + self.resultsName, + asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), + modal=self.modalResults ) + + if debugging: + #~ print ("Matched",self,"->",retTokens.asList()) + if (self.debugActions[1] ): + self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) + + return loc, retTokens + + def tryParse( self, instring, loc ): + try: + return self._parse( instring, loc, doActions=False )[0] + except ParseFatalException: + raise ParseException( instring, loc, self.errmsg, self) + + def canParseNext(self, instring, loc): + try: + self.tryParse(instring, loc) + except (ParseException, IndexError): + return False + else: + return True + + class _UnboundedCache(object): + def __init__(self): + cache = {} + self.not_in_cache = not_in_cache = object() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + if _OrderedDict is not None: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = _OrderedDict() + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.popitem(False) + + def clear(self): + cache.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + else: + class _FifoCache(object): + def __init__(self, size): + self.not_in_cache = not_in_cache = object() + + cache = {} + key_fifo = collections.deque([], size) + + def get(self, key): + return cache.get(key, not_in_cache) + + def set(self, key, value): + cache[key] = value + if len(cache) > size: + cache.pop(key_fifo.popleft(), None) + key_fifo.append(key) + + def clear(self): + cache.clear() + key_fifo.clear() + + self.get = types.MethodType(get, self) + self.set = types.MethodType(set, self) + self.clear = types.MethodType(clear, self) + + # argument cache for optimizing repeated calls when backtracking through recursive expressions + packrat_cache = {} # this is set later by enabledPackrat(); this is here so that resetCache() doesn't fail + packrat_cache_lock = RLock() + packrat_cache_stats = [0, 0] + + # this method gets repeatedly called during backtracking with the same arguments - + # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression + def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): + HIT, MISS = 0, 1 + lookup = (self, instring, loc, callPreParse, doActions) + with ParserElement.packrat_cache_lock: + cache = ParserElement.packrat_cache + value = cache.get(lookup) + if value is cache.not_in_cache: + ParserElement.packrat_cache_stats[MISS] += 1 + try: + value = self._parseNoCache(instring, loc, doActions, callPreParse) + except ParseBaseException as pe: + # cache a copy of the exception, without the traceback + cache.set(lookup, pe.__class__(*pe.args)) + raise + else: + cache.set(lookup, (value[0], value[1].copy())) + return value + else: + ParserElement.packrat_cache_stats[HIT] += 1 + if isinstance(value, Exception): + raise value + return (value[0], value[1].copy()) + + _parse = _parseNoCache + + @staticmethod + def resetCache(): + ParserElement.packrat_cache.clear() + ParserElement.packrat_cache_stats[:] = [0] * len(ParserElement.packrat_cache_stats) + + _packratEnabled = False + @staticmethod + def enablePackrat(cache_size_limit=128): + """Enables "packrat" parsing, which adds memoizing to the parsing logic. + Repeated parse attempts at the same string location (which happens + often in many complex grammars) can immediately return a cached value, + instead of re-executing parsing/validating code. Memoizing is done of + both valid results and parsing exceptions. + + Parameters: + - cache_size_limit - (default=C{128}) - if an integer value is provided + will limit the size of the packrat cache; if None is passed, then + the cache size will be unbounded; if 0 is passed, the cache will + be effectively disabled. + + This speedup may break existing programs that use parse actions that + have side-effects. For this reason, packrat parsing is disabled when + you first import pyparsing. To activate the packrat feature, your + program must call the class method C{ParserElement.enablePackrat()}. If + your program uses C{psyco} to "compile as you go", you must call + C{enablePackrat} before calling C{psyco.full()}. If you do not do this, + Python will crash. For best results, call C{enablePackrat()} immediately + after importing pyparsing. + + Example:: + import pyparsing + pyparsing.ParserElement.enablePackrat() + """ + if not ParserElement._packratEnabled: + ParserElement._packratEnabled = True + if cache_size_limit is None: + ParserElement.packrat_cache = ParserElement._UnboundedCache() + else: + ParserElement.packrat_cache = ParserElement._FifoCache(cache_size_limit) + ParserElement._parse = ParserElement._parseCache + + def parseString( self, instring, parseAll=False ): + """ + Execute the parse expression with the given string. + This is the main interface to the client code, once the complete + expression has been built. + + If you want the grammar to require that the entire input string be + successfully parsed, then set C{parseAll} to True (equivalent to ending + the grammar with C{L{StringEnd()}}). + + Note: C{parseString} implicitly calls C{expandtabs()} on the input string, + in order to report proper column numbers in parse actions. + If the input string contains tabs and + the grammar uses parse actions that use the C{loc} argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + - calling C{parseWithTabs} on your grammar before calling C{parseString} + (see L{I{parseWithTabs}<parseWithTabs>}) + - define your parse action using the full C{(s,loc,toks)} signature, and + reference the input string using the parse action's C{s} argument + - explictly expand the tabs in your input string before calling + C{parseString} + + Example:: + Word('a').parseString('aaaaabaaa') # -> ['aaaaa'] + Word('a').parseString('aaaaabaaa', parseAll=True) # -> Exception: Expected end of text + """ + ParserElement.resetCache() + if not self.streamlined: + self.streamline() + #~ self.saveAsList = True + for e in self.ignoreExprs: + e.streamline() + if not self.keepTabs: + instring = instring.expandtabs() + try: + loc, tokens = self._parse( instring, 0 ) + if parseAll: + loc = self.preParse( instring, loc ) + se = Empty() + StringEnd() + se._parse( instring, loc ) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + else: + return tokens + + def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): + """ + Scan the input string for expression matches. Each match will return the + matching tokens, start location, and end location. May be called with optional + C{maxMatches} argument, to clip scanning after 'n' matches are found. If + C{overlap} is specified, then overlapping matches will be reported. + + Note that the start and end locations are reported relative to the string + being parsed. See L{I{parseString}<parseString>} for more information on parsing + strings with embedded tabs. + + Example:: + source = "sldjf123lsdjjkf345sldkjf879lkjsfd987" + print(source) + for tokens,start,end in Word(alphas).scanString(source): + print(' '*start + '^'*(end-start)) + print(' '*start + tokens[0]) + + prints:: + + sldjf123lsdjjkf345sldkjf879lkjsfd987 + ^^^^^ + sldjf + ^^^^^^^ + lsdjjkf + ^^^^^^ + sldkjf + ^^^^^^ + lkjsfd + """ + if not self.streamlined: + self.streamline() + for e in self.ignoreExprs: + e.streamline() + + if not self.keepTabs: + instring = _ustr(instring).expandtabs() + instrlen = len(instring) + loc = 0 + preparseFn = self.preParse + parseFn = self._parse + ParserElement.resetCache() + matches = 0 + try: + while loc <= instrlen and matches < maxMatches: + try: + preloc = preparseFn( instring, loc ) + nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) + except ParseException: + loc = preloc+1 + else: + if nextLoc > loc: + matches += 1 + yield tokens, preloc, nextLoc + if overlap: + nextloc = preparseFn( instring, loc ) + if nextloc > loc: + loc = nextLoc + else: + loc += 1 + else: + loc = nextLoc + else: + loc = preloc+1 + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def transformString( self, instring ): + """ + Extension to C{L{scanString}}, to modify matching text with modified tokens that may + be returned from a parse action. To use C{transformString}, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking C{transformString()} on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. C{transformString()} returns the resulting transformed string. + + Example:: + wd = Word(alphas) + wd.setParseAction(lambda toks: toks[0].title()) + + print(wd.transformString("now is the winter of our discontent made glorious summer by this sun of york.")) + Prints:: + Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York. + """ + out = [] + lastE = 0 + # force preservation of <TAB>s, to minimize unwanted transformation of string, and to + # keep string locs straight between transformString and scanString + self.keepTabs = True + try: + for t,s,e in self.scanString( instring ): + out.append( instring[lastE:s] ) + if t: + if isinstance(t,ParseResults): + out += t.asList() + elif isinstance(t,list): + out += t + else: + out.append(t) + lastE = e + out.append(instring[lastE:]) + out = [o for o in out if o] + return "".join(map(_ustr,_flatten(out))) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def searchString( self, instring, maxMatches=_MAX_INT ): + """ + Another extension to C{L{scanString}}, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + C{maxMatches} argument, to clip searching after 'n' matches are found. + + Example:: + # a capitalized word starts with an uppercase letter, followed by zero or more lowercase letters + cap_word = Word(alphas.upper(), alphas.lower()) + + print(cap_word.searchString("More than Iron, more than Lead, more than Gold I need Electricity")) + prints:: + ['More', 'Iron', 'Lead', 'Gold', 'I'] + """ + try: + return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def split(self, instring, maxsplit=_MAX_INT, includeSeparators=False): + """ + Generator method to split a string using the given expression as a separator. + May be called with optional C{maxsplit} argument, to limit the number of splits; + and the optional C{includeSeparators} argument (default=C{False}), if the separating + matching text should be included in the split results. + + Example:: + punc = oneOf(list(".,;:/-!?")) + print(list(punc.split("This, this?, this sentence, is badly punctuated!"))) + prints:: + ['This', ' this', '', ' this sentence', ' is badly punctuated', ''] + """ + splits = 0 + last = 0 + for t,s,e in self.scanString(instring, maxMatches=maxsplit): + yield instring[last:s] + if includeSeparators: + yield t[0] + last = e + yield instring[last:] + + def __add__(self, other ): + """ + Implementation of + operator - returns C{L{And}}. Adding strings to a ParserElement + converts them to L{Literal}s by default. + + Example:: + greet = Word(alphas) + "," + Word(alphas) + "!" + hello = "Hello, World!" + print (hello, "->", greet.parseString(hello)) + Prints:: + Hello, World! -> ['Hello', ',', 'World', '!'] + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, other ] ) + + def __radd__(self, other ): + """ + Implementation of + operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other + self + + def __sub__(self, other): + """ + Implementation of - operator, returns C{L{And}} with error stop + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return And( [ self, And._ErrorStop(), other ] ) + + def __rsub__(self, other ): + """ + Implementation of - operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other - self + + def __mul__(self,other): + """ + Implementation of * operator, allows use of C{expr * 3} in place of + C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer + tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples + may also include C{None} as in: + - C{expr*(n,None)} or C{expr*(n,)} is equivalent + to C{expr*n + L{ZeroOrMore}(expr)} + (read as "at least n instances of C{expr}") + - C{expr*(None,n)} is equivalent to C{expr*(0,n)} + (read as "0 to n instances of C{expr}") + - C{expr*(None,None)} is equivalent to C{L{ZeroOrMore}(expr)} + - C{expr*(1,None)} is equivalent to C{L{OneOrMore}(expr)} + + Note that C{expr*(None,n)} does not raise an exception if + more than n exprs exist in the input stream; that is, + C{expr*(None,n)} does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + C{expr*(None,n) + ~expr} + """ + if isinstance(other,int): + minElements, optElements = other,0 + elif isinstance(other,tuple): + other = (other + (None, None))[:2] + if other[0] is None: + other = (0, other[1]) + if isinstance(other[0],int) and other[1] is None: + if other[0] == 0: + return ZeroOrMore(self) + if other[0] == 1: + return OneOrMore(self) + else: + return self*other[0] + ZeroOrMore(self) + elif isinstance(other[0],int) and isinstance(other[1],int): + minElements, optElements = other + optElements -= minElements + else: + raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) + else: + raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) + + if minElements < 0: + raise ValueError("cannot multiply ParserElement by negative value") + if optElements < 0: + raise ValueError("second tuple value must be greater or equal to first tuple value") + if minElements == optElements == 0: + raise ValueError("cannot multiply ParserElement by 0 or (0,0)") + + if (optElements): + def makeOptionalList(n): + if n>1: + return Optional(self + makeOptionalList(n-1)) + else: + return Optional(self) + if minElements: + if minElements == 1: + ret = self + makeOptionalList(optElements) + else: + ret = And([self]*minElements) + makeOptionalList(optElements) + else: + ret = makeOptionalList(optElements) + else: + if minElements == 1: + ret = self + else: + ret = And([self]*minElements) + return ret + + def __rmul__(self, other): + return self.__mul__(other) + + def __or__(self, other ): + """ + Implementation of | operator - returns C{L{MatchFirst}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return MatchFirst( [ self, other ] ) + + def __ror__(self, other ): + """ + Implementation of | operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other | self + + def __xor__(self, other ): + """ + Implementation of ^ operator - returns C{L{Or}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Or( [ self, other ] ) + + def __rxor__(self, other ): + """ + Implementation of ^ operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other ^ self + + def __and__(self, other ): + """ + Implementation of & operator - returns C{L{Each}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return Each( [ self, other ] ) + + def __rand__(self, other ): + """ + Implementation of & operator when left operand is not a C{L{ParserElement}} + """ + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + if not isinstance( other, ParserElement ): + warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), + SyntaxWarning, stacklevel=2) + return None + return other & self + + def __invert__( self ): + """ + Implementation of ~ operator - returns C{L{NotAny}} + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for C{L{setResultsName}}, with C{listAllMatches=False}. + + If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be + passed as C{True}. + + If C{name} is omitted, same as calling C{L{copy}}. + + Example:: + # these are equivalent + userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") + userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") + """ + if name is not None: + return self.setResultsName(name) + else: + return self.copy() + + def suppress( self ): + """ + Suppresses the output of this C{ParserElement}; useful to keep punctuation from + cluttering up returned output. + """ + return Suppress( self ) + + def leaveWhitespace( self ): + """ + Disables the skipping of whitespace before matching the characters in the + C{ParserElement}'s defined pattern. This is normally only used internally by + the pyparsing module, but may be needed in some whitespace-sensitive grammars. + """ + self.skipWhitespace = False + return self + + def setWhitespaceChars( self, chars ): + """ + Overrides the default whitespace chars + """ + self.skipWhitespace = True + self.whiteChars = chars + self.copyDefaultWhiteChars = False + return self + + def parseWithTabs( self ): + """ + Overrides default behavior to expand C{<TAB>}s to spaces before parsing the input string. + Must be called before C{parseString} when the input grammar contains elements that + match C{<TAB>} characters. + """ + self.keepTabs = True + return self + + def ignore( self, other ): + """ + Define expression to be ignored (e.g., comments) while doing pattern + matching; may be called repeatedly, to define multiple comment or other + ignorable patterns. + + Example:: + patt = OneOrMore(Word(alphas)) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj'] + + patt.ignore(cStyleComment) + patt.parseString('ablaj /* comment */ lskjd') # -> ['ablaj', 'lskjd'] + """ + if isinstance(other, basestring): + other = Suppress(other) + + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + self.ignoreExprs.append(other) + else: + self.ignoreExprs.append( Suppress( other.copy() ) ) + return self + + def setDebugActions( self, startAction, successAction, exceptionAction ): + """ + Enable display of debugging messages while doing pattern matching. + """ + self.debugActions = (startAction or _defaultStartDebugAction, + successAction or _defaultSuccessDebugAction, + exceptionAction or _defaultExceptionDebugAction) + self.debug = True + return self + + def setDebug( self, flag=True ): + """ + Enable display of debugging messages while doing pattern matching. + Set C{flag} to True to enable, False to disable. + + Example:: + wd = Word(alphas).setName("alphaword") + integer = Word(nums).setName("numword") + term = wd | integer + + # turn on debugging for wd + wd.setDebug() + + OneOrMore(term).parseString("abc 123 xyz 890") + + prints:: + Match alphaword at loc 0(1,1) + Matched alphaword -> ['abc'] + Match alphaword at loc 3(1,4) + Exception raised:Expected alphaword (at char 4), (line:1, col:5) + Match alphaword at loc 7(1,8) + Matched alphaword -> ['xyz'] + Match alphaword at loc 11(1,12) + Exception raised:Expected alphaword (at char 12), (line:1, col:13) + Match alphaword at loc 15(1,16) + Exception raised:Expected alphaword (at char 15), (line:1, col:16) + + The output shown is that produced by the default debug actions - custom debug actions can be + specified using L{setDebugActions}. Prior to attempting + to match the C{wd} expression, the debugging message C{"Match <exprname> at loc <n>(<line>,<col>)"} + is shown. Then if the parse succeeds, a C{"Matched"} message is shown, or an C{"Exception raised"} + message is shown. Also note the use of L{setName} to assign a human-readable name to the expression, + which makes debugging and exception messages easier to understand - for instance, the default + name created for the C{Word} expression without calling C{setName} is C{"W:(ABCD...)"}. + """ + if flag: + self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) + else: + self.debug = False + return self + + def __str__( self ): + return self.name + + def __repr__( self ): + return _ustr(self) + + def streamline( self ): + self.streamlined = True + self.strRepr = None + return self + + def checkRecursion( self, parseElementList ): + pass + + def validate( self, validateTrace=[] ): + """ + Check defined expressions for valid structure, check for infinite recursive definitions. + """ + self.checkRecursion( [] ) + + def parseFile( self, file_or_filename, parseAll=False ): + """ + Execute the parse expression on the given file or filename. + If a filename is specified (instead of a file object), + the entire file is opened, read, and closed before parsing. + """ + try: + file_contents = file_or_filename.read() + except AttributeError: + with open(file_or_filename, "r") as f: + file_contents = f.read() + try: + return self.parseString(file_contents, parseAll) + except ParseBaseException as exc: + if ParserElement.verbose_stacktrace: + raise + else: + # catch and re-raise exception from here, clears out pyparsing internal stack trace + raise exc + + def __eq__(self,other): + if isinstance(other, ParserElement): + return self is other or vars(self) == vars(other) + elif isinstance(other, basestring): + return self.matches(other) + else: + return super(ParserElement,self)==other + + def __ne__(self,other): + return not (self == other) + + def __hash__(self): + return hash(id(self)) + + def __req__(self,other): + return self == other + + def __rne__(self,other): + return not (self == other) + + def matches(self, testString, parseAll=True): + """ + Method for quick testing of a parser against a test string. Good for simple + inline microtests of sub expressions while building up larger parser. + + Parameters: + - testString - to test against this expression for a match + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + + Example:: + expr = Word(nums) + assert expr.matches("100") + """ + try: + self.parseString(_ustr(testString), parseAll=parseAll) + return True + except ParseBaseException: + return False + + def runTests(self, tests, parseAll=True, comment='#', fullDump=True, printResults=True, failureTests=False): + """ + Execute the parse expression on a series of test strings, showing each + test, the parsed results or where the parse failed. Quick and easy way to + run a parse expression against a list of sample strings. + + Parameters: + - tests - a list of separate test strings, or a multiline string of test strings + - parseAll - (default=C{True}) - flag to pass to C{L{parseString}} when running tests + - comment - (default=C{'#'}) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default=C{True}) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default=C{True}) prints test output to stdout + - failureTests - (default=C{False}) indicates if these tests are expected to fail parsing + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if C{failureTests} is True), and the results contain a list of lines of each + test's output + + Example:: + number_expr = pyparsing_common.number.copy() + + result = number_expr.runTests(''' + # unsigned integer + 100 + # negative integer + -100 + # float with scientific notation + 6.02e23 + # integer with scientific notation + 1e-12 + ''') + print("Success" if result[0] else "Failed!") + + result = number_expr.runTests(''' + # stray character + 100Z + # missing leading digit before '.' + -.100 + # too many '.' + 3.14.159 + ''', failureTests=True) + print("Success" if result[0] else "Failed!") + prints:: + # unsigned integer + 100 + [100] + + # negative integer + -100 + [-100] + + # float with scientific notation + 6.02e23 + [6.02e+23] + + # integer with scientific notation + 1e-12 + [1e-12] + + Success + + # stray character + 100Z + ^ + FAIL: Expected end of text (at char 3), (line:1, col:4) + + # missing leading digit before '.' + -.100 + ^ + FAIL: Expected {real number with scientific notation | real number | signed integer} (at char 0), (line:1, col:1) + + # too many '.' + 3.14.159 + ^ + FAIL: Expected end of text (at char 4), (line:1, col:5) + + Success + + Each test string must be on a single line. If you want to test a string that spans multiple + lines, create a test like this:: + + expr.runTest(r"this is a test\\n of strings that spans \\n 3 lines") + + (Note that this is a raw string literal, you must include the leading 'r'.) + """ + if isinstance(tests, basestring): + tests = list(map(str.strip, tests.rstrip().splitlines())) + if isinstance(comment, basestring): + comment = Literal(comment) + allResults = [] + comments = [] + success = True + for t in tests: + if comment is not None and comment.matches(t, False) or comments and not t: + comments.append(t) + continue + if not t: + continue + out = ['\n'.join(comments), t] + comments = [] + try: + t = t.replace(r'\n','\n') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + except ParseBaseException as pe: + fatal = "(FATAL)" if isinstance(pe, ParseFatalException) else "" + if '\n' in t: + out.append(line(pe.loc, t)) + out.append(' '*(col(pe.loc,t)-1) + '^' + fatal) + else: + out.append(' '*pe.loc + '^' + fatal) + out.append("FAIL: " + str(pe)) + success = success and failureTests + result = pe + except Exception as exc: + out.append("FAIL-EXCEPTION: " + str(exc)) + success = success and failureTests + result = exc + + if printResults: + if fullDump: + out.append('') + print('\n'.join(out)) + + allResults.append((t, result)) + + return success, allResults + + +class Token(ParserElement): + """ + Abstract C{ParserElement} subclass, for defining atomic matching patterns. + """ + def __init__( self ): + super(Token,self).__init__( savelist=False ) + + +class Empty(Token): + """ + An empty token, will always match. + """ + def __init__( self ): + super(Empty,self).__init__() + self.name = "Empty" + self.mayReturnEmpty = True + self.mayIndexError = False + + +class NoMatch(Token): + """ + A token that will never match. + """ + def __init__( self ): + super(NoMatch,self).__init__() + self.name = "NoMatch" + self.mayReturnEmpty = True + self.mayIndexError = False + self.errmsg = "Unmatchable token" + + def parseImpl( self, instring, loc, doActions=True ): + raise ParseException(instring, loc, self.errmsg, self) + + +class Literal(Token): + """ + Token to exactly match a specified string. + + Example:: + Literal('blah').parseString('blah') # -> ['blah'] + Literal('blah').parseString('blahfooblah') # -> ['blah'] + Literal('blah').parseString('bla') # -> Exception: Expected "blah" + + For case-insensitive matching, use L{CaselessLiteral}. + + For keyword matching (force word break before and after the matched string), + use L{Keyword} or L{CaselessKeyword}. + """ + def __init__( self, matchString ): + super(Literal,self).__init__() + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Literal; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.__class__ = Empty + self.name = '"%s"' % _ustr(self.match) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + + # Performance tuning: this routine gets called a *lot* + # if this is a single character match string and the first character matches, + # short-circuit as quickly as possible, and avoid calling startswith + #~ @profile + def parseImpl( self, instring, loc, doActions=True ): + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) +_L = Literal +ParserElement._literalStringClass = Literal + +class Keyword(Token): + """ + Token to exactly match a specified string as a keyword, that is, it must be + immediately followed by a non-keyword character. Compare with C{L{Literal}}: + - C{Literal("if")} will match the leading C{'if'} in C{'ifAndOnlyIf'}. + - C{Keyword("if")} will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} + Accepts two optional constructor arguments in addition to the keyword string: + - C{identChars} is a string of characters that would be valid identifier characters, + defaulting to all alphanumerics + "_" and "$" + - C{caseless} allows case-insensitive matching, default is C{False}. + + Example:: + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use L{CaselessKeyword}. + """ + DEFAULT_KEYWORD_CHARS = alphanums+"_$" + + def __init__( self, matchString, identChars=None, caseless=False ): + super(Keyword,self).__init__() + if identChars is None: + identChars = Keyword.DEFAULT_KEYWORD_CHARS + self.match = matchString + self.matchLen = len(matchString) + try: + self.firstMatchChar = matchString[0] + except IndexError: + warnings.warn("null string passed to Keyword; use Empty() instead", + SyntaxWarning, stacklevel=2) + self.name = '"%s"' % self.match + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = False + self.mayIndexError = False + self.caseless = caseless + if caseless: + self.caselessmatch = matchString.upper() + identChars = identChars.upper() + self.identChars = set(identChars) + + def parseImpl( self, instring, loc, doActions=True ): + if self.caseless: + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and + (loc == 0 or instring[loc-1].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + else: + if (instring[loc] == self.firstMatchChar and + (self.matchLen==1 or instring.startswith(self.match,loc)) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and + (loc == 0 or instring[loc-1] not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + + def copy(self): + c = super(Keyword,self).copy() + c.identChars = Keyword.DEFAULT_KEYWORD_CHARS + return c + + @staticmethod + def setDefaultKeywordChars( chars ): + """Overrides the default Keyword chars + """ + Keyword.DEFAULT_KEYWORD_CHARS = chars + +class CaselessLiteral(Literal): + """ + Token to match a specified string, ignoring case of letters. + Note: the matched results will always be in the case of the given + match string, NOT the case of the input text. + + Example:: + OneOrMore(CaselessLiteral("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD', 'CMD'] + + (Contrast with example for L{CaselessKeyword}.) + """ + def __init__( self, matchString ): + super(CaselessLiteral,self).__init__( matchString.upper() ) + # Preserve the defining literal. + self.returnString = matchString + self.name = "'%s'" % self.returnString + self.errmsg = "Expected " + self.name + + def parseImpl( self, instring, loc, doActions=True ): + if instring[ loc:loc+self.matchLen ].upper() == self.match: + return loc+self.matchLen, self.returnString + raise ParseException(instring, loc, self.errmsg, self) + +class CaselessKeyword(Keyword): + """ + Caseless version of L{Keyword}. + + Example:: + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for L{CaselessLiteral}.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + + def parseImpl( self, instring, loc, doActions=True ): + if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and + (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): + return loc+self.matchLen, self.match + raise ParseException(instring, loc, self.errmsg, self) + +class CloseMatch(Token): + """ + A variation on L{Literal} which matches "close" matches, that is, + strings with at most 'n' mismatching characters. C{CloseMatch} takes parameters: + - C{match_string} - string to be matched + - C{maxMismatches} - (C{default=1}) maximum number of mismatches allowed to count as a match + + The results from a successful parse will contain the matched text from the input string and the following named results: + - C{mismatches} - a list of the positions within the match_string where mismatches were found + - C{original} - the original match_string used to compare against the input string + + If C{mismatches} is an empty list, then the match was an exact match. + + Example:: + patt = CloseMatch("ATCATCGAATGGA") + patt.parseString("ATCATCGAAXGGA") # -> (['ATCATCGAAXGGA'], {'mismatches': [[9]], 'original': ['ATCATCGAATGGA']}) + patt.parseString("ATCAXCGAAXGGA") # -> Exception: Expected 'ATCATCGAATGGA' (with up to 1 mismatches) (at char 0), (line:1, col:1) + + # exact match + patt.parseString("ATCATCGAATGGA") # -> (['ATCATCGAATGGA'], {'mismatches': [[]], 'original': ['ATCATCGAATGGA']}) + + # close match allowing up to 2 mismatches + patt = CloseMatch("ATCATCGAATGGA", maxMismatches=2) + patt.parseString("ATCAXCGAAXGGA") # -> (['ATCAXCGAAXGGA'], {'mismatches': [[4, 9]], 'original': ['ATCATCGAATGGA']}) + """ + def __init__(self, match_string, maxMismatches=1): + super(CloseMatch,self).__init__() + self.name = match_string + self.match_string = match_string + self.maxMismatches = maxMismatches + self.errmsg = "Expected %r (with up to %d mismatches)" % (self.match_string, self.maxMismatches) + self.mayIndexError = False + self.mayReturnEmpty = False + + def parseImpl( self, instring, loc, doActions=True ): + start = loc + instrlen = len(instring) + maxloc = start + len(self.match_string) + + if maxloc <= instrlen: + match_string = self.match_string + match_stringloc = 0 + mismatches = [] + maxMismatches = self.maxMismatches + + for match_stringloc,s_m in enumerate(zip(instring[loc:maxloc], self.match_string)): + src,mat = s_m + if src != mat: + mismatches.append(match_stringloc) + if len(mismatches) > maxMismatches: + break + else: + loc = match_stringloc + 1 + results = ParseResults([instring[start:loc]]) + results['original'] = self.match_string + results['mismatches'] = mismatches + return loc, results + + raise ParseException(instring, loc, self.errmsg, self) + + +class Word(Token): + """ + Token for matching words composed of allowed character sets. + Defined with string containing all allowed initial characters, + an optional string containing allowed body characters (if omitted, + defaults to the initial character set), and an optional minimum, + maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. An optional + C{excludeChars} parameter can list characters that might be found in + the input C{bodyChars} string; useful to define a word of all printables + except for one or two characters, for instance. + + L{srange} is useful for defining custom character set strings for defining + C{Word} expressions, using range notation from regular expression character sets. + + A common mistake is to use C{Word} to match a specific literal string, as in + C{Word("Address")}. Remember that C{Word} uses the string argument to define + I{sets} of matchable characters. This expression would match "Add", "AAA", + "dAred", or any other word made up of the characters 'A', 'd', 'r', 'e', and 's'. + To match an exact literal string, use L{Literal} or L{Keyword}. + + pyparsing includes helper strings for building Words: + - L{alphas} + - L{nums} + - L{alphanums} + - L{hexnums} + - L{alphas8bit} (alphabetic characters in ASCII range 128-255 - accented, tilded, umlauted, etc.) + - L{punc8bit} (non-alphabetic characters in ASCII range 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - L{printables} (any non-whitespace character) + + Example:: + # a word composed of digits + integer = Word(nums) # equivalent to Word("0123456789") or Word(srange("0-9")) + + # a word with a leading capital, and zero or more lowercase + capital_word = Word(alphas.upper(), alphas.lower()) + + # hostnames are alphanumeric, with leading alpha, and '-' + hostname = Word(alphas, alphanums+'-') + + # roman numeral (not a strict parser, accepts invalid mix of characters) + roman = Word("IVXLCDM") + + # any string of non-whitespace characters, except for ',' + csv_value = Word(printables, excludeChars=",") + """ + def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): + super(Word,self).__init__() + if excludeChars: + initChars = ''.join(c for c in initChars if c not in excludeChars) + if bodyChars: + bodyChars = ''.join(c for c in bodyChars if c not in excludeChars) + self.initCharsOrig = initChars + self.initChars = set(initChars) + if bodyChars : + self.bodyCharsOrig = bodyChars + self.bodyChars = set(bodyChars) + else: + self.bodyCharsOrig = initChars + self.bodyChars = set(initChars) + + self.maxSpecified = max > 0 + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.asKeyword = asKeyword + + if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): + if self.bodyCharsOrig == self.initCharsOrig: + self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) + elif len(self.initCharsOrig) == 1: + self.reString = "%s[%s]*" % \ + (re.escape(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + else: + self.reString = "[%s][%s]*" % \ + (_escapeRegexRangeChars(self.initCharsOrig), + _escapeRegexRangeChars(self.bodyCharsOrig),) + if self.asKeyword: + self.reString = r"\b"+self.reString+r"\b" + try: + self.re = re.compile( self.reString ) + except Exception: + self.re = None + + def parseImpl( self, instring, loc, doActions=True ): + if self.re: + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + return loc, result.group() + + if not(instring[ loc ] in self.initChars): + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + instrlen = len(instring) + bodychars = self.bodyChars + maxloc = start + self.maxLen + maxloc = min( maxloc, instrlen ) + while loc < maxloc and instring[loc] in bodychars: + loc += 1 + + throwException = False + if loc - start < self.minLen: + throwException = True + if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: + throwException = True + if self.asKeyword: + if (start>0 and instring[start-1] in bodychars) or (loc<instrlen and instring[loc] in bodychars): + throwException = True + + if throwException: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(Word,self).__str__() + except Exception: + pass + + + if self.strRepr is None: + + def charsAsStr(s): + if len(s)>4: + return s[:4]+"..." + else: + return s + + if ( self.initCharsOrig != self.bodyCharsOrig ): + self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) + else: + self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) + + return self.strRepr + + +class Regex(Token): + """ + Token for matching strings that match a given regular expression. + Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. + If the given regex contains named groups (defined using C{(?P<name>...)}), these will be preserved as + named parse results. + + Example:: + realnum = Regex(r"[+-]?\d+\.\d*") + date = Regex(r'(?P<year>\d{4})-(?P<month>\d\d?)-(?P<day>\d\d?)') + # ref: http://stackoverflow.com/questions/267399/how-do-you-match-only-valid-roman-numerals-with-a-regular-expression + roman = Regex(r"M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})") + """ + compiledREtype = type(re.compile("[A-Z]")) + def __init__( self, pattern, flags=0): + """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" + super(Regex,self).__init__() + + if isinstance(pattern, basestring): + if not pattern: + warnings.warn("null string passed to Regex; use Empty() instead", + SyntaxWarning, stacklevel=2) + + self.pattern = pattern + self.flags = flags + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % pattern, + SyntaxWarning, stacklevel=2) + raise + + elif isinstance(pattern, Regex.compiledREtype): + self.re = pattern + self.pattern = \ + self.reString = str(pattern) + self.flags = flags + + else: + raise ValueError("Regex may only be constructed with a string or a compiled RE object") + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = self.re.match(instring,loc) + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + d = result.groupdict() + ret = ParseResults(result.group()) + if d: + for k in d: + ret[k] = d[k] + return loc,ret + + def __str__( self ): + try: + return super(Regex,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "Re:(%s)" % repr(self.pattern) + + return self.strRepr + + +class QuotedString(Token): + r""" + Token for matching strings that are delimited by quoting characters. + + Defined with the following parameters: + - quoteChar - string of one or more characters defining the quote delimiting string + - escChar - character to escape quotes, typically backslash (default=C{None}) + - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=C{None}) + - multiline - boolean indicating whether quotes can span multiple lines (default=C{False}) + - unquoteResults - boolean indicating whether the matched text should be unquoted (default=C{True}) + - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=C{None} => same as quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace (C{'\t'}, C{'\n'}, etc.) to actual whitespace (default=C{True}) + + Example:: + qs = QuotedString('"') + print(qs.searchString('lsjdf "This is the quote" sldjf')) + complex_qs = QuotedString('{{', endQuoteChar='}}') + print(complex_qs.searchString('lsjdf {{This is the "quote"}} sldjf')) + sql_qs = QuotedString('"', escQuote='""') + print(sql_qs.searchString('lsjdf "This is the quote with ""embedded"" quotes" sldjf')) + prints:: + [['This is the quote']] + [['This is the "quote"']] + [['This is the quote with "embedded" quotes']] + """ + def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None, convertWhitespaceEscapes=True): + super(QuotedString,self).__init__() + + # remove white space from quote chars - wont work anyway + quoteChar = quoteChar.strip() + if not quoteChar: + warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + if endQuoteChar is None: + endQuoteChar = quoteChar + else: + endQuoteChar = endQuoteChar.strip() + if not endQuoteChar: + warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) + raise SyntaxError() + + self.quoteChar = quoteChar + self.quoteCharLen = len(quoteChar) + self.firstQuoteChar = quoteChar[0] + self.endQuoteChar = endQuoteChar + self.endQuoteCharLen = len(endQuoteChar) + self.escChar = escChar + self.escQuote = escQuote + self.unquoteResults = unquoteResults + self.convertWhitespaceEscapes = convertWhitespaceEscapes + + if multiline: + self.flags = re.MULTILINE | re.DOTALL + self.pattern = r'%s(?:[^%s%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + else: + self.flags = 0 + self.pattern = r'%s(?:[^%s\n\r%s]' % \ + ( re.escape(self.quoteChar), + _escapeRegexRangeChars(self.endQuoteChar[0]), + (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) + if len(self.endQuoteChar) > 1: + self.pattern += ( + '|(?:' + ')|(?:'.join("%s[^%s]" % (re.escape(self.endQuoteChar[:i]), + _escapeRegexRangeChars(self.endQuoteChar[i])) + for i in range(len(self.endQuoteChar)-1,0,-1)) + ')' + ) + if escQuote: + self.pattern += (r'|(?:%s)' % re.escape(escQuote)) + if escChar: + self.pattern += (r'|(?:%s.)' % re.escape(escChar)) + self.escCharReplacePattern = re.escape(self.escChar)+"(.)" + self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) + + try: + self.re = re.compile(self.pattern, self.flags) + self.reString = self.pattern + except sre_constants.error: + warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, + SyntaxWarning, stacklevel=2) + raise + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayIndexError = False + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None + if not result: + raise ParseException(instring, loc, self.errmsg, self) + + loc = result.end() + ret = result.group() + + if self.unquoteResults: + + # strip off quotes + ret = ret[self.quoteCharLen:-self.endQuoteCharLen] + + if isinstance(ret,basestring): + # replace escaped whitespace + if '\\' in ret and self.convertWhitespaceEscapes: + ws_map = { + r'\t' : '\t', + r'\n' : '\n', + r'\f' : '\f', + r'\r' : '\r', + } + for wslit,wschar in ws_map.items(): + ret = ret.replace(wslit, wschar) + + # replace escaped characters + if self.escChar: + ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) + + # replace escaped quotes + if self.escQuote: + ret = ret.replace(self.escQuote, self.endQuoteChar) + + return loc, ret + + def __str__( self ): + try: + return super(QuotedString,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) + + return self.strRepr + + +class CharsNotIn(Token): + """ + Token for matching words composed of characters I{not} in a given set (will + include whitespace in matched characters if not listed in the provided exclusion set - see example). + Defined with string containing all disallowed characters, and an optional + minimum, maximum, and/or exact length. The default value for C{min} is 1 (a + minimum value < 1 is not valid); the default values for C{max} and C{exact} + are 0, meaning no maximum or exact length restriction. + + Example:: + # define a comma-separated-value as anything that is not a ',' + csv_value = CharsNotIn(',') + print(delimitedList(csv_value).parseString("dkls,lsdkjf,s12 34,@!#,213")) + prints:: + ['dkls', 'lsdkjf', 's12 34', '@!#', '213'] + """ + def __init__( self, notChars, min=1, max=0, exact=0 ): + super(CharsNotIn,self).__init__() + self.skipWhitespace = False + self.notChars = notChars + + if min < 1: + raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + self.name = _ustr(self) + self.errmsg = "Expected " + self.name + self.mayReturnEmpty = ( self.minLen == 0 ) + self.mayIndexError = False + + def parseImpl( self, instring, loc, doActions=True ): + if instring[loc] in self.notChars: + raise ParseException(instring, loc, self.errmsg, self) + + start = loc + loc += 1 + notchars = self.notChars + maxlen = min( start+self.maxLen, len(instring) ) + while loc < maxlen and \ + (instring[loc] not in notchars): + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + def __str__( self ): + try: + return super(CharsNotIn, self).__str__() + except Exception: + pass + + if self.strRepr is None: + if len(self.notChars) > 4: + self.strRepr = "!W:(%s...)" % self.notChars[:4] + else: + self.strRepr = "!W:(%s)" % self.notChars + + return self.strRepr + +class White(Token): + """ + Special matching class for matching whitespace. Normally, whitespace is ignored + by pyparsing grammars. This class is included when some whitespace structures + are significant. Define with a string containing the whitespace characters to be + matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, + as defined for the C{L{Word}} class. + """ + whiteStrs = { + " " : "<SPC>", + "\t": "<TAB>", + "\n": "<LF>", + "\r": "<CR>", + "\f": "<FF>", + } + def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): + super(White,self).__init__() + self.matchWhite = ws + self.setWhitespaceChars( "".join(c for c in self.whiteChars if c not in self.matchWhite) ) + #~ self.leaveWhitespace() + self.name = ("".join(White.whiteStrs[c] for c in self.matchWhite)) + self.mayReturnEmpty = True + self.errmsg = "Expected " + self.name + + self.minLen = min + + if max > 0: + self.maxLen = max + else: + self.maxLen = _MAX_INT + + if exact > 0: + self.maxLen = exact + self.minLen = exact + + def parseImpl( self, instring, loc, doActions=True ): + if not(instring[ loc ] in self.matchWhite): + raise ParseException(instring, loc, self.errmsg, self) + start = loc + loc += 1 + maxloc = start + self.maxLen + maxloc = min( maxloc, len(instring) ) + while loc < maxloc and instring[loc] in self.matchWhite: + loc += 1 + + if loc - start < self.minLen: + raise ParseException(instring, loc, self.errmsg, self) + + return loc, instring[start:loc] + + +class _PositionToken(Token): + def __init__( self ): + super(_PositionToken,self).__init__() + self.name=self.__class__.__name__ + self.mayReturnEmpty = True + self.mayIndexError = False + +class GoToColumn(_PositionToken): + """ + Token to advance to a specific column of input text; useful for tabular report scraping. + """ + def __init__( self, colno ): + super(GoToColumn,self).__init__() + self.col = colno + + def preParse( self, instring, loc ): + if col(loc,instring) != self.col: + instrlen = len(instring) + if self.ignoreExprs: + loc = self._skipIgnorables( instring, loc ) + while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : + loc += 1 + return loc + + def parseImpl( self, instring, loc, doActions=True ): + thiscol = col( loc, instring ) + if thiscol > self.col: + raise ParseException( instring, loc, "Text not in expected column", self ) + newloc = loc + self.col - thiscol + ret = instring[ loc: newloc ] + return newloc, ret + + +class LineStart(_PositionToken): + """ + Matches if current position is at the beginning of a line within the parse string + + Example:: + + test = '''\ + AAA this line + AAA and this line + AAA but not this one + B AAA and definitely not this one + ''' + + for t in (LineStart() + 'AAA' + restOfLine).searchString(test): + print(t) + + Prints:: + ['AAA', ' this line'] + ['AAA', ' and this line'] + + """ + def __init__( self ): + super(LineStart,self).__init__() + self.errmsg = "Expected start of line" + + def parseImpl( self, instring, loc, doActions=True ): + if col(loc, instring) == 1: + return loc, [] + raise ParseException(instring, loc, self.errmsg, self) + +class LineEnd(_PositionToken): + """ + Matches if current position is at the end of a line within the parse string + """ + def __init__( self ): + super(LineEnd,self).__init__() + self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) + self.errmsg = "Expected end of line" + + def parseImpl( self, instring, loc, doActions=True ): + if loc<len(instring): + if instring[loc] == "\n": + return loc+1, "\n" + else: + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class StringStart(_PositionToken): + """ + Matches if current position is at the beginning of the parse string + """ + def __init__( self ): + super(StringStart,self).__init__() + self.errmsg = "Expected start of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc != 0: + # see if entire string up to here is just whitespace and ignoreables + if loc != self.preParse( instring, 0 ): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class StringEnd(_PositionToken): + """ + Matches if current position is at the end of the parse string + """ + def __init__( self ): + super(StringEnd,self).__init__() + self.errmsg = "Expected end of text" + + def parseImpl( self, instring, loc, doActions=True ): + if loc < len(instring): + raise ParseException(instring, loc, self.errmsg, self) + elif loc == len(instring): + return loc+1, [] + elif loc > len(instring): + return loc, [] + else: + raise ParseException(instring, loc, self.errmsg, self) + +class WordStart(_PositionToken): + """ + Matches if the current position is at the beginning of a Word, and + is not preceded by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of + the string being parsed, or at the beginning of a line. + """ + def __init__(self, wordChars = printables): + super(WordStart,self).__init__() + self.wordChars = set(wordChars) + self.errmsg = "Not at the start of a word" + + def parseImpl(self, instring, loc, doActions=True ): + if loc != 0: + if (instring[loc-1] in self.wordChars or + instring[loc] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + +class WordEnd(_PositionToken): + """ + Matches if the current position is at the end of a Word, and + is not followed by any character in a given set of C{wordChars} + (default=C{printables}). To emulate the C{\b} behavior of regular expressions, + use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of + the string being parsed, or at the end of a line. + """ + def __init__(self, wordChars = printables): + super(WordEnd,self).__init__() + self.wordChars = set(wordChars) + self.skipWhitespace = False + self.errmsg = "Not at the end of a word" + + def parseImpl(self, instring, loc, doActions=True ): + instrlen = len(instring) + if instrlen>0 and loc<instrlen: + if (instring[loc] in self.wordChars or + instring[loc-1] not in self.wordChars): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + +class ParseExpression(ParserElement): + """ + Abstract subclass of ParserElement, for combining and post-processing parsed tokens. + """ + def __init__( self, exprs, savelist = False ): + super(ParseExpression,self).__init__(savelist) + if isinstance( exprs, _generatorType ): + exprs = list(exprs) + + if isinstance( exprs, basestring ): + self.exprs = [ ParserElement._literalStringClass( exprs ) ] + elif isinstance( exprs, collections.Iterable ): + exprs = list(exprs) + # if sequence of strings provided, wrap with Literal + if all(isinstance(expr, basestring) for expr in exprs): + exprs = map(ParserElement._literalStringClass, exprs) + self.exprs = list(exprs) + else: + try: + self.exprs = list( exprs ) + except TypeError: + self.exprs = [ exprs ] + self.callPreparse = False + + def __getitem__( self, i ): + return self.exprs[i] + + def append( self, other ): + self.exprs.append( other ) + self.strRepr = None + return self + + def leaveWhitespace( self ): + """Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on + all contained expressions.""" + self.skipWhitespace = False + self.exprs = [ e.copy() for e in self.exprs ] + for e in self.exprs: + e.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + else: + super( ParseExpression, self).ignore( other ) + for e in self.exprs: + e.ignore( self.ignoreExprs[-1] ) + return self + + def __str__( self ): + try: + return super(ParseExpression,self).__str__() + except Exception: + pass + + if self.strRepr is None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.exprs) ) + return self.strRepr + + def streamline( self ): + super(ParseExpression,self).streamline() + + for e in self.exprs: + e.streamline() + + # collapse nested And's of the form And( And( And( a,b), c), d) to And( a,b,c,d ) + # but only if there are no parse actions or resultsNames on the nested And's + # (likewise for Or's and MatchFirst's) + if ( len(self.exprs) == 2 ): + other = self.exprs[0] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = other.exprs[:] + [ self.exprs[1] ] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + other = self.exprs[-1] + if ( isinstance( other, self.__class__ ) and + not(other.parseAction) and + other.resultsName is None and + not other.debug ): + self.exprs = self.exprs[:-1] + other.exprs[:] + self.strRepr = None + self.mayReturnEmpty |= other.mayReturnEmpty + self.mayIndexError |= other.mayIndexError + + self.errmsg = "Expected " + _ustr(self) + + return self + + def setResultsName( self, name, listAllMatches=False ): + ret = super(ParseExpression,self).setResultsName(name,listAllMatches) + return ret + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + for e in self.exprs: + e.validate(tmp) + self.checkRecursion( [] ) + + def copy(self): + ret = super(ParseExpression,self).copy() + ret.exprs = [e.copy() for e in self.exprs] + return ret + +class And(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the C{'+'} operator. + May also be constructed using the C{'-'} operator, which will suppress backtracking. + + Example:: + integer = Word(nums) + name_expr = OneOrMore(Word(alphas)) + + expr = And([integer("id"),name_expr("name"),integer("age")]) + # more easily written as: + expr = integer("id") + name_expr("name") + integer("age") + """ + + class _ErrorStop(Empty): + def __init__(self, *args, **kwargs): + super(And._ErrorStop,self).__init__(*args, **kwargs) + self.name = '-' + self.leaveWhitespace() + + def __init__( self, exprs, savelist = True ): + super(And,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.setWhitespaceChars( self.exprs[0].whiteChars ) + self.skipWhitespace = self.exprs[0].skipWhitespace + self.callPreparse = True + + def parseImpl( self, instring, loc, doActions=True ): + # pass False as last arg to _parse for first element, since we already + # pre-parsed the string as part of our And pre-parsing + loc, resultlist = self.exprs[0]._parse( instring, loc, doActions, callPreParse=False ) + errorStop = False + for e in self.exprs[1:]: + if isinstance(e, And._ErrorStop): + errorStop = True + continue + if errorStop: + try: + loc, exprtokens = e._parse( instring, loc, doActions ) + except ParseSyntaxException: + raise + except ParseBaseException as pe: + pe.__traceback__ = None + raise ParseSyntaxException._from_exception(pe) + except IndexError: + raise ParseSyntaxException(instring, len(instring), self.errmsg, self) + else: + loc, exprtokens = e._parse( instring, loc, doActions ) + if exprtokens or exprtokens.haskeys(): + resultlist += exprtokens + return loc, resultlist + + def __iadd__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #And( [ self, other ] ) + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + if not e.mayReturnEmpty: + break + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + +class Or(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the expression that matches the longest string will be used. + May be constructed using the C{'^'} operator. + + Example:: + # construct Or using '^' operator + + number = Word(nums) ^ Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) + prints:: + [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(Or,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + matches = [] + for e in self.exprs: + try: + loc2 = e.tryParse( instring, loc ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + else: + # save match among all matches, to retry longest to shortest + matches.append((loc2, e)) + + if matches: + matches.sort(key=lambda x: -x[0]) + for _,e in matches: + try: + return e._parse( instring, loc, doActions ) + except ParseException as err: + err.__traceback__ = None + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + + def __ixor__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #Or( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " ^ ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class MatchFirst(ParseExpression): + """ + Requires that at least one C{ParseExpression} is found. + If two expressions match, the first one listed is the one that will match. + May be constructed using the C{'|'} operator. + + Example:: + # construct MatchFirst using '|' operator + + # watch the order of expressions to match + number = Word(nums) | Combine(Word(nums) + '.' + Word(nums)) + print(number.searchString("123 3.1416 789")) # Fail! -> [['123'], ['3'], ['1416'], ['789']] + + # put more selective expression first + number = Combine(Word(nums) + '.' + Word(nums)) | Word(nums) + print(number.searchString("123 3.1416 789")) # Better -> [['123'], ['3.1416'], ['789']] + """ + def __init__( self, exprs, savelist = False ): + super(MatchFirst,self).__init__(exprs, savelist) + if self.exprs: + self.mayReturnEmpty = any(e.mayReturnEmpty for e in self.exprs) + else: + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + maxExcLoc = -1 + maxException = None + for e in self.exprs: + try: + ret = e._parse( instring, loc, doActions ) + return ret + except ParseException as err: + if err.loc > maxExcLoc: + maxException = err + maxExcLoc = err.loc + except IndexError: + if len(instring) > maxExcLoc: + maxException = ParseException(instring,len(instring),e.errmsg,self) + maxExcLoc = len(instring) + + # only got here if no expression matched, raise exception for match that made it the furthest + else: + if maxException is not None: + maxException.msg = self.errmsg + raise maxException + else: + raise ParseException(instring, loc, "no defined alternatives to match", self) + + def __ior__(self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass( other ) + return self.append( other ) #MatchFirst( [ self, other ] ) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " | ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class Each(ParseExpression): + """ + Requires all given C{ParseExpression}s to be found, but in any order. + Expressions may be separated by whitespace. + May be constructed using the C{'&'} operator. + + Example:: + color = oneOf("RED ORANGE YELLOW GREEN BLUE PURPLE BLACK WHITE BROWN") + shape_type = oneOf("SQUARE CIRCLE TRIANGLE STAR HEXAGON OCTAGON") + integer = Word(nums) + shape_attr = "shape:" + shape_type("shape") + posn_attr = "posn:" + Group(integer("x") + ',' + integer("y"))("posn") + color_attr = "color:" + color("color") + size_attr = "size:" + integer("size") + + # use Each (using operator '&') to accept attributes in any order + # (shape and posn are required, color and size are optional) + shape_spec = shape_attr & posn_attr & Optional(color_attr) & Optional(size_attr) + + shape_spec.runTests(''' + shape: SQUARE color: BLACK posn: 100, 120 + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + color:GREEN size:20 shape:TRIANGLE posn:20,40 + ''' + ) + prints:: + shape: SQUARE color: BLACK posn: 100, 120 + ['shape:', 'SQUARE', 'color:', 'BLACK', 'posn:', ['100', ',', '120']] + - color: BLACK + - posn: ['100', ',', '120'] + - x: 100 + - y: 120 + - shape: SQUARE + + + shape: CIRCLE size: 50 color: BLUE posn: 50,80 + ['shape:', 'CIRCLE', 'size:', '50', 'color:', 'BLUE', 'posn:', ['50', ',', '80']] + - color: BLUE + - posn: ['50', ',', '80'] + - x: 50 + - y: 80 + - shape: CIRCLE + - size: 50 + + + color: GREEN size: 20 shape: TRIANGLE posn: 20,40 + ['color:', 'GREEN', 'size:', '20', 'shape:', 'TRIANGLE', 'posn:', ['20', ',', '40']] + - color: GREEN + - posn: ['20', ',', '40'] + - x: 20 + - y: 40 + - shape: TRIANGLE + - size: 20 + """ + def __init__( self, exprs, savelist = True ): + super(Each,self).__init__(exprs, savelist) + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + self.skipWhitespace = True + self.initExprGroups = True + + def parseImpl( self, instring, loc, doActions=True ): + if self.initExprGroups: + self.opt1map = dict((id(e.expr),e) for e in self.exprs if isinstance(e,Optional)) + opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] + opt2 = [ e for e in self.exprs if e.mayReturnEmpty and not isinstance(e,Optional)] + self.optionals = opt1 + opt2 + self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] + self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] + self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] + self.required += self.multirequired + self.initExprGroups = False + tmpLoc = loc + tmpReqd = self.required[:] + tmpOpt = self.optionals[:] + matchOrder = [] + + keepMatching = True + while keepMatching: + tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired + failed = [] + for e in tmpExprs: + try: + tmpLoc = e.tryParse( instring, tmpLoc ) + except ParseException: + failed.append(e) + else: + matchOrder.append(self.opt1map.get(id(e),e)) + if e in tmpReqd: + tmpReqd.remove(e) + elif e in tmpOpt: + tmpOpt.remove(e) + if len(failed) == len(tmpExprs): + keepMatching = False + + if tmpReqd: + missing = ", ".join(_ustr(e) for e in tmpReqd) + raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) + + # add any unmatched Optionals, in case they have default values defined + matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] + + resultlist = [] + for e in matchOrder: + loc,results = e._parse(instring,loc,doActions) + resultlist.append(results) + + finalResults = sum(resultlist, ParseResults([])) + return loc, finalResults + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + " & ".join(_ustr(e) for e in self.exprs) + "}" + + return self.strRepr + + def checkRecursion( self, parseElementList ): + subRecCheckList = parseElementList[:] + [ self ] + for e in self.exprs: + e.checkRecursion( subRecCheckList ) + + +class ParseElementEnhance(ParserElement): + """ + Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens. + """ + def __init__( self, expr, savelist=False ): + super(ParseElementEnhance,self).__init__(savelist) + if isinstance( expr, basestring ): + if issubclass(ParserElement._literalStringClass, Token): + expr = ParserElement._literalStringClass(expr) + else: + expr = ParserElement._literalStringClass(Literal(expr)) + self.expr = expr + self.strRepr = None + if expr is not None: + self.mayIndexError = expr.mayIndexError + self.mayReturnEmpty = expr.mayReturnEmpty + self.setWhitespaceChars( expr.whiteChars ) + self.skipWhitespace = expr.skipWhitespace + self.saveAsList = expr.saveAsList + self.callPreparse = expr.callPreparse + self.ignoreExprs.extend(expr.ignoreExprs) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr is not None: + return self.expr._parse( instring, loc, doActions, callPreParse=False ) + else: + raise ParseException("",loc,self.errmsg,self) + + def leaveWhitespace( self ): + self.skipWhitespace = False + self.expr = self.expr.copy() + if self.expr is not None: + self.expr.leaveWhitespace() + return self + + def ignore( self, other ): + if isinstance( other, Suppress ): + if other not in self.ignoreExprs: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + else: + super( ParseElementEnhance, self).ignore( other ) + if self.expr is not None: + self.expr.ignore( self.ignoreExprs[-1] ) + return self + + def streamline( self ): + super(ParseElementEnhance,self).streamline() + if self.expr is not None: + self.expr.streamline() + return self + + def checkRecursion( self, parseElementList ): + if self in parseElementList: + raise RecursiveGrammarException( parseElementList+[self] ) + subRecCheckList = parseElementList[:] + [ self ] + if self.expr is not None: + self.expr.checkRecursion( subRecCheckList ) + + def validate( self, validateTrace=[] ): + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion( [] ) + + def __str__( self ): + try: + return super(ParseElementEnhance,self).__str__() + except Exception: + pass + + if self.strRepr is None and self.expr is not None: + self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) + return self.strRepr + + +class FollowedBy(ParseElementEnhance): + """ + Lookahead matching of the given parse expression. C{FollowedBy} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression matches at the current + position. C{FollowedBy} always returns a null token list. + + Example:: + # use FollowedBy to match a label only if it is followed by a ':' + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + OneOrMore(attr_expr).parseString("shape: SQUARE color: BLACK posn: upper left").pprint() + prints:: + [['shape', 'SQUARE'], ['color', 'BLACK'], ['posn', 'upper left']] + """ + def __init__( self, expr ): + super(FollowedBy,self).__init__(expr) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + self.expr.tryParse( instring, loc ) + return loc, [] + + +class NotAny(ParseElementEnhance): + """ + Lookahead to disallow matching with the given parse expression. C{NotAny} + does I{not} advance the parsing position within the input string, it only + verifies that the specified parse expression does I{not} match at the current + position. Also, C{NotAny} does I{not} skip over leading whitespace. C{NotAny} + always returns a null token list. May be constructed using the '~' operator. + + Example:: + + """ + def __init__( self, expr ): + super(NotAny,self).__init__(expr) + #~ self.leaveWhitespace() + self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs + self.mayReturnEmpty = True + self.errmsg = "Found unwanted token, "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + if self.expr.canParseNext(instring, loc): + raise ParseException(instring, loc, self.errmsg, self) + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "~{" + _ustr(self.expr) + "}" + + return self.strRepr + +class _MultipleMatch(ParseElementEnhance): + def __init__( self, expr, stopOn=None): + super(_MultipleMatch, self).__init__(expr) + self.saveAsList = True + ender = stopOn + if isinstance(ender, basestring): + ender = ParserElement._literalStringClass(ender) + self.not_ender = ~ender if ender is not None else None + + def parseImpl( self, instring, loc, doActions=True ): + self_expr_parse = self.expr._parse + self_skip_ignorables = self._skipIgnorables + check_ender = self.not_ender is not None + if check_ender: + try_not_ender = self.not_ender.tryParse + + # must be at least one (but first see if we are the stopOn sentinel; + # if so, fail) + if check_ender: + try_not_ender(instring, loc) + loc, tokens = self_expr_parse( instring, loc, doActions, callPreParse=False ) + try: + hasIgnoreExprs = (not not self.ignoreExprs) + while 1: + if check_ender: + try_not_ender(instring, loc) + if hasIgnoreExprs: + preloc = self_skip_ignorables( instring, loc ) + else: + preloc = loc + loc, tmptokens = self_expr_parse( instring, preloc, doActions ) + if tmptokens or tmptokens.haskeys(): + tokens += tmptokens + except (ParseException,IndexError): + pass + + return loc, tokens + +class OneOrMore(_MultipleMatch): + """ + Repetition of one or more of the given expression. + + Parameters: + - expr - expression that must match one or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: BLACK" + OneOrMore(attr_expr).parseString(text).pprint() # Fail! read 'color' as data instead of next label -> [['shape', 'SQUARE color']] + + # use stopOn attribute for OneOrMore to avoid reading label string as part of the data + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + OneOrMore(attr_expr).parseString(text).pprint() # Better -> [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'BLACK']] + + # could also be written as + (attr_expr * (1,)).parseString(text).pprint() + """ + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "{" + _ustr(self.expr) + "}..." + + return self.strRepr + +class ZeroOrMore(_MultipleMatch): + """ + Optional repetition of zero or more of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - stopOn - (default=C{None}) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to L{OneOrMore} + """ + def __init__( self, expr, stopOn=None): + super(ZeroOrMore,self).__init__(expr, stopOn=stopOn) + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + return super(ZeroOrMore, self).parseImpl(instring, loc, doActions) + except (ParseException,IndexError): + return loc, [] + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]..." + + return self.strRepr + +class _NullToken(object): + def __bool__(self): + return False + __nonzero__ = __bool__ + def __str__(self): + return "" + +_optionalNotMatched = _NullToken() +class Optional(ParseElementEnhance): + """ + Optional matching of the given expression. + + Parameters: + - expr - expression that must match zero or more times + - default (optional) - value to be returned if the optional expression is not found. + + Example:: + # US postal code can be a 5-digit zip, plus optional 4-digit qualifier + zip = Combine(Word(nums, exact=5) + Optional('-' + Word(nums, exact=4))) + zip.runTests(''' + # traditional ZIP code + 12345 + + # ZIP+4 form + 12101-0001 + + # invalid ZIP + 98765- + ''') + prints:: + # traditional ZIP code + 12345 + ['12345'] + + # ZIP+4 form + 12101-0001 + ['12101-0001'] + + # invalid ZIP + 98765- + ^ + FAIL: Expected end of text (at char 5), (line:1, col:6) + """ + def __init__( self, expr, default=_optionalNotMatched ): + super(Optional,self).__init__( expr, savelist=False ) + self.saveAsList = self.expr.saveAsList + self.defaultValue = default + self.mayReturnEmpty = True + + def parseImpl( self, instring, loc, doActions=True ): + try: + loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) + except (ParseException,IndexError): + if self.defaultValue is not _optionalNotMatched: + if self.expr.resultsName: + tokens = ParseResults([ self.defaultValue ]) + tokens[self.expr.resultsName] = self.defaultValue + else: + tokens = [ self.defaultValue ] + else: + tokens = [] + return loc, tokens + + def __str__( self ): + if hasattr(self,"name"): + return self.name + + if self.strRepr is None: + self.strRepr = "[" + _ustr(self.expr) + "]" + + return self.strRepr + +class SkipTo(ParseElementEnhance): + """ + Token for skipping over all undefined text until the matched expression is found. + + Parameters: + - expr - target expression marking the end of the data to be skipped + - include - (default=C{False}) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default=C{None}) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default=C{None}) define expressions that are not allowed to be + included in the skipped test; if found before the target expression is found, + the SkipTo is not a match + + Example:: + report = ''' + Outstanding Issues Report - 1 Jan 2000 + + # | Severity | Description | Days Open + -----+----------+-------------------------------------------+----------- + 101 | Critical | Intermittent system crash | 6 + 94 | Cosmetic | Spelling error on Login ('log|n') | 14 + 79 | Minor | System slow when running too many reports | 47 + ''' + integer = Word(nums) + SEP = Suppress('|') + # use SkipTo to simply match everything up until the next SEP + # - ignore quoted strings, so that a '|' character inside a quoted string does not match + # - parse action will call token.strip() for each matched token, i.e., the description body + string_data = SkipTo(SEP, ignore=quotedString) + string_data.setParseAction(tokenMap(str.strip)) + ticket_expr = (integer("issue_num") + SEP + + string_data("sev") + SEP + + string_data("desc") + SEP + + integer("days_open")) + + for tkt in ticket_expr.searchString(report): + print tkt.dump() + prints:: + ['101', 'Critical', 'Intermittent system crash', '6'] + - days_open: 6 + - desc: Intermittent system crash + - issue_num: 101 + - sev: Critical + ['94', 'Cosmetic', "Spelling error on Login ('log|n')", '14'] + - days_open: 14 + - desc: Spelling error on Login ('log|n') + - issue_num: 94 + - sev: Cosmetic + ['79', 'Minor', 'System slow when running too many reports', '47'] + - days_open: 47 + - desc: System slow when running too many reports + - issue_num: 79 + - sev: Minor + """ + def __init__( self, other, include=False, ignore=None, failOn=None ): + super( SkipTo, self ).__init__( other ) + self.ignoreExpr = ignore + self.mayReturnEmpty = True + self.mayIndexError = False + self.includeMatch = include + self.asList = False + if isinstance(failOn, basestring): + self.failOn = ParserElement._literalStringClass(failOn) + else: + self.failOn = failOn + self.errmsg = "No match found for "+_ustr(self.expr) + + def parseImpl( self, instring, loc, doActions=True ): + startloc = loc + instrlen = len(instring) + expr = self.expr + expr_parse = self.expr._parse + self_failOn_canParseNext = self.failOn.canParseNext if self.failOn is not None else None + self_ignoreExpr_tryParse = self.ignoreExpr.tryParse if self.ignoreExpr is not None else None + + tmploc = loc + while tmploc <= instrlen: + if self_failOn_canParseNext is not None: + # break if failOn expression matches + if self_failOn_canParseNext(instring, tmploc): + break + + if self_ignoreExpr_tryParse is not None: + # advance past ignore expressions + while 1: + try: + tmploc = self_ignoreExpr_tryParse(instring, tmploc) + except ParseBaseException: + break + + try: + expr_parse(instring, tmploc, doActions=False, callPreParse=False) + except (ParseException, IndexError): + # no match, advance loc in string + tmploc += 1 + else: + # matched skipto expr, done + break + + else: + # ran off the end of the input string without matching skipto expr, fail + raise ParseException(instring, loc, self.errmsg, self) + + # build up return values + loc = tmploc + skiptext = instring[startloc:loc] + skipresult = ParseResults(skiptext) + + if self.includeMatch: + loc, mat = expr_parse(instring,loc,doActions,callPreParse=False) + skipresult += mat + + return loc, skipresult + +class Forward(ParseElementEnhance): + """ + Forward declaration of an expression to be defined later - + used for recursive grammars, such as algebraic infix notation. + When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. + + Note: take care when assigning to C{Forward} not to overlook precedence of operators. + Specifically, '|' has a lower precedence than '<<', so that:: + fwdExpr << a | b | c + will actually be evaluated as:: + (fwdExpr << a) | b | c + thereby leaving b and c out as parseable alternatives. It is recommended that you + explicitly group the values inserted into the C{Forward}:: + fwdExpr << (a | b | c) + Converting to use the '<<=' operator instead will avoid this problem. + + See L{ParseResults.pprint} for an example of a recursive parser created using + C{Forward}. + """ + def __init__( self, other=None ): + super(Forward,self).__init__( other, savelist=False ) + + def __lshift__( self, other ): + if isinstance( other, basestring ): + other = ParserElement._literalStringClass(other) + self.expr = other + self.strRepr = None + self.mayIndexError = self.expr.mayIndexError + self.mayReturnEmpty = self.expr.mayReturnEmpty + self.setWhitespaceChars( self.expr.whiteChars ) + self.skipWhitespace = self.expr.skipWhitespace + self.saveAsList = self.expr.saveAsList + self.ignoreExprs.extend(self.expr.ignoreExprs) + return self + + def __ilshift__(self, other): + return self << other + + def leaveWhitespace( self ): + self.skipWhitespace = False + return self + + def streamline( self ): + if not self.streamlined: + self.streamlined = True + if self.expr is not None: + self.expr.streamline() + return self + + def validate( self, validateTrace=[] ): + if self not in validateTrace: + tmp = validateTrace[:]+[self] + if self.expr is not None: + self.expr.validate(tmp) + self.checkRecursion([]) + + def __str__( self ): + if hasattr(self,"name"): + return self.name + return self.__class__.__name__ + ": ..." + + # stubbed out for now - creates awful memory and perf issues + self._revertClass = self.__class__ + self.__class__ = _ForwardNoRecurse + try: + if self.expr is not None: + retString = _ustr(self.expr) + else: + retString = "None" + finally: + self.__class__ = self._revertClass + return self.__class__.__name__ + ": " + retString + + def copy(self): + if self.expr is not None: + return super(Forward,self).copy() + else: + ret = Forward() + ret <<= self + return ret + +class _ForwardNoRecurse(Forward): + def __str__( self ): + return "..." + +class TokenConverter(ParseElementEnhance): + """ + Abstract subclass of C{ParseExpression}, for converting parsed results. + """ + def __init__( self, expr, savelist=False ): + super(TokenConverter,self).__init__( expr )#, savelist ) + self.saveAsList = False + +class Combine(TokenConverter): + """ + Converter to concatenate all matching tokens to a single string. + By default, the matching patterns must also be contiguous in the input string; + this can be disabled by specifying C{'adjacent=False'} in the constructor. + + Example:: + real = Word(nums) + '.' + Word(nums) + print(real.parseString('3.1416')) # -> ['3', '.', '1416'] + # will also erroneously match the following + print(real.parseString('3. 1416')) # -> ['3', '.', '1416'] + + real = Combine(Word(nums) + '.' + Word(nums)) + print(real.parseString('3.1416')) # -> ['3.1416'] + # no match when there are internal spaces + print(real.parseString('3. 1416')) # -> Exception: Expected W:(0123...) + """ + def __init__( self, expr, joinString="", adjacent=True ): + super(Combine,self).__init__( expr ) + # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself + if adjacent: + self.leaveWhitespace() + self.adjacent = adjacent + self.skipWhitespace = True + self.joinString = joinString + self.callPreparse = True + + def ignore( self, other ): + if self.adjacent: + ParserElement.ignore(self, other) + else: + super( Combine, self).ignore( other ) + return self + + def postParse( self, instring, loc, tokenlist ): + retToks = tokenlist.copy() + del retToks[:] + retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) + + if self.resultsName and retToks.haskeys(): + return [ retToks ] + else: + return retToks + +class Group(TokenConverter): + """ + Converter to return the matched tokens as a list - useful for returning tokens of C{L{ZeroOrMore}} and C{L{OneOrMore}} expressions. + + Example:: + ident = Word(alphas) + num = Word(nums) + term = ident | num + func = ident + Optional(delimitedList(term)) + print(func.parseString("fn a,b,100")) # -> ['fn', 'a', 'b', '100'] + + func = ident + Group(Optional(delimitedList(term))) + print(func.parseString("fn a,b,100")) # -> ['fn', ['a', 'b', '100']] + """ + def __init__( self, expr ): + super(Group,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + return [ tokenlist ] + +class Dict(TokenConverter): + """ + Converter to return a repetitive expression as a list, but also as a dictionary. + Each element can also be referenced using the first token in the expression as its key. + Useful for tabular report scraping when the first column can be used as a item key. + + Example:: + data_word = Word(alphas) + label = data_word + FollowedBy(':') + attr_expr = Group(label + Suppress(':') + OneOrMore(data_word).setParseAction(' '.join)) + + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + + # print attributes as plain groups + print(OneOrMore(attr_expr).parseString(text).dump()) + + # instead of OneOrMore(expr), parse using Dict(OneOrMore(Group(expr))) - Dict will auto-assign names + result = Dict(OneOrMore(Group(attr_expr))).parseString(text) + print(result.dump()) + + # access named fields as dict entries, or output as dict + print(result['shape']) + print(result.asDict()) + prints:: + ['shape', 'SQUARE', 'posn', 'upper left', 'color', 'light blue', 'texture', 'burlap'] + + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + {'color': 'light blue', 'posn': 'upper left', 'texture': 'burlap', 'shape': 'SQUARE'} + See more examples at L{ParseResults} of accessing fields by results name. + """ + def __init__( self, expr ): + super(Dict,self).__init__( expr ) + self.saveAsList = True + + def postParse( self, instring, loc, tokenlist ): + for i,tok in enumerate(tokenlist): + if len(tok) == 0: + continue + ikey = tok[0] + if isinstance(ikey,int): + ikey = _ustr(tok[0]).strip() + if len(tok)==1: + tokenlist[ikey] = _ParseResultsWithOffset("",i) + elif len(tok)==2 and not isinstance(tok[1],ParseResults): + tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) + else: + dictvalue = tok.copy() #ParseResults(i) + del dictvalue[0] + if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.haskeys()): + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) + else: + tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) + + if self.resultsName: + return [ tokenlist ] + else: + return tokenlist + + +class Suppress(TokenConverter): + """ + Converter for ignoring the results of a parsed expression. + + Example:: + source = "a, b, c,d" + wd = Word(alphas) + wd_list1 = wd + ZeroOrMore(',' + wd) + print(wd_list1.parseString(source)) + + # often, delimiters that are useful during parsing are just in the + # way afterward - use Suppress to keep them out of the parsed output + wd_list2 = wd + ZeroOrMore(Suppress(',') + wd) + print(wd_list2.parseString(source)) + prints:: + ['a', ',', 'b', ',', 'c', ',', 'd'] + ['a', 'b', 'c', 'd'] + (See also L{delimitedList}.) + """ + def postParse( self, instring, loc, tokenlist ): + return [] + + def suppress( self ): + return self + + +class OnlyOnce(object): + """ + Wrapper for parse actions, to ensure they are only called once. + """ + def __init__(self, methodCall): + self.callable = _trim_arity(methodCall) + self.called = False + def __call__(self,s,l,t): + if not self.called: + results = self.callable(s,l,t) + self.called = True + return results + raise ParseException(s,l,"") + def reset(self): + self.called = False + +def traceParseAction(f): + """ + Decorator for debugging parse actions. + + When the parse action is called, this decorator will print C{">> entering I{method-name}(line:I{current_source_line}, I{parse_location}, I{matched_tokens})".} + When the parse action completes, the decorator will print C{"<<"} followed by the returned value, or any exception that the parse action raised. + + Example:: + wd = Word(alphas) + + @traceParseAction + def remove_duplicate_chars(tokens): + return ''.join(sorted(set(''.join(tokens))) + + wds = OneOrMore(wd).setParseAction(remove_duplicate_chars) + print(wds.parseString("slkdjs sld sldd sdlf sdljf")) + prints:: + >>entering remove_duplicate_chars(line: 'slkdjs sld sldd sdlf sdljf', 0, (['slkdjs', 'sld', 'sldd', 'sdlf', 'sdljf'], {})) + <<leaving remove_duplicate_chars (ret: 'dfjkls') + ['dfjkls'] + """ + f = _trim_arity(f) + def z(*paArgs): + thisFunc = f.__name__ + s,l,t = paArgs[-3:] + if len(paArgs)>3: + thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc + sys.stderr.write( ">>entering %s(line: '%s', %d, %r)\n" % (thisFunc,line(l,s),l,t) ) + try: + ret = f(*paArgs) + except Exception as exc: + sys.stderr.write( "<<leaving %s (exception: %s)\n" % (thisFunc,exc) ) + raise + sys.stderr.write( "<<leaving %s (ret: %r)\n" % (thisFunc,ret) ) + return ret + try: + z.__name__ = f.__name__ + except AttributeError: + pass + return z + +# +# global helpers +# +def delimitedList( expr, delim=",", combine=False ): + """ + Helper to define a delimited list of expressions - the delimiter defaults to ','. + By default, the list elements and delimiters can have intervening whitespace, and + comments, but this can be overridden by passing C{combine=True} in the constructor. + If C{combine} is set to C{True}, the matching tokens are returned as a single token + string, with the delimiters included; otherwise, the matching tokens are returned + as a list of tokens, with the delimiters suppressed. + + Example:: + delimitedList(Word(alphas)).parseString("aa,bb,cc") # -> ['aa', 'bb', 'cc'] + delimitedList(Word(hexnums), delim=':', combine=True).parseString("AA:BB:CC:DD:EE") # -> ['AA:BB:CC:DD:EE'] + """ + dlName = _ustr(expr)+" ["+_ustr(delim)+" "+_ustr(expr)+"]..." + if combine: + return Combine( expr + ZeroOrMore( delim + expr ) ).setName(dlName) + else: + return ( expr + ZeroOrMore( Suppress( delim ) + expr ) ).setName(dlName) + +def countedArray( expr, intExpr=None ): + """ + Helper to define a counted list of expressions. + This helper defines a pattern of the form:: + integer expr expr expr... + where the leading integer tells how many expr expressions follow. + The matched tokens returns the array of expr tokens as a list - the leading count token is suppressed. + + If C{intExpr} is specified, it should be a pyparsing expression that produces an integer value. + + Example:: + countedArray(Word(alphas)).parseString('2 ab cd ef') # -> ['ab', 'cd'] + + # in this parser, the leading integer value is given in binary, + # '10' indicating that 2 values are in the array + binaryConstant = Word('01').setParseAction(lambda t: int(t[0], 2)) + countedArray(Word(alphas), intExpr=binaryConstant).parseString('10 ab cd ef') # -> ['ab', 'cd'] + """ + arrayExpr = Forward() + def countFieldParseAction(s,l,t): + n = t[0] + arrayExpr << (n and Group(And([expr]*n)) or Group(empty)) + return [] + if intExpr is None: + intExpr = Word(nums).setParseAction(lambda t:int(t[0])) + else: + intExpr = intExpr.copy() + intExpr.setName("arrayLen") + intExpr.addParseAction(countFieldParseAction, callDuringTry=True) + return ( intExpr + arrayExpr ).setName('(len) ' + _ustr(expr) + '...') + +def _flatten(L): + ret = [] + for i in L: + if isinstance(i,list): + ret.extend(_flatten(i)) + else: + ret.append(i) + return ret + +def matchPreviousLiteral(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousLiteral(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches a + previous literal, will also match the leading C{"1:1"} in C{"1:10"}. + If this is not desired, use C{matchPreviousExpr}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + def copyTokenToRepeater(s,l,t): + if t: + if len(t) == 1: + rep << t[0] + else: + # flatten t tokens + tflat = _flatten(t.asList()) + rep << And(Literal(tt) for tt in tflat) + else: + rep << Empty() + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def matchPreviousExpr(expr): + """ + Helper to define an expression that is indirectly defined from + the tokens matched in a previous expression, that is, it looks + for a 'repeat' of a previous expression. For example:: + first = Word(nums) + second = matchPreviousExpr(first) + matchExpr = first + ":" + second + will match C{"1:1"}, but not C{"1:2"}. Because this matches by + expressions, will I{not} match the leading C{"1:1"} in C{"1:10"}; + the expressions are evaluated first, and then compared, so + C{"1"} is compared with C{"10"}. + Do I{not} use with packrat parsing enabled. + """ + rep = Forward() + e2 = expr.copy() + rep <<= e2 + def copyTokenToRepeater(s,l,t): + matchTokens = _flatten(t.asList()) + def mustMatchTheseTokens(s,l,t): + theseTokens = _flatten(t.asList()) + if theseTokens != matchTokens: + raise ParseException("",0,"") + rep.setParseAction( mustMatchTheseTokens, callDuringTry=True ) + expr.addParseAction(copyTokenToRepeater, callDuringTry=True) + rep.setName('(prev) ' + _ustr(expr)) + return rep + +def _escapeRegexRangeChars(s): + #~ escape these chars: ^-] + for c in r"\^-]": + s = s.replace(c,_bslash+c) + s = s.replace("\n",r"\n") + s = s.replace("\t",r"\t") + return _ustr(s) + +def oneOf( strs, caseless=False, useRegex=True ): + """ + Helper to quickly define a set of alternative Literals, and makes sure to do + longest-first testing when there is a conflict, regardless of the input order, + but returns a C{L{MatchFirst}} for best performance. + + Parameters: + - strs - a string of space-delimited literals, or a collection of string literals + - caseless - (default=C{False}) - treat all literals as caseless + - useRegex - (default=C{True}) - as an optimization, will generate a Regex + object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or + if creating a C{Regex} raises an exception) + + Example:: + comp_oper = oneOf("< = > <= >= !=") + var = Word(alphas) + number = Word(nums) + term = var | number + comparison_expr = term + comp_oper + term + print(comparison_expr.searchString("B = 12 AA=23 B<=AA AA>12")) + prints:: + [['B', '=', '12'], ['AA', '=', '23'], ['B', '<=', 'AA'], ['AA', '>', '12']] + """ + if caseless: + isequal = ( lambda a,b: a.upper() == b.upper() ) + masks = ( lambda a,b: b.upper().startswith(a.upper()) ) + parseElementClass = CaselessLiteral + else: + isequal = ( lambda a,b: a == b ) + masks = ( lambda a,b: b.startswith(a) ) + parseElementClass = Literal + + symbols = [] + if isinstance(strs,basestring): + symbols = strs.split() + elif isinstance(strs, collections.Iterable): + symbols = list(strs) + else: + warnings.warn("Invalid argument to oneOf, expected string or iterable", + SyntaxWarning, stacklevel=2) + if not symbols: + return NoMatch() + + i = 0 + while i < len(symbols)-1: + cur = symbols[i] + for j,other in enumerate(symbols[i+1:]): + if ( isequal(other, cur) ): + del symbols[i+j+1] + break + elif ( masks(cur, other) ): + del symbols[i+j+1] + symbols.insert(i,other) + cur = other + break + else: + i += 1 + + if not caseless and useRegex: + #~ print (strs,"->", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) + try: + if len(symbols)==len("".join(symbols)): + return Regex( "[%s]" % "".join(_escapeRegexRangeChars(sym) for sym in symbols) ).setName(' | '.join(symbols)) + else: + return Regex( "|".join(re.escape(sym) for sym in symbols) ).setName(' | '.join(symbols)) + except Exception: + warnings.warn("Exception creating Regex for oneOf, building MatchFirst", + SyntaxWarning, stacklevel=2) + + + # last resort, just use MatchFirst + return MatchFirst(parseElementClass(sym) for sym in symbols).setName(' | '.join(symbols)) + +def dictOf( key, value ): + """ + Helper to easily and clearly define a dictionary by specifying the respective patterns + for the key and value. Takes care of defining the C{L{Dict}}, C{L{ZeroOrMore}}, and C{L{Group}} tokens + in the proper order. The key pattern can include delimiting markers or punctuation, + as long as they are suppressed, thereby leaving the significant key text. The value + pattern can include named results, so that the C{Dict} results can include named token + fields. + + Example:: + text = "shape: SQUARE posn: upper left color: light blue texture: burlap" + attr_expr = (label + Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join)) + print(OneOrMore(attr_expr).parseString(text).dump()) + + attr_label = label + attr_value = Suppress(':') + OneOrMore(data_word, stopOn=label).setParseAction(' '.join) + + # similar to Dict, but simpler call format + result = dictOf(attr_label, attr_value).parseString(text) + print(result.dump()) + print(result['shape']) + print(result.shape) # object attribute access works too + print(result.asDict()) + prints:: + [['shape', 'SQUARE'], ['posn', 'upper left'], ['color', 'light blue'], ['texture', 'burlap']] + - color: light blue + - posn: upper left + - shape: SQUARE + - texture: burlap + SQUARE + SQUARE + {'color': 'light blue', 'shape': 'SQUARE', 'posn': 'upper left', 'texture': 'burlap'} + """ + return Dict( ZeroOrMore( Group ( key + value ) ) ) + +def originalTextFor(expr, asString=True): + """ + Helper to return the original, untokenized text for a given expression. Useful to + restore the parsed fields of an HTML start tag into the raw tag text itself, or to + revert separate tokens with intervening whitespace back to the original matching + input text. By default, returns astring containing the original parsed text. + + If the optional C{asString} argument is passed as C{False}, then the return value is a + C{L{ParseResults}} containing any results names that were originally matched, and a + single token containing the original matched text from the input string. So if + the expression passed to C{L{originalTextFor}} contains expressions with defined + results names, you must set C{asString} to C{False} if you want to preserve those + results name values. + + Example:: + src = "this is test <b> bold <i>text</i> </b> normal text " + for tag in ("b","i"): + opener,closer = makeHTMLTags(tag) + patt = originalTextFor(opener + SkipTo(closer) + closer) + print(patt.searchString(src)[0]) + prints:: + ['<b> bold <i>text</i> </b>'] + ['<i>text</i>'] + """ + locMarker = Empty().setParseAction(lambda s,loc,t: loc) + endlocMarker = locMarker.copy() + endlocMarker.callPreparse = False + matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") + if asString: + extractText = lambda s,l,t: s[t._original_start:t._original_end] + else: + def extractText(s,l,t): + t[:] = [s[t.pop('_original_start'):t.pop('_original_end')]] + matchExpr.setParseAction(extractText) + matchExpr.ignoreExprs = expr.ignoreExprs + return matchExpr + +def ungroup(expr): + """ + Helper to undo pyparsing's default grouping of And expressions, even + if all but one are non-empty. + """ + return TokenConverter(expr).setParseAction(lambda t:t[0]) + +def locatedExpr(expr): + """ + Helper to decorate a returned token with its starting and ending locations in the input string. + This helper adds the following results names: + - locn_start = location where matched expression begins + - locn_end = location where matched expression ends + - value = the actual parsed results + + Be careful if the input text contains C{<TAB>} characters, you may want to call + C{L{ParserElement.parseWithTabs}} + + Example:: + wd = Word(alphas) + for match in locatedExpr(wd).searchString("ljsdf123lksdjjf123lkkjj1222"): + print(match) + prints:: + [[0, 'ljsdf', 5]] + [[8, 'lksdjjf', 15]] + [[18, 'lkkjj', 23]] + """ + locator = Empty().setParseAction(lambda s,l,t: l) + return Group(locator("locn_start") + expr("value") + locator.copy().leaveWhitespace()("locn_end")) + + +# convenience constants for positional expressions +empty = Empty().setName("empty") +lineStart = LineStart().setName("lineStart") +lineEnd = LineEnd().setName("lineEnd") +stringStart = StringStart().setName("stringStart") +stringEnd = StringEnd().setName("stringEnd") + +_escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) +_escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0].lstrip(r'\0x'),16))) +_escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) +_singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(printables, excludeChars=r'\]', exact=1) | Regex(r"\w", re.UNICODE) +_charRange = Group(_singleChar + Suppress("-") + _singleChar) +_reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" + +def srange(s): + r""" + Helper to easily define string ranges for use in Word construction. Borrows + syntax from regexp '[]' string range definitions:: + srange("[0-9]") -> "0123456789" + srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" + srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" + The input string must be enclosed in []'s, and the returned string is the expanded + character set joined into a single string. + The values enclosed in the []'s may be: + - a single character + - an escaped character with a leading backslash (such as C{\-} or C{\]}) + - an escaped hex character with a leading C{'\x'} (C{\x21}, which is a C{'!'} character) + (C{\0x##} is also supported for backwards compatibility) + - an escaped octal character with a leading C{'\0'} (C{\041}, which is a C{'!'} character) + - a range of any of the above, separated by a dash (C{'a-z'}, etc.) + - any combination of the above (C{'aeiouy'}, C{'a-zA-Z0-9_$'}, etc.) + """ + _expanded = lambda p: p if not isinstance(p,ParseResults) else ''.join(unichr(c) for c in range(ord(p[0]),ord(p[1])+1)) + try: + return "".join(_expanded(part) for part in _reBracketExpr.parseString(s).body) + except Exception: + return "" + +def matchOnlyAtCol(n): + """ + Helper method for defining parse actions that require matching at a specific + column in the input text. + """ + def verifyCol(strg,locn,toks): + if col(locn,strg) != n: + raise ParseException(strg,locn,"matched token not at column %d" % n) + return verifyCol + +def replaceWith(replStr): + """ + Helper method for common parse actions that simply return a literal value. Especially + useful when used with C{L{transformString<ParserElement.transformString>}()}. + + Example:: + num = Word(nums).setParseAction(lambda toks: int(toks[0])) + na = oneOf("N/A NA").setParseAction(replaceWith(math.nan)) + term = na | num + + OneOrMore(term).parseString("324 234 N/A 234") # -> [324, 234, nan, 234] + """ + return lambda s,l,t: [replStr] + +def removeQuotes(s,l,t): + """ + Helper parse action for removing quotation marks from parsed quoted strings. + + Example:: + # by default, quotation marks are included in parsed results + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["'Now is the Winter of our Discontent'"] + + # use removeQuotes to strip quotation marks from parsed results + quotedString.setParseAction(removeQuotes) + quotedString.parseString("'Now is the Winter of our Discontent'") # -> ["Now is the Winter of our Discontent"] + """ + return t[0][1:-1] + +def tokenMap(func, *args): + """ + Helper to define a parse action by mapping a function to all elements of a ParseResults list.If any additional + args are passed, they are forwarded to the given function as additional arguments after + the token, as in C{hex_integer = Word(hexnums).setParseAction(tokenMap(int, 16))}, which will convert the + parsed data to an integer using base 16. + + Example (compare the last to example in L{ParserElement.transformString}:: + hex_ints = OneOrMore(Word(hexnums)).setParseAction(tokenMap(int, 16)) + hex_ints.runTests(''' + 00 11 22 aa FF 0a 0d 1a + ''') + + upperword = Word(alphas).setParseAction(tokenMap(str.upper)) + OneOrMore(upperword).runTests(''' + my kingdom for a horse + ''') + + wd = Word(alphas).setParseAction(tokenMap(str.title)) + OneOrMore(wd).setParseAction(' '.join).runTests(''' + now is the winter of our discontent made glorious summer by this sun of york + ''') + prints:: + 00 11 22 aa FF 0a 0d 1a + [0, 17, 34, 170, 255, 10, 13, 26] + + my kingdom for a horse + ['MY', 'KINGDOM', 'FOR', 'A', 'HORSE'] + + now is the winter of our discontent made glorious summer by this sun of york + ['Now Is The Winter Of Our Discontent Made Glorious Summer By This Sun Of York'] + """ + def pa(s,l,t): + return [func(tokn, *args) for tokn in t] + + try: + func_name = getattr(func, '__name__', + getattr(func, '__class__').__name__) + except Exception: + func_name = str(func) + pa.__name__ = func_name + + return pa + +upcaseTokens = tokenMap(lambda t: _ustr(t).upper()) +"""(Deprecated) Helper parse action to convert tokens to upper case. Deprecated in favor of L{pyparsing_common.upcaseTokens}""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. Deprecated in favor of L{pyparsing_common.downcaseTokens}""" + +def _makeTags(tagStr, xml): + """Internal helper to construct opening and closing tag expressions, given a tag name""" + if isinstance(tagStr,basestring): + resname = tagStr + tagStr = Keyword(tagStr, caseless=not xml) + else: + resname = tagStr.name + + tagAttrName = Word(alphas,alphanums+"_-:") + if (xml): + tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + else: + printablesLessRAbrack = "".join(c for c in printables if c not in ">") + tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) + openTag = Suppress("<") + tagStr("tag") + \ + Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ + Optional( Suppress("=") + tagAttrValue ) ))) + \ + Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") + closeTag = Combine(_L("</") + tagStr + ">") + + openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % resname) + closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("</%s>" % resname) + openTag.tag = resname + closeTag.tag = resname + return openTag, closeTag + +def makeHTMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for HTML, given a tag name. Matches + tags in either upper or lower case, attributes with namespaces and with quoted or unquoted values. + + Example:: + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + # makeHTMLTags returns pyparsing expressions for the opening and closing tags as a 2-tuple + a,a_end = makeHTMLTags("A") + link_expr = a + SkipTo(a_end)("link_text") + a_end + + for link in link_expr.searchString(text): + # attributes in the <A> tag (like "href" shown here) are also accessible as named results + print(link.link_text, '->', link.href) + prints:: + pyparsing -> http://pyparsing.wikispaces.com + """ + return _makeTags( tagStr, False ) + +def makeXMLTags(tagStr): + """ + Helper to construct opening and closing tag expressions for XML, given a tag name. Matches + tags only in the given upper/lower case. + + Example: similar to L{makeHTMLTags} + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """ + Helper to create a validating parse action to be used with start tags created + with C{L{makeXMLTags}} or C{L{makeHTMLTags}}. Use C{withAttribute} to qualify a starting tag + with a required attribute value, to avoid false matches on common tags such as + C{<TD>} or C{<DIV>}. + + Call C{withAttribute} with a series of attribute names and values. Specify the list + of filter attributes names and values as: + - keyword arguments, as in C{(align="right")}, or + - as an explicit dict with C{**} operator, when an attribute name is also a Python + reserved word, as in C{**{"class":"Customer", "align":"right"}} + - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) + For attribute names with a namespace prefix, you must use the second form. Attribute + names are matched insensitive to upper/lower case. + + If just testing for C{class} (with or without a namespace), use C{L{withClass}}. + + To verify that the attribute exists, but without specifying a value, pass + C{withAttribute.ANY_VALUE} as the value. + + Example:: + html = ''' + <div> + Some text + <div type="grid">1 4 0 1 0</div> + <div type="graph">1,3 2,3 1,1</div> + <div>this has no type</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + + # only match div tag having a type attribute with value "grid" + div_grid = div().setParseAction(withAttribute(type="grid")) + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + # construct a match with any div tag having a type attribute, regardless of the value + div_any_type = div().setParseAction(withAttribute(type=withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + if args: + attrs = args[:] + else: + attrs = attrDict.items() + attrs = [(k,v) for k,v in attrs] + def pa(s,l,tokens): + for attrName,attrValue in attrs: + if attrName not in tokens: + raise ParseException(s,l,"no matching attribute " + attrName) + if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: + raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % + (attrName, tokens[attrName], attrValue)) + return pa +withAttribute.ANY_VALUE = object() + +def withClass(classname, namespace=''): + """ + Simplified version of C{L{withAttribute}} when matching on a div class - made + difficult because C{class} is a reserved word in Python. + + Example:: + html = ''' + <div> + Some text + <div class="grid">1 4 0 1 0</div> + <div class="graph">1,3 2,3 1,1</div> + <div>this <div> has no class</div> + </div> + + ''' + div,div_end = makeHTMLTags("div") + div_grid = div().setParseAction(withClass("grid")) + + grid_expr = div_grid + SkipTo(div | div_end)("body") + for grid_header in grid_expr.searchString(html): + print(grid_header.body) + + div_any_type = div().setParseAction(withClass(withAttribute.ANY_VALUE)) + div_expr = div_any_type + SkipTo(div | div_end)("body") + for div_header in div_expr.searchString(html): + print(div_header.body) + prints:: + 1 4 0 1 0 + + 1 4 0 1 0 + 1,3 2,3 1,1 + """ + classattr = "%s:class" % namespace if namespace else "class" + return withAttribute(**{classattr : classname}) + +opAssoc = _Constants() +opAssoc.LEFT = object() +opAssoc.RIGHT = object() + +def infixNotation( baseExpr, opList, lpar=Suppress('('), rpar=Suppress(')') ): + """ + Helper method for constructing grammars of expressions made up of + operators working in a precedence hierarchy. Operators may be unary or + binary, left- or right-associative. Parse actions can also be attached + to operator expressions. The generated parser will also recognize the use + of parentheses to override operator precedences (see example below). + + Note: if you define a deep operator list, you may see performance issues + when using infixNotation. See L{ParserElement.enablePackrat} for a + mechanism to potentially improve your parser performance. + + Parameters: + - baseExpr - expression representing the most basic element for the nested + - opList - list of tuples, one for each operator precedence level in the + expression grammar; each tuple is of the form + (opExpr, numTerms, rightLeftAssoc, parseAction), where: + - opExpr is the pyparsing expression for the operator; + may also be a string, which will be converted to a Literal; + if numTerms is 3, opExpr is a tuple of two expressions, for the + two operators separating the 3 terms + - numTerms is the number of terms for this operator (must + be 1, 2, or 3) + - rightLeftAssoc is the indicator whether the operator is + right or left associative, using the pyparsing-defined + constants C{opAssoc.RIGHT} and C{opAssoc.LEFT}. + - parseAction is the parse action to be associated with + expressions matching this operator expression (the + parse action tuple member may be omitted) + - lpar - expression for matching left-parentheses (default=C{Suppress('(')}) + - rpar - expression for matching right-parentheses (default=C{Suppress(')')}) + + Example:: + # simple example of four-function arithmetic with ints and variable names + integer = pyparsing_common.signed_integer + varname = pyparsing_common.identifier + + arith_expr = infixNotation(integer | varname, + [ + ('-', 1, opAssoc.RIGHT), + (oneOf('* /'), 2, opAssoc.LEFT), + (oneOf('+ -'), 2, opAssoc.LEFT), + ]) + + arith_expr.runTests(''' + 5+3*6 + (5+3)*6 + -2--11 + ''', fullDump=False) + prints:: + 5+3*6 + [[5, '+', [3, '*', 6]]] + + (5+3)*6 + [[[5, '+', 3], '*', 6]] + + -2--11 + [[['-', 2], '-', ['-', 11]]] + """ + ret = Forward() + lastExpr = baseExpr | ( lpar + ret + rpar ) + for i,operDef in enumerate(opList): + opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] + termName = "%s term" % opExpr if arity < 3 else "%s%s term" % opExpr + if arity == 3: + if opExpr is None or len(opExpr) != 2: + raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") + opExpr1, opExpr2 = opExpr + thisExpr = Forward().setName(termName) + if rightLeftAssoc == opAssoc.LEFT: + if arity == 1: + matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ + Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + elif rightLeftAssoc == opAssoc.RIGHT: + if arity == 1: + # try to avoid LR with this extra test + if not isinstance(opExpr, Optional): + opExpr = Optional(opExpr) + matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ + Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) + else: + raise ValueError("operator must be unary (1), binary (2), or ternary (3)") + else: + raise ValueError("operator must indicate right or left associativity") + if pa: + matchExpr.setParseAction( pa ) + thisExpr <<= ( matchExpr.setName(termName) | lastExpr ) + lastExpr = thisExpr + ret <<= lastExpr + return ret + +operatorPrecedence = infixNotation +"""(Deprecated) Former name of C{L{infixNotation}}, will be dropped in a future release.""" + +dblQuotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"').setName("string enclosed in double quotes") +sglQuotedString = Combine(Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("string enclosed in single quotes") +quotedString = Combine(Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*')+'"'| + Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\(?:[^x]|x[0-9a-fA-F]+)))*")+"'").setName("quotedString using single or double quotes") +unicodeString = Combine(_L('u') + quotedString.copy()).setName("unicode string literal") + +def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): + """ + Helper method for defining nested lists enclosed in opening and closing + delimiters ("(" and ")" are the default). + + Parameters: + - opener - opening character for a nested list (default=C{"("}); can also be a pyparsing expression + - closer - closing character for a nested list (default=C{")"}); can also be a pyparsing expression + - content - expression for items within the nested lists (default=C{None}) + - ignoreExpr - expression for ignoring opening and closing delimiters (default=C{quotedString}) + + If an expression is not provided for the content argument, the nested + expression will capture all whitespace-delimited content between delimiters + as a list of separate values. + + Use the C{ignoreExpr} argument to define expressions that may contain + opening or closing characters that should not be treated as opening + or closing characters for nesting, such as quotedString or a comment + expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. + The default is L{quotedString}, but if no expressions are to be ignored, + then pass C{None} for this argument. + + Example:: + data_type = oneOf("void int short long char float double") + decl_data_type = Combine(data_type + Optional(Word('*'))) + ident = Word(alphas+'_', alphanums+'_') + number = pyparsing_common.number + arg = Group(decl_data_type + ident) + LPAR,RPAR = map(Suppress, "()") + + code_body = nestedExpr('{', '}', ignoreExpr=(quotedString | cStyleComment)) + + c_function = (decl_data_type("type") + + ident("name") + + LPAR + Optional(delimitedList(arg), [])("args") + RPAR + + code_body("body")) + c_function.ignore(cStyleComment) + + source_code = ''' + int is_odd(int x) { + return (x%2); + } + + int dec_to_hex(char hchar) { + if (hchar >= '0' && hchar <= '9') { + return (ord(hchar)-ord('0')); + } else { + return (10+ord(hchar)-ord('A')); + } + } + ''' + for func in c_function.searchString(source_code): + print("%(name)s (%(type)s) args: %(args)s" % func) + + prints:: + is_odd (int) args: [['int', 'x']] + dec_to_hex (int) args: [['char', 'hchar']] + """ + if opener == closer: + raise ValueError("opening and closing strings cannot be the same") + if content is None: + if isinstance(opener,basestring) and isinstance(closer,basestring): + if len(opener) == 1 and len(closer)==1: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS + ).setParseAction(lambda t:t[0].strip())) + else: + if ignoreExpr is not None: + content = (Combine(OneOrMore(~ignoreExpr + + ~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) + ).setParseAction(lambda t:t[0].strip())) + else: + raise ValueError("opening and closing arguments must be strings if no content expression is given") + ret = Forward() + if ignoreExpr is not None: + ret <<= Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) + else: + ret <<= Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) + ret.setName('nested %s%s expression' % (opener,closer)) + return ret + +def indentedBlock(blockStatementExpr, indentStack, indent=True): + """ + Helper method for defining space-delimited indentation blocks, such as + those used to define block statements in Python source code. + + Parameters: + - blockStatementExpr - expression defining syntax of statement that + is repeated within the indented block + - indentStack - list created by caller to manage indentation stack + (multiple statementWithIndentedBlock expressions within a single grammar + should share a common indentStack) + - indent - boolean indicating whether block must be indented beyond the + the current level; set to False for block of left-most statements + (default=C{True}) + + A valid block must contain at least one C{blockStatement}. + + Example:: + data = ''' + def A(z): + A1 + B = 100 + G = A2 + A2 + A3 + B + def BB(a,b,c): + BB1 + def BBA(): + bba1 + bba2 + bba3 + C + D + def spam(x,y): + def eggs(z): + pass + ''' + + + indentStack = [1] + stmt = Forward() + + identifier = Word(alphas, alphanums) + funcDecl = ("def" + identifier + Group( "(" + Optional( delimitedList(identifier) ) + ")" ) + ":") + func_body = indentedBlock(stmt, indentStack) + funcDef = Group( funcDecl + func_body ) + + rvalue = Forward() + funcCall = Group(identifier + "(" + Optional(delimitedList(rvalue)) + ")") + rvalue << (funcCall | identifier | Word(nums)) + assignment = Group(identifier + "=" + rvalue) + stmt << ( funcDef | assignment | identifier ) + + module_body = OneOrMore(stmt) + + parseTree = module_body.parseString(data) + parseTree.pprint() + prints:: + [['def', + 'A', + ['(', 'z', ')'], + ':', + [['A1'], [['B', '=', '100']], [['G', '=', 'A2']], ['A2'], ['A3']]], + 'B', + ['def', + 'BB', + ['(', 'a', 'b', 'c', ')'], + ':', + [['BB1'], [['def', 'BBA', ['(', ')'], ':', [['bba1'], ['bba2'], ['bba3']]]]]], + 'C', + 'D', + ['def', + 'spam', + ['(', 'x', 'y', ')'], + ':', + [[['def', 'eggs', ['(', 'z', ')'], ':', [['pass']]]]]]] + """ + def checkPeerIndent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if curCol != indentStack[-1]: + if curCol > indentStack[-1]: + raise ParseFatalException(s,l,"illegal nesting") + raise ParseException(s,l,"not a peer entry") + + def checkSubIndent(s,l,t): + curCol = col(l,s) + if curCol > indentStack[-1]: + indentStack.append( curCol ) + else: + raise ParseException(s,l,"not a subentry") + + def checkUnindent(s,l,t): + if l >= len(s): return + curCol = col(l,s) + if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): + raise ParseException(s,l,"not an unindent") + indentStack.pop() + + NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) + INDENT = (Empty() + Empty().setParseAction(checkSubIndent)).setName('INDENT') + PEER = Empty().setParseAction(checkPeerIndent).setName('') + UNDENT = Empty().setParseAction(checkUnindent).setName('UNINDENT') + if indent: + smExpr = Group( Optional(NL) + + #~ FollowedBy(blockStatementExpr) + + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) + else: + smExpr = Group( Optional(NL) + + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) + blockStatementExpr.ignore(_bslash + LineEnd()) + return smExpr.setName('indented block') + +alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") +punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") + +anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:").setName('any tag')) +_htmlEntityMap = dict(zip("gt lt amp nbsp quot apos".split(),'><& "\'')) +commonHTMLEntity = Regex('&(?P<entity>' + '|'.join(_htmlEntityMap.keys()) +");").setName("common HTML entity") +def replaceHTMLEntity(t): + """Helper parser action to replace common HTML entities with their special characters""" + return _htmlEntityMap.get(t.entity) + +# it's easy to get these comment structures wrong - they're very common, so may as well make them available +cStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/').setName("C style comment") +"Comment of the form C{/* ... */}" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form C{<!-- ... -->}" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form C{// ... (to end of line)}" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form C{L{cStyleComment}} or C{L{dblSlashComment}}" + +javaStyleComment = cppStyleComment +"Same as C{L{cppStyleComment}}" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form C{# ... (to end of line)}" + +_commasepitem = Combine(OneOrMore(Word(printables, excludeChars=',') + + Optional( Word(" \t") + + ~Literal(",") + ~LineEnd() ) ) ).streamline().setName("commaItem") +commaSeparatedList = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("commaSeparatedList") +"""(Deprecated) Predefined expression of 1 or more printable words or quoted strings, separated by commas. + This expression is deprecated in favor of L{pyparsing_common.comma_separated_list}.""" + +# some other useful expressions - using lower-case class name since we are really using this as a namespace +class pyparsing_common: + """ + Here are some common low-level expressions that may be useful in jump-starting parser development: + - numeric forms (L{integers<integer>}, L{reals<real>}, L{scientific notation<sci_real>}) + - common L{programming identifiers<identifier>} + - network addresses (L{MAC<mac_address>}, L{IPv4<ipv4_address>}, L{IPv6<ipv6_address>}) + - ISO8601 L{dates<iso8601_date>} and L{datetime<iso8601_datetime>} + - L{UUID<uuid>} + - L{comma-separated list<comma_separated_list>} + Parse actions: + - C{L{convertToInteger}} + - C{L{convertToFloat}} + - C{L{convertToDate}} + - C{L{convertToDatetime}} + - C{L{stripHTMLTags}} + - C{L{upcaseTokens}} + - C{L{downcaseTokens}} + + Example:: + pyparsing_common.number.runTests(''' + # any int or real number, returned as the appropriate type + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.fnumber.runTests(''' + # any int or real number, returned as float + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + ''') + + pyparsing_common.hex_integer.runTests(''' + # hex numbers + 100 + FF + ''') + + pyparsing_common.fraction.runTests(''' + # fractions + 1/2 + -3/4 + ''') + + pyparsing_common.mixed_integer.runTests(''' + # mixed fractions + 1 + 1/2 + -3/4 + 1-3/4 + ''') + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(''' + # uuid + 12345678-1234-5678-1234-567812345678 + ''') + prints:: + # any int or real number, returned as the appropriate type + 100 + [100] + + -100 + [-100] + + +100 + [100] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # any int or real number, returned as float + 100 + [100.0] + + -100 + [-100.0] + + +100 + [100.0] + + 3.14159 + [3.14159] + + 6.02e23 + [6.02e+23] + + 1e-12 + [1e-12] + + # hex numbers + 100 + [256] + + FF + [255] + + # fractions + 1/2 + [0.5] + + -3/4 + [-0.75] + + # mixed fractions + 1 + [1] + + 1/2 + [0.5] + + -3/4 + [-0.75] + + 1-3/4 + [1.75] + + # uuid + 12345678-1234-5678-1234-567812345678 + [UUID('12345678-1234-5678-1234-567812345678')] + """ + + convertToInteger = tokenMap(int) + """ + Parse action for converting parsed integers to Python int + """ + + convertToFloat = tokenMap(float) + """ + Parse action for converting parsed numbers to Python float + """ + + integer = Word(nums).setName("integer").setParseAction(convertToInteger) + """expression that parses an unsigned integer, returns an int""" + + hex_integer = Word(hexnums).setName("hex integer").setParseAction(tokenMap(int,16)) + """expression that parses a hexadecimal integer, returns an int""" + + signed_integer = Regex(r'[+-]?\d+').setName("signed integer").setParseAction(convertToInteger) + """expression that parses an integer with optional leading sign, returns an int""" + + fraction = (signed_integer().setParseAction(convertToFloat) + '/' + signed_integer().setParseAction(convertToFloat)).setName("fraction") + """fractional expression of an integer divided by an integer, returns a float""" + fraction.addParseAction(lambda t: t[0]/t[-1]) + + mixed_integer = (fraction | signed_integer + Optional(Optional('-').suppress() + fraction)).setName("fraction or mixed integer-fraction") + """mixed integer of the form 'integer - fraction', with optional leading integer, returns float""" + mixed_integer.addParseAction(sum) + + real = Regex(r'[+-]?\d+\.\d*').setName("real number").setParseAction(convertToFloat) + """expression that parses a floating point number and returns a float""" + + sci_real = Regex(r'[+-]?\d+([eE][+-]?\d+|\.\d*([eE][+-]?\d+)?)').setName("real number with scientific notation").setParseAction(convertToFloat) + """expression that parses a floating point number with optional scientific notation and returns a float""" + + # streamlining this expression makes the docs nicer-looking + number = (sci_real | real | signed_integer).streamline() + """any numeric expression, returns the corresponding Python type""" + + fnumber = Regex(r'[+-]?\d+\.?\d*([eE][+-]?\d+)?').setName("fnumber").setParseAction(convertToFloat) + """any int or real number, returned as float""" + + identifier = Word(alphas+'_', alphanums+'_').setName("identifier") + """typical code identifier (leading alpha or '_', followed by 0 or more alphas, nums, or '_')""" + + ipv4_address = Regex(r'(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})(\.(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})){3}').setName("IPv4 address") + "IPv4 address (C{0.0.0.0 - 255.255.255.255})" + + _ipv6_part = Regex(r'[0-9a-fA-F]{1,4}').setName("hex_integer") + _full_ipv6_address = (_ipv6_part + (':' + _ipv6_part)*7).setName("full IPv6 address") + _short_ipv6_address = (Optional(_ipv6_part + (':' + _ipv6_part)*(0,6)) + "::" + Optional(_ipv6_part + (':' + _ipv6_part)*(0,6))).setName("short IPv6 address") + _short_ipv6_address.addCondition(lambda t: sum(1 for tt in t if pyparsing_common._ipv6_part.matches(tt)) < 8) + _mixed_ipv6_address = ("::ffff:" + ipv4_address).setName("mixed IPv6 address") + ipv6_address = Combine((_full_ipv6_address | _mixed_ipv6_address | _short_ipv6_address).setName("IPv6 address")).setName("IPv6 address") + "IPv6 address (long, short, or mixed form)" + + mac_address = Regex(r'[0-9a-fA-F]{2}([:.-])[0-9a-fA-F]{2}(?:\1[0-9a-fA-F]{2}){4}').setName("MAC address") + "MAC address xx:xx:xx:xx:xx (may also have '-' or '.' delimiters)" + + @staticmethod + def convertToDate(fmt="%Y-%m-%d"): + """ + Helper to create a parse action for converting parsed date string to Python datetime.date + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%d"}) + + Example:: + date_expr = pyparsing_common.iso8601_date.copy() + date_expr.setParseAction(pyparsing_common.convertToDate()) + print(date_expr.parseString("1999-12-31")) + prints:: + [datetime.date(1999, 12, 31)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt).date() + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + @staticmethod + def convertToDatetime(fmt="%Y-%m-%dT%H:%M:%S.%f"): + """ + Helper to create a parse action for converting parsed datetime string to Python datetime.datetime + + Params - + - fmt - format to be passed to datetime.strptime (default=C{"%Y-%m-%dT%H:%M:%S.%f"}) + + Example:: + dt_expr = pyparsing_common.iso8601_datetime.copy() + dt_expr.setParseAction(pyparsing_common.convertToDatetime()) + print(dt_expr.parseString("1999-12-31T23:59:59.999")) + prints:: + [datetime.datetime(1999, 12, 31, 23, 59, 59, 999000)] + """ + def cvt_fn(s,l,t): + try: + return datetime.strptime(t[0], fmt) + except ValueError as ve: + raise ParseException(s, l, str(ve)) + return cvt_fn + + iso8601_date = Regex(r'(?P<year>\d{4})(?:-(?P<month>\d\d)(?:-(?P<day>\d\d))?)?').setName("ISO8601 date") + "ISO8601 date (C{yyyy-mm-dd})" + + iso8601_datetime = Regex(r'(?P<year>\d{4})-(?P<month>\d\d)-(?P<day>\d\d)[T ](?P<hour>\d\d):(?P<minute>\d\d)(:(?P<second>\d\d(\.\d*)?)?)?(?P<tz>Z|[+-]\d\d:?\d\d)?').setName("ISO8601 datetime") + "ISO8601 datetime (C{yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)}) - trailing seconds, milliseconds, and timezone optional; accepts separating C{'T'} or C{' '}" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (C{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx})" + + _html_stripper = anyOpenTag.suppress() | anyCloseTag.suppress() + @staticmethod + def stripHTMLTags(s, l, tokens): + """ + Parse action to remove HTML tags from web page HTML source + + Example:: + # strip HTML links from normal text + text = '<td>More info at the <a href="http://pyparsing.wikispaces.com">pyparsing</a> wiki page</td>' + td,td_end = makeHTMLTags("TD") + table_text = td + SkipTo(td_end).setParseAction(pyparsing_common.stripHTMLTags)("body") + td_end + + print(table_text.parseString(text).body) # -> 'More info at the pyparsing wiki page' + """ + return pyparsing_common._html_stripper.transformString(tokens[0]) + + _commasepitem = Combine(OneOrMore(~Literal(",") + ~LineEnd() + Word(printables, excludeChars=',') + + Optional( White(" \t") ) ) ).streamline().setName("commaItem") + comma_separated_list = delimitedList( Optional( quotedString.copy() | _commasepitem, default="") ).setName("comma separated list") + """Predefined expression of 1 or more printable words or quoted strings, separated by commas.""" + + upcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).upper())) + """Parse action to convert tokens to upper case.""" + + downcaseTokens = staticmethod(tokenMap(lambda t: _ustr(t).lower())) + """Parse action to convert tokens to lower case.""" + + +if __name__ == "__main__": + + selectToken = CaselessLiteral("select") + fromToken = CaselessLiteral("from") + + ident = Word(alphas, alphanums + "_$") + + columnName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + columnNameList = Group(delimitedList(columnName)).setName("columns") + columnSpec = ('*' | columnNameList) + + tableName = delimitedList(ident, ".", combine=True).setParseAction(upcaseTokens) + tableNameList = Group(delimitedList(tableName)).setName("tables") + + simpleSQL = selectToken("command") + columnSpec("columns") + fromToken + tableNameList("tables") + + # demo runTests method, including embedded comments in test string + simpleSQL.runTests(""" + # '*' as column list and dotted table name + select * from SYS.XYZZY + + # caseless match on "SELECT", and casts back to "select" + SELECT * from XYZZY, ABC + + # list of column names, and mixed case SELECT keyword + Select AA,BB,CC from Sys.dual + + # multiple tables + Select A, B, C from Sys.dual, Table2 + + # invalid SELECT keyword - should fail + Xelect A, B, C from Sys.dual + + # incomplete command - should fail + Select + + # invalid column name - should fail + Select ^^^ frox Sys.dual + + """) + + pyparsing_common.number.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + # any int or real number, returned as float + pyparsing_common.fnumber.runTests(""" + 100 + -100 + +100 + 3.14159 + 6.02e23 + 1e-12 + """) + + pyparsing_common.hex_integer.runTests(""" + 100 + FF + """) + + import uuid + pyparsing_common.uuid.setParseAction(tokenMap(uuid.UUID)) + pyparsing_common.uuid.runTests(""" + 12345678-1234-5678-1234-567812345678 + """) diff --git a/myenv/lib/python3.7/site-packages/setuptools/_vendor/six.py b/myenv/lib/python3.7/site-packages/setuptools/_vendor/six.py new file mode 100644 index 000000000..190c0239c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/_vendor/six.py @@ -0,0 +1,868 @@ +"""Utilities for writing code that runs on Python 2 and 3""" + +# Copyright (c) 2010-2015 Benjamin Peterson +# +# 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. + +from __future__ import absolute_import + +import functools +import itertools +import operator +import sys +import types + +__author__ = "Benjamin Peterson <benjamin@python.org>" +__version__ = "1.10.0" + + +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 +PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) + +if PY3: + string_types = str, + integer_types = int, + class_types = type, + text_type = str + binary_type = bytes + + MAXSIZE = sys.maxsize +else: + string_types = basestring, + integer_types = (int, long) + class_types = (type, types.ClassType) + text_type = unicode + binary_type = str + + if sys.platform.startswith("java"): + # Jython always uses 32 bits. + MAXSIZE = int((1 << 31) - 1) + else: + # It's possible to have sizeof(long) != sizeof(Py_ssize_t). + class X(object): + + def __len__(self): + return 1 << 31 + try: + len(X()) + except OverflowError: + # 32-bit + MAXSIZE = int((1 << 31) - 1) + else: + # 64-bit + MAXSIZE = int((1 << 63) - 1) + del X + + +def _add_doc(func, doc): + """Add documentation to a function.""" + func.__doc__ = doc + + +def _import_module(name): + """Import module, returning the module after the last dot.""" + __import__(name) + return sys.modules[name] + + +class _LazyDescr(object): + + def __init__(self, name): + self.name = name + + def __get__(self, obj, tp): + result = self._resolve() + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass + return result + + +class MovedModule(_LazyDescr): + + def __init__(self, name, old, new=None): + super(MovedModule, self).__init__(name) + if PY3: + if new is None: + new = name + self.mod = new + else: + self.mod = old + + def _resolve(self): + return _import_module(self.mod) + + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + + +class MovedAttribute(_LazyDescr): + + def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): + super(MovedAttribute, self).__init__(name) + if PY3: + if new_mod is None: + new_mod = name + self.mod = new_mod + if new_attr is None: + if old_attr is None: + new_attr = name + else: + new_attr = old_attr + self.attr = new_attr + else: + self.mod = old_mod + if old_attr is None: + old_attr = name + self.attr = old_attr + + def _resolve(self): + module = _import_module(self.mod) + return getattr(module, self.attr) + + +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): + + """Lazy loading of moved objects""" + __path__ = [] # mark as package + + +_moved_attributes = [ + MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), + MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), + MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), + MovedAttribute("map", "itertools", "builtins", "imap", "map"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), + MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), + MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), + MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), + MovedModule("builtins", "__builtin__"), + MovedModule("configparser", "ConfigParser"), + MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), + MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), + MovedModule("http_cookies", "Cookie", "http.cookies"), + MovedModule("html_entities", "htmlentitydefs", "html.entities"), + MovedModule("html_parser", "HTMLParser", "html.parser"), + MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), + MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), + MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), + MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), + MovedModule("cPickle", "cPickle", "pickle"), + MovedModule("queue", "Queue"), + MovedModule("reprlib", "repr"), + MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), + MovedModule("tkinter", "Tkinter"), + MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), + MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), + MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), + MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), + MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), + MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), + MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), + MovedModule("tkinter_colorchooser", "tkColorChooser", + "tkinter.colorchooser"), + MovedModule("tkinter_commondialog", "tkCommonDialog", + "tkinter.commondialog"), + MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), + MovedModule("tkinter_font", "tkFont", "tkinter.font"), + MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), + MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", + "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), + MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), +] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + +for attr in _moved_attributes: + setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) +del attr + +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") + + +def add_move(move): + """Add an item to six.moves.""" + setattr(_MovedItems, move.name, move) + + +def remove_move(name): + """Remove item from six.moves.""" + try: + delattr(_MovedItems, name) + except AttributeError: + try: + del moves.__dict__[name] + except KeyError: + raise AttributeError("no such move, %r" % (name,)) + + +if PY3: + _meth_func = "__func__" + _meth_self = "__self__" + + _func_closure = "__closure__" + _func_code = "__code__" + _func_defaults = "__defaults__" + _func_globals = "__globals__" +else: + _meth_func = "im_func" + _meth_self = "im_self" + + _func_closure = "func_closure" + _func_code = "func_code" + _func_defaults = "func_defaults" + _func_globals = "func_globals" + + +try: + advance_iterator = next +except NameError: + def advance_iterator(it): + return it.next() +next = advance_iterator + + +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + +if PY3: + def get_unbound_function(unbound): + return unbound + + create_bound_method = types.MethodType + + def create_unbound_method(func, cls): + return func + + Iterator = object +else: + def get_unbound_function(unbound): + return unbound.im_func + + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + + class Iterator(object): + + def next(self): + return type(self).__next__(self) + + callable = callable +_add_doc(get_unbound_function, + """Get the function out of a possibly unbound function""") + + +get_method_function = operator.attrgetter(_meth_func) +get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) +get_function_code = operator.attrgetter(_func_code) +get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) + + +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) + + def itervalues(d, **kw): + return iter(d.values(**kw)) + + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") + + +if PY3: + def b(s): + return s.encode("latin-1") + + def u(s): + return s + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter + import io + StringIO = io.StringIO + BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" +else: + def b(s): + return s + # Workaround for standalone backslash + + def u(s): + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr + int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) + import StringIO + StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" +_add_doc(b, """Byte literal""") +_add_doc(u, """Text literal""") + + +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) + + +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + + def reraise(tp, value, tb=None): + if value is None: + value = tp() + if value.__traceback__ is not tb: + raise value.with_traceback(tb) + raise value + +else: + def exec_(_code_, _globs_=None, _locs_=None): + """Execute code in a namespace.""" + if _globs_ is None: + frame = sys._getframe(1) + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals + del frame + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") + + exec_("""def reraise(tp, value, tb=None): + raise tp, value, tb +""") + + +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: + def print_(*args, **kwargs): + """The new-style print function for Python 2.4 and 2.5.""" + fp = kwargs.pop("file", sys.stdout) + if fp is None: + return + + def write(data): + if not isinstance(data, basestring): + data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) + fp.write(data) + want_unicode = False + sep = kwargs.pop("sep", None) + if sep is not None: + if isinstance(sep, unicode): + want_unicode = True + elif not isinstance(sep, str): + raise TypeError("sep must be None or a string") + end = kwargs.pop("end", None) + if end is not None: + if isinstance(end, unicode): + want_unicode = True + elif not isinstance(end, str): + raise TypeError("end must be None or a string") + if kwargs: + raise TypeError("invalid keyword arguments to print()") + if not want_unicode: + for arg in args: + if isinstance(arg, unicode): + want_unicode = True + break + if want_unicode: + newline = unicode("\n") + space = unicode(" ") + else: + newline = "\n" + space = " " + if sep is None: + sep = space + if end is None: + end = newline + for i, arg in enumerate(args): + if i: + write(sep) + write(arg) + write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() + +_add_doc(reraise, """Reraise an exception.""") + +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps + + +def with_metaclass(meta, *bases): + """Create a base class with a metaclass.""" + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/myenv/lib/python3.7/site-packages/setuptools/archive_util.py b/myenv/lib/python3.7/site-packages/setuptools/archive_util.py new file mode 100644 index 000000000..81436044d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/archive_util.py @@ -0,0 +1,173 @@ +"""Utilities for extracting common archive formats""" + +import zipfile +import tarfile +import os +import shutil +import posixpath +import contextlib +from distutils.errors import DistutilsError + +from pkg_resources import ensure_directory + +__all__ = [ + "unpack_archive", "unpack_zipfile", "unpack_tarfile", "default_filter", + "UnrecognizedFormat", "extraction_drivers", "unpack_directory", +] + + +class UnrecognizedFormat(DistutilsError): + """Couldn't recognize the archive type""" + + +def default_filter(src, dst): + """The default progress/filter callback; returns True for all files""" + return dst + + +def unpack_archive(filename, extract_dir, progress_filter=default_filter, + drivers=None): + """Unpack `filename` to `extract_dir`, or raise ``UnrecognizedFormat`` + + `progress_filter` is a function taking two arguments: a source path + internal to the archive ('/'-separated), and a filesystem path where it + will be extracted. The callback must return the desired extract path + (which may be the same as the one passed in), or else ``None`` to skip + that file or directory. The callback can thus be used to report on the + progress of the extraction, as well as to filter the items extracted or + alter their extraction paths. + + `drivers`, if supplied, must be a non-empty sequence of functions with the + same signature as this function (minus the `drivers` argument), that raise + ``UnrecognizedFormat`` if they do not support extracting the designated + archive type. The `drivers` are tried in sequence until one is found that + does not raise an error, or until all are exhausted (in which case + ``UnrecognizedFormat`` is raised). If you do not supply a sequence of + drivers, the module's ``extraction_drivers`` constant will be used, which + means that ``unpack_zipfile`` and ``unpack_tarfile`` will be tried, in that + order. + """ + for driver in drivers or extraction_drivers: + try: + driver(filename, extract_dir, progress_filter) + except UnrecognizedFormat: + continue + else: + return + else: + raise UnrecognizedFormat( + "Not a recognized archive type: %s" % filename + ) + + +def unpack_directory(filename, extract_dir, progress_filter=default_filter): + """"Unpack" a directory, using the same interface as for archives + + Raises ``UnrecognizedFormat`` if `filename` is not a directory + """ + if not os.path.isdir(filename): + raise UnrecognizedFormat("%s is not a directory" % filename) + + paths = { + filename: ('', extract_dir), + } + for base, dirs, files in os.walk(filename): + src, dst = paths[base] + for d in dirs: + paths[os.path.join(base, d)] = src + d + '/', os.path.join(dst, d) + for f in files: + target = os.path.join(dst, f) + target = progress_filter(src + f, target) + if not target: + # skip non-files + continue + ensure_directory(target) + f = os.path.join(base, f) + shutil.copyfile(f, target) + shutil.copystat(f, target) + + +def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): + """Unpack zip `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a zipfile (as determined + by ``zipfile.is_zipfile()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + + if not zipfile.is_zipfile(filename): + raise UnrecognizedFormat("%s is not a zip file" % (filename,)) + + with zipfile.ZipFile(filename) as z: + for info in z.infolist(): + name = info.filename + + # don't extract absolute paths or ones with .. in them + if name.startswith('/') or '..' in name.split('/'): + continue + + target = os.path.join(extract_dir, *name.split('/')) + target = progress_filter(name, target) + if not target: + continue + if name.endswith('/'): + # directory + ensure_directory(target) + else: + # file + ensure_directory(target) + data = z.read(info.filename) + with open(target, 'wb') as f: + f.write(data) + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) + + +def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): + """Unpack tar/tar.gz/tar.bz2 `filename` to `extract_dir` + + Raises ``UnrecognizedFormat`` if `filename` is not a tarfile (as determined + by ``tarfile.open()``). See ``unpack_archive()`` for an explanation + of the `progress_filter` argument. + """ + try: + tarobj = tarfile.open(filename) + except tarfile.TarError: + raise UnrecognizedFormat( + "%s is not a compressed or uncompressed tar file" % (filename,) + ) + with contextlib.closing(tarobj): + # don't do any chowning! + tarobj.chown = lambda *args: None + for member in tarobj: + name = member.name + # don't extract absolute paths or ones with .. in them + if not name.startswith('/') and '..' not in name.split('/'): + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal + # files + while member is not None and (member.islnk() or member.issym()): + linkpath = member.linkname + if member.issym(): + base = posixpath.dirname(member.name) + linkpath = posixpath.join(base, linkpath) + linkpath = posixpath.normpath(linkpath) + member = tarobj._getmember(linkpath) + + if member is not None and (member.isfile() or member.isdir()): + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] + try: + # XXX Ugh + tarobj._extract_member(member, final_dst) + except tarfile.ExtractError: + # chown/chmod/mkfifo/mknode/makedev failed + pass + return True + + +extraction_drivers = unpack_directory, unpack_zipfile, unpack_tarfile diff --git a/myenv/lib/python3.7/site-packages/setuptools/build_meta.py b/myenv/lib/python3.7/site-packages/setuptools/build_meta.py new file mode 100644 index 000000000..609ea1e51 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/build_meta.py @@ -0,0 +1,172 @@ +"""A PEP 517 interface to setuptools + +Previously, when a user or a command line tool (let's call it a "frontend") +needed to make a request of setuptools to take a certain action, for +example, generating a list of installation requirements, the frontend would +would call "setup.py egg_info" or "setup.py bdist_wheel" on the command line. + +PEP 517 defines a different method of interfacing with setuptools. Rather +than calling "setup.py" directly, the frontend should: + + 1. Set the current directory to the directory with a setup.py file + 2. Import this module into a safe python interpreter (one in which + setuptools can potentially set global variables or crash hard). + 3. Call one of the functions defined in PEP 517. + +What each function does is defined in PEP 517. However, here is a "casual" +definition of the functions (this definition should not be relied on for +bug reports or API stability): + + - `build_wheel`: build a wheel in the folder and return the basename + - `get_requires_for_build_wheel`: get the `setup_requires` to build + - `prepare_metadata_for_build_wheel`: get the `install_requires` + - `build_sdist`: build an sdist in the folder and return the basename + - `get_requires_for_build_sdist`: get the `setup_requires` to build + +Again, this is not a formal definition! Just a "taste" of the module. +""" + +import os +import sys +import tokenize +import shutil +import contextlib + +import setuptools +import distutils + + +class SetupRequirementsError(BaseException): + def __init__(self, specifiers): + self.specifiers = specifiers + + +class Distribution(setuptools.dist.Distribution): + def fetch_build_eggs(self, specifiers): + raise SetupRequirementsError(specifiers) + + @classmethod + @contextlib.contextmanager + def patch(cls): + """ + Replace + distutils.dist.Distribution with this class + for the duration of this context. + """ + orig = distutils.core.Distribution + distutils.core.Distribution = cls + try: + yield + finally: + distutils.core.Distribution = orig + + +def _run_setup(setup_script='setup.py'): + # Note that we can reuse our build directory between calls + # Correctness comes first, then optimization later + __file__ = setup_script + __name__ = '__main__' + f = getattr(tokenize, 'open', open)(__file__) + code = f.read().replace('\\r\\n', '\\n') + f.close() + exec(compile(code, __file__, 'exec'), locals()) + + +def _fix_config(config_settings): + config_settings = config_settings or {} + config_settings.setdefault('--global-option', []) + return config_settings + + +def _get_build_requires(config_settings): + config_settings = _fix_config(config_settings) + requirements = ['setuptools', 'wheel'] + + sys.argv = sys.argv[:1] + ['egg_info'] + \ + config_settings["--global-option"] + try: + with Distribution.patch(): + _run_setup() + except SetupRequirementsError as e: + requirements += e.specifiers + + return requirements + + +def _get_immediate_subdirectories(a_dir): + return [name for name in os.listdir(a_dir) + if os.path.isdir(os.path.join(a_dir, name))] + + +def get_requires_for_build_wheel(config_settings=None): + config_settings = _fix_config(config_settings) + return _get_build_requires(config_settings) + + +def get_requires_for_build_sdist(config_settings=None): + config_settings = _fix_config(config_settings) + return _get_build_requires(config_settings) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings=None): + sys.argv = sys.argv[:1] + ['dist_info', '--egg-base', metadata_directory] + _run_setup() + + dist_info_directory = metadata_directory + while True: + dist_infos = [f for f in os.listdir(dist_info_directory) + if f.endswith('.dist-info')] + + if len(dist_infos) == 0 and \ + len(_get_immediate_subdirectories(dist_info_directory)) == 1: + dist_info_directory = os.path.join( + dist_info_directory, os.listdir(dist_info_directory)[0]) + continue + + assert len(dist_infos) == 1 + break + + # PEP 517 requires that the .dist-info directory be placed in the + # metadata_directory. To comply, we MUST copy the directory to the root + if dist_info_directory != metadata_directory: + shutil.move( + os.path.join(dist_info_directory, dist_infos[0]), + metadata_directory) + shutil.rmtree(dist_info_directory, ignore_errors=True) + + return dist_infos[0] + + +def build_wheel(wheel_directory, config_settings=None, + metadata_directory=None): + config_settings = _fix_config(config_settings) + wheel_directory = os.path.abspath(wheel_directory) + sys.argv = sys.argv[:1] + ['bdist_wheel'] + \ + config_settings["--global-option"] + _run_setup() + if wheel_directory != 'dist': + shutil.rmtree(wheel_directory) + shutil.copytree('dist', wheel_directory) + + wheels = [f for f in os.listdir(wheel_directory) + if f.endswith('.whl')] + + assert len(wheels) == 1 + return wheels[0] + + +def build_sdist(sdist_directory, config_settings=None): + config_settings = _fix_config(config_settings) + sdist_directory = os.path.abspath(sdist_directory) + sys.argv = sys.argv[:1] + ['sdist'] + \ + config_settings["--global-option"] + _run_setup() + if sdist_directory != 'dist': + shutil.rmtree(sdist_directory) + shutil.copytree('dist', sdist_directory) + + sdists = [f for f in os.listdir(sdist_directory) + if f.endswith('.tar.gz')] + + assert len(sdists) == 1 + return sdists[0] diff --git a/myenv/lib/python3.7/site-packages/setuptools/cli-32.exe b/myenv/lib/python3.7/site-packages/setuptools/cli-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/cli-64.exe b/myenv/lib/python3.7/site-packages/setuptools/cli-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..675e6bf3743f3d3011c238657e7128ee9960ef7f GIT binary patch literal 74752 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 &sjKl@1{;unAiW2w^OujNoW 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/cli.exe b/myenv/lib/python3.7/site-packages/setuptools/cli.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__init__.py b/myenv/lib/python3.7/site-packages/setuptools/command/__init__.py new file mode 100644 index 000000000..fe619e2e6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/__init__.py @@ -0,0 +1,18 @@ +__all__ = [ + 'alias', 'bdist_egg', 'bdist_rpm', 'build_ext', 'build_py', 'develop', + 'easy_install', 'egg_info', 'install', 'install_lib', 'rotate', 'saveopts', + 'sdist', 'setopt', 'test', 'install_egg_info', 'install_scripts', + 'register', 'bdist_wininst', 'upload_docs', 'upload', 'build_clib', + 'dist_info', +] + +from distutils.command.bdist import bdist +import sys + +from setuptools.command import install_scripts + +if 'egg' not in bdist.format_commands: + bdist.format_command['egg'] = ('bdist_egg', "Python .egg file") + bdist.format_commands.append('egg') + +del bdist, sys diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11d18b6302bfb66edca3ba8ee5a4f82c28d6565c GIT binary patch literal 752 zcmY*W%Wl&^6!jy1BypNhXhH}`-Dc64S41jR2=M_3L07KO$nl+|6UH7hGjU132A2HN zY+3OOthmmD!dSj@?$Mn4eB0@?EIg~r{-+O)W&Nz3!x<oWgTJ~(0~XlefC~-qz=r@r zXhI9x5J3lypbI^?2gh(99>59omxIKD0X*b(?j(*~;~{qw7w<>Bk$Z`U+=x0W|8pQE zJVq42=)$U*Zy}7n+qQM(T)8m(XpNs3FXb#%ra1?uG@;Ao0m?E*xMmy({i;p4gXP8q zKr6~cX(F1c4Pk}SDd#3cEjkNff&<mw1H#$d_)_Rp(<D@BMMbHV@l>5N@fFqRn}()J zo8Ce5H(d9?s7$h27fQNBA(f`HtNMl&^_!%<F1bj7fXI~bcaCZ83eT{Hq`7UfF7g-7 z-5T4*+eUadwq+NI#Ko**N8-Ay+ur+)z81yl1i8}%<8<6K0U_8cA<3YQwAPHPNhb0< zEnu>ZBu`LkT(wcjG4{1CwGel2c1gMmA@fv|y-+1b{}aYf%aRuG!;(Xcwl%+R;!?5- z2N+kWj2D6fl`76<JYNwqQ`6#A1urvFR?na6#ca8f{Mll9ejZ=OB`eSNBRrGYboN4j vN#ncP{)PLBVuFignve;uJG{sRtT}yM4@LFSM0RAi@blfs4xPxUape2~8Tju@ literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/alias.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d19f531c06a99f6ec264ded29a56abfb0d5c6910 GIT binary patch literal 2420 zcmZuz-EP}96eg)3E4I^QU6wRyQ3&hL;%$z*HN{e38@e{@cC&0l3KS4p2#QEMN@U3) z=`0bPo4R|0JwS80H`s&hO1Hb}E97eDP>!4a(BKhyL>?V}=R1dfI6GS>(Dt4zJ}+hn z`41=O&4$4P=;}8RoN$_wJ`E_vF-uwB3M@0WQoHX2PTvjOel4hh&gRZb5_mrm?(*78 z!fV1ETfq$X_zdXlyuM9Zjn`n6v}n1onJ7KfNveJw=p@g6lroo~xBAhbWt9!V6CK8R z)=he4BR5OJok)qYQ7OZ2l8Tt3HE0aF1^p3pwE^Pj8mF7&`N9bu(Gl5qrK`z^jOjKx zaG%2H6+H#nqx+UzKYueK;2<m3e;?*r_)+FZvN!CDO#9tj`e~$v^aqhtN!Igsj(xS8 zila3(NE5x<YT0M>(=+<n8GUv}Z?srxOEHk8V_w750$U}G|0Z${ygSpKflLm;V&^cD zoo=3TAyua@J3D(}xS{T4-yHJwI2;^)eMfgUdV4bcs(bJL{mzrlAQ`liOz9|1+cLhl zaaSKi9VPT|pz}Oc7l(1)??)N$L}?PKwZU;&Q@aOvHV;v1f*`C;J=&y~K+2C`9;5QS zA*c_atDiv#5>QS8#%W-27TDYh9B%ihaQA9UB!F1&dEDty7<*OxFGij>fB_BO1b}Bt z$2e5n-4xv<1E2xPT<UnJeZ3oLKgkaBeWCmu-U06YTnc}36jj{e?{CT{TRyns36RN^ zqMsj%lFH&rHS|}98GzP;FM<PzkNg-8Ipq`bYRab-m}p?kh@6@<7?F^1U{7dqWDMPE z+0ubE<>e$xbOPoI5muB{r450vj03rCCDN{8Kqcm3m;408b?C|kL1>-2w762m?0tJ5 z_V9Dq_{PH#*<<pyw%}=xDMyaq)(&T5`T{}-9$Q<l@qoqSUxrHiY9QjId+dv&DAwt* zL2=6b)hR%J7WGBT|6^BV{?Oz=yIq0Va;xLdLpa|$yuq}zQjy6;_?|>UwWwUeF{Z%< z5SC$j1G++PA_xnV(PFWJ;a$5^5U^I&pg)4H{sjR?hCp$8N+Iz92DPbytz!rqJS}`4 zT^m(}fq}->_K1z>n2i}F2dht^#%&Yr;7$O}*=O=E96zHc44$s+a&lrF{DXU-q`Y|7 zg4u0xcf=N<)L@m|CfQB2z-!CogmLdxO?!IAXdF)dWXojCz*kGxLD%3EEL#ap(D&xp zsw}i-w#u3TLa1WyQI*vG4@g>6wBK&UB~uI_-6y=h0<aYRR$fhglRv=HJcFt>%($s- zx1>ZuoKYXrv&o?{%VY<NbDouRJ)tLL4tWx56Uown@|Eeb35BsA>Ckv5F;A+H+k1JE zNlYM9RV2o#^sr(hiOL$6$Dtf%kT-@4S8?HGTvMAQ`aAR}Em-{pEKs*W5ZYueR4mWX z#AaB%T=;o(p4zNQU8rg+teC0D13R}`&C&}){B{_Y^)T$`e3;_68HNYLD4o2ig(1&l zP&c?xu}sXZ6Rb>p!rMr}eW1eg>`)c&n?oh!G~wrVpbm>DJ6D+emdI~;3&k7an~^C2 zcy{axg$IYQscqTRV@>8co@cO$F?+BfnA6%6zyxo&W%7)juoG*<G+fzZ3e>&ML6d!H zG(dgO+~GE8R*c3mnupv4jmK+9Ss*#ke2H*xiHxiztQ0^!x0mKSQCiHm+tsLDUBG^6 z<GG7V?KVEAS|`opC@o1b+issn{5v4nHSiRYAB$YeE^UNdV&F?x<wF?@c@riV&@sUH zpnDA600VJ{pL^aJ+*$a3tJMhRk+bIC#G1fA63Wz?;Od);aZMb-{hh6;<Y)~q17+wL zEMHhLiSrt$pn4n9ngAQ0D<Wfj%ttRcIt^p#eOnRhdrT&Uf3cbn!3E2!&#(UvCahmq literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..23ae2889ee83f34fcaeb199aaf1f26c6a0bfd546 GIT binary patch literal 14214 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45017028a34f0c8124e2c89f0c07022953ae4d92 GIT binary patch literal 1799 zcma)6PjA~c6elTJR#azgSG2{t0plfWeUP0d4VD%`(ER~+S~j#j87K%@q#b#*q>z%6 zxbmq5+8y@|oa4TduG^(wA*Vgkc9Ja{FdBS(rXJt>@%P^2x9jTxf-!n^@AaPzg#Ivp zR>KA5IZXWs1V<c8G{yvBG$uU<qaP3_+<Aw%Bb*U=>+}f6FHzh52-fHzHgYuxD9>SP z3PPYB=Ezw0oP~#;%U#}hhk6a}frn<j*5`>Xn99e|03#Go7(Y#fQVAEdI24qNK~&0u zUf9vTIE*Gqrf88-o>`+oCS`V<q{C-{_3*euUz8~o!y!x30oY_zq`FiKmuWN>G)g&z zI6BEv8o`HLWw}uDl*W;aOBoe{cdW0i4*f<RN2i)9aQQGvbrDJVkd_+a(J(ZN6yefW zC{7BYQm{A;$59#$1&8R?5!?*!8ug_xz%)%#`r_vw&0e9Bepvt#y$HDt@I@}87_J}b zLwcMPhqO#Nz>PD&3MUOUEBI+S?!zZK08aX%fcVDoDrTIG^QcJriA;*qh5s0sw!^Fr z%<o|82OugmhwPtWj0!v=bEiT^=Lm8|4r+fzXxpuC02>T^!zFp`W-1vfll$6%{Wh*$ zE#%;Lq<q*rKk4QwnE<8TNu;`vEOV3YSatg&#&-2i`t^iAiCI3`+AIdU!;zAY2Rl!n zc3*Y#BoCL2hbrFL-7b!zt`<d^7g;9tRdtD_dr>Hz{8V`m{w7RqDjbo3OxG{J1JVm7 zjG?hHY-kChLL)TCXK02iJckPA<c!Qn;f&mQ!>}@QxKrW#=vU~9iolBBqxX0~Y<>Hc z^F4YCHkC8?J^-KGyN_lrZ<-Uc2JAK~w`!abj4B7X^$*T*SYtN5wE^{>q?ft90BFcH zAnzD}n;?b&@%1AM&$jFtfz&~p+7+72tRD~rC%=&+7lL@xFJES*ipAzLy79&|!7SW( zvn--nr-;<F{VxV(3MqyP=j?B$w`~@HW2i>k5p=q9ZR`JZ$JE=f=cZpRRvM;P;9ZXn z#nn`c?r4*mbT(^O0%M?iX5HFeu1{?3sWqVLJlK=aWu_DMzcBn+GJ|P&Sqp3&{UVso zMa%|?6rDYp!9$?;L0O&rXu4(kV3nb3$Y|TITUWcezA+TViZ#`O(+VD5wCIzY|A<&O z5@_&~+5<X;D%zfEf^FSglHLp8iCpT?T!6C|EG!uy?cKhH#@@b7l&OAo%Lv1Sx(mWg zeGde}0dB$1$3AHVKKTT+7M_0gpR^pbz1nBY)DB~Hz}PtBr8Ihrv7<7Q%P&pFcos8e z`_IN)B*VN0muay?n5NUFu>Ccc_@3QsyS>j1k?<x;-B~tv=K@vTTy9z81*eyut!D08 Q`+Ey``zCQV=bt)%0n*_77XSbN literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/bdist_wininst.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a92ee051d6666712e0cebb0ecc442dc6cb096a81 GIT binary patch literal 990 zcmZuvOK;Oa5Z;ILP|~1MAx;P)!~q`~w}pxnAyk0`w_I8Y6bY@ItdrXHtGnw|MDB_H zkoL%5+AAmi0w-o1w=}3@&G_?r9^cN)hhDEkK%(Qv-!2#-zwqNm8~}%)`Xv}iB#lWz z8KER$V@}CuBAMiuMDl<~><1q+Nsox@{046_nxefC4&V?}KLrzzF_i?oTU9(AbLq&& zB^f)i3Gr>)o5)ZbaUP~&s*R!$GsO%j$O-i$sP2O)Nkpz_NlSLkE_g{LJ#DHdl9gP5 zLO#BXI{jLXiad{lBuGtP1(4o^ejF|XG0l?1Pi5a^{qszn_I;HVsk{w4F(!ZOd6QzU z2l;n%lBI)8&Am|TBG}s*?jGEFy3Dqav>(T|TLTe?lab5q2Hr}Alfr~qY9HN4K;hL~ z$2vNQXSP+-vRf-(p^Hg<q%EH&@+VPU2>4Taxe6D)3A}}`yjd2@Kxr>g-Xs!YsQ1%1 z3;B8~^2OecnGNTWig#!G2M6A<mxuXwO><jK_lK{{neXYq6uHT=Sl@+pWp8ab&<@oE z3Jp+QZBnC2+we5$^7*>wefOQ>Y*Fyt2Cc^W0)V6?5oEb(XvD5~Nv<g+UvLQ-o__^| zqa7W8a-DHkgj%Q~g>{)*CsW~E!73BW;moC~1-R<d%532012CJQ8jBKO%jhOsKKzey zk&Yl9xw#G779#bNKnU9rBFSVCBi<0=tnlO2pQ;sA?mP8xLaHi?q;S9*O`CSQ6-~In oGu#YVi&zipE)Uk2C}deVs~(~%<v)YTZTsDd(|e?=vD6m-3pb|tjQ{`u literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_clib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9d7e8fecbf3065b7ed7969bc8b3bcf8b94ee669 GIT binary patch literal 2469 zcma)8&5ztP6nC6VCYznzZa*jp732$=PQ}j9LPcAlsz4D!LItTsMNzAeiJjSOlQ^}V z*_~D9!uDFJf5I*&_?L2p3;zNqo}KyFtvKLOoadMK@$>V0&-2yRmXBcUKe_t+)kTE< z)QjbCfOr6p{2nHXsFk7I!pK574s1(vaOUKlpkrt|bMtP{HMEm?`9`o|p>GlGQ1=z0 zF0=RXu^nJ)Jw}7>-(V3v8d%NchpAMRN;CPGsjB=&2rhtaXM6&$D+N1XA}pg+9Hf$k z6Tz!8*1F4qfp`Fqd=Dmu0*fN;Bd{r^_A3-P)B%5;#vfN{M#DHu$I%p&d;;T#DH9^4 zjHo?EC`+O$Q)Dej#%wQ|ro0kFaYDHfOL&&?gS433^No$0L-Ji-W-MogA`uZ4O*I*b z8Bst<73JmbIFgKlhmsYP74eM7nN%z{1^|cTq#yIVOfz<U&<9UU7JUV_3c>(lYiVet zZw<+pl#-kaMqaR))W|gYehWJ-5)KB^Sf#uG4EL5U$PL2B`yoJ(WS7X2#c48IBTAVh z2^WM#@tziBu_6mZv~{fGb#AD=R1&$ztBgXRVC!qIB#+7xLIg~}xPov_{UB9)2Dyaz z#*8Ge`69~UEI6oTkQIa{|E;=;BcL9VpCmYkK;@-^xGJIj>a9#NK8~{gVPPe5gTzS| zO(fu4hiHX`M3kl`tQl#=0BIRXeFQ5L=eDTNWf4Tt1~Jy@s>cpI8}NJ$kE|_(-dKmK zwjRR!`TjFJ$8)>3PoU&Zt+`V>6ut1|EoIe?!pctYF_!n0Lvf9-qGRh<OX1o%21(U9 zaj9M7Q*0rl@2KuEI>qx2=yrg{ateB#rQQV1-MRyQT!oEX7v#DtAHSWIJ^Z<L9-`+z z&b`{3So4i~<HW1Grxthu3$?ef;DZH!W#O;07L0~(G~5%=*VN13pQ0M=`}>=<1MeQ~ zzQ*%SwN<<I<}se22}<w_`;8@@nf-VWkDj4Gd%k5TusGi~Hnv+Eb+6v4HRl4|eC^IJ zm~T7vW{rWmX!yO?4*2$-LKB1bu=S|vwrMDjlC&Uw=n^6lkY0VlOMT|#ddr%T{ztMu z_?Yw;@_mw5kg8AsrC`$ZfC9>M!CNQKTUjoT-Z2HMlT}-Ugx4Ntjkm1Qqi6pU$WmdA z<XkE8gs52w4WdPG&y-fbLC{@&Ua7KDAx%Z&=20xTY<g)CXBB0dDI2#fh(Sl_WEJ|V z5SuUs+w4$@C@eYjH!+b-hq7@s8Q@lK3q%H&8hgT2<EJt$K&psY<LI((I?(4cCUhwX z8>Yt5U8`|)|7ct=3{A3ep@ZnRw=AGwr)^8&vQfxoPlrZY3Vl~K-KDSw5L}D}ixdmN zxk}?uN4Nw0!A|2ymL<)`>XZWy$WV8mU~x}qM8XAW(bcAUXIoCN*|rwbOdGe2Yv4%{ z8&2T2vC*wI*kOmzY89hli(al{D0<p*cftPyiEFU_XErKDItAFHX(UE)*-$3rC>JAW z-r*g2yZC%cKa0b1dg~LF+?ni)>}GQN?%mOoQJI#zCem59E8^RCK2<NHk<^!};yjaQ zNeELO6?C+|>W1a4xzH|GQF#~e$X{SW)+Nigu3Ff_*t0y`>ukfiT{+ISwcXN=Z@Iu< ztu>8Z_~zSJ;G6#Gm7}FK*VQY%K6?KQkhefQg1g%b&Dn%u<A-6+X_YacdtvypiZXp_ zu<C{(<#8B_4*{<U<(cUN&C_SE4^!$?@wOe@W`iGGqszY_!$n|*Ydj{Wbg+zc<8YBq zf}OPn{DI&?nq+P^R&0~k!R2-IhmZ}S{+nYG^$aw9=tARbyf50V-G|!%Ne`w=R!{%z Fe*x4@xcC47 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_ext.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61617ccc15efe8809ec79189ab0801c24f5b9696 GIT binary patch literal 10039 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 C|KLXe literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/build_py.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..252d9e44adff23834b9e4f10f7621bc23c1f4041 GIT binary patch literal 8599 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/develop.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebcd78cdb7906d362afded5f5c29ef512d522ecd GIT binary patch literal 6423 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/dist_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5ed18d117f7075bcc06d0a8107aead9feb6745e GIT binary patch literal 1395 zcmZux&5qkP5GF<0l4ZLMS|r{60lK9+tktGjbW@~7+AYvav6to~pdhp&<&`0e3Q2Do z#d}Kf9^PZ$qR*jgPkn`+Izz9$*|aoB4o4*C`({4+$LTa8&=ybc{q`p#<S$(8nh(Yk z=;jy(K{6t!@M@Y-m|5*DS;i>({Mug*vH>MO6EP6O*F+2@d&RP$@O~vp(ESvhXqj6X z=dq}a<yBKEu(T|!(l4SPOe|zsHB!V?6WencKR=hUj!i3zs;r9KR;r2q1`Omhp?z?o zmdm^mV6s}x3-s@r2gVcVW(I>KfRtpOpcxb1oMygY!hcP&!4@Up3q%O(K#Txq)Q|S) zy3dOp;u$&*Z$nO4H<I)D;aP6vcRiKeFMBp|p&FZ4P1Vff8Sc4tvXUnL0?6j8+I|~b z)yArHjE!39LdI50nG_VjW5XF4oj^BOCPCJO!w6_8rXqv@96^BX8(Eis5FNt4e|}F} zU0p!R(~DfErK*M0CSB_EY{B`lIcmPS5DyF9UOf2HmdEpjuD>de9z9B*rft;%WMlKX zKGen0@z?fQo*HRatyQWvZ=1!o4(UE?v-U;*0Z_M9URRyus>RBgy9gh75ZZlqv-!Up zZxKiGjyS6DnzAF8P#u8F+1p_R%l-~1=vLSR@b1EXaufF5ZTp}Y2QPL(8!*;n1M0q_ zmvl`QbWJ(*jdulQfthXRg)fL52=5gglQ-VSM6i#@rDunmK=_-`juz2oy!Ni(mMaS9 z@Wuh$$kuE#S<{6N-#mCjSkd9>ww@@MZnW1<7u_hZn>tydw(h^Yyx)({9544=l4*Z; zE-l~j6a2b9dI((f7>1tdRih`)s%4`YT0X|>ho#cX-1eR_z2D~cybtm-gGPoTdw_8g zf17x`Ae-(p%0c^j3chzLqTdJKr_jwE7zmAM=za(Ez>8>ibHNNyohD%)a^B=i$$1}f zzEomWqdnpL*($HEzl?=6g|3{i`pL>jy;GUS2jXbDz;A)U7okxj8cU4m-D3(ppAG$x zh0OVrpbt0~s^DCI2z&bXkm1T!wV4%4ON|QN{zW*a%bq*=f1&#D@s`2&7}FpG-wVA7 Hov?oa*Bouo literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/easy_install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2da6c39508436f3b8fb333ea33ccd5724c85ecb3 GIT binary patch literal 64577 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 E2Rz@X(*OVf literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/egg_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8454f52bb4a749bfca02ecdad4be3f54838ce194 GIT binary patch literal 21071 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f9409cbe80706bf3fd1958c4351ed7a82365890 GIT binary patch literal 4027 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ea6c20acf4f8a158ea87a3dc3ecae17270af483 GIT binary patch literal 2428 zcmZ`*Uysv95ck@S<NSjwg}Z`i6;zdyN+eK<3Wy@ap;o-yLqSxsiY%XZlXK3o!>*lj z(V;$o)V}l+v=7N+ztX<;sb7Jo{$>*&2S*+4?Cf}UXLf!w<2>keniih%lg(#;`j+(% zEvlym=01k{8H8J$rPhQ6Y+?sCqqUtnfrHse-AOH|8JP>-3p~Tu()z>?{IzZ)X#8Mt zkJn#Yye_<PQ`BC$L5tgut)BlcELc5TJ83@BK2Ky=7D>9(W4gYbPbN{u!8WsKBGfdB zg~IAonStF8BN^`{GZE7X)nkLXkD(rb2rFRR3T)2cEel+3k62LS4tHN$fyZmy!(8We z?ql|OgEuiZc#F3&H+cvCozfdgriv&{LophKNjA*q{YNWFH_EzwNUxH#3)e+l<no|9 z%w@OO6J2sL8i}4WZ?Dg|3Z?Hf<MXYz+C|=7zwH)z%-}XXG}B$SF%$vCtwSpWg-?v4 z)2iIUNm#l{q{F{0*@EhuUk6i}%%VaJW|15W^OOsz1`|2h9f#p9bu;^R#=nWf>Fn!k z#qic>EYs`5o40Qdo(!hR6t^+=y(;6Iw{8^Aqk$4dIW6)$Rma(Qh0dVzqY6)ddZ5oF zSyCiXn#@I*Pm3ha)W>uYx{<}^pP$%sQvWCt4z_q0CK6A<99j!xB)6ByMevL}OZJi# z_JT6fI%H!PqqcMx?$YA!mi5xc+C%i}g+FdAnupf7b%@=Nv_}-xj)`h*=WR^WWVdI_ z28<b^{pxb_#u4C1jdO@hSY})dlT7gHruy6nVu;NBdAJUg?o9Vbp%f}FCGuFeA111h z$u818&sG*F%Yzo#ngK9~<!QK}z10?N=SsWNsMyo)I8U;bYhDpa*wgjAET(0ldXA)Y z2|SU6@q}xCH&TKQHmR{9Z8~+M^04xI6H;{s#9|(PP3E#Qn0?Usr4xv~zxxO;%G^4J z!Rs$DE4-GBSp^#dCB)xdGI__WYO9sHQ+VS#@fbe0{{Xhx6{FEu>+j;6CL}Fd4}m(( zTh`K{EExN$DB6q8O4sBC;e3j_oGhFs`Ow~6YcDpIC@_P%w_{?A3aWE?5Xv%}H+~e8 ze3oRRu8G!sV>_Q7(DDm~3I*+bq+3v|fRz+DxdozYi9$Kb^Td0JN|S6~QvO1p&J<xG zg^-_`*Wv~6SGq1<h`20-_R7rY69RfeWU7=RJZcl#kKu*cehvx&Ds0u2j(0|b{QEdN zaP<<lsIwpzV7<uBvQz8=plt)<Pwe^G>Z~fu``Gdho`k8vlL`^Bth$iAfOU_3&~A&W zV4akGs8z*(@r1QwibqzdQ@9uuJ=F#I%>w4A`qw^c-TK`cGYnMrE8uUCbarCXUe=rF z6J~nO_h4RJ=Io*M>@&0iG!GO%Q(bN!+FQ8Hz9&68;JNpcId*|VO|m)*my!%CN->7U z>+baId9ANz*<kK&KYcuS!v-HnkD6`*8(FAdl48$<NPE$ADl#s~LtW!yw;c5x?I;;* zhpPhZdq0`J6G&5|b%-Y@-5c1ZNMgB7wuzE#1Ht)MCn8zpNdIn{$5E>8_16cWD-d*& za>t}6+8ebAd5s8tG%Dj{MP3HEj-dzw%Wk*k=l|E%POqi?Fr+*TL){F+NzTiZ_;wgR zFQat*rXGeok0EYxp<<bs&w_53O311M$quZ^i$uO8a)k)_axACGS81H2CPQ~n8z4S& zZP)P}-|<_1$9E*X?X`7-qsr(Xg)*@>)o2P97#)4qBwbTd#sph$rTz8)3-gC$6+Tm& hjYq4}6Ve#@kZ;<*yNbd+svLvd2J`JUaBDN)`46n~b7BAh literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_lib.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8488e585aebf107e79620db3f35a5a9f9863bdb GIT binary patch literal 4104 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 SsMdQ2?V`Cg{#WbMb@RU))FtZx literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/install_scripts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2497df47a805d965ecf185fa04b5d665aef4121 GIT binary patch literal 2307 zcmZuy&2AJ&5bmD;{lmt9A%utx5s5Ym-T*-XC5jM1pd4aF0*PoO)EZCsu4kA(x_fQB zn&l89<(6kyACpJOqx3bo<Q2FiRkORsaWYodc2}3HtE;}R`a!SPCh(<CH=qC9BIFNT ztUd=O_hG0XL2$xpMsgZbigPQoa@!)5<WA@=HD2g7JAUZHubl;XD{STMu$_0p4keEX zcewk8a96mgb7+SSx1NxJ_ZN6418VH79B&V7(|wpIEt8#zPRhb`e~9$%_d-WJ(vevg zg_=mgcp^otOL-9EKd(L;Cih{ePeBM0QcgmP)6nJ?x8D#run8b^d7Jw@ctauJ7KG3- zYe}JWlx0lCGO4the)X{I7p2UjtiMq8mlmJ(t8AkBQE|{0<1tH$QQ6;@QB?`Kv{W&L z<MG2^jOkk#Y7>MeDV<w2Il?5;nlPIaIN#cSG;oYl%494(Ff$uTk?17KlBr;2g?UiM zElMUT$djW)Hu{yw4p_c@J*;H17ilrvi{x-rW?V=$%;j(=W$doHQ+&C{zld42ck6RK zx;su~c5`&+-o4?|VU<)jmUp@#<2!e6>zC0`2|cNFS!U|wG%oWzD){hJlD4V?89)$S z7z)8cXqQf}owoY#U5*okS8!o833>|?4kbgBHOR7Nkfxf<p?sLInxszZ%3In?{durR zV&RQJ&swn8mJcwQVBbOenWek6mG<-*lrYu~Es*Ol&K^25yRoyu&e0n+0)rgdGq=&Y zp!GoOagY0;^=q1*n+3Hmf8znz(DXd4Tzw(kd|}DoYj;dR8_X{r5zq(eC7jLQtI<#E z)iv0;T-$YP{{9g;vL2G>XJ&1P_e$OV1rYM`&u73V06}Y8B3?|ef|cp*Op=VRAZgm- zm53)g+Q|fLaUcoXhui{i!wyRnlam5g<44nWb)a|4VhijCADFA}YPz*7<d%rk0YJBb zyz!S>)BTsa1OC|Y79MxZNq@-_=|jK^#M)qOf^woqNhXwpRzl2$vCwRk6b+8~%9lh& zgv~8?A|)gONA}RZ(G^iH!VczO50H!<zy~*x)-voqX~_9ZCR)hw+_R+M<-R(pG`2cW zat)n1I|353vAh6Nm55oKMM|0WNR~OPA{pgjfFVY5tio2L*sh3xKBl{mCoJ<m=t%64 z#u7>BiG;;DHx6ba^mY`k!lo`uf8NgiLI?F&7RPvvJ8A6ZU-7Vpx(k8akrzR%!%(+C z5V~QtX+Y0d9`!5-<`!M2UHI)%93FMx&!cVIvjW)Jq|<Y!DTl?NI&L@#9`OQ5v&S&h zPauG17Se3y=GM%kMB8(R+ck8g)IG9cy`)$QU_Y{e03>bA+qK`&&^tt!leD8=1I7G9 zpr-ECK6h&SB002XEr2?ZuCZ;+*Ny<>wF~<|kxQ@-ozDZf`_r3EA)%A@-vPUi@agNa zuXn|&o%WBLeM69eW!!i-FS+T(6DdWZ*(8tDi|OU>7Jvp0^slQ`+Xi3Pm7)8|-@vZz z!MZ#P_m>}|_ymOo!Z_H*!_F#=aG<eDWt<A$9^<5CQpiha=V6~Oxbe9>K)y-LDl~3T z8n-Dk#Fmvx4B89SbQVluh-wqWWuYNna17y#&`-wj#0dT_8sllehtOaEH!^f|8Yx%d zyxTCE*MwN>)_Q{tKnfxT@Db4ImDM$tEZsT@=j{QN*TKQSHvwzHV$8G|gMcQPfO(g( zmy;;NfMMk`#><$orq4Gxl^DW_u&{;82F3VtA@3Ew2?2GizzIHTy2GGrT1Xjq(KFR# zJpAx@ecY5zg)KMGGdf+g8GO^_6%eLZy%;koR5_6`^cw6Zi!OrI_`lFh@b%(;-(ZJT ONQW-nfLsOEdHWxQwt<@f literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/py36compat.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dd49738e372fd29b55e13cd7e7a47fb0020198e GIT binary patch literal 4640 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/register.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4068230af796352d831eefbc9cf0954cb4f31b3b GIT binary patch literal 616 zcmZ8ey>8nu5I&M}tU5`D3>|_#Kt06FpHT-Wil803d1)pA1)++RAc6V`NjXT7t$C1i z>??8Y)K}=#qihvH5BQG9<NbVh{BU?U1C;9K)t8q9;8(be5}|R8uy0UFkVHdGC=jS= z!U%i<NhNy($rP*Tca~5|KEpivjnS~qf*ysUagDIAQ7K4>goI*NR85kJB$7TtvL{){ z_OVe#X`M0|@);zY4Dk_Rk5N6q6SDb12sl#FC-wlrmVo(m?PFCGqHOXOi|w1f5m{T; zX(N5qnzAr~i)ZMc6CYWn^Pga1^!>Txohdh|Q+$&ep0`>mV|i`(*Gh<$T{dqw@-h?M z=KR#<tD-XcEMHz-@f+Ti-AUP4muh`tvgPW+-KN|s*LSXMwS8{xxbShvMR#xZu=^BY z!@_~i$hU)k&&YE<pZZvcCaskaekMfS%3cTiK#1Eu)!P>{!Q}09Qz2xV2{BY2hI^)7 zjA5bM&@v`59TMkJax8K8y(_g{?5HkAE`GZ646)mGVR8S}_VK$d!S~_cY*_aZ`wOsC Bl3V}) literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/rotate.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11cc12af95202756a6c872238e4158d683338322 GIT binary patch literal 2546 zcmZ`*OLH4V5T4nWRu3nR<GiSl+Jd-jkyr|WKth>RikRYrfl7*i3fCfQM)J!0^32Gw zx1<XWRUEkR52Pa(&YbuaoaV}jzmOB%Bg>DF?AG-3_RREj_k7*6pUurx2t56#mp7G9 z$UpcodmLaML6biMVT93`B(y~-@>XmmcFQ)r9XpBJat-gqUdw}VCoZ*0(7Umplv`yp z=Eaqy+Nx6W1z{!TzaY%#)kC{gW6l#&FaHa>kUG`1PL}R*p~Aeaw&B~3vmSJd>ycCg z6~*$aTt!*>xe%Gyz;PMvLsxp7B}qGF9aJ-WY+xQilb-<Lq(vENS&X)9X0;q<Gl#i7 zyXE!>811pr3j#*_tPH)+Dy#~9nbp9!Iqiu|wG}VkTIVrWJji0kMZmx&5p984St^UW z?2Ti$gB{NEDD4FsLCT+Vse*14b6K|wFKMgJ_NSUA#dUC5agoYEWq}a~D}wJ1BEeZ5 zrj~KPRTc@D&59*pct>U8Ab7sb1rO9VKWkCY795tjxHl}>DOS=!vITZ$-Klys=!_4z zG0yH#2pB%tThJaulb3-oG9=-YLNtN57=Z}Ujk>K}W3%>AWeC=32X(>WIFiTR--$R6 z3SJJHxrp{4n9aSmXm(8`Wit`Yt$rBZm-o_-_t=M>FyFg-M|JP_`XYY6d+))6=F?^# z<*QLDRXdJXMd#lA57chEDY+WtD$8Pdn(a){(3~DyBR|j!Q5vbJ9Y+NZGXo)c6`k^c z5bD8OTsxZm|Cwjv0f{n=$1lJPNgtxI<BJ7F89k&wQIJ4PKyni#7D^80m5tIv7z?du zB)#qs<?K|%*AxOw3Cy!`-uEQ6z9Y&-oyzN%4lS{d7=2-O8T-te&~;+8fMi_8G@4kL zT$n%`#W!CL09Z2Tov3>dWGTQ@1W5+aSTXTfl{{|?h&-zw!Rr`sE4<Nb1j~&g%9nA~ za)bAJ%k|>s8I>pSG3cG4rMR}biYFZ;xc?Rp+G!A_iubrU4jh8Wh4uuR349M+*qk3x zMTT@tC*am^)-F^61CqKWaDjF)zw)}Jt;QWqb2Bz2^Dz9fvK9l>z_<M2E!2x^JW|{` zI>&C5o;mNvTAX#-v3v;3Y~4$GTf19`SlF`$>kX+_L=}0gfnpAbw!tA?`L-PoxG6ol z5=n!_w8I5DrfX<x+6&b|&Lvo$$C1*P0G{C>WgKkbYzDkK73WYh=EI3Qdj3^|--dA$ zEJ7>PqMlu$KJ@eS9KP07tGMz8SC8Y4@Wy5m_-|kUI8e(cSjR19$26fM;P?MTfUc9x zKSmaC_Sl&~6~97;))fL0s@%ReF2RUDv?c)Lk<DD@0WfU@<j5Y{<MITc41EQARUOw@ zNzDxb*s#LJ5m<eWk)N$=WMuEJ<I2soAFPoxa?Nai=pvY5)_M7>*>4^sRQ#nbj2Doj zWEbS)i!=Ti*}d^>27c`WV8bZwW&&##7M)(4ZE5=6aVX9}@H$K~5L`qE_URa$oX{cd zTBl)XYb%r5!K+C7J+2ZJB^-cq5msy3edPefB@llEZ3e^}N2enO>FcmpTwY@49$1k_ z35f-HNfuRe%S=D&i@FNy!=s8O0?=>3scWZ8w=pkF+X)x%;EZ>HXs4e=sR1;U;7ll8 z5*+SU$pzkw+QD$a1<TVZ#!E~bgs_)(BZ=kPliPUX!sVAJ!MXMZX&j|Hb#IE^0Ckj( zN{Dt%Nzhb@C6K=o8Eu2wCdef&LNwQ`8eO1^fMcKf)`CHF4T^9LMvBTw+&1bJ?T5y( zFw~VWOfoizIq<bG+#R%IbQ!)%VaT!$FjdB72Z{#X$+|WGUuRjT&u_ss!Q1IfATEF{ z;sz2twNo~m#KaOKN<gqI$ORxibu7oSOe#8-@A?a79R3f^;aQm9lLpdh^)mOh5t?|n z=1(SZ{C$zr`eM%O4ybQkIJwLkd>?-WrlqBFA{Us<X4lu5tNpcUd>&#FNGviCP<S!O H5OVuJyiBLz literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/saveopts.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6e509625b820337ffee817c12a550c71e77013f GIT binary patch literal 941 zcmYjPOK;Oa5Z;HAm^M{Wc?hH)EYV92jmx97l`4b)!L34SrAijn%Jr_p2EVeq32o$@ z+F!sgXpj7*y>j9&aAG!fAS=yyc4qv|%(wGyZEXd?8J;{o`#});<t~fkf$<hZZ-L^7 z;|%3E!a0cuMxPKToL(bN1-YUT<=!#swSGe;>JhstxHK#&i&PHmYFQas7VJFMB5?_e z0|oC2Y=R+BggJ@`#{fnmj|1d2idwt{z-{a6cp?BuPoEuw6(nVz#|7WcWFdmP0y;2d z5C^Hu#B|T42YOspnG}3EK?^gk`bjznN)?pmt5AUD`keom;HJ3_e4V@p(G{o~4bcos zG$R+EYdpjs(AmcsttrRfhzdp<7q4r4Luz`9Z|E(8=++l9^FUg&cHQCxvUcirO>VrJ zN_0zV?+}f4PSI%N6qy#FLkx81ieexeW~N8Vy}-2Fj2gI6d%o>*sg087V@Il8Z=$T> zz^)I3X)cV*#MqWJBG+~W2InG;$C*)%c<Vc&iZ~ax!__5I<D%EGo)%eZJy!xK7skk9 zpe;>uZYfl-RI9|&Nu2#e>H(nq`5snEPGTd%Nvy)O%(zfG%vE?kWNcsW7JC!^Dq+>+ z#g0k$2Sb%TPj?Rv!jrI))wV3OiL-25CA<4C%_t7%uVczG)5~TvW4PFXesyUnG<**_ z&>Nr-Zex#hiH`}{#6EsPrrm$Zka*-ah%q-UV|InHyyWA|*<Hp)<2Y*~9maT>fP0k- zohUh9T=fVF%%@#a51r4wj}zSn<wFM^nfs1<Ui9?;DE+4YKDdCyIsJ+*0G2=<qsk#$ Q|M0HEH*O!bd$0TSFI`CmNB{r; literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/sdist.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f91dd3d2dacc2cf2c62d55274ed5b6e9302d5b90 GIT binary patch literal 6237 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/setopt.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acb62b870335cb6705af22a555701edb271142b4 GIT binary patch literal 4539 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 B&qe?M literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/test.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..553a84af98f1eabfa611472b8597558a715c66b4 GIT binary patch literal 8114 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45bd2ad3ef6d1ee8465c30bc62d3f49a59565fea GIT binary patch literal 1408 zcmah|&5j&35VpH}W_pL&RW?Epl#2xtq7m6n0xLFBgaQZwLJUZo1B`?$@7TTZq^I4n z-IMfaIVF$41I!$GrM`0F6*y7l`5{F7SgLYWw|}a>@AGGeheHBm_VA6Len|-V4U^q~ zoIC(??}L*>(vnPYj!HU@CNU*n5*f?n1(Au0XVLR`5=nYavfl5oo{Tfv^_#jhLQXN? zjR=AVVD3F|icF{^xNj26NX9S7B$0{i!Q7L5Ie@t@Q#kX$;=ZLAG8o@2l(kwaCRHJt z(zDGq>_R;f3vDd(hM5a5bj51n+*4y^*ax{_3t_eLEi(m^x+s)Ym1j>y>rTR&DTRA* z;2eW}4(86lc`~D`=!&c<C0Aq?*Ef8!>a8K>G35RF_7zzT)+Een_}-TUYNzAupi7L^ zm!XO7TA?dZ>ZRhQ_S#ggOB<(bCFZIdTq=(>hXB8J>8^$DCPy&&F6V_cbN*PhR#%tZ z>%4}v_Pj85zXT{qoGOc7i5)=)e>8b*^+I@+0}6RzN~x^N=Qh8Xaen4btB)7*qbaW! zcW?XR>~dzyJH_d}d-=n>*7Yr2IWNlcmYtrSedwQv+$rDG-k8$898S%AE-IOCNI9un zi$Z!0VZ<T`9YuXQ?Dc6%mv3$ty^6@51!O%13oP7)puOQiiO=cJ^op)1;0}z;;&pUR z65^A`L;C>*>L~e<RM8KhRlq-9ejBJo>3r(F0+di82<BcN48deuFi+TdQ`c5G$G&(r zRU48v^1w5?!FJs^>vcoU^}IILb3PdXd3)@;p;fhU+8f*29#q~P><`N#i+I>0bO_4E z9b$9<?kzAE9%d2&OxNfUUB11A>OVxVM-8=$=LFQ=g`iD6S&=oU5m2H&Dk4CN{S7I6 zxzX~gJyPEXIWdqE6Mw;ED&`+4=6(A=AdR!w_TgrG46Zx=Mzt44SowA3;q8KIGP;4_ zmF}_WcfcHyPD1zB>GI~T_kYm%I2&{+=lFU!M>^(4HYLU*&Yv`*-2NGGF3ptlpvHi* z#mioTKa>(UK-D2-p^7v~qVy;ohR2&Fp{wp#YUdlTOLwx>d-!eRe>t*C?{Dh*1i5ke JB2qev{{$AqXM_L% literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/command/__pycache__/upload_docs.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..786c0cc6b10349279f2be551b1751ccf2d1744ab GIT binary patch literal 6150 zcmbtY&2t+^cAswy1|Ud+Uy>}#V`n89n<BZfBugttTeeq{E!#^e6t%Kv*MW!V0Xg6R z19cB1acYoCnck`#l3E{fOr^kMZaL?e!&d%=zUJgh4%ypYlHY55kfNMZfSUez-P6<E z@AuyOb$>iJ=V|zLc2>Xs{Y6dtPpV9R778EY5&w#WX@SOcW+Zyo2n?OdW@2`&z*1!^ zvAa&-sIr}uf)d*8#0^}PmxHp(y}(m>C8(&p8dOz27tA4dl3I5@m{((zl7;SKu-L5! zbyathrS5XDjB=TI$x3%6SV6hMs^4kB>L(hTW3}%zR*P1S%wUb#kF~~p-XHXnG-OSd zwuI+B==PJS8}%~bhyLAIWP>bDgn#u^r>njg?6%TwH|#P0-Eo7Dw+HlEn8j(&&r<Kv z;iCsvh2KBS_S4>eDzb=eq<pWj;r)Pp(i*y~iwq-#oHcjfzaI5kDT^RAlXMT+^6c9W z`!wV|&Qrcc?IM2JFl1#v%lge$662fF8So^DchR~SXAy5g#t)nQG{!Q1(8phM#uIH( zm3{^uQr$1{hzm$Et)p{ne9vIUP%pHR!OTKGHn2(7mYf#@%wR9fqDZvDek2`{@wk=c z_8@Do-)flL#u(Ck^wl-#OcrBEU7$iU7yqL1MRfR6zS-yTa}2ZjJmj10G+_}Jn_a%S z+i5m$i5tC}&)M}>v;X|PpJnY^dmWzqMf=9jf4;f1*^m3{aSwZzB<s9&<JPt8S-2^p zY|zirG!dtZ6Xk54QrbrUP?oSUw9B+wL2K9an$DMyx2Q7x%>ex^B#{>A0JXvNz+^^X zF_T%$j_i)Ps<ln#u+p9xIH(htT~-FrT;@e?+t||q=P~rWG4KHAdA5KaRkq0L$mgOO zTVl)KX-9f6A1$yIwyMgDY>k~md!3!f?q86VQwz!8B+ZN4o16W^evD-iz6e>WzL{Tq zqTu`*AbkR4Ug1$c6>*mG!#h&v`CCAapSJxIvHu$uwZlP@-S#hwuN!7QC-&19>pT+u zv?rpi{0fUjKM4>0_8>{{;#lry(aX$l^R(-Wh(C`w-keN(oyGjlR=$KRYSEWr9{!J@ z(ZqHuH2wsILhHbp9Jt(nxt!@Rd*jHst9|VZ;ZPoHPtm4unb$F!v5js_v@T?IcMvD6 zDf;_y@8u4R#hdP5%(;ufA+ki2w51XC6)eX|9Zk~P55?rwP1J>hMAJQeLC;sG!@yH) zoOI)>=rOY^vai`n#&$J=H6814L|9eRP^qcruWvOhPM%fP<6fM_VG`$2GgSsJ_!>2M zS;+UItclHQ==>Z+XC}<wfb4xdvza=2e(Cf~UmtolS(@m~3H%)@nKqp)6o9Eh0b6hd z=CQ_qhTLNMu@2{;cWf-hdG?Kx8IT!SspF2yh0*btd2CQ?ua4FVvuNow8p#;m>r@XM zo@H~R8gs^Nqj^?>+*zG$6IAPNscn_E(k1K;d#-jQpFe~9{MwTf2kuY(ax8oX<wh;I z8n)p-5s|;WbJr&a5`}CdKmSC;y}bzx{S#<j7LA3mN*3C2?{$T6QmI@al}y`NbMn!k zt|kiye4;dtaH&Zn71HX5*}k+o@XFE~BXl<uk*q~M_|}Lt+zY#r^iFJ%lYXT2BIG^k zhP_@o=(QraS_K0_9e<M&a;zr^=9f_Y0FR(<1YJ*eDK$KO8ILOK`Nh)^nJ#6Dy%t3W z`c?3d#VEV{Hxv{=V2{Vf(8&K83Wi!cCaLk|-)Gi{)QcJ{wfL<$G>6vEE=-ag7<{|1 z#WrG#lR1S$vQ_xKZ}pdt3LE`D9hNeyQyRJGU&83fvoiHMg8%)Uab6pF)ZVE8Y~@MM zvg+v-#;97jg?9|X@$Ac|+Ov0`Dh~nq+_9!>Uyi+nxh3@%`PE+Px8o!dejD4#fQZ*Y zaP_jd+NjA=9`~uMECq4@J{6qq0clYwmHXHZQciNf$%gpbl)OViGl_cANhm`05wN4a zv|n&UW@)#QR78!6(x7x{aHVq>Ujm-+1&gO?CM|$LNSh=8P6kdQE!EK?ryICDN<cK8 zqdSZ6l~(~EYb_oD_RY!kKgX0*gxB<{Zs0kGuxH`%@La@m&d4vEM#HPG&zuDX_%a@a zg#?9{7odObScCRziZQ@35E7nwPqoY-r!gdSSRH%hplnWE1k(%X9y+%2a~Q!Ztce?_ zj7#L*v+8KBfMc0y&)CYH%VGm-f@T)T{=mYfmM3I|4|>y@bhD^C(Oma{QAJiMPVjga zbS{N4b)zg~VHQf4Mxw1%>O9dQCkvVdUZomG>=PN34)10>iW>Gri>)qGBLpQVip-eb z!n^z$C1*5aVwS&wTu`XdjGA6ETqvXtwLlq0K7U#b=sUARibAyiEj;2Mkrdi*VSz&v zdugm{Lo3r@FZz)o{KDMRhvv&(VL~tMp^X+hL-d3rx0q4b%sj8HYB%u?%GP;pX!qRA zEbJp4wyOUc_JW#qq)N=DdNE1)6};h$t&x>r(N~yD?a!`E;&FK^|Ec%Ow3mT^u7kiT zs)7B!4O`>gb=vR`eA?_g?_3t|<ntdWOPmQf#ZFET6Xbt9?}z`v?~f#%Q>oXmq!+_+ z6LW3>{RxyRZBW1@QarBVNDFq>l~ovBbC(P}<cHEchz_OmJWK{KCp(KX7@DoBXBAXw zjy-cf<XKD;A!n*VNiIC6LtYd_z(bwN4*tt}zIIw^r{13_kDTZ%%JxuUh?h`>u?C|k zOlBgtpd71hkh(gc3y78`v;Tpdr3q)LkE~<u$bgHqJI<&Cx2F%?3}ywlXTy-n%z?9W z8RP(i$0!n)kM+W96MZk|cRYXc`<SQ^Jf5HJNB*xK{OX?H4-e`5Ln>0jM-LzG_@t`Y zJA$CR{>tx@Pal7N|FgSad~)~k%^TOR-T&<KFYbT3eedRt_piT)<mUBj@7=gAD13SA z>q?vJ>-;lRL1G>v%l$4WW=z|RL%<9hQ;prZ3_XRS6~})>XRYDMavRp5h`uZ-<%9{} zL6bDQA>1n|UC1(>e#V{b)_#aUJ4cMPN#byq{5Ol}0HC~dqaw{#0{1%h1Jh5d=>^rO zhhy0UKS7yl>Jvd}65@jj&7!%-(?K6|rHTl=-IN`UJIZQnYzNKkupga;*}?=SvrQOc zDdTu;TZqu~xA1r2BC7b;&cy4pug{=Hq<{#e^3iu;MX-KE>m%d$HTYs<q>~>eYyB&2 z8*!0<)<Kj87%hU>1YYpsh1tgW@1INn(nYT_v(~7$w}zMvP*w^@<<-s{?-dTHoDE1i zfT060gUpTQ0Zbh}$^|%y+$|6=Azv)Ktln9oSe-3*Rz|DThMvx_GOP~ghPC1RaG|J) ze=p|oEbu>MYv1Zcg}LxIGCMaqUsUm>#hwpY8M6O^?7~D=&DNM#RA`Rh>Z~%f4})TH z^agPN<QG}Bn4|9&<zXH5H`!cKS9L1avP;=pg?pqQf!nD5Z?bvf7pm+}#(2AMDJDJD zdbcbsd#Cef2j2HO|6bRIOS+b0Eu+QkQn7TTV~szdcZugSwEoS~m)cia&%mB9jxIwB z%f)i%3R^fZ@ctjzBGvF*ZId@YvroNU)whnm2KS2P(YtI3d$3Zh5JAWL|IL=i`op^` z4Duft;}To_Kfa;n2`w}*`iI$1*&4n8oUpYcb3FgXxh-k%UEIo~t>)O-;dEEJ9kwW# zs%R%m6S)6Lzs;WjfVuN=DB_l%UwS;)?Z#O~Z2Rmb2~L>OqT{Tz)uA?D8h{J;`zZ%$ z_eE<z>W01q$s(VWSErGMEGn-}YoJhjAl7pq4R8|XajtG)e)tcX!@0-mD0*^8eHZke z&b9G6f{Jv%NO3&C67q{DXX;n4Yc?;7&HRlg<0G{gv|5o6pkN#RuMvhajFhiV8rvbr z8t#K8U&udy#b5saDvdvvR@w)rv_R|_{}5~AA5ro#B|ar@Batp0C={7lQq=*D;#8Gx zKNR9c${DA?s;+AI9F_i>5=O~oO0H5uURzoZw(dXVB`T70!#TypRl&Ga`$%Bm*{u{O zaw2P=?(95*PI@@w6UCaR`r}gqLI^cVuRj2PdWKk>$ui3OSX0EolQYiOX($iwb}R%u zupoxZrnGesA=InOBx&E<-hQ|(E8uR^`v<y@3bO(3o3KR!-!G$aGP1hCXwG`txPj_r zjn(ln>OK0R-sWw}E#igz8!A@7f*E)W4&|6dh-pfT+`BZe1hXsl0%r_R>GYy3Nn6sy z21y576e1MaSRX$O%55I*sp~{((fT<NIH^Z`g>o0KDFB{{51ich_jtrNNQk!A5ef{V z8|E@X1CbAe22hfka{+{eI3ymUYFN6VY8E8RN?Jo+*XxRBE}(B!kr?W~U@Rc8xMv8= zgv=1*-D)gJx2d>ovnjo1vzxL(5}{meHlGc`gs_EL{qDW{A3gbEr@4I(hWcRV;r3Uu zf`ds5#~<Y()D=gS&^SF{%K2Sf+C^b+Dj1)utEV}=y4g^tSw+VAC)f%QJGx?RK~MWB z8#91PD*?JE5`|^jzEfMONH{TWzKrB8Ji<rfnwDXi7WTt19Q<7y#LjjX@UK;ut4peP z;~cIH>24V7bjZBkzpiXZmS-1F%3y+pS$$)C<2gPQ(uerpQqrL07nIzkgpL9HDUx9E z<PviOmuN6qWuU<uugN!X_q)+epGQL3+}J$l`UiUi?sUN6oz(r7y1-C`Sgqm5wnDmp bIo9Sc$a>X&SO!rILdK~-WD6uWUHg9lN6V2R literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/alias.py b/myenv/lib/python3.7/site-packages/setuptools/command/alias.py new file mode 100644 index 000000000..4532b1cc0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/alias.py @@ -0,0 +1,80 @@ +from distutils.errors import DistutilsOptionError + +from setuptools.extern.six.moves import map + +from setuptools.command.setopt import edit_config, option_base, config_file + + +def shquote(arg): + """Quote an argument for later parsing by shlex.split()""" + for c in '"', "'", "\\", "#": + if c in arg: + return repr(arg) + if arg.split() != [arg]: + return repr(arg) + return arg + + +class alias(option_base): + """Define a shortcut that invokes one or more commands""" + + description = "define a shortcut to invoke one or more commands" + command_consumes_arguments = True + + user_options = [ + ('remove', 'r', 'remove (unset) the alias'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.args = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.remove and len(self.args) != 1: + raise DistutilsOptionError( + "Must specify exactly one argument (the alias name) when " + "using --remove" + ) + + def run(self): + aliases = self.distribution.get_option_dict('aliases') + + if not self.args: + print("Command Aliases") + print("---------------") + for alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + + elif len(self.args) == 1: + alias, = self.args + if self.remove: + command = None + elif alias in aliases: + print("setup.py alias", format_alias(alias, aliases)) + return + else: + print("No alias definition found for %r" % alias) + return + else: + alias = self.args[0] + command = ' '.join(map(shquote, self.args[1:])) + + edit_config(self.filename, {'aliases': {alias: command}}, self.dry_run) + + +def format_alias(name, aliases): + source, command = aliases[name] + if source == config_file('global'): + source = '--global-config ' + elif source == config_file('user'): + source = '--user-config ' + elif source == config_file('local'): + source = '' + else: + source = '--filename=%r' % source + return source + name + ' ' + command diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py b/myenv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py new file mode 100644 index 000000000..423b81876 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/bdist_egg.py @@ -0,0 +1,502 @@ +"""setuptools.command.bdist_egg + +Build .egg distributions""" + +from distutils.errors import DistutilsSetupError +from distutils.dir_util import remove_tree, mkpath +from distutils import log +from types import CodeType +import sys +import os +import re +import textwrap +import marshal + +from setuptools.extern import six + +from pkg_resources import get_build_platform, Distribution, ensure_directory +from pkg_resources import EntryPoint +from setuptools.extension import Library +from setuptools import Command + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_path, get_python_version + + def _get_purelib(): + return get_path("purelib") +except ImportError: + from distutils.sysconfig import get_python_lib, get_python_version + + def _get_purelib(): + return get_python_lib(False) + + +def strip_module(filename): + if '.' in filename: + filename = os.path.splitext(filename)[0] + if filename.endswith('module'): + filename = filename[:-6] + return filename + + +def sorted_walk(dir): + """Do os.walk in a reproducible way, + independent of indeterministic filesystem readdir order + """ + for base, dirs, files in os.walk(dir): + dirs.sort() + files.sort() + yield base, dirs, files + + +def write_stub(resource, pyfile): + _stub_template = textwrap.dedent(""" + def __bootstrap__(): + global __bootstrap__, __loader__, __file__ + import sys, pkg_resources, imp + __file__ = pkg_resources.resource_filename(__name__, %r) + __loader__ = None; del __bootstrap__, __loader__ + imp.load_dynamic(__name__,__file__) + __bootstrap__() + """).lstrip() + with open(pyfile, 'w') as f: + f.write(_stub_template % resource) + + +class bdist_egg(Command): + description = "create an \"egg\" distribution" + + user_options = [ + ('bdist-dir=', 'b', + "temporary directory for creating the distribution"), + ('plat-name=', 'p', "platform name to embed in generated filenames " + "(default: %s)" % get_build_platform()), + ('exclude-source-files', None, + "remove all .py files from the generated egg"), + ('keep-temp', 'k', + "keep the pseudo-installation tree around after " + + "creating the distribution archive"), + ('dist-dir=', 'd', + "directory to put final built distributions in"), + ('skip-build', None, + "skip rebuilding everything (for testing/debugging)"), + ] + + boolean_options = [ + 'keep-temp', 'skip-build', 'exclude-source-files' + ] + + def initialize_options(self): + self.bdist_dir = None + self.plat_name = None + self.keep_temp = 0 + self.dist_dir = None + self.skip_build = 0 + self.egg_output = None + self.exclude_source_files = None + + def finalize_options(self): + ei_cmd = self.ei_cmd = self.get_finalized_command("egg_info") + self.egg_info = ei_cmd.egg_info + + if self.bdist_dir is None: + bdist_base = self.get_finalized_command('bdist').bdist_base + self.bdist_dir = os.path.join(bdist_base, 'egg') + + if self.plat_name is None: + self.plat_name = get_build_platform() + + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + if self.egg_output is None: + + # Compute filename of the output egg + basename = Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version, + get_python_version(), + self.distribution.has_ext_modules() and self.plat_name + ).egg_name() + + self.egg_output = os.path.join(self.dist_dir, basename + '.egg') + + def do_install_data(self): + # Hack for packages that install data to install's --install-lib + self.get_finalized_command('install').install_lib = self.bdist_dir + + site_packages = os.path.normcase(os.path.realpath(_get_purelib())) + old, self.distribution.data_files = self.distribution.data_files, [] + + for item in old: + if isinstance(item, tuple) and len(item) == 2: + if os.path.isabs(item[0]): + realpath = os.path.realpath(item[0]) + normalized = os.path.normcase(realpath) + if normalized == site_packages or normalized.startswith( + site_packages + os.sep + ): + item = realpath[len(site_packages) + 1:], item[1] + # XXX else: raise ??? + self.distribution.data_files.append(item) + + try: + log.info("installing package data to %s", self.bdist_dir) + self.call_command('install_data', force=0, root=None) + finally: + self.distribution.data_files = old + + def get_outputs(self): + return [self.egg_output] + + def call_command(self, cmdname, **kw): + """Invoke reinitialized command `cmdname` with keyword args""" + for dirname in INSTALL_DIRECTORY_ATTRS: + kw.setdefault(dirname, self.bdist_dir) + kw.setdefault('skip_build', self.skip_build) + kw.setdefault('dry_run', self.dry_run) + cmd = self.reinitialize_command(cmdname, **kw) + self.run_command(cmdname) + return cmd + + def run(self): + # Generate metadata first + self.run_command("egg_info") + # We run install_lib before install_data, because some data hacks + # pull their data path from the install_lib command. + log.info("installing library code to %s", self.bdist_dir) + instcmd = self.get_finalized_command('install') + old_root = instcmd.root + instcmd.root = None + if self.distribution.has_c_libraries() and not self.skip_build: + self.run_command('build_clib') + cmd = self.call_command('install_lib', warn_dir=0) + instcmd.root = old_root + + all_outputs, ext_outputs = self.get_ext_outputs() + self.stubs = [] + to_compile = [] + for (p, ext_name) in enumerate(ext_outputs): + filename, ext = os.path.splitext(ext_name) + pyfile = os.path.join(self.bdist_dir, strip_module(filename) + + '.py') + self.stubs.append(pyfile) + log.info("creating stub loader for %s", ext_name) + if not self.dry_run: + write_stub(os.path.basename(ext_name), pyfile) + to_compile.append(pyfile) + ext_outputs[p] = ext_name.replace(os.sep, '/') + + if to_compile: + cmd.byte_compile(to_compile) + if self.distribution.data_files: + self.do_install_data() + + # Make the EGG-INFO directory + archive_root = self.bdist_dir + egg_info = os.path.join(archive_root, 'EGG-INFO') + self.mkpath(egg_info) + if self.distribution.scripts: + script_dir = os.path.join(egg_info, 'scripts') + log.info("installing scripts to %s", script_dir) + self.call_command('install_scripts', install_dir=script_dir, + no_ep=1) + + self.copy_metadata_to(egg_info) + native_libs = os.path.join(egg_info, "native_libs.txt") + if all_outputs: + log.info("writing %s", native_libs) + if not self.dry_run: + ensure_directory(native_libs) + libs_file = open(native_libs, 'wt') + libs_file.write('\n'.join(all_outputs)) + libs_file.write('\n') + libs_file.close() + elif os.path.isfile(native_libs): + log.info("removing %s", native_libs) + if not self.dry_run: + os.unlink(native_libs) + + write_safety_flag( + os.path.join(archive_root, 'EGG-INFO'), self.zip_safe() + ) + + if os.path.exists(os.path.join(self.egg_info, 'depends.txt')): + log.warn( + "WARNING: 'depends.txt' will not be used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + if self.exclude_source_files: + self.zap_pyfiles() + + # Make the archive + make_zipfile(self.egg_output, archive_root, verbose=self.verbose, + dry_run=self.dry_run, mode=self.gen_header()) + if not self.keep_temp: + remove_tree(self.bdist_dir, dry_run=self.dry_run) + + # Add to 'Distribution.dist_files' so that the "upload" command works + getattr(self.distribution, 'dist_files', []).append( + ('bdist_egg', get_python_version(), self.egg_output)) + + def zap_pyfiles(self): + log.info("Removing .py files from temporary directory") + for base, dirs, files in walk_egg(self.bdist_dir): + for name in files: + path = os.path.join(base, name) + + if name.endswith('.py'): + log.debug("Deleting %s", path) + os.unlink(path) + + if base.endswith('__pycache__'): + path_old = path + + pattern = r'(?P<name>.+)\.(?P<magic>[^.]+)\.pyc' + m = re.match(pattern, name) + path_new = os.path.join( + base, os.pardir, m.group('name') + '.pyc') + log.info( + "Renaming file from [%s] to [%s]" + % (path_old, path_new)) + try: + os.remove(path_new) + except OSError: + pass + os.rename(path_old, path_new) + + def zip_safe(self): + safe = getattr(self.distribution, 'zip_safe', None) + if safe is not None: + return safe + log.warn("zip_safe flag not set; analyzing archive contents...") + return analyze_egg(self.bdist_dir, self.stubs) + + def gen_header(self): + epm = EntryPoint.parse_map(self.distribution.entry_points or '') + ep = epm.get('setuptools.installation', {}).get('eggsecutable') + if ep is None: + return 'w' # not an eggsecutable, do it the usual way. + + if not ep.attrs or ep.extras: + raise DistutilsSetupError( + "eggsecutable entry point (%r) cannot have 'extras' " + "or refer to a module" % (ep,) + ) + + pyver = sys.version[:3] + pkg = ep.module_name + full = '.'.join(ep.attrs) + base = ep.attrs[0] + basename = os.path.basename(self.egg_output) + + header = ( + "#!/bin/sh\n" + 'if [ `basename $0` = "%(basename)s" ]\n' + 'then exec python%(pyver)s -c "' + "import sys, os; sys.path.insert(0, os.path.abspath('$0')); " + "from %(pkg)s import %(base)s; sys.exit(%(full)s())" + '" "$@"\n' + 'else\n' + ' echo $0 is not the correct name for this egg file.\n' + ' echo Please rename it back to %(basename)s and try again.\n' + ' exec false\n' + 'fi\n' + ) % locals() + + if not self.dry_run: + mkpath(os.path.dirname(self.egg_output), dry_run=self.dry_run) + f = open(self.egg_output, 'w') + f.write(header) + f.close() + return 'a' + + def copy_metadata_to(self, target_dir): + "Copy metadata (egg info) to the target_dir" + # normalize the path (so that a forward-slash in egg_info will + # match using startswith below) + norm_egg_info = os.path.normpath(self.egg_info) + prefix = os.path.join(norm_egg_info, '') + for path in self.ei_cmd.filelist.files: + if path.startswith(prefix): + target = os.path.join(target_dir, path[len(prefix):]) + ensure_directory(target) + self.copy_file(path, target) + + def get_ext_outputs(self): + """Get a list of relative paths to C extensions in the output distro""" + + all_outputs = [] + ext_outputs = [] + + paths = {self.bdist_dir: ''} + for base, dirs, files in sorted_walk(self.bdist_dir): + for filename in files: + if os.path.splitext(filename)[1].lower() in NATIVE_EXTENSIONS: + all_outputs.append(paths[base] + filename) + for filename in dirs: + paths[os.path.join(base, filename)] = (paths[base] + + filename + '/') + + if self.distribution.has_ext_modules(): + build_cmd = self.get_finalized_command('build_ext') + for ext in build_cmd.extensions: + if isinstance(ext, Library): + continue + fullname = build_cmd.get_ext_fullname(ext.name) + filename = build_cmd.get_ext_filename(fullname) + if not os.path.basename(filename).startswith('dl-'): + if os.path.exists(os.path.join(self.bdist_dir, filename)): + ext_outputs.append(filename) + + return all_outputs, ext_outputs + + +NATIVE_EXTENSIONS = dict.fromkeys('.dll .so .dylib .pyd'.split()) + + +def walk_egg(egg_dir): + """Walk an unpacked egg's contents, skipping the metadata directory""" + walker = sorted_walk(egg_dir) + base, dirs, files = next(walker) + if 'EGG-INFO' in dirs: + dirs.remove('EGG-INFO') + yield base, dirs, files + for bdf in walker: + yield bdf + + +def analyze_egg(egg_dir, stubs): + # check for existing flag in EGG-INFO + for flag, fn in safety_flags.items(): + if os.path.exists(os.path.join(egg_dir, 'EGG-INFO', fn)): + return flag + if not can_scan(): + return False + safe = True + for base, dirs, files in walk_egg(egg_dir): + for name in files: + if name.endswith('.py') or name.endswith('.pyw'): + continue + elif name.endswith('.pyc') or name.endswith('.pyo'): + # always scan, even if we already know we're not safe + safe = scan_module(egg_dir, base, name, stubs) and safe + return safe + + +def write_safety_flag(egg_dir, safe): + # Write or remove zip safety flag file(s) + for flag, fn in safety_flags.items(): + fn = os.path.join(egg_dir, fn) + if os.path.exists(fn): + if safe is None or bool(safe) != flag: + os.unlink(fn) + elif safe is not None and bool(safe) == flag: + f = open(fn, 'wt') + f.write('\n') + f.close() + + +safety_flags = { + True: 'zip-safe', + False: 'not-zip-safe', +} + + +def scan_module(egg_dir, base, name, stubs): + """Check whether module possibly uses unsafe-for-zipfile stuff""" + + filename = os.path.join(base, name) + if filename[:-1] in stubs: + return True # Extension module + pkg = base[len(egg_dir) + 1:].replace(os.sep, '.') + module = pkg + (pkg and '.' or '') + os.path.splitext(name)[0] + if sys.version_info < (3, 3): + skip = 8 # skip magic & date + elif sys.version_info < (3, 7): + skip = 12 # skip magic & date & file size + else: + skip = 16 # skip magic & reserved? & date & file size + f = open(filename, 'rb') + f.read(skip) + code = marshal.load(f) + f.close() + safe = True + symbols = dict.fromkeys(iter_symbols(code)) + for bad in ['__file__', '__path__']: + if bad in symbols: + log.warn("%s: module references %s", module, bad) + safe = False + if 'inspect' in symbols: + for bad in [ + 'getsource', 'getabsfile', 'getsourcefile', 'getfile' + 'getsourcelines', 'findsource', 'getcomments', 'getframeinfo', + 'getinnerframes', 'getouterframes', 'stack', 'trace' + ]: + if bad in symbols: + log.warn("%s: module MAY be using inspect.%s", module, bad) + safe = False + return safe + + +def iter_symbols(code): + """Yield names and strings used by `code` and its nested code objects""" + for name in code.co_names: + yield name + for const in code.co_consts: + if isinstance(const, six.string_types): + yield const + elif isinstance(const, CodeType): + for name in iter_symbols(const): + yield name + + +def can_scan(): + if not sys.platform.startswith('java') and sys.platform != 'cli': + # CPython, PyPy, etc. + return True + log.warn("Unable to analyze compiled code on this platform.") + log.warn("Please ask the author to include a 'zip_safe'" + " setting (either True or False) in the package's setup.py") + + +# Attribute names of options for commands that might need to be convinced to +# install to the egg build directory + +INSTALL_DIRECTORY_ATTRS = [ + 'install_lib', 'install_dir', 'install_data', 'install_base' +] + + +def make_zipfile(zip_filename, base_dir, verbose=0, dry_run=0, compress=True, + mode='w'): + """Create a zip file from all the files under 'base_dir'. The output + zip file will be named 'base_dir' + ".zip". Uses either the "zipfile" + Python module (if available) or the InfoZIP "zip" utility (if installed + and found on the default search path). If neither tool is available, + raises DistutilsExecError. Returns the name of the output zip file. + """ + import zipfile + + mkpath(os.path.dirname(zip_filename), dry_run=dry_run) + log.info("creating '%s' and adding '%s' to it", zip_filename, base_dir) + + def visit(z, dirname, names): + for name in names: + path = os.path.normpath(os.path.join(dirname, name)) + if os.path.isfile(path): + p = path[len(base_dir) + 1:] + if not dry_run: + z.write(path, p) + log.debug("adding '%s'", p) + + compression = zipfile.ZIP_DEFLATED if compress else zipfile.ZIP_STORED + if not dry_run: + z = zipfile.ZipFile(zip_filename, mode, compression=compression) + for dirname, dirs, files in sorted_walk(base_dir): + visit(z, dirname, files) + z.close() + else: + for dirname, dirs, files in sorted_walk(base_dir): + visit(None, dirname, files) + return zip_filename diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py b/myenv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py new file mode 100644 index 000000000..70730927e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/bdist_rpm.py @@ -0,0 +1,43 @@ +import distutils.command.bdist_rpm as orig + + +class bdist_rpm(orig.bdist_rpm): + """ + Override the default bdist_rpm behavior to do the following: + + 1. Run egg_info to ensure the name and version are properly calculated. + 2. Always run 'install' using --single-version-externally-managed to + disable eggs in RPM distributions. + 3. Replace dash with underscore in the version numbers for better RPM + compatibility. + """ + + def run(self): + # ensure distro name is up-to-date + self.run_command('egg_info') + + orig.bdist_rpm.run(self) + + def _make_spec_file(self): + version = self.distribution.get_version() + rpmversion = version.replace('-', '_') + spec = orig.bdist_rpm._make_spec_file(self) + line23 = '%define version ' + version + line24 = '%define version ' + rpmversion + spec = [ + line.replace( + "Source0: %{name}-%{version}.tar", + "Source0: %{name}-%{unmangled_version}.tar" + ).replace( + "setup.py install ", + "setup.py install --single-version-externally-managed " + ).replace( + "%setup", + "%setup -n %{name}-%{unmangled_version}" + ).replace(line23, line24) + for line in spec + ] + insert_loc = spec.index(line24) + 1 + unmangled_version = "%define unmangled_version " + version + spec.insert(insert_loc, unmangled_version) + return spec diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py b/myenv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py new file mode 100644 index 000000000..073de97b4 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/bdist_wininst.py @@ -0,0 +1,21 @@ +import distutils.command.bdist_wininst as orig + + +class bdist_wininst(orig.bdist_wininst): + def reinitialize_command(self, command, reinit_subcommands=0): + """ + Supplement reinitialize_command to work around + http://bugs.python.org/issue20819 + """ + cmd = self.distribution.reinitialize_command( + command, reinit_subcommands) + if command in ('install', 'install_lib'): + cmd.install_lib = None + return cmd + + def run(self): + self._is_running = True + try: + orig.bdist_wininst.run(self) + finally: + self._is_running = False diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/build_clib.py b/myenv/lib/python3.7/site-packages/setuptools/command/build_clib.py new file mode 100644 index 000000000..09caff6ff --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/build_clib.py @@ -0,0 +1,98 @@ +import distutils.command.build_clib as orig +from distutils.errors import DistutilsSetupError +from distutils import log +from setuptools.dep_util import newer_pairwise_group + + +class build_clib(orig.build_clib): + """ + Override the default build_clib behaviour to do the following: + + 1. Implement a rudimentary timestamp-based dependency system + so 'compile()' doesn't run every time. + 2. Add more keys to the 'build_info' dictionary: + * obj_deps - specify dependencies for each object compiled. + this should be a dictionary mapping a key + with the source filename to a list of + dependencies. Use an empty string for global + dependencies. + * cflags - specify a list of additional flags to pass to + the compiler. + """ + + def build_libraries(self, libraries): + for (lib_name, build_info) in libraries: + sources = build_info.get('sources') + if sources is None or not isinstance(sources, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'sources' must be present and must be " + "a list of source filenames" % lib_name) + sources = list(sources) + + log.info("building '%s' library", lib_name) + + # Make sure everything is the correct type. + # obj_deps should be a dictionary of keys as sources + # and a list/tuple of files that are its dependencies. + obj_deps = build_info.get('obj_deps', dict()) + if not isinstance(obj_deps, dict): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + dependencies = [] + + # Get the global dependencies that are specified by the '' key. + # These will go into every source's dependency list. + global_deps = obj_deps.get('', list()) + if not isinstance(global_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + + # Build the list to be used by newer_pairwise_group + # each source will be auto-added to its dependencies. + for source in sources: + src_deps = [source] + src_deps.extend(global_deps) + extra_deps = obj_deps.get(source, list()) + if not isinstance(extra_deps, (list, tuple)): + raise DistutilsSetupError( + "in 'libraries' option (library '%s'), " + "'obj_deps' must be a dictionary of " + "type 'source: list'" % lib_name) + src_deps.extend(extra_deps) + dependencies.append(src_deps) + + expected_objects = self.compiler.object_filenames( + sources, + output_dir=self.build_temp + ) + + if newer_pairwise_group(dependencies, expected_objects) != ([], []): + # First, compile the source code to object files in the library + # directory. (This should probably change to putting object + # files in a temporary build directory.) + macros = build_info.get('macros') + include_dirs = build_info.get('include_dirs') + cflags = build_info.get('cflags') + objects = self.compiler.compile( + sources, + output_dir=self.build_temp, + macros=macros, + include_dirs=include_dirs, + extra_postargs=cflags, + debug=self.debug + ) + + # Now "link" the object files together into a static library. + # (On Unix at least, this isn't really linking -- it just + # builds an archive. Whatever.) + self.compiler.create_static_lib( + expected_objects, + lib_name, + output_dir=self.build_clib, + debug=self.debug + ) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/build_ext.py b/myenv/lib/python3.7/site-packages/setuptools/command/build_ext.py new file mode 100644 index 000000000..ea97b37b2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/build_ext.py @@ -0,0 +1,331 @@ +import os +import sys +import itertools +import imp +from distutils.command.build_ext import build_ext as _du_build_ext +from distutils.file_util import copy_file +from distutils.ccompiler import new_compiler +from distutils.sysconfig import customize_compiler, get_config_var +from distutils.errors import DistutilsError +from distutils import log + +from setuptools.extension import Library +from setuptools.extern import six + +try: + # Attempt to use Cython for building extensions, if available + from Cython.Distutils.build_ext import build_ext as _build_ext + # Additionally, assert that the compiler module will load + # also. Ref #1229. + __import__('Cython.Compiler.Main') +except ImportError: + _build_ext = _du_build_ext + +# make sure _config_vars is initialized +get_config_var("LDSHARED") +from distutils.sysconfig import _config_vars as _CONFIG_VARS + + +def _customize_compiler_for_shlib(compiler): + if sys.platform == "darwin": + # building .dylib requires additional compiler flags on OSX; here we + # temporarily substitute the pyconfig.h variables so that distutils' + # 'customize_compiler' uses them before we build the shared libraries. + tmp = _CONFIG_VARS.copy() + try: + # XXX Help! I don't have any idea whether these are right... + _CONFIG_VARS['LDSHARED'] = ( + "gcc -Wl,-x -dynamiclib -undefined dynamic_lookup") + _CONFIG_VARS['CCSHARED'] = " -dynamiclib" + _CONFIG_VARS['SO'] = ".dylib" + customize_compiler(compiler) + finally: + _CONFIG_VARS.clear() + _CONFIG_VARS.update(tmp) + else: + customize_compiler(compiler) + + +have_rtld = False +use_stubs = False +libtype = 'shared' + +if sys.platform == "darwin": + use_stubs = True +elif os.name != 'nt': + try: + import dl + use_stubs = have_rtld = hasattr(dl, 'RTLD_NOW') + except ImportError: + pass + +if_dl = lambda s: s if have_rtld else '' + + +def get_abi3_suffix(): + """Return the file extension for an abi3-compliant Extension()""" + for suffix, _, _ in (s for s in imp.get_suffixes() if s[2] == imp.C_EXTENSION): + if '.abi3' in suffix: # Unix + return suffix + elif suffix == '.pyd': # Windows + return suffix + + +class build_ext(_build_ext): + def run(self): + """Build extensions in build directory, then copy if --inplace""" + old_inplace, self.inplace = self.inplace, 0 + _build_ext.run(self) + self.inplace = old_inplace + if old_inplace: + self.copy_extensions_to_source() + + def copy_extensions_to_source(self): + build_py = self.get_finalized_command('build_py') + for ext in self.extensions: + fullname = self.get_ext_fullname(ext.name) + filename = self.get_ext_filename(fullname) + modpath = fullname.split('.') + package = '.'.join(modpath[:-1]) + package_dir = build_py.get_package_dir(package) + dest_filename = os.path.join(package_dir, + os.path.basename(filename)) + src_filename = os.path.join(self.build_lib, filename) + + # Always copy, even if source is older than destination, to ensure + # that the right extensions for the current Python/platform are + # used. + copy_file( + src_filename, dest_filename, verbose=self.verbose, + dry_run=self.dry_run + ) + if ext._needs_stub: + self.write_stub(package_dir or os.curdir, ext, True) + + def get_ext_filename(self, fullname): + filename = _build_ext.get_ext_filename(self, fullname) + if fullname in self.ext_map: + ext = self.ext_map[fullname] + use_abi3 = ( + six.PY3 + and getattr(ext, 'py_limited_api') + and get_abi3_suffix() + ) + if use_abi3: + so_ext = _get_config_var_837('EXT_SUFFIX') + filename = filename[:-len(so_ext)] + filename = filename + get_abi3_suffix() + if isinstance(ext, Library): + fn, ext = os.path.splitext(filename) + return self.shlib_compiler.library_filename(fn, libtype) + elif use_stubs and ext._links_to_dynamic: + d, fn = os.path.split(filename) + return os.path.join(d, 'dl-' + fn) + return filename + + def initialize_options(self): + _build_ext.initialize_options(self) + self.shlib_compiler = None + self.shlibs = [] + self.ext_map = {} + + def finalize_options(self): + _build_ext.finalize_options(self) + self.extensions = self.extensions or [] + self.check_extensions_list(self.extensions) + self.shlibs = [ext for ext in self.extensions + if isinstance(ext, Library)] + if self.shlibs: + self.setup_shlib_compiler() + for ext in self.extensions: + ext._full_name = self.get_ext_fullname(ext.name) + for ext in self.extensions: + fullname = ext._full_name + self.ext_map[fullname] = ext + + # distutils 3.1 will also ask for module names + # XXX what to do with conflicts? + self.ext_map[fullname.split('.')[-1]] = ext + + ltd = self.shlibs and self.links_to_dynamic(ext) or False + ns = ltd and use_stubs and not isinstance(ext, Library) + ext._links_to_dynamic = ltd + ext._needs_stub = ns + filename = ext._file_name = self.get_ext_filename(fullname) + libdir = os.path.dirname(os.path.join(self.build_lib, filename)) + if ltd and libdir not in ext.library_dirs: + ext.library_dirs.append(libdir) + if ltd and use_stubs and os.curdir not in ext.runtime_library_dirs: + ext.runtime_library_dirs.append(os.curdir) + + def setup_shlib_compiler(self): + compiler = self.shlib_compiler = new_compiler( + compiler=self.compiler, dry_run=self.dry_run, force=self.force + ) + _customize_compiler_for_shlib(compiler) + + if self.include_dirs is not None: + compiler.set_include_dirs(self.include_dirs) + if self.define is not None: + # 'define' option is a list of (name,value) tuples + for (name, value) in self.define: + compiler.define_macro(name, value) + if self.undef is not None: + for macro in self.undef: + compiler.undefine_macro(macro) + if self.libraries is not None: + compiler.set_libraries(self.libraries) + if self.library_dirs is not None: + compiler.set_library_dirs(self.library_dirs) + if self.rpath is not None: + compiler.set_runtime_library_dirs(self.rpath) + if self.link_objects is not None: + compiler.set_link_objects(self.link_objects) + + # hack so distutils' build_extension() builds a library instead + compiler.link_shared_object = link_shared_object.__get__(compiler) + + def get_export_symbols(self, ext): + if isinstance(ext, Library): + return ext.export_symbols + return _build_ext.get_export_symbols(self, ext) + + def build_extension(self, ext): + ext._convert_pyx_sources_to_lang() + _compiler = self.compiler + try: + if isinstance(ext, Library): + self.compiler = self.shlib_compiler + _build_ext.build_extension(self, ext) + if ext._needs_stub: + cmd = self.get_finalized_command('build_py').build_lib + self.write_stub(cmd, ext) + finally: + self.compiler = _compiler + + def links_to_dynamic(self, ext): + """Return true if 'ext' links to a dynamic lib in the same package""" + # XXX this should check to ensure the lib is actually being built + # XXX as dynamic, and not just using a locally-found version or a + # XXX static-compiled version + libnames = dict.fromkeys([lib._full_name for lib in self.shlibs]) + pkg = '.'.join(ext._full_name.split('.')[:-1] + ['']) + return any(pkg + libname in libnames for libname in ext.libraries) + + def get_outputs(self): + return _build_ext.get_outputs(self) + self.__get_stubs_outputs() + + def __get_stubs_outputs(self): + # assemble the base name for each extension that needs a stub + ns_ext_bases = ( + os.path.join(self.build_lib, *ext._full_name.split('.')) + for ext in self.extensions + if ext._needs_stub + ) + # pair each base with the extension + pairs = itertools.product(ns_ext_bases, self.__get_output_extensions()) + return list(base + fnext for base, fnext in pairs) + + def __get_output_extensions(self): + yield '.py' + yield '.pyc' + if self.get_finalized_command('build_py').optimize: + yield '.pyo' + + def write_stub(self, output_dir, ext, compile=False): + log.info("writing stub loader for %s to %s", ext._full_name, + output_dir) + stub_file = (os.path.join(output_dir, *ext._full_name.split('.')) + + '.py') + if compile and os.path.exists(stub_file): + raise DistutilsError(stub_file + " already exists! Please delete.") + if not self.dry_run: + f = open(stub_file, 'w') + f.write( + '\n'.join([ + "def __bootstrap__():", + " global __bootstrap__, __file__, __loader__", + " import sys, os, pkg_resources, imp" + if_dl(", dl"), + " __file__ = pkg_resources.resource_filename" + "(__name__,%r)" + % os.path.basename(ext._file_name), + " del __bootstrap__", + " if '__loader__' in globals():", + " del __loader__", + if_dl(" old_flags = sys.getdlopenflags()"), + " old_dir = os.getcwd()", + " try:", + " os.chdir(os.path.dirname(__file__))", + if_dl(" sys.setdlopenflags(dl.RTLD_NOW)"), + " imp.load_dynamic(__name__,__file__)", + " finally:", + if_dl(" sys.setdlopenflags(old_flags)"), + " os.chdir(old_dir)", + "__bootstrap__()", + "" # terminal \n + ]) + ) + f.close() + if compile: + from distutils.util import byte_compile + + byte_compile([stub_file], optimize=0, + force=True, dry_run=self.dry_run) + optimize = self.get_finalized_command('install_lib').optimize + if optimize > 0: + byte_compile([stub_file], optimize=optimize, + force=True, dry_run=self.dry_run) + if os.path.exists(stub_file) and not self.dry_run: + os.unlink(stub_file) + + +if use_stubs or os.name == 'nt': + # Build shared libraries + # + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + self.link( + self.SHARED_LIBRARY, objects, output_libname, + output_dir, libraries, library_dirs, runtime_library_dirs, + export_symbols, debug, extra_preargs, extra_postargs, + build_temp, target_lang + ) +else: + # Build static libraries everywhere else + libtype = 'static' + + def link_shared_object( + self, objects, output_libname, output_dir=None, libraries=None, + library_dirs=None, runtime_library_dirs=None, export_symbols=None, + debug=0, extra_preargs=None, extra_postargs=None, build_temp=None, + target_lang=None): + # XXX we need to either disallow these attrs on Library instances, + # or warn/abort here if set, or something... + # libraries=None, library_dirs=None, runtime_library_dirs=None, + # export_symbols=None, extra_preargs=None, extra_postargs=None, + # build_temp=None + + assert output_dir is None # distutils build_ext doesn't pass this + output_dir, filename = os.path.split(output_libname) + basename, ext = os.path.splitext(filename) + if self.library_filename("x").startswith('lib'): + # strip 'lib' prefix; this is kludgy if some platform uses + # a different prefix + basename = basename[3:] + + self.create_static_lib( + objects, basename, output_dir, debug, target_lang + ) + + +def _get_config_var_837(name): + """ + In https://github.com/pypa/setuptools/pull/837, we discovered + Python 3.3.0 exposes the extension suffix under the name 'SO'. + """ + if sys.version_info < (3, 3, 1): + name = 'SO' + return get_config_var(name) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/build_py.py b/myenv/lib/python3.7/site-packages/setuptools/command/build_py.py new file mode 100644 index 000000000..b0314fd41 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/build_py.py @@ -0,0 +1,270 @@ +from glob import glob +from distutils.util import convert_path +import distutils.command.build_py as orig +import os +import fnmatch +import textwrap +import io +import distutils.errors +import itertools + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter, filterfalse + +try: + from setuptools.lib2to3_ex import Mixin2to3 +except ImportError: + + class Mixin2to3: + def run_2to3(self, files, doctests=True): + "do nothing" + + +class build_py(orig.build_py, Mixin2to3): + """Enhanced 'build_py' command that includes data files with packages + + The data files are specified via a 'package_data' argument to 'setup()'. + See 'setuptools.dist.Distribution' for more details. + + Also, this version of the 'build_py' command allows you to specify both + 'py_modules' and 'packages' in the same setup operation. + """ + + def finalize_options(self): + orig.build_py.finalize_options(self) + self.package_data = self.distribution.package_data + self.exclude_package_data = (self.distribution.exclude_package_data or + {}) + if 'data_files' in self.__dict__: + del self.__dict__['data_files'] + self.__updated_files = [] + self.__doctests_2to3 = [] + + def run(self): + """Build modules, packages, and copy data files to build directory""" + if not self.py_modules and not self.packages: + return + + if self.py_modules: + self.build_modules() + + if self.packages: + self.build_packages() + self.build_package_data() + + self.run_2to3(self.__updated_files, False) + self.run_2to3(self.__updated_files, True) + self.run_2to3(self.__doctests_2to3, True) + + # Only compile actual .py files, using our base class' idea of what our + # output files are. + self.byte_compile(orig.build_py.get_outputs(self, include_bytecode=0)) + + def __getattr__(self, attr): + "lazily compute data files" + if attr == 'data_files': + self.data_files = self._get_data_files() + return self.data_files + return orig.build_py.__getattr__(self, attr) + + def build_module(self, module, module_file, package): + if six.PY2 and isinstance(package, six.string_types): + # avoid errors on Python 2 when unicode is passed (#190) + package = package.split('.') + outfile, copied = orig.build_py.build_module(self, module, module_file, + package) + if copied: + self.__updated_files.append(outfile) + return outfile, copied + + def _get_data_files(self): + """Generate list of '(package,src_dir,build_dir,filenames)' tuples""" + self.analyze_manifest() + return list(map(self._get_pkg_data_files, self.packages or ())) + + def _get_pkg_data_files(self, package): + # Locate package source directory + src_dir = self.get_package_dir(package) + + # Compute package build directory + build_dir = os.path.join(*([self.build_lib] + package.split('.'))) + + # Strip directory from globbed filenames + filenames = [ + os.path.relpath(file, src_dir) + for file in self.find_data_files(package, src_dir) + ] + return package, src_dir, build_dir, filenames + + def find_data_files(self, package, src_dir): + """Return filenames for package's data files in 'src_dir'""" + patterns = self._get_platform_patterns( + self.package_data, + package, + src_dir, + ) + globs_expanded = map(glob, patterns) + # flatten the expanded globs into an iterable of matches + globs_matches = itertools.chain.from_iterable(globs_expanded) + glob_files = filter(os.path.isfile, globs_matches) + files = itertools.chain( + self.manifest_files.get(package, []), + glob_files, + ) + return self.exclude_data_files(package, src_dir, files) + + def build_package_data(self): + """Copy data files into build directory""" + for package, src_dir, build_dir, filenames in self.data_files: + for filename in filenames: + target = os.path.join(build_dir, filename) + self.mkpath(os.path.dirname(target)) + srcfile = os.path.join(src_dir, filename) + outf, copied = self.copy_file(srcfile, target) + srcfile = os.path.abspath(srcfile) + if (copied and + srcfile in self.distribution.convert_2to3_doctests): + self.__doctests_2to3.append(outf) + + def analyze_manifest(self): + self.manifest_files = mf = {} + if not self.distribution.include_package_data: + return + src_dirs = {} + for package in self.packages or (): + # Locate package source directory + src_dirs[assert_relative(self.get_package_dir(package))] = package + + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + for path in ei_cmd.filelist.files: + d, f = os.path.split(assert_relative(path)) + prev = None + oldf = f + while d and d != prev and d not in src_dirs: + prev = d + d, df = os.path.split(d) + f = os.path.join(df, f) + if d in src_dirs: + if path.endswith('.py') and f == oldf: + continue # it's a module, not data + mf.setdefault(src_dirs[d], []).append(path) + + def get_data_files(self): + pass # Lazily compute data files in _get_data_files() function. + + def check_package(self, package, package_dir): + """Check namespace packages' __init__ for declare_namespace""" + try: + return self.packages_checked[package] + except KeyError: + pass + + init_py = orig.build_py.check_package(self, package, package_dir) + self.packages_checked[package] = init_py + + if not init_py or not self.distribution.namespace_packages: + return init_py + + for pkg in self.distribution.namespace_packages: + if pkg == package or pkg.startswith(package + '.'): + break + else: + return init_py + + with io.open(init_py, 'rb') as f: + contents = f.read() + if b'declare_namespace' not in contents: + raise distutils.errors.DistutilsError( + "Namespace package problem: %s is a namespace package, but " + "its\n__init__.py does not call declare_namespace()! Please " + 'fix it.\n(See the setuptools manual under ' + '"Namespace Packages" for details.)\n"' % (package,) + ) + return init_py + + def initialize_options(self): + self.packages_checked = {} + orig.build_py.initialize_options(self) + + def get_package_dir(self, package): + res = orig.build_py.get_package_dir(self, package) + if self.distribution.src_root is not None: + return os.path.join(self.distribution.src_root, res) + return res + + def exclude_data_files(self, package, src_dir, files): + """Filter filenames for package's data files in 'src_dir'""" + files = list(files) + patterns = self._get_platform_patterns( + self.exclude_package_data, + package, + src_dir, + ) + match_groups = ( + fnmatch.filter(files, pattern) + for pattern in patterns + ) + # flatten the groups of matches into an iterable of matches + matches = itertools.chain.from_iterable(match_groups) + bad = set(matches) + keepers = ( + fn + for fn in files + if fn not in bad + ) + # ditch dupes + return list(_unique_everseen(keepers)) + + @staticmethod + def _get_platform_patterns(spec, package, src_dir): + """ + yield platform-specific path patterns (suitable for glob + or fn_match) from a glob-based spec (such as + self.package_data or self.exclude_package_data) + matching package in src_dir. + """ + raw_patterns = itertools.chain( + spec.get('', []), + spec.get(package, []), + ) + return ( + # Each pattern has to be converted to a platform-specific path + os.path.join(src_dir, convert_path(pattern)) + for pattern in raw_patterns + ) + + +# from Python docs +def _unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def assert_relative(path): + if not os.path.isabs(path): + return path + from distutils.errors import DistutilsSetupError + + msg = textwrap.dedent(""" + Error: setup script specifies an absolute path: + + %s + + setup() arguments must *always* be /-separated paths relative to the + setup.py directory, *never* absolute paths. + """).lstrip() % path + raise DistutilsSetupError(msg) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/develop.py b/myenv/lib/python3.7/site-packages/setuptools/command/develop.py new file mode 100644 index 000000000..959c932a5 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/develop.py @@ -0,0 +1,216 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsError, DistutilsOptionError +import os +import glob +import io + +from setuptools.extern import six + +from pkg_resources import Distribution, PathMetadata, normalize_path +from setuptools.command.easy_install import easy_install +from setuptools import namespaces +import setuptools + + +class develop(namespaces.DevelopInstaller, easy_install): + """Set up package for development""" + + description = "install package in 'development mode'" + + user_options = easy_install.user_options + [ + ("uninstall", "u", "Uninstall this source package"), + ("egg-path=", None, "Set the path to be used in the .egg-link file"), + ] + + boolean_options = easy_install.boolean_options + ['uninstall'] + + command_consumes_arguments = False # override base + + def run(self): + if self.uninstall: + self.multi_version = True + self.uninstall_link() + self.uninstall_namespaces() + else: + self.install_for_development() + self.warn_deprecated_options() + + def initialize_options(self): + self.uninstall = None + self.egg_path = None + easy_install.initialize_options(self) + self.setup_path = None + self.always_copy_from = '.' # always copy eggs installed in curdir + + def finalize_options(self): + ei = self.get_finalized_command("egg_info") + if ei.broken_egg_info: + template = "Please rename %r to %r before using 'develop'" + args = ei.egg_info, ei.broken_egg_info + raise DistutilsError(template % args) + self.args = [ei.egg_name] + + easy_install.finalize_options(self) + self.expand_basedirs() + self.expand_dirs() + # pick up setup-dir .egg files only: no .egg-info + self.package_index.scan(glob.glob('*.egg')) + + egg_link_fn = ei.egg_name + '.egg-link' + self.egg_link = os.path.join(self.install_dir, egg_link_fn) + self.egg_base = ei.egg_base + if self.egg_path is None: + self.egg_path = os.path.abspath(ei.egg_base) + + target = normalize_path(self.egg_base) + egg_path = normalize_path(os.path.join(self.install_dir, + self.egg_path)) + if egg_path != target: + raise DistutilsOptionError( + "--egg-path must be a relative path from the install" + " directory to " + target + ) + + # Make a distribution for the package's source + self.dist = Distribution( + target, + PathMetadata(target, os.path.abspath(ei.egg_info)), + project_name=ei.egg_name + ) + + self.setup_path = self._resolve_setup_path( + self.egg_base, + self.install_dir, + self.egg_path, + ) + + @staticmethod + def _resolve_setup_path(egg_base, install_dir, egg_path): + """ + Generate a path from egg_base back to '.' where the + setup script resides and ensure that path points to the + setup path from $install_dir/$egg_path. + """ + path_to_setup = egg_base.replace(os.sep, '/').rstrip('/') + if path_to_setup != os.curdir: + path_to_setup = '../' * (path_to_setup.count('/') + 1) + resolved = normalize_path( + os.path.join(install_dir, egg_path, path_to_setup) + ) + if resolved != normalize_path(os.curdir): + raise DistutilsOptionError( + "Can't get a consistent path to setup script from" + " installation directory", resolved, normalize_path(os.curdir)) + return path_to_setup + + def install_for_development(self): + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + + # Fixup egg-link and easy-install.pth + ei_cmd = self.get_finalized_command("egg_info") + self.egg_path = build_path + self.dist.location = build_path + # XXX + self.dist._provider = PathMetadata(build_path, ei_cmd.egg_info) + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + self.install_site_py() # ensure that target dir is site-safe + if setuptools.bootstrap_install_from: + self.easy_install(setuptools.bootstrap_install_from) + setuptools.bootstrap_install_from = None + + self.install_namespaces() + + # create an .egg-link in the installation dir, pointing to our egg + log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) + if not self.dry_run: + with open(self.egg_link, "w") as f: + f.write(self.egg_path + "\n" + self.setup_path) + # postprocess the installed distro, fixing up .pth, installing scripts, + # and handling requirements + self.process_distribution(None, self.dist, not self.no_deps) + + def uninstall_link(self): + if os.path.exists(self.egg_link): + log.info("Removing %s (link to %s)", self.egg_link, self.egg_base) + egg_link_file = open(self.egg_link) + contents = [line.rstrip() for line in egg_link_file] + egg_link_file.close() + if contents not in ([self.egg_path], + [self.egg_path, self.setup_path]): + log.warn("Link points to %s: uninstall aborted", contents) + return + if not self.dry_run: + os.unlink(self.egg_link) + if not self.dry_run: + self.update_pth(self.dist) # remove any .pth link to us + if self.distribution.scripts: + # XXX should also check for entry point scripts! + log.warn("Note: you must uninstall or replace scripts manually!") + + def install_egg_scripts(self, dist): + if dist is not self.dist: + # Installing a dependency, so fall back to normal behavior + return easy_install.install_egg_scripts(self, dist) + + # create wrapper scripts in the script dir, pointing to dist.scripts + + # new-style... + self.install_wrapper_scripts(dist) + + # ...and old-style + for script_name in self.distribution.scripts or []: + script_path = os.path.abspath(convert_path(script_name)) + script_name = os.path.basename(script_path) + with io.open(script_path) as strm: + script_text = strm.read() + self.install_script(dist, script_name, script_text, script_path) + + def install_wrapper_scripts(self, dist): + dist = VersionlessRequirement(dist) + return easy_install.install_wrapper_scripts(self, dist) + + +class VersionlessRequirement(object): + """ + Adapt a pkg_resources.Distribution to simply return the project + name as the 'requirement' so that scripts will work across + multiple versions. + + >>> dist = Distribution(project_name='foo', version='1.0') + >>> str(dist.as_requirement()) + 'foo==1.0' + >>> adapted_dist = VersionlessRequirement(dist) + >>> str(adapted_dist.as_requirement()) + 'foo' + """ + + def __init__(self, dist): + self.__dist = dist + + def __getattr__(self, name): + return getattr(self.__dist, name) + + def as_requirement(self): + return self.project_name diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/dist_info.py b/myenv/lib/python3.7/site-packages/setuptools/command/dist_info.py new file mode 100644 index 000000000..c45258fa0 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/dist_info.py @@ -0,0 +1,36 @@ +""" +Create a dist_info directory +As defined in the wheel specification +""" + +import os + +from distutils.core import Command +from distutils import log + + +class dist_info(Command): + + description = 'create a .dist-info directory' + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ] + + def initialize_options(self): + self.egg_base = None + + def finalize_options(self): + pass + + def run(self): + egg_info = self.get_finalized_command('egg_info') + egg_info.egg_base = self.egg_base + egg_info.finalize_options() + egg_info.run() + dist_info_dir = egg_info.egg_info[:-len('.egg-info')] + '.dist-info' + log.info("creating '{}'".format(os.path.abspath(dist_info_dir))) + + bdist_wheel = self.get_finalized_command('bdist_wheel') + bdist_wheel.egg2dist(egg_info.egg_info, dist_info_dir) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/easy_install.py b/myenv/lib/python3.7/site-packages/setuptools/command/easy_install.py new file mode 100644 index 000000000..a6f61436b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/easy_install.py @@ -0,0 +1,2334 @@ +#!/usr/bin/env python +""" +Easy Install +------------ + +A tool for doing automatic download/extract/build of distutils-based Python +packages. For detailed documentation, see the accompanying EasyInstall.txt +file, or visit the `EasyInstall home page`__. + +__ https://setuptools.readthedocs.io/en/latest/easy_install.html + +""" + +from glob import glob +from distutils.util import get_platform +from distutils.util import convert_path, subst_vars +from distutils.errors import ( + DistutilsArgError, DistutilsOptionError, + DistutilsError, DistutilsPlatformError, +) +from distutils.command.install import INSTALL_SCHEMES, SCHEME_KEYS +from distutils import log, dir_util +from distutils.command.build_scripts import first_line_re +from distutils.spawn import find_executable +import sys +import os +import zipimport +import shutil +import tempfile +import zipfile +import re +import stat +import random +import textwrap +import warnings +import site +import struct +import contextlib +import subprocess +import shlex +import io + +from setuptools.extern import six +from setuptools.extern.six.moves import configparser, map + +from setuptools import Command +from setuptools.sandbox import run_setup +from setuptools.py31compat import get_path, get_config_vars +from setuptools.py27compat import rmtree_safe +from setuptools.command import setopt +from setuptools.archive_util import unpack_archive +from setuptools.package_index import ( + PackageIndex, parse_requirement_arg, URL_SCHEME, +) +from setuptools.command import bdist_egg, egg_info +from setuptools.wheel import Wheel +from pkg_resources import ( + yield_lines, normalize_path, resource_string, ensure_directory, + get_distribution, find_distributions, Environment, Requirement, + Distribution, PathMetadata, EggMetadata, WorkingSet, DistributionNotFound, + VersionConflict, DEVELOP_DIST, +) +import pkg_resources.py31compat + +# Turn on PEP440Warnings +warnings.filterwarnings("default", category=pkg_resources.PEP440Warning) + +__all__ = [ + 'samefile', 'easy_install', 'PthDistributions', 'extract_wininst_cfg', + 'main', 'get_exe_prefixes', +] + + +def is_64bit(): + return struct.calcsize("P") == 8 + + +def samefile(p1, p2): + """ + Determine if two paths reference the same file. + + Augments os.path.samefile to work on Windows and + suppresses errors if the path doesn't exist. + """ + both_exist = os.path.exists(p1) and os.path.exists(p2) + use_samefile = hasattr(os.path, 'samefile') and both_exist + if use_samefile: + return os.path.samefile(p1, p2) + norm_p1 = os.path.normpath(os.path.normcase(p1)) + norm_p2 = os.path.normpath(os.path.normcase(p2)) + return norm_p1 == norm_p2 + + +if six.PY2: + + def _to_ascii(s): + return s + + def isascii(s): + try: + six.text_type(s, 'ascii') + return True + except UnicodeError: + return False +else: + + def _to_ascii(s): + return s.encode('ascii') + + def isascii(s): + try: + s.encode('ascii') + return True + except UnicodeError: + return False + + +_one_liner = lambda text: textwrap.dedent(text).strip().replace('\n', '; ') + + +class easy_install(Command): + """Manage a download/build/install process""" + description = "Find/get/install Python packages" + command_consumes_arguments = True + + user_options = [ + ('prefix=', None, "installation prefix"), + ("zip-ok", "z", "install package as a zipfile"), + ("multi-version", "m", "make apps have to require() a version"), + ("upgrade", "U", "force upgrade (searches PyPI for latest versions)"), + ("install-dir=", "d", "install package to DIR"), + ("script-dir=", "s", "install scripts to DIR"), + ("exclude-scripts", "x", "Don't install scripts"), + ("always-copy", "a", "Copy all needed packages to install dir"), + ("index-url=", "i", "base URL of Python Package Index"), + ("find-links=", "f", "additional URL(s) to search for packages"), + ("build-directory=", "b", + "download/extract/build in DIR; keep the results"), + ('optimize=', 'O', + "also compile with optimization: -O1 for \"python -O\", " + "-O2 for \"python -OO\", and -O0 to disable [default: -O0]"), + ('record=', None, + "filename in which to record list of installed files"), + ('always-unzip', 'Z', "don't install as a zipfile, no matter what"), + ('site-dirs=', 'S', "list of directories where .pth files work"), + ('editable', 'e', "Install specified packages in editable form"), + ('no-deps', 'N', "don't install dependencies"), + ('allow-hosts=', 'H', "pattern(s) that hostnames must match"), + ('local-snapshots-ok', 'l', + "allow building eggs from local checkouts"), + ('version', None, "print version information and exit"), + ('no-find-links', None, + "Don't load find-links defined in packages being installed") + ] + boolean_options = [ + 'zip-ok', 'multi-version', 'exclude-scripts', 'upgrade', 'always-copy', + 'editable', + 'no-deps', 'local-snapshots-ok', 'version' + ] + + if site.ENABLE_USER_SITE: + help_msg = "install in user site-package '%s'" % site.USER_SITE + user_options.append(('user', None, help_msg)) + boolean_options.append('user') + + negative_opt = {'always-unzip': 'zip-ok'} + create_index = PackageIndex + + def initialize_options(self): + # the --user option seems to be an opt-in one, + # so the default should be False. + self.user = 0 + self.zip_ok = self.local_snapshots_ok = None + self.install_dir = self.script_dir = self.exclude_scripts = None + self.index_url = None + self.find_links = None + self.build_directory = None + self.args = None + self.optimize = self.record = None + self.upgrade = self.always_copy = self.multi_version = None + self.editable = self.no_deps = self.allow_hosts = None + self.root = self.prefix = self.no_report = None + self.version = None + self.install_purelib = None # for pure module distributions + self.install_platlib = None # non-pure (dists w/ extensions) + self.install_headers = None # for C/C++ headers + self.install_lib = None # set to either purelib or platlib + self.install_scripts = None + self.install_data = None + self.install_base = None + self.install_platbase = None + if site.ENABLE_USER_SITE: + self.install_userbase = site.USER_BASE + self.install_usersite = site.USER_SITE + else: + self.install_userbase = None + self.install_usersite = None + self.no_find_links = None + + # Options not specifiable via command line + self.package_index = None + self.pth_file = self.always_copy_from = None + self.site_dirs = None + self.installed_projects = {} + self.sitepy_installed = False + # Always read easy_install options, even if we are subclassed, or have + # an independent instance created. This ensures that defaults will + # always come from the standard configuration file(s)' "easy_install" + # section, even if this is a "develop" or "install" command, or some + # other embedding. + self._dry_run = None + self.verbose = self.distribution.verbose + self.distribution._set_command_options( + self, self.distribution.get_option_dict('easy_install') + ) + + def delete_blockers(self, blockers): + extant_blockers = ( + filename for filename in blockers + if os.path.exists(filename) or os.path.islink(filename) + ) + list(map(self._delete_path, extant_blockers)) + + def _delete_path(self, path): + log.info("Deleting %s", path) + if self.dry_run: + return + + is_tree = os.path.isdir(path) and not os.path.islink(path) + remover = rmtree if is_tree else os.unlink + remover(path) + + @staticmethod + def _render_version(): + """ + Render the Setuptools version and installation details, then exit. + """ + ver = sys.version[:3] + dist = get_distribution('setuptools') + tmpl = 'setuptools {dist.version} from {dist.location} (Python {ver})' + print(tmpl.format(**locals())) + raise SystemExit() + + def finalize_options(self): + self.version and self._render_version() + + py_version = sys.version.split()[0] + prefix, exec_prefix = get_config_vars('prefix', 'exec_prefix') + + self.config_vars = { + 'dist_name': self.distribution.get_name(), + 'dist_version': self.distribution.get_version(), + 'dist_fullname': self.distribution.get_fullname(), + 'py_version': py_version, + 'py_version_short': py_version[0:3], + 'py_version_nodot': py_version[0] + py_version[2], + 'sys_prefix': prefix, + 'prefix': prefix, + 'sys_exec_prefix': exec_prefix, + 'exec_prefix': exec_prefix, + # Only python 3.2+ has abiflags + 'abiflags': getattr(sys, 'abiflags', ''), + } + + if site.ENABLE_USER_SITE: + self.config_vars['userbase'] = self.install_userbase + self.config_vars['usersite'] = self.install_usersite + + self._fix_install_dir_for_user_site() + + self.expand_basedirs() + self.expand_dirs() + + self._expand( + 'install_dir', 'script_dir', 'build_directory', + 'site_dirs', + ) + # If a non-default installation directory was specified, default the + # script directory to match it. + if self.script_dir is None: + self.script_dir = self.install_dir + + if self.no_find_links is None: + self.no_find_links = False + + # Let install_dir get set by install_lib command, which in turn + # gets its info from the install command, and takes into account + # --prefix and --home and all that other crud. + self.set_undefined_options( + 'install_lib', ('install_dir', 'install_dir') + ) + # Likewise, set default script_dir from 'install_scripts.install_dir' + self.set_undefined_options( + 'install_scripts', ('install_dir', 'script_dir') + ) + + if self.user and self.install_purelib: + self.install_dir = self.install_purelib + self.script_dir = self.install_scripts + # default --record from the install command + self.set_undefined_options('install', ('record', 'record')) + # Should this be moved to the if statement below? It's not used + # elsewhere + normpath = map(normalize_path, sys.path) + self.all_site_dirs = get_site_dirs() + if self.site_dirs is not None: + site_dirs = [ + os.path.expanduser(s.strip()) for s in + self.site_dirs.split(',') + ] + for d in site_dirs: + if not os.path.isdir(d): + log.warn("%s (in --site-dirs) does not exist", d) + elif normalize_path(d) not in normpath: + raise DistutilsOptionError( + d + " (in --site-dirs) is not on sys.path" + ) + else: + self.all_site_dirs.append(normalize_path(d)) + if not self.editable: + self.check_site_dir() + self.index_url = self.index_url or "https://pypi.python.org/simple" + self.shadow_path = self.all_site_dirs[:] + for path_item in self.install_dir, normalize_path(self.script_dir): + if path_item not in self.shadow_path: + self.shadow_path.insert(0, path_item) + + if self.allow_hosts is not None: + hosts = [s.strip() for s in self.allow_hosts.split(',')] + else: + hosts = ['*'] + if self.package_index is None: + self.package_index = self.create_index( + self.index_url, search_path=self.shadow_path, hosts=hosts, + ) + self.local_index = Environment(self.shadow_path + sys.path) + + if self.find_links is not None: + if isinstance(self.find_links, six.string_types): + self.find_links = self.find_links.split() + else: + self.find_links = [] + if self.local_snapshots_ok: + self.package_index.scan_egg_links(self.shadow_path + sys.path) + if not self.no_find_links: + self.package_index.add_find_links(self.find_links) + self.set_undefined_options('install_lib', ('optimize', 'optimize')) + if not isinstance(self.optimize, int): + try: + self.optimize = int(self.optimize) + if not (0 <= self.optimize <= 2): + raise ValueError + except ValueError: + raise DistutilsOptionError("--optimize must be 0, 1, or 2") + + if self.editable and not self.build_directory: + raise DistutilsArgError( + "Must specify a build directory (-b) when using --editable" + ) + if not self.args: + raise DistutilsArgError( + "No urls, filenames, or requirements specified (see --help)") + + self.outputs = [] + + def _fix_install_dir_for_user_site(self): + """ + Fix the install_dir if "--user" was used. + """ + if not self.user or not site.ENABLE_USER_SITE: + return + + self.create_home_path() + if self.install_userbase is None: + msg = "User base directory is not specified" + raise DistutilsPlatformError(msg) + self.install_base = self.install_platbase = self.install_userbase + scheme_name = os.name.replace('posix', 'unix') + '_user' + self.select_scheme(scheme_name) + + def _expand_attrs(self, attrs): + for attr in attrs: + val = getattr(self, attr) + if val is not None: + if os.name == 'posix' or os.name == 'nt': + val = os.path.expanduser(val) + val = subst_vars(val, self.config_vars) + setattr(self, attr, val) + + def expand_basedirs(self): + """Calls `os.path.expanduser` on install_base, install_platbase and + root.""" + self._expand_attrs(['install_base', 'install_platbase', 'root']) + + def expand_dirs(self): + """Calls `os.path.expanduser` on install dirs.""" + dirs = [ + 'install_purelib', + 'install_platlib', + 'install_lib', + 'install_headers', + 'install_scripts', + 'install_data', + ] + self._expand_attrs(dirs) + + def run(self): + if self.verbose != self.distribution.verbose: + log.set_verbosity(self.verbose) + try: + for spec in self.args: + self.easy_install(spec, not self.no_deps) + if self.record: + outputs = self.outputs + if self.root: # strip any package prefix + root_len = len(self.root) + for counter in range(len(outputs)): + outputs[counter] = outputs[counter][root_len:] + from distutils import file_util + + self.execute( + file_util.write_file, (self.record, outputs), + "writing list of installed files to '%s'" % + self.record + ) + self.warn_deprecated_options() + finally: + log.set_verbosity(self.distribution.verbose) + + def pseudo_tempname(self): + """Return a pseudo-tempname base in the install directory. + This code is intentionally naive; if a malicious party can write to + the target directory you're already in deep doodoo. + """ + try: + pid = os.getpid() + except Exception: + pid = random.randint(0, sys.maxsize) + return os.path.join(self.install_dir, "test-easy-install-%s" % pid) + + def warn_deprecated_options(self): + pass + + def check_site_dir(self): + """Verify that self.install_dir is .pth-capable dir, if needed""" + + instdir = normalize_path(self.install_dir) + pth_file = os.path.join(instdir, 'easy-install.pth') + + # Is it a configured, PYTHONPATH, implicit, or explicit site dir? + is_site_dir = instdir in self.all_site_dirs + + if not is_site_dir and not self.multi_version: + # No? Then directly test whether it does .pth file processing + is_site_dir = self.check_pth_processing() + else: + # make sure we can write to target dir + testfile = self.pseudo_tempname() + '.write-test' + test_exists = os.path.exists(testfile) + try: + if test_exists: + os.unlink(testfile) + open(testfile, 'w').close() + os.unlink(testfile) + except (OSError, IOError): + self.cant_write_to_target() + + if not is_site_dir and not self.multi_version: + # Can't install non-multi to non-site dir + raise DistutilsError(self.no_default_version_msg()) + + if is_site_dir: + if self.pth_file is None: + self.pth_file = PthDistributions(pth_file, self.all_site_dirs) + else: + self.pth_file = None + + if instdir not in map(normalize_path, _pythonpath()): + # only PYTHONPATH dirs need a site.py, so pretend it's there + self.sitepy_installed = True + elif self.multi_version and not os.path.exists(pth_file): + self.sitepy_installed = True # don't need site.py in this case + self.pth_file = None # and don't create a .pth file + self.install_dir = instdir + + __cant_write_msg = textwrap.dedent(""" + can't create or remove files in install directory + + The following error occurred while trying to add or remove files in the + installation directory: + + %s + + The installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + """).lstrip() + + __not_exists_id = textwrap.dedent(""" + This directory does not currently exist. Please create it and try again, or + choose a different installation directory (using the -d or --install-dir + option). + """).lstrip() + + __access_msg = textwrap.dedent(""" + Perhaps your account does not have write access to this directory? If the + installation directory is a system-owned directory, you may need to sign in + as the administrator or "root" account. If you do not have administrative + access to this machine, you may wish to choose a different installation + directory, preferably one that is listed in your PYTHONPATH environment + variable. + + For information on other options, you may wish to consult the + documentation at: + + https://setuptools.readthedocs.io/en/latest/easy_install.html + + Please make the appropriate changes for your system and try again. + """).lstrip() + + def cant_write_to_target(self): + msg = self.__cant_write_msg % (sys.exc_info()[1], self.install_dir,) + + if not os.path.exists(self.install_dir): + msg += '\n' + self.__not_exists_id + else: + msg += '\n' + self.__access_msg + raise DistutilsError(msg) + + def check_pth_processing(self): + """Empirically verify whether .pth files are supported in inst. dir""" + instdir = self.install_dir + log.info("Checking .pth file support in %s", instdir) + pth_file = self.pseudo_tempname() + ".pth" + ok_file = pth_file + '.ok' + ok_exists = os.path.exists(ok_file) + tmpl = _one_liner(""" + import os + f = open({ok_file!r}, 'w') + f.write('OK') + f.close() + """) + '\n' + try: + if ok_exists: + os.unlink(ok_file) + dirname = os.path.dirname(ok_file) + pkg_resources.py31compat.makedirs(dirname, exist_ok=True) + f = open(pth_file, 'w') + except (OSError, IOError): + self.cant_write_to_target() + else: + try: + f.write(tmpl.format(**locals())) + f.close() + f = None + executable = sys.executable + if os.name == 'nt': + dirname, basename = os.path.split(executable) + alt = os.path.join(dirname, 'pythonw.exe') + use_alt = ( + basename.lower() == 'python.exe' and + os.path.exists(alt) + ) + if use_alt: + # use pythonw.exe to avoid opening a console window + executable = alt + + from distutils.spawn import spawn + + spawn([executable, '-E', '-c', 'pass'], 0) + + if os.path.exists(ok_file): + log.info( + "TEST PASSED: %s appears to support .pth files", + instdir + ) + return True + finally: + if f: + f.close() + if os.path.exists(ok_file): + os.unlink(ok_file) + if os.path.exists(pth_file): + os.unlink(pth_file) + if not self.multi_version: + log.warn("TEST FAILED: %s does NOT support .pth files", instdir) + return False + + def install_egg_scripts(self, dist): + """Write all the scripts for `dist`, unless scripts are excluded""" + if not self.exclude_scripts and dist.metadata_isdir('scripts'): + for script_name in dist.metadata_listdir('scripts'): + if dist.metadata_isdir('scripts/' + script_name): + # The "script" is a directory, likely a Python 3 + # __pycache__ directory, so skip it. + continue + self.install_script( + dist, script_name, + dist.get_metadata('scripts/' + script_name) + ) + self.install_wrapper_scripts(dist) + + def add_output(self, path): + if os.path.isdir(path): + for base, dirs, files in os.walk(path): + for filename in files: + self.outputs.append(os.path.join(base, filename)) + else: + self.outputs.append(path) + + def not_editable(self, spec): + if self.editable: + raise DistutilsArgError( + "Invalid argument %r: you can't use filenames or URLs " + "with --editable (except via the --find-links option)." + % (spec,) + ) + + def check_editable(self, spec): + if not self.editable: + return + + if os.path.exists(os.path.join(self.build_directory, spec.key)): + raise DistutilsArgError( + "%r already exists in %s; can't do a checkout there" % + (spec.key, self.build_directory) + ) + + @contextlib.contextmanager + def _tmpdir(self): + tmpdir = tempfile.mkdtemp(prefix=six.u("easy_install-")) + try: + # cast to str as workaround for #709 and #710 and #712 + yield str(tmpdir) + finally: + os.path.exists(tmpdir) and rmtree(rmtree_safe(tmpdir)) + + def easy_install(self, spec, deps=False): + if not self.editable: + self.install_site_py() + + with self._tmpdir() as tmpdir: + if not isinstance(spec, Requirement): + if URL_SCHEME(spec): + # It's a url, download it to tmpdir and process + self.not_editable(spec) + dl = self.package_index.download(spec, tmpdir) + return self.install_item(None, dl, tmpdir, deps, True) + + elif os.path.exists(spec): + # Existing file or directory, just process it directly + self.not_editable(spec) + return self.install_item(None, spec, tmpdir, deps, True) + else: + spec = parse_requirement_arg(spec) + + self.check_editable(spec) + dist = self.package_index.fetch_distribution( + spec, tmpdir, self.upgrade, self.editable, + not self.always_copy, self.local_index + ) + if dist is None: + msg = "Could not find suitable distribution for %r" % spec + if self.always_copy: + msg += " (--always-copy skips system and development eggs)" + raise DistutilsError(msg) + elif dist.precedence == DEVELOP_DIST: + # .egg-info dists don't need installing, just process deps + self.process_distribution(spec, dist, deps, "Using") + return dist + else: + return self.install_item(spec, dist.location, tmpdir, deps) + + def install_item(self, spec, download, tmpdir, deps, install_needed=False): + + # Installation is also needed if file in tmpdir or is not an egg + install_needed = install_needed or self.always_copy + install_needed = install_needed or os.path.dirname(download) == tmpdir + install_needed = install_needed or not download.endswith('.egg') + install_needed = install_needed or ( + self.always_copy_from is not None and + os.path.dirname(normalize_path(download)) == + normalize_path(self.always_copy_from) + ) + + if spec and not install_needed: + # at this point, we know it's a local .egg, we just don't know if + # it's already installed. + for dist in self.local_index[spec.project_name]: + if dist.location == download: + break + else: + install_needed = True # it's not in the local index + + log.info("Processing %s", os.path.basename(download)) + + if install_needed: + dists = self.install_eggs(spec, download, tmpdir) + for dist in dists: + self.process_distribution(spec, dist, deps) + else: + dists = [self.egg_distribution(download)] + self.process_distribution(spec, dists[0], deps, "Using") + + if spec is not None: + for dist in dists: + if dist in spec: + return dist + + def select_scheme(self, name): + """Sets the install directories by applying the install schemes.""" + # it's the caller's problem if they supply a bad name! + scheme = INSTALL_SCHEMES[name] + for key in SCHEME_KEYS: + attrname = 'install_' + key + if getattr(self, attrname) is None: + setattr(self, attrname, scheme[key]) + + def process_distribution(self, requirement, dist, deps=True, *info): + self.update_pth(dist) + self.package_index.add(dist) + if dist in self.local_index[dist.key]: + self.local_index.remove(dist) + self.local_index.add(dist) + self.install_egg_scripts(dist) + self.installed_projects[dist.key] = dist + log.info(self.installation_report(requirement, dist, *info)) + if (dist.has_metadata('dependency_links.txt') and + not self.no_find_links): + self.package_index.add_find_links( + dist.get_metadata_lines('dependency_links.txt') + ) + if not deps and not self.always_copy: + return + elif requirement is not None and dist.key != requirement.key: + log.warn("Skipping dependencies for %s", dist) + return # XXX this is not the distribution we were looking for + elif requirement is None or dist not in requirement: + # if we wound up with a different version, resolve what we've got + distreq = dist.as_requirement() + requirement = Requirement(str(distreq)) + log.info("Processing dependencies for %s", requirement) + try: + distros = WorkingSet([]).resolve( + [requirement], self.local_index, self.easy_install + ) + except DistributionNotFound as e: + raise DistutilsError(str(e)) + except VersionConflict as e: + raise DistutilsError(e.report()) + if self.always_copy or self.always_copy_from: + # Force all the relevant distros to be copied or activated + for dist in distros: + if dist.key not in self.installed_projects: + self.easy_install(dist.as_requirement()) + log.info("Finished processing dependencies for %s", requirement) + + def should_unzip(self, dist): + if self.zip_ok is not None: + return not self.zip_ok + if dist.has_metadata('not-zip-safe'): + return True + if not dist.has_metadata('zip-safe'): + return True + return False + + def maybe_move(self, spec, dist_filename, setup_base): + dst = os.path.join(self.build_directory, spec.key) + if os.path.exists(dst): + msg = ( + "%r already exists in %s; build directory %s will not be kept" + ) + log.warn(msg, spec.key, self.build_directory, setup_base) + return setup_base + if os.path.isdir(dist_filename): + setup_base = dist_filename + else: + if os.path.dirname(dist_filename) == setup_base: + os.unlink(dist_filename) # get it out of the tmp dir + contents = os.listdir(setup_base) + if len(contents) == 1: + dist_filename = os.path.join(setup_base, contents[0]) + if os.path.isdir(dist_filename): + # if the only thing there is a directory, move it instead + setup_base = dist_filename + ensure_directory(dst) + shutil.move(setup_base, dst) + return dst + + def install_wrapper_scripts(self, dist): + if self.exclude_scripts: + return + for args in ScriptWriter.best().get_args(dist): + self.write_script(*args) + + def install_script(self, dist, script_name, script_text, dev_path=None): + """Generate a legacy script wrapper and install it""" + spec = str(dist.as_requirement()) + is_script = is_python_script(script_text, script_name) + + if is_script: + body = self._load_template(dev_path) % locals() + script_text = ScriptWriter.get_header(script_text) + body + self.write_script(script_name, _to_ascii(script_text), 'b') + + @staticmethod + def _load_template(dev_path): + """ + There are a couple of template scripts in the package. This + function loads one of them and prepares it for use. + """ + # See https://github.com/pypa/setuptools/issues/134 for info + # on script file naming and downstream issues with SVR4 + name = 'script.tmpl' + if dev_path: + name = name.replace('.tmpl', ' (dev).tmpl') + + raw_bytes = resource_string('setuptools', name) + return raw_bytes.decode('utf-8') + + def write_script(self, script_name, contents, mode="t", blockers=()): + """Write an executable file to the scripts directory""" + self.delete_blockers( # clean up old .py/.pyw w/o a script + [os.path.join(self.script_dir, x) for x in blockers] + ) + log.info("Installing %s script to %s", script_name, self.script_dir) + target = os.path.join(self.script_dir, script_name) + self.add_output(target) + + if self.dry_run: + return + + mask = current_umask() + ensure_directory(target) + if os.path.exists(target): + os.unlink(target) + with open(target, "w" + mode) as f: + f.write(contents) + chmod(target, 0o777 - mask) + + def install_eggs(self, spec, dist_filename, tmpdir): + # .egg dirs or files are already built, so just return them + if dist_filename.lower().endswith('.egg'): + return [self.install_egg(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.exe'): + return [self.install_exe(dist_filename, tmpdir)] + elif dist_filename.lower().endswith('.whl'): + return [self.install_wheel(dist_filename, tmpdir)] + + # Anything else, try to extract and build + setup_base = tmpdir + if os.path.isfile(dist_filename) and not dist_filename.endswith('.py'): + unpack_archive(dist_filename, tmpdir, self.unpack_progress) + elif os.path.isdir(dist_filename): + setup_base = os.path.abspath(dist_filename) + + if (setup_base.startswith(tmpdir) # something we downloaded + and self.build_directory and spec is not None): + setup_base = self.maybe_move(spec, dist_filename, setup_base) + + # Find the setup.py file + setup_script = os.path.join(setup_base, 'setup.py') + + if not os.path.exists(setup_script): + setups = glob(os.path.join(setup_base, '*', 'setup.py')) + if not setups: + raise DistutilsError( + "Couldn't find a setup script in %s" % + os.path.abspath(dist_filename) + ) + if len(setups) > 1: + raise DistutilsError( + "Multiple setup scripts in %s" % + os.path.abspath(dist_filename) + ) + setup_script = setups[0] + + # Now run it, and return the result + if self.editable: + log.info(self.report_editable(spec, setup_script)) + return [] + else: + return self.build_and_install(setup_script, setup_base) + + def egg_distribution(self, egg_path): + if os.path.isdir(egg_path): + metadata = PathMetadata(egg_path, os.path.join(egg_path, + 'EGG-INFO')) + else: + metadata = EggMetadata(zipimport.zipimporter(egg_path)) + return Distribution.from_filename(egg_path, metadata=metadata) + + def install_egg(self, egg_path, tmpdir): + destination = os.path.join( + self.install_dir, + os.path.basename(egg_path), + ) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + + dist = self.egg_distribution(egg_path) + if not samefile(egg_path, destination): + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + new_dist_is_zipped = False + if os.path.isdir(egg_path): + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copytree, "Copying" + elif self.should_unzip(dist): + self.mkpath(destination) + f, m = self.unpack_and_compile, "Extracting" + else: + new_dist_is_zipped = True + if egg_path.startswith(tmpdir): + f, m = shutil.move, "Moving" + else: + f, m = shutil.copy2, "Copying" + self.execute( + f, + (egg_path, destination), + (m + " %s to %s") % ( + os.path.basename(egg_path), + os.path.dirname(destination) + ), + ) + update_dist_caches( + destination, + fix_zipimporter_caches=new_dist_is_zipped, + ) + except Exception: + update_dist_caches(destination, fix_zipimporter_caches=False) + raise + + self.add_output(destination) + return self.egg_distribution(destination) + + def install_exe(self, dist_filename, tmpdir): + # See if it's valid, get data + cfg = extract_wininst_cfg(dist_filename) + if cfg is None: + raise DistutilsError( + "%s is not a valid distutils Windows .exe" % dist_filename + ) + # Create a dummy distribution object until we build the real distro + dist = Distribution( + None, + project_name=cfg.get('metadata', 'name'), + version=cfg.get('metadata', 'version'), platform=get_platform(), + ) + + # Convert the .exe to an unpacked egg + egg_path = os.path.join(tmpdir, dist.egg_name() + '.egg') + dist.location = egg_path + egg_tmp = egg_path + '.tmp' + _egg_info = os.path.join(egg_tmp, 'EGG-INFO') + pkg_inf = os.path.join(_egg_info, 'PKG-INFO') + ensure_directory(pkg_inf) # make sure EGG-INFO dir exists + dist._provider = PathMetadata(egg_tmp, _egg_info) # XXX + self.exe_to_egg(dist_filename, egg_tmp) + + # Write EGG-INFO/PKG-INFO + if not os.path.exists(pkg_inf): + f = open(pkg_inf, 'w') + f.write('Metadata-Version: 1.0\n') + for k, v in cfg.items('metadata'): + if k != 'target_version': + f.write('%s: %s\n' % (k.replace('_', '-').title(), v)) + f.close() + script_dir = os.path.join(_egg_info, 'scripts') + # delete entry-point scripts to avoid duping + self.delete_blockers([ + os.path.join(script_dir, args[0]) + for args in ScriptWriter.get_args(dist) + ]) + # Build .egg file from tmpdir + bdist_egg.make_zipfile( + egg_path, egg_tmp, verbose=self.verbose, dry_run=self.dry_run, + ) + # install the .egg + return self.install_egg(egg_path, tmpdir) + + def exe_to_egg(self, dist_filename, egg_tmp): + """Extract a bdist_wininst to the directories an egg would use""" + # Check for .pth file and set up prefix translations + prefixes = get_exe_prefixes(dist_filename) + to_compile = [] + native_libs = [] + top_level = {} + + def process(src, dst): + s = src.lower() + for old, new in prefixes: + if s.startswith(old): + src = new + src[len(old):] + parts = src.split('/') + dst = os.path.join(egg_tmp, *parts) + dl = dst.lower() + if dl.endswith('.pyd') or dl.endswith('.dll'): + parts[-1] = bdist_egg.strip_module(parts[-1]) + top_level[os.path.splitext(parts[0])[0]] = 1 + native_libs.append(src) + elif dl.endswith('.py') and old != 'SCRIPTS/': + top_level[os.path.splitext(parts[0])[0]] = 1 + to_compile.append(dst) + return dst + if not src.endswith('.pth'): + log.warn("WARNING: can't process %s", src) + return None + + # extract, tracking .pyd/.dll->native_libs and .py -> to_compile + unpack_archive(dist_filename, egg_tmp, process) + stubs = [] + for res in native_libs: + if res.lower().endswith('.pyd'): # create stubs for .pyd's + parts = res.split('/') + resource = parts[-1] + parts[-1] = bdist_egg.strip_module(parts[-1]) + '.py' + pyfile = os.path.join(egg_tmp, *parts) + to_compile.append(pyfile) + stubs.append(pyfile) + bdist_egg.write_stub(resource, pyfile) + self.byte_compile(to_compile) # compile .py's + bdist_egg.write_safety_flag( + os.path.join(egg_tmp, 'EGG-INFO'), + bdist_egg.analyze_egg(egg_tmp, stubs)) # write zip-safety flag + + for name in 'top_level', 'native_libs': + if locals()[name]: + txt = os.path.join(egg_tmp, 'EGG-INFO', name + '.txt') + if not os.path.exists(txt): + f = open(txt, 'w') + f.write('\n'.join(locals()[name]) + '\n') + f.close() + + def install_wheel(self, wheel_path, tmpdir): + wheel = Wheel(wheel_path) + assert wheel.is_compatible() + destination = os.path.join(self.install_dir, wheel.egg_name()) + destination = os.path.abspath(destination) + if not self.dry_run: + ensure_directory(destination) + if os.path.isdir(destination) and not os.path.islink(destination): + dir_util.remove_tree(destination, dry_run=self.dry_run) + elif os.path.exists(destination): + self.execute( + os.unlink, + (destination,), + "Removing " + destination, + ) + try: + self.execute( + wheel.install_as_egg, + (destination,), + ("Installing %s to %s") % ( + os.path.basename(wheel_path), + os.path.dirname(destination) + ), + ) + finally: + update_dist_caches(destination, fix_zipimporter_caches=False) + self.add_output(destination) + return self.egg_distribution(destination) + + __mv_warning = textwrap.dedent(""" + Because this distribution was installed --multi-version, before you can + import modules from this package in an application, you will need to + 'import pkg_resources' and then use a 'require()' call similar to one of + these examples, in order to select the desired version: + + pkg_resources.require("%(name)s") # latest installed version + pkg_resources.require("%(name)s==%(version)s") # this exact version + pkg_resources.require("%(name)s>=%(version)s") # this version or higher + """).lstrip() + + __id_warning = textwrap.dedent(""" + Note also that the installation directory must be on sys.path at runtime for + this to work. (e.g. by being the application's script directory, by being on + PYTHONPATH, or by being added to sys.path by your code.) + """) + + def installation_report(self, req, dist, what="Installed"): + """Helpful installation message for display to package users""" + msg = "\n%(what)s %(eggloc)s%(extras)s" + if self.multi_version and not self.no_report: + msg += '\n' + self.__mv_warning + if self.install_dir not in map(normalize_path, sys.path): + msg += '\n' + self.__id_warning + + eggloc = dist.location + name = dist.project_name + version = dist.version + extras = '' # TODO: self.report_extras(req, dist) + return msg % locals() + + __editable_msg = textwrap.dedent(""" + Extracted editable version of %(spec)s to %(dirname)s + + If it uses setuptools in its setup script, you can activate it in + "development" mode by going to that directory and running:: + + %(python)s setup.py develop + + See the setuptools documentation for the "develop" command for more info. + """).lstrip() + + def report_editable(self, spec, setup_script): + dirname = os.path.dirname(setup_script) + python = sys.executable + return '\n' + self.__editable_msg % locals() + + def run_setup(self, setup_script, setup_base, args): + sys.modules.setdefault('distutils.command.bdist_egg', bdist_egg) + sys.modules.setdefault('distutils.command.egg_info', egg_info) + + args = list(args) + if self.verbose > 2: + v = 'v' * (self.verbose - 1) + args.insert(0, '-' + v) + elif self.verbose < 2: + args.insert(0, '-q') + if self.dry_run: + args.insert(0, '-n') + log.info( + "Running %s %s", setup_script[len(setup_base) + 1:], ' '.join(args) + ) + try: + run_setup(setup_script, args) + except SystemExit as v: + raise DistutilsError("Setup script exited with %s" % (v.args[0],)) + + def build_and_install(self, setup_script, setup_base): + args = ['bdist_egg', '--dist-dir'] + + dist_dir = tempfile.mkdtemp( + prefix='egg-dist-tmp-', dir=os.path.dirname(setup_script) + ) + try: + self._set_fetcher_options(os.path.dirname(setup_script)) + args.append(dist_dir) + + self.run_setup(setup_script, setup_base, args) + all_eggs = Environment([dist_dir]) + eggs = [] + for key in all_eggs: + for dist in all_eggs[key]: + eggs.append(self.install_egg(dist.location, setup_base)) + if not eggs and not self.dry_run: + log.warn("No eggs found in %s (setup script problem?)", + dist_dir) + return eggs + finally: + rmtree(dist_dir) + log.set_verbosity(self.verbose) # restore our log verbosity + + def _set_fetcher_options(self, base): + """ + When easy_install is about to run bdist_egg on a source dist, that + source dist might have 'setup_requires' directives, requiring + additional fetching. Ensure the fetcher options given to easy_install + are available to that command as well. + """ + # find the fetch options from easy_install and write them out + # to the setup.cfg file. + ei_opts = self.distribution.get_option_dict('easy_install').copy() + fetch_directives = ( + 'find_links', 'site_dirs', 'index_url', 'optimize', + 'site_dirs', 'allow_hosts', + ) + fetch_options = {} + for key, val in ei_opts.items(): + if key not in fetch_directives: + continue + fetch_options[key.replace('_', '-')] = val[1] + # create a settings dictionary suitable for `edit_config` + settings = dict(easy_install=fetch_options) + cfg_filename = os.path.join(base, 'setup.cfg') + setopt.edit_config(cfg_filename, settings) + + def update_pth(self, dist): + if self.pth_file is None: + return + + for d in self.pth_file[dist.key]: # drop old entries + if self.multi_version or d.location != dist.location: + log.info("Removing %s from easy-install.pth file", d) + self.pth_file.remove(d) + if d.location in self.shadow_path: + self.shadow_path.remove(d.location) + + if not self.multi_version: + if dist.location in self.pth_file.paths: + log.info( + "%s is already the active version in easy-install.pth", + dist, + ) + else: + log.info("Adding %s to easy-install.pth file", dist) + self.pth_file.add(dist) # add new entry + if dist.location not in self.shadow_path: + self.shadow_path.append(dist.location) + + if not self.dry_run: + + self.pth_file.save() + + if dist.key == 'setuptools': + # Ensure that setuptools itself never becomes unavailable! + # XXX should this check for latest version? + filename = os.path.join(self.install_dir, 'setuptools.pth') + if os.path.islink(filename): + os.unlink(filename) + f = open(filename, 'wt') + f.write(self.pth_file.make_relative(dist.location) + '\n') + f.close() + + def unpack_progress(self, src, dst): + # Progress filter for unpacking + log.debug("Unpacking %s to %s", src, dst) + return dst # only unpack-and-compile skips files for dry run + + def unpack_and_compile(self, egg_path, destination): + to_compile = [] + to_chmod = [] + + def pf(src, dst): + if dst.endswith('.py') and not src.startswith('EGG-INFO/'): + to_compile.append(dst) + elif dst.endswith('.dll') or dst.endswith('.so'): + to_chmod.append(dst) + self.unpack_progress(src, dst) + return not self.dry_run and dst or None + + unpack_archive(egg_path, destination, pf) + self.byte_compile(to_compile) + if not self.dry_run: + for f in to_chmod: + mode = ((os.stat(f)[stat.ST_MODE]) | 0o555) & 0o7755 + chmod(f, mode) + + def byte_compile(self, to_compile): + if sys.dont_write_bytecode: + return + + from distutils.util import byte_compile + + try: + # try to make the byte compile messages quieter + log.set_verbosity(self.verbose - 1) + + byte_compile(to_compile, optimize=0, force=1, dry_run=self.dry_run) + if self.optimize: + byte_compile( + to_compile, optimize=self.optimize, force=1, + dry_run=self.dry_run, + ) + finally: + log.set_verbosity(self.verbose) # restore original verbosity + + __no_default_msg = textwrap.dedent(""" + bad install directory or PYTHONPATH + + You are attempting to install a package to a directory that is not + on PYTHONPATH and which Python does not read ".pth" files from. The + installation directory you specified (via --install-dir, --prefix, or + the distutils default setting) was: + + %s + + and your PYTHONPATH environment variable currently contains: + + %r + + Here are some of your options for correcting the problem: + + * You can choose a different installation directory, i.e., one that is + on PYTHONPATH or supports .pth files + + * You can add the installation directory to the PYTHONPATH environment + variable. (It must then also be on PYTHONPATH whenever you run + Python and want to use the package(s) you are installing.) + + * You can set up the installation directory to support ".pth" files by + using one of the approaches described here: + + https://setuptools.readthedocs.io/en/latest/easy_install.html#custom-installation-locations + + + Please make the appropriate changes for your system and try again.""").lstrip() + + def no_default_version_msg(self): + template = self.__no_default_msg + return template % (self.install_dir, os.environ.get('PYTHONPATH', '')) + + def install_site_py(self): + """Make sure there's a site.py in the target dir, if needed""" + + if self.sitepy_installed: + return # already did it, or don't need to + + sitepy = os.path.join(self.install_dir, "site.py") + source = resource_string("setuptools", "site-patch.py") + source = source.decode('utf-8') + current = "" + + if os.path.exists(sitepy): + log.debug("Checking existing site.py in %s", self.install_dir) + with io.open(sitepy) as strm: + current = strm.read() + + if not current.startswith('def __boot():'): + raise DistutilsError( + "%s is not a setuptools-generated site.py; please" + " remove it." % sitepy + ) + + if current != source: + log.info("Creating %s", sitepy) + if not self.dry_run: + ensure_directory(sitepy) + with io.open(sitepy, 'w', encoding='utf-8') as strm: + strm.write(source) + self.byte_compile([sitepy]) + + self.sitepy_installed = True + + def create_home_path(self): + """Create directories under ~.""" + if not self.user: + return + home = convert_path(os.path.expanduser("~")) + for name, path in six.iteritems(self.config_vars): + if path.startswith(home) and not os.path.isdir(path): + self.debug_print("os.makedirs('%s', 0o700)" % path) + os.makedirs(path, 0o700) + + INSTALL_SCHEMES = dict( + posix=dict( + install_dir='$base/lib/python$py_version_short/site-packages', + script_dir='$base/bin', + ), + ) + + DEFAULT_SCHEME = dict( + install_dir='$base/Lib/site-packages', + script_dir='$base/Scripts', + ) + + def _expand(self, *attrs): + config_vars = self.get_finalized_command('install').config_vars + + if self.prefix: + # Set default install_dir/scripts from --prefix + config_vars = config_vars.copy() + config_vars['base'] = self.prefix + scheme = self.INSTALL_SCHEMES.get(os.name, self.DEFAULT_SCHEME) + for attr, val in scheme.items(): + if getattr(self, attr, None) is None: + setattr(self, attr, val) + + from distutils.util import subst_vars + + for attr in attrs: + val = getattr(self, attr) + if val is not None: + val = subst_vars(val, config_vars) + if os.name == 'posix': + val = os.path.expanduser(val) + setattr(self, attr, val) + + +def _pythonpath(): + items = os.environ.get('PYTHONPATH', '').split(os.pathsep) + return filter(None, items) + + +def get_site_dirs(): + """ + Return a list of 'site' dirs + """ + + sitedirs = [] + + # start with PYTHONPATH + sitedirs.extend(_pythonpath()) + + prefixes = [sys.prefix] + if sys.exec_prefix != sys.prefix: + prefixes.append(sys.exec_prefix) + for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) + elif os.sep == '/': + sitedirs.extend([ + os.path.join( + prefix, + "lib", + "python" + sys.version[:3], + "site-packages", + ), + os.path.join(prefix, "lib", "site-python"), + ]) + else: + sitedirs.extend([ + prefix, + os.path.join(prefix, "lib", "site-packages"), + ]) + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + home_sp = os.path.join( + home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages', + ) + sitedirs.append(home_sp) + lib_paths = get_path('purelib'), get_path('platlib') + for site_lib in lib_paths: + if site_lib not in sitedirs: + sitedirs.append(site_lib) + + if site.ENABLE_USER_SITE: + sitedirs.append(site.USER_SITE) + + try: + sitedirs.extend(site.getsitepackages()) + except AttributeError: + pass + + sitedirs = list(map(normalize_path, sitedirs)) + + return sitedirs + + +def expand_paths(inputs): + """Yield sys.path directories that might contain "old-style" packages""" + + seen = {} + + for dirname in inputs: + dirname = normalize_path(dirname) + if dirname in seen: + continue + + seen[dirname] = 1 + if not os.path.isdir(dirname): + continue + + files = os.listdir(dirname) + yield dirname, files + + for name in files: + if not name.endswith('.pth'): + # We only care about the .pth files + continue + if name in ('easy-install.pth', 'setuptools.pth'): + # Ignore .pth files that we control + continue + + # Read the .pth file + f = open(os.path.join(dirname, name)) + lines = list(yield_lines(f)) + f.close() + + # Yield existing non-dupe, non-import directory lines from it + for line in lines: + if not line.startswith("import"): + line = normalize_path(line.rstrip()) + if line not in seen: + seen[line] = 1 + if not os.path.isdir(line): + continue + yield line, os.listdir(line) + + +def extract_wininst_cfg(dist_filename): + """Extract configuration data from a bdist_wininst .exe + + Returns a configparser.RawConfigParser, or None + """ + f = open(dist_filename, 'rb') + try: + endrec = zipfile._EndRecData(f) + if endrec is None: + return None + + prepended = (endrec[9] - endrec[5]) - endrec[6] + if prepended < 12: # no wininst data here + return None + f.seek(prepended - 12) + + tag, cfglen, bmlen = struct.unpack("<iii", f.read(12)) + if tag not in (0x1234567A, 0x1234567B): + return None # not a valid tag + + f.seek(prepended - (12 + cfglen)) + init = {'version': '', 'target_version': ''} + cfg = configparser.RawConfigParser(init) + try: + part = f.read(cfglen) + # Read up to the first null byte. + config = part.split(b'\0', 1)[0] + # Now the config is in bytes, but for RawConfigParser, it should + # be text, so decode it. + config = config.decode(sys.getfilesystemencoding()) + cfg.readfp(six.StringIO(config)) + except configparser.Error: + return None + if not cfg.has_section('metadata') or not cfg.has_section('Setup'): + return None + return cfg + + finally: + f.close() + + +def get_exe_prefixes(exe_filename): + """Get exe->egg path translations for a given .exe file""" + + prefixes = [ + ('PURELIB/', ''), + ('PLATLIB/pywin32_system32', ''), + ('PLATLIB/', ''), + ('SCRIPTS/', 'EGG-INFO/scripts/'), + ('DATA/lib/site-packages', ''), + ] + z = zipfile.ZipFile(exe_filename) + try: + for info in z.infolist(): + name = info.filename + parts = name.split('/') + if len(parts) == 3 and parts[2] == 'PKG-INFO': + if parts[1].endswith('.egg-info'): + prefixes.insert(0, ('/'.join(parts[:2]), 'EGG-INFO/')) + break + if len(parts) != 2 or not name.endswith('.pth'): + continue + if name.endswith('-nspkg.pth'): + continue + if parts[0].upper() in ('PURELIB', 'PLATLIB'): + contents = z.read(name) + if six.PY3: + contents = contents.decode() + for pth in yield_lines(contents): + pth = pth.strip().replace('\\', '/') + if not pth.startswith('import'): + prefixes.append((('%s/%s/' % (parts[0], pth)), '')) + finally: + z.close() + prefixes = [(x.lower(), y) for x, y in prefixes] + prefixes.sort() + prefixes.reverse() + return prefixes + + +class PthDistributions(Environment): + """A .pth file with Distribution paths in it""" + + dirty = False + + def __init__(self, filename, sitedirs=()): + self.filename = filename + self.sitedirs = list(map(normalize_path, sitedirs)) + self.basedir = normalize_path(os.path.dirname(self.filename)) + self._load() + Environment.__init__(self, [], None, None) + for path in yield_lines(self.paths): + list(map(self.add, find_distributions(path, True))) + + def _load(self): + self.paths = [] + saw_import = False + seen = dict.fromkeys(self.sitedirs) + if os.path.isfile(self.filename): + f = open(self.filename, 'rt') + for line in f: + if line.startswith('import'): + saw_import = True + continue + path = line.rstrip() + self.paths.append(path) + if not path.strip() or path.strip().startswith('#'): + continue + # skip non-existent paths, in case somebody deleted a package + # manually, and duplicate paths as well + path = self.paths[-1] = normalize_path( + os.path.join(self.basedir, path) + ) + if not os.path.exists(path) or path in seen: + self.paths.pop() # skip it + self.dirty = True # we cleaned up, so we're dirty now :) + continue + seen[path] = 1 + f.close() + + if self.paths and not saw_import: + self.dirty = True # ensure anything we touch has import wrappers + while self.paths and not self.paths[-1].strip(): + self.paths.pop() + + def save(self): + """Write changed .pth file back to disk""" + if not self.dirty: + return + + rel_paths = list(map(self.make_relative, self.paths)) + if rel_paths: + log.debug("Saving %s", self.filename) + lines = self._wrap_lines(rel_paths) + data = '\n'.join(lines) + '\n' + + if os.path.islink(self.filename): + os.unlink(self.filename) + with open(self.filename, 'wt') as f: + f.write(data) + + elif os.path.exists(self.filename): + log.debug("Deleting empty %s", self.filename) + os.unlink(self.filename) + + self.dirty = False + + @staticmethod + def _wrap_lines(lines): + return lines + + def add(self, dist): + """Add `dist` to the distribution map""" + new_path = ( + dist.location not in self.paths and ( + dist.location not in self.sitedirs or + # account for '.' being in PYTHONPATH + dist.location == os.getcwd() + ) + ) + if new_path: + self.paths.append(dist.location) + self.dirty = True + Environment.add(self, dist) + + def remove(self, dist): + """Remove `dist` from the distribution map""" + while dist.location in self.paths: + self.paths.remove(dist.location) + self.dirty = True + Environment.remove(self, dist) + + def make_relative(self, path): + npath, last = os.path.split(normalize_path(path)) + baselen = len(self.basedir) + parts = [last] + sep = os.altsep == '/' and '/' or os.sep + while len(npath) >= baselen: + if npath == self.basedir: + parts.append(os.curdir) + parts.reverse() + return sep.join(parts) + npath, last = os.path.split(npath) + parts.append(last) + else: + return path + + +class RewritePthDistributions(PthDistributions): + @classmethod + def _wrap_lines(cls, lines): + yield cls.prelude + for line in lines: + yield line + yield cls.postlude + + prelude = _one_liner(""" + import sys + sys.__plen = len(sys.path) + """) + postlude = _one_liner(""" + import sys + new = sys.path[sys.__plen:] + del sys.path[sys.__plen:] + p = getattr(sys, '__egginsert', 0) + sys.path[p:p] = new + sys.__egginsert = p + len(new) + """) + + +if os.environ.get('SETUPTOOLS_SYS_PATH_TECHNIQUE', 'raw') == 'rewrite': + PthDistributions = RewritePthDistributions + + +def _first_line_re(): + """ + Return a regular expression based on first_line_re suitable for matching + strings. + """ + if isinstance(first_line_re.pattern, str): + return first_line_re + + # first_line_re in Python >=3.1.4 and >=3.2.1 is a bytes pattern. + return re.compile(first_line_re.pattern.decode()) + + +def auto_chmod(func, arg, exc): + if func in [os.unlink, os.remove] and os.name == 'nt': + chmod(arg, stat.S_IWRITE) + return func(arg) + et, ev, _ = sys.exc_info() + six.reraise(et, (ev[0], ev[1] + (" %s %s" % (func, arg)))) + + +def update_dist_caches(dist_path, fix_zipimporter_caches): + """ + Fix any globally cached `dist_path` related data + + `dist_path` should be a path of a newly installed egg distribution (zipped + or unzipped). + + sys.path_importer_cache contains finder objects that have been cached when + importing data from the original distribution. Any such finders need to be + cleared since the replacement distribution might be packaged differently, + e.g. a zipped egg distribution might get replaced with an unzipped egg + folder or vice versa. Having the old finders cached may then cause Python + to attempt loading modules from the replacement distribution using an + incorrect loader. + + zipimport.zipimporter objects are Python loaders charged with importing + data packaged inside zip archives. If stale loaders referencing the + original distribution, are left behind, they can fail to load modules from + the replacement distribution. E.g. if an old zipimport.zipimporter instance + is used to load data from a new zipped egg archive, it may cause the + operation to attempt to locate the requested data in the wrong location - + one indicated by the original distribution's zip archive directory + information. Such an operation may then fail outright, e.g. report having + read a 'bad local file header', or even worse, it may fail silently & + return invalid data. + + zipimport._zip_directory_cache contains cached zip archive directory + information for all existing zipimport.zipimporter instances and all such + instances connected to the same archive share the same cached directory + information. + + If asked, and the underlying Python implementation allows it, we can fix + all existing zipimport.zipimporter instances instead of having to track + them down and remove them one by one, by updating their shared cached zip + archive directory information. This, of course, assumes that the + replacement distribution is packaged as a zipped egg. + + If not asked to fix existing zipimport.zipimporter instances, we still do + our best to clear any remaining zipimport.zipimporter related cached data + that might somehow later get used when attempting to load data from the new + distribution and thus cause such load operations to fail. Note that when + tracking down such remaining stale data, we can not catch every conceivable + usage from here, and we clear only those that we know of and have found to + cause problems if left alive. Any remaining caches should be updated by + whomever is in charge of maintaining them, i.e. they should be ready to + handle us replacing their zip archives with new distributions at runtime. + + """ + # There are several other known sources of stale zipimport.zipimporter + # instances that we do not clear here, but might if ever given a reason to + # do so: + # * Global setuptools pkg_resources.working_set (a.k.a. 'master working + # set') may contain distributions which may in turn contain their + # zipimport.zipimporter loaders. + # * Several zipimport.zipimporter loaders held by local variables further + # up the function call stack when running the setuptools installation. + # * Already loaded modules may have their __loader__ attribute set to the + # exact loader instance used when importing them. Python 3.4 docs state + # that this information is intended mostly for introspection and so is + # not expected to cause us problems. + normalized_path = normalize_path(dist_path) + _uncache(normalized_path, sys.path_importer_cache) + if fix_zipimporter_caches: + _replace_zip_directory_cache_data(normalized_path) + else: + # Here, even though we do not want to fix existing and now stale + # zipimporter cache information, we still want to remove it. Related to + # Python's zip archive directory information cache, we clear each of + # its stale entries in two phases: + # 1. Clear the entry so attempting to access zip archive information + # via any existing stale zipimport.zipimporter instances fails. + # 2. Remove the entry from the cache so any newly constructed + # zipimport.zipimporter instances do not end up using old stale + # zip archive directory information. + # This whole stale data removal step does not seem strictly necessary, + # but has been left in because it was done before we started replacing + # the zip archive directory information cache content if possible, and + # there are no relevant unit tests that we can depend on to tell us if + # this is really needed. + _remove_and_clear_zip_directory_cache_data(normalized_path) + + +def _collect_zipimporter_cache_entries(normalized_path, cache): + """ + Return zipimporter cache entry keys related to a given normalized path. + + Alternative path spellings (e.g. those using different character case or + those using alternative path separators) related to the same path are + included. Any sub-path entries are included as well, i.e. those + corresponding to zip archives embedded in other zip archives. + + """ + result = [] + prefix_len = len(normalized_path) + for p in cache: + np = normalize_path(p) + if (np.startswith(normalized_path) and + np[prefix_len:prefix_len + 1] in (os.sep, '')): + result.append(p) + return result + + +def _update_zipimporter_cache(normalized_path, cache, updater=None): + """ + Update zipimporter cache data for a given normalized path. + + Any sub-path entries are processed as well, i.e. those corresponding to zip + archives embedded in other zip archives. + + Given updater is a callable taking a cache entry key and the original entry + (after already removing the entry from the cache), and expected to update + the entry and possibly return a new one to be inserted in its place. + Returning None indicates that the entry should not be replaced with a new + one. If no updater is given, the cache entries are simply removed without + any additional processing, the same as if the updater simply returned None. + + """ + for p in _collect_zipimporter_cache_entries(normalized_path, cache): + # N.B. pypy's custom zipimport._zip_directory_cache implementation does + # not support the complete dict interface: + # * Does not support item assignment, thus not allowing this function + # to be used only for removing existing cache entries. + # * Does not support the dict.pop() method, forcing us to use the + # get/del patterns instead. For more detailed information see the + # following links: + # https://github.com/pypa/setuptools/issues/202#issuecomment-202913420 + # http://bit.ly/2h9itJX + old_entry = cache[p] + del cache[p] + new_entry = updater and updater(p, old_entry) + if new_entry is not None: + cache[p] = new_entry + + +def _uncache(normalized_path, cache): + _update_zipimporter_cache(normalized_path, cache) + + +def _remove_and_clear_zip_directory_cache_data(normalized_path): + def clear_and_remove_cached_zip_archive_directory_data(path, old_entry): + old_entry.clear() + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=clear_and_remove_cached_zip_archive_directory_data) + + +# PyPy Python implementation does not allow directly writing to the +# zipimport._zip_directory_cache and so prevents us from attempting to correct +# its content. The best we can do there is clear the problematic cache content +# and have PyPy repopulate it as needed. The downside is that if there are any +# stale zipimport.zipimporter instances laying around, attempting to use them +# will fail due to not having its zip archive directory information available +# instead of being automatically corrected to use the new correct zip archive +# directory information. +if '__pypy__' in sys.builtin_module_names: + _replace_zip_directory_cache_data = \ + _remove_and_clear_zip_directory_cache_data +else: + + def _replace_zip_directory_cache_data(normalized_path): + def replace_cached_zip_archive_directory_data(path, old_entry): + # N.B. In theory, we could load the zip directory information just + # once for all updated path spellings, and then copy it locally and + # update its contained path strings to contain the correct + # spelling, but that seems like a way too invasive move (this cache + # structure is not officially documented anywhere and could in + # theory change with new Python releases) for no significant + # benefit. + old_entry.clear() + zipimport.zipimporter(path) + old_entry.update(zipimport._zip_directory_cache[path]) + return old_entry + + _update_zipimporter_cache( + normalized_path, zipimport._zip_directory_cache, + updater=replace_cached_zip_archive_directory_data) + + +def is_python(text, filename='<string>'): + "Is this string a valid Python script?" + try: + compile(text, filename, 'exec') + except (SyntaxError, TypeError): + return False + else: + return True + + +def is_sh(executable): + """Determine if the specified executable is a .sh (contains a #! line)""" + try: + with io.open(executable, encoding='latin-1') as fp: + magic = fp.read(2) + except (OSError, IOError): + return executable + return magic == '#!' + + +def nt_quote_arg(arg): + """Quote a command line argument according to Windows parsing rules""" + return subprocess.list2cmdline([arg]) + + +def is_python_script(script_text, filename): + """Is this text, as a whole, a Python script? (as opposed to shell/bat/etc. + """ + if filename.endswith('.py') or filename.endswith('.pyw'): + return True # extension says it's Python + if is_python(script_text, filename): + return True # it's syntactically valid Python + if script_text.startswith('#!'): + # It begins with a '#!' line, so check if 'python' is in it somewhere + return 'python' in script_text.splitlines()[0].lower() + + return False # Not any Python I can recognize + + +try: + from os import chmod as _chmod +except ImportError: + # Jython compatibility + def _chmod(*args): + pass + + +def chmod(path, mode): + log.debug("changing mode of %s to %o", path, mode) + try: + _chmod(path, mode) + except os.error as e: + log.debug("chmod failed: %s", e) + + +class CommandSpec(list): + """ + A command spec for a #! header, specified as a list of arguments akin to + those passed to Popen. + """ + + options = [] + split_args = dict() + + @classmethod + def best(cls): + """ + Choose the best CommandSpec class based on environmental conditions. + """ + return cls + + @classmethod + def _sys_executable(cls): + _default = os.path.normpath(sys.executable) + return os.environ.get('__PYVENV_LAUNCHER__', _default) + + @classmethod + def from_param(cls, param): + """ + Construct a CommandSpec from a parameter to build_scripts, which may + be None. + """ + if isinstance(param, cls): + return param + if isinstance(param, list): + return cls(param) + if param is None: + return cls.from_environment() + # otherwise, assume it's a string. + return cls.from_string(param) + + @classmethod + def from_environment(cls): + return cls([cls._sys_executable()]) + + @classmethod + def from_string(cls, string): + """ + Construct a command spec from a simple string representing a command + line parseable by shlex.split. + """ + items = shlex.split(string, **cls.split_args) + return cls(items) + + def install_options(self, script_text): + self.options = shlex.split(self._extract_options(script_text)) + cmdline = subprocess.list2cmdline(self) + if not isascii(cmdline): + self.options[:0] = ['-x'] + + @staticmethod + def _extract_options(orig_script): + """ + Extract any options from the first line of the script. + """ + first = (orig_script + '\n').splitlines()[0] + match = _first_line_re().match(first) + options = match.group(1) or '' if match else '' + return options.strip() + + def as_header(self): + return self._render(self + list(self.options)) + + @staticmethod + def _strip_quotes(item): + _QUOTES = '"\'' + for q in _QUOTES: + if item.startswith(q) and item.endswith(q): + return item[1:-1] + return item + + @staticmethod + def _render(items): + cmdline = subprocess.list2cmdline( + CommandSpec._strip_quotes(item.strip()) for item in items) + return '#!' + cmdline + '\n' + + +# For pbr compat; will be removed in a future version. +sys_executable = CommandSpec._sys_executable() + + +class WindowsCommandSpec(CommandSpec): + split_args = dict(posix=False) + + +class ScriptWriter(object): + """ + Encapsulates behavior around writing entry point scripts for console and + gui apps. + """ + + template = textwrap.dedent(r""" + # EASY-INSTALL-ENTRY-SCRIPT: %(spec)r,%(group)r,%(name)r + __requires__ = %(spec)r + import re + import sys + from pkg_resources import load_entry_point + + if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit( + load_entry_point(%(spec)r, %(group)r, %(name)r)() + ) + """).lstrip() + + command_spec_class = CommandSpec + + @classmethod + def get_script_args(cls, dist, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_args", DeprecationWarning) + writer = (WindowsScriptWriter if wininst else ScriptWriter).best() + header = cls.get_script_header("", executable, wininst) + return writer.get_args(dist, header) + + @classmethod + def get_script_header(cls, script_text, executable=None, wininst=False): + # for backward compatibility + warnings.warn("Use get_header", DeprecationWarning) + if wininst: + executable = "python.exe" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + @classmethod + def get_args(cls, dist, header=None): + """ + Yield write_script() argument tuples for a distribution's + console_scripts and gui_scripts entry points. + """ + if header is None: + header = cls.get_header() + spec = str(dist.as_requirement()) + for type_ in 'console', 'gui': + group = type_ + '_scripts' + for name, ep in dist.get_entry_map(group).items(): + cls._ensure_safe_name(name) + script_text = cls.template % locals() + args = cls._get_script_args(type_, name, header, script_text) + for res in args: + yield res + + @staticmethod + def _ensure_safe_name(name): + """ + Prevent paths in *_scripts entry point names. + """ + has_path_sep = re.search(r'[\\/]', name) + if has_path_sep: + raise ValueError("Path separators not allowed in script names") + + @classmethod + def get_writer(cls, force_windows): + # for backward compatibility + warnings.warn("Use best", DeprecationWarning) + return WindowsScriptWriter.best() if force_windows else cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter for this environment. + """ + if sys.platform == 'win32' or (os.name == 'java' and os._name == 'nt'): + return WindowsScriptWriter.best() + else: + return cls + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + # Simply write the stub with no extension. + yield (name, header + script_text) + + @classmethod + def get_header(cls, script_text="", executable=None): + """Create a #! line, getting options (if any) from script_text""" + cmd = cls.command_spec_class.best().from_param(executable) + cmd.install_options(script_text) + return cmd.as_header() + + +class WindowsScriptWriter(ScriptWriter): + command_spec_class = WindowsCommandSpec + + @classmethod + def get_writer(cls): + # for backward compatibility + warnings.warn("Use best", DeprecationWarning) + return cls.best() + + @classmethod + def best(cls): + """ + Select the best ScriptWriter suitable for Windows + """ + writer_lookup = dict( + executable=WindowsExecutableLauncherWriter, + natural=cls, + ) + # for compatibility, use the executable launcher by default + launcher = os.environ.get('SETUPTOOLS_LAUNCHER', 'executable') + return writer_lookup[launcher] + + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + "For Windows, add a .py extension" + ext = dict(console='.pya', gui='.pyw')[type_] + if ext not in os.environ['PATHEXT'].lower().split(';'): + msg = ( + "{ext} not listed in PATHEXT; scripts will not be " + "recognized as executables." + ).format(**locals()) + warnings.warn(msg, UserWarning) + old = ['.pya', '.py', '-script.py', '.pyc', '.pyo', '.pyw', '.exe'] + old.remove(ext) + header = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield name + ext, header + script_text, 't', blockers + + @classmethod + def _adjust_header(cls, type_, orig_header): + """ + Make sure 'pythonw' is used for gui and and 'python' is used for + console (regardless of what sys.executable is). + """ + pattern = 'pythonw.exe' + repl = 'python.exe' + if type_ == 'gui': + pattern, repl = repl, pattern + pattern_ob = re.compile(re.escape(pattern), re.IGNORECASE) + new_header = pattern_ob.sub(string=orig_header, repl=repl) + return new_header if cls._use_header(new_header) else orig_header + + @staticmethod + def _use_header(new_header): + """ + Should _adjust_header use the replaced header? + + On non-windows systems, always use. On + Windows systems, only use the replaced header if it resolves + to an executable on the system. + """ + clean_header = new_header[2:-1].strip('"') + return sys.platform != 'win32' or find_executable(clean_header) + + +class WindowsExecutableLauncherWriter(WindowsScriptWriter): + @classmethod + def _get_script_args(cls, type_, name, header, script_text): + """ + For Windows, add a .py extension and an .exe launcher + """ + if type_ == 'gui': + launcher_type = 'gui' + ext = '-script.pyw' + old = ['.pyw'] + else: + launcher_type = 'cli' + ext = '-script.py' + old = ['.py', '.pyc', '.pyo'] + hdr = cls._adjust_header(type_, header) + blockers = [name + x for x in old] + yield (name + ext, hdr + script_text, 't', blockers) + yield ( + name + '.exe', get_win_launcher(launcher_type), + 'b' # write in binary mode + ) + if not is_64bit(): + # install a manifest for the launcher to prevent Windows + # from detecting it as an installer (which it will for + # launchers like easy_install.exe). Consider only + # adding a manifest for launchers detected as installers. + # See Distribute #143 for details. + m_name = name + '.exe.manifest' + yield (m_name, load_launcher_manifest(name), 't') + + +# for backward-compatibility +get_script_args = ScriptWriter.get_script_args +get_script_header = ScriptWriter.get_script_header + + +def get_win_launcher(type): + """ + Load the Windows launcher (executable) suitable for launching a script. + + `type` should be either 'cli' or 'gui' + + Returns the executable as a byte string. + """ + launcher_fn = '%s.exe' % type + if is_64bit(): + launcher_fn = launcher_fn.replace(".", "-64.") + else: + launcher_fn = launcher_fn.replace(".", "-32.") + return resource_string('setuptools', launcher_fn) + + +def load_launcher_manifest(name): + manifest = pkg_resources.resource_string(__name__, 'launcher manifest.xml') + if six.PY2: + return manifest % vars() + else: + return manifest.decode('utf-8') % vars() + + +def rmtree(path, ignore_errors=False, onerror=auto_chmod): + return shutil.rmtree(path, ignore_errors, onerror) + + +def current_umask(): + tmp = os.umask(0o022) + os.umask(tmp) + return tmp + + +def bootstrap(): + # This function is called when setuptools*.egg is run using /bin/sh + import setuptools + + argv0 = os.path.dirname(setuptools.__path__[0]) + sys.argv[0] = argv0 + sys.argv.append(argv0) + main() + + +def main(argv=None, **kw): + from setuptools import setup + from setuptools.dist import Distribution + + class DistributionWithoutHelpCommands(Distribution): + common_usage = "" + + def _show_help(self, *args, **kw): + with _patch_usage(): + Distribution._show_help(self, *args, **kw) + + if argv is None: + argv = sys.argv[1:] + + with _patch_usage(): + setup( + script_args=['-q', 'easy_install', '-v'] + argv, + script_name=sys.argv[0] or 'easy_install', + distclass=DistributionWithoutHelpCommands, + **kw + ) + + +@contextlib.contextmanager +def _patch_usage(): + import distutils.core + USAGE = textwrap.dedent(""" + usage: %(script)s [options] requirement_or_url ... + or: %(script)s --help + """).lstrip() + + def gen_usage(script_name): + return USAGE % dict( + script=os.path.basename(script_name), + ) + + saved = distutils.core.gen_usage + distutils.core.gen_usage = gen_usage + try: + yield + finally: + distutils.core.gen_usage = saved diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/egg_info.py b/myenv/lib/python3.7/site-packages/setuptools/command/egg_info.py new file mode 100644 index 000000000..f3e604d3f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/egg_info.py @@ -0,0 +1,696 @@ +"""setuptools.command.egg_info + +Create a distribution's .egg-info directory and contents""" + +from distutils.filelist import FileList as _FileList +from distutils.errors import DistutilsInternalError +from distutils.util import convert_path +from distutils import log +import distutils.errors +import distutils.filelist +import os +import re +import sys +import io +import warnings +import time +import collections + +from setuptools.extern import six +from setuptools.extern.six.moves import map + +from setuptools import Command +from setuptools.command.sdist import sdist +from setuptools.command.sdist import walk_revctrl +from setuptools.command.setopt import edit_config +from setuptools.command import bdist_egg +from pkg_resources import ( + parse_requirements, safe_name, parse_version, + safe_version, yield_lines, EntryPoint, iter_entry_points, to_filename) +import setuptools.unicode_utils as unicode_utils +from setuptools.glob import glob + +from setuptools.extern import packaging + + +def translate_pattern(glob): + """ + Translate a file path glob like '*.txt' in to a regular expression. + This differs from fnmatch.translate which allows wildcards to match + directory separators. It also knows about '**/' which matches any number of + directories. + """ + pat = '' + + # This will split on '/' within [character classes]. This is deliberate. + chunks = glob.split(os.path.sep) + + sep = re.escape(os.sep) + valid_char = '[^%s]' % (sep,) + + for c, chunk in enumerate(chunks): + last_chunk = c == len(chunks) - 1 + + # Chunks that are a literal ** are globstars. They match anything. + if chunk == '**': + if last_chunk: + # Match anything if this is the last component + pat += '.*' + else: + # Match '(name/)*' + pat += '(?:%s+%s)*' % (valid_char, sep) + continue # Break here as the whole path component has been handled + + # Find any special characters in the remainder + i = 0 + chunk_len = len(chunk) + while i < chunk_len: + char = chunk[i] + if char == '*': + # Match any number of name characters + pat += valid_char + '*' + elif char == '?': + # Match a name character + pat += valid_char + elif char == '[': + # Character class + inner_i = i + 1 + # Skip initial !/] chars + if inner_i < chunk_len and chunk[inner_i] == '!': + inner_i = inner_i + 1 + if inner_i < chunk_len and chunk[inner_i] == ']': + inner_i = inner_i + 1 + + # Loop till the closing ] is found + while inner_i < chunk_len and chunk[inner_i] != ']': + inner_i = inner_i + 1 + + if inner_i >= chunk_len: + # Got to the end of the string without finding a closing ] + # Do not treat this as a matching group, but as a literal [ + pat += re.escape(char) + else: + # Grab the insides of the [brackets] + inner = chunk[i + 1:inner_i] + char_class = '' + + # Class negation + if inner[0] == '!': + char_class = '^' + inner = inner[1:] + + char_class += re.escape(inner) + pat += '[%s]' % (char_class,) + + # Skip to the end ] + i = inner_i + else: + pat += re.escape(char) + i += 1 + + # Join each chunk with the dir separator + if not last_chunk: + pat += sep + + pat += r'\Z' + return re.compile(pat, flags=re.MULTILINE|re.DOTALL) + + +class egg_info(Command): + description = "create a distribution's .egg-info directory" + + user_options = [ + ('egg-base=', 'e', "directory containing .egg-info directories" + " (default: top of the source tree)"), + ('tag-date', 'd', "Add date stamp (e.g. 20050528) to version number"), + ('tag-build=', 'b', "Specify explicit tag to add to version number"), + ('no-date', 'D', "Don't include date stamp [default]"), + ] + + boolean_options = ['tag-date'] + negative_opt = { + 'no-date': 'tag-date', + } + + def initialize_options(self): + self.egg_name = None + self.egg_version = None + self.egg_base = None + self.egg_info = None + self.tag_build = None + self.tag_date = 0 + self.broken_egg_info = False + self.vtags = None + + #################################### + # allow the 'tag_svn_revision' to be detected and + # set, supporting sdists built on older Setuptools. + @property + def tag_svn_revision(self): + pass + + @tag_svn_revision.setter + def tag_svn_revision(self, value): + pass + #################################### + + def save_version_info(self, filename): + """ + Materialize the value of date into the + build tag. Install build keys in a deterministic order + to avoid arbitrary reordering on subsequent builds. + """ + egg_info = collections.OrderedDict() + # follow the order these keys would have been added + # when PYTHONHASHSEED=0 + egg_info['tag_build'] = self.tags() + egg_info['tag_date'] = 0 + edit_config(filename, dict(egg_info=egg_info)) + + def finalize_options(self): + self.egg_name = safe_name(self.distribution.get_name()) + self.vtags = self.tags() + self.egg_version = self.tagged_version() + + parsed_version = parse_version(self.egg_version) + + try: + is_version = isinstance(parsed_version, packaging.version.Version) + spec = ( + "%s==%s" if is_version else "%s===%s" + ) + list( + parse_requirements(spec % (self.egg_name, self.egg_version)) + ) + except ValueError: + raise distutils.errors.DistutilsOptionError( + "Invalid distribution name or version syntax: %s-%s" % + (self.egg_name, self.egg_version) + ) + + if self.egg_base is None: + dirs = self.distribution.package_dir + self.egg_base = (dirs or {}).get('', os.curdir) + + self.ensure_dirname('egg_base') + self.egg_info = to_filename(self.egg_name) + '.egg-info' + if self.egg_base != os.curdir: + self.egg_info = os.path.join(self.egg_base, self.egg_info) + if '-' in self.egg_name: + self.check_broken_egg_info() + + # Set package version for the benefit of dumber commands + # (e.g. sdist, bdist_wininst, etc.) + # + self.distribution.metadata.version = self.egg_version + + # If we bootstrapped around the lack of a PKG-INFO, as might be the + # case in a fresh checkout, make sure that any special tags get added + # to the version info + # + pd = self.distribution._patched_dist + if pd is not None and pd.key == self.egg_name.lower(): + pd._version = self.egg_version + pd._parsed_version = parse_version(self.egg_version) + self.distribution._patched_dist = None + + def write_or_delete_file(self, what, filename, data, force=False): + """Write `data` to `filename` or delete if empty + + If `data` is non-empty, this routine is the same as ``write_file()``. + If `data` is empty but not ``None``, this is the same as calling + ``delete_file(filename)`. If `data` is ``None``, then this is a no-op + unless `filename` exists, in which case a warning is issued about the + orphaned file (if `force` is false), or deleted (if `force` is true). + """ + if data: + self.write_file(what, filename, data) + elif os.path.exists(filename): + if data is None and not force: + log.warn( + "%s not set in setup(), but %s exists", what, filename + ) + return + else: + self.delete_file(filename) + + def write_file(self, what, filename, data): + """Write `data` to `filename` (if not a dry run) after announcing it + + `what` is used in a log message to identify what is being written + to the file. + """ + log.info("writing %s to %s", what, filename) + if six.PY3: + data = data.encode("utf-8") + if not self.dry_run: + f = open(filename, 'wb') + f.write(data) + f.close() + + def delete_file(self, filename): + """Delete `filename` (if not a dry run) after announcing it""" + log.info("deleting %s", filename) + if not self.dry_run: + os.unlink(filename) + + def tagged_version(self): + version = self.distribution.get_version() + # egg_info may be called more than once for a distribution, + # in which case the version string already contains all tags. + if self.vtags and version.endswith(self.vtags): + return safe_version(version) + return safe_version(version + self.vtags) + + def run(self): + self.mkpath(self.egg_info) + installer = self.distribution.fetch_build_egg + for ep in iter_entry_points('egg_info.writers'): + ep.require(installer=installer) + writer = ep.resolve() + writer(self, ep.name, os.path.join(self.egg_info, ep.name)) + + # Get rid of native_libs.txt if it was put there by older bdist_egg + nl = os.path.join(self.egg_info, "native_libs.txt") + if os.path.exists(nl): + self.delete_file(nl) + + self.find_sources() + + def tags(self): + version = '' + if self.tag_build: + version += self.tag_build + if self.tag_date: + version += time.strftime("-%Y%m%d") + return version + + def find_sources(self): + """Generate SOURCES.txt manifest file""" + manifest_filename = os.path.join(self.egg_info, "SOURCES.txt") + mm = manifest_maker(self.distribution) + mm.manifest = manifest_filename + mm.run() + self.filelist = mm.filelist + + def check_broken_egg_info(self): + bei = self.egg_name + '.egg-info' + if self.egg_base != os.curdir: + bei = os.path.join(self.egg_base, bei) + if os.path.exists(bei): + log.warn( + "-" * 78 + '\n' + "Note: Your current .egg-info directory has a '-' in its name;" + '\nthis will not work correctly with "setup.py develop".\n\n' + 'Please rename %s to %s to correct this problem.\n' + '-' * 78, + bei, self.egg_info + ) + self.broken_egg_info = self.egg_info + self.egg_info = bei # make it work for now + + +class FileList(_FileList): + # Implementations of the various MANIFEST.in commands + + def process_template_line(self, line): + # Parse the line: split it up, make sure the right number of words + # is there, and return the relevant words. 'action' is always + # defined: it's the first word of the line. Which of the other + # three are defined depends on the action; it'll be either + # patterns, (dir and patterns), or (dir_pattern). + (action, patterns, dir, dir_pattern) = self._parse_template_line(line) + + # OK, now we know that the action is valid and we have the + # right number of words on the line for that action -- so we + # can proceed with minimal error-checking. + if action == 'include': + self.debug_print("include " + ' '.join(patterns)) + for pattern in patterns: + if not self.include(pattern): + log.warn("warning: no files found matching '%s'", pattern) + + elif action == 'exclude': + self.debug_print("exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.exclude(pattern): + log.warn(("warning: no previously-included files " + "found matching '%s'"), pattern) + + elif action == 'global-include': + self.debug_print("global-include " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_include(pattern): + log.warn(("warning: no files found matching '%s' " + "anywhere in distribution"), pattern) + + elif action == 'global-exclude': + self.debug_print("global-exclude " + ' '.join(patterns)) + for pattern in patterns: + if not self.global_exclude(pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found anywhere in distribution"), + pattern) + + elif action == 'recursive-include': + self.debug_print("recursive-include %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_include(dir, pattern): + log.warn(("warning: no files found matching '%s' " + "under directory '%s'"), + pattern, dir) + + elif action == 'recursive-exclude': + self.debug_print("recursive-exclude %s %s" % + (dir, ' '.join(patterns))) + for pattern in patterns: + if not self.recursive_exclude(dir, pattern): + log.warn(("warning: no previously-included files matching " + "'%s' found under directory '%s'"), + pattern, dir) + + elif action == 'graft': + self.debug_print("graft " + dir_pattern) + if not self.graft(dir_pattern): + log.warn("warning: no directories found matching '%s'", + dir_pattern) + + elif action == 'prune': + self.debug_print("prune " + dir_pattern) + if not self.prune(dir_pattern): + log.warn(("no previously-included directories found " + "matching '%s'"), dir_pattern) + + else: + raise DistutilsInternalError( + "this cannot happen: invalid action '%s'" % action) + + def _remove_files(self, predicate): + """ + Remove all files from the file list that match the predicate. + Return True if any matching files were removed + """ + found = False + for i in range(len(self.files) - 1, -1, -1): + if predicate(self.files[i]): + self.debug_print(" removing " + self.files[i]) + del self.files[i] + found = True + return found + + def include(self, pattern): + """Include files that match 'pattern'.""" + found = [f for f in glob(pattern) if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def exclude(self, pattern): + """Exclude files that match 'pattern'.""" + match = translate_pattern(pattern) + return self._remove_files(match.match) + + def recursive_include(self, dir, pattern): + """ + Include all files anywhere in 'dir/' that match the pattern. + """ + full_pattern = os.path.join(dir, '**', pattern) + found = [f for f in glob(full_pattern, recursive=True) + if not os.path.isdir(f)] + self.extend(found) + return bool(found) + + def recursive_exclude(self, dir, pattern): + """ + Exclude any file anywhere in 'dir/' that match the pattern. + """ + match = translate_pattern(os.path.join(dir, '**', pattern)) + return self._remove_files(match.match) + + def graft(self, dir): + """Include all files from 'dir/'.""" + found = [ + item + for match_dir in glob(dir) + for item in distutils.filelist.findall(match_dir) + ] + self.extend(found) + return bool(found) + + def prune(self, dir): + """Filter out files from 'dir/'.""" + match = translate_pattern(os.path.join(dir, '**')) + return self._remove_files(match.match) + + def global_include(self, pattern): + """ + Include all files anywhere in the current directory that match the + pattern. This is very inefficient on large file trees. + """ + if self.allfiles is None: + self.findall() + match = translate_pattern(os.path.join('**', pattern)) + found = [f for f in self.allfiles if match.match(f)] + self.extend(found) + return bool(found) + + def global_exclude(self, pattern): + """ + Exclude all files anywhere that match the pattern. + """ + match = translate_pattern(os.path.join('**', pattern)) + return self._remove_files(match.match) + + def append(self, item): + if item.endswith('\r'): # Fix older sdists built on Windows + item = item[:-1] + path = convert_path(item) + + if self._safe_path(path): + self.files.append(path) + + def extend(self, paths): + self.files.extend(filter(self._safe_path, paths)) + + def _repair(self): + """ + Replace self.files with only safe paths + + Because some owners of FileList manipulate the underlying + ``files`` attribute directly, this method must be called to + repair those paths. + """ + self.files = list(filter(self._safe_path, self.files)) + + def _safe_path(self, path): + enc_warn = "'%s' not %s encodable -- skipping" + + # To avoid accidental trans-codings errors, first to unicode + u_path = unicode_utils.filesys_decode(path) + if u_path is None: + log.warn("'%s' in unexpected encoding -- skipping" % path) + return False + + # Must ensure utf-8 encodability + utf8_path = unicode_utils.try_encode(u_path, "utf-8") + if utf8_path is None: + log.warn(enc_warn, path, 'utf-8') + return False + + try: + # accept is either way checks out + if os.path.exists(u_path) or os.path.exists(utf8_path): + return True + # this will catch any encode errors decoding u_path + except UnicodeEncodeError: + log.warn(enc_warn, path, sys.getfilesystemencoding()) + + +class manifest_maker(sdist): + template = "MANIFEST.in" + + def initialize_options(self): + self.use_defaults = 1 + self.prune = 1 + self.manifest_only = 1 + self.force_manifest = 1 + + def finalize_options(self): + pass + + def run(self): + self.filelist = FileList() + if not os.path.exists(self.manifest): + self.write_manifest() # it must exist so it'll get in the list + self.add_defaults() + if os.path.exists(self.template): + self.read_template() + self.prune_file_list() + self.filelist.sort() + self.filelist.remove_duplicates() + self.write_manifest() + + def _manifest_normalize(self, path): + path = unicode_utils.filesys_decode(path) + return path.replace(os.sep, '/') + + def write_manifest(self): + """ + Write the file list in 'self.filelist' to the manifest file + named by 'self.manifest'. + """ + self.filelist._repair() + + # Now _repairs should encodability, but not unicode + files = [self._manifest_normalize(f) for f in self.filelist.files] + msg = "writing manifest file '%s'" % self.manifest + self.execute(write_file, (self.manifest, files), msg) + + def warn(self, msg): + if not self._should_suppress_warning(msg): + sdist.warn(self, msg) + + @staticmethod + def _should_suppress_warning(msg): + """ + suppress missing-file warnings from sdist + """ + return re.match(r"standard file .*not found", msg) + + def add_defaults(self): + sdist.add_defaults(self) + self.filelist.append(self.template) + self.filelist.append(self.manifest) + rcfiles = list(walk_revctrl()) + if rcfiles: + self.filelist.extend(rcfiles) + elif os.path.exists(self.manifest): + self.read_manifest() + ei_cmd = self.get_finalized_command('egg_info') + self.filelist.graft(ei_cmd.egg_info) + + def prune_file_list(self): + build = self.get_finalized_command('build') + base_dir = self.distribution.get_fullname() + self.filelist.prune(build.build_base) + self.filelist.prune(base_dir) + sep = re.escape(os.sep) + self.filelist.exclude_pattern(r'(^|' + sep + r')(RCS|CVS|\.svn)' + sep, + is_regex=1) + + +def write_file(filename, contents): + """Create a file with the specified name and write 'contents' (a + sequence of strings without line terminators) to it. + """ + contents = "\n".join(contents) + + # assuming the contents has been vetted for utf-8 encoding + contents = contents.encode("utf-8") + + with open(filename, "wb") as f: # always write POSIX-style manifest + f.write(contents) + + +def write_pkg_info(cmd, basename, filename): + log.info("writing %s", filename) + if not cmd.dry_run: + metadata = cmd.distribution.metadata + metadata.version, oldver = cmd.egg_version, metadata.version + metadata.name, oldname = cmd.egg_name, metadata.name + + try: + # write unescaped data to PKG-INFO, so older pkg_resources + # can still parse it + metadata.write_pkg_info(cmd.egg_info) + finally: + metadata.name, metadata.version = oldname, oldver + + safe = getattr(cmd.distribution, 'zip_safe', None) + + bdist_egg.write_safety_flag(cmd.egg_info, safe) + + +def warn_depends_obsolete(cmd, basename, filename): + if os.path.exists(filename): + log.warn( + "WARNING: 'depends.txt' is not used by setuptools 0.6!\n" + "Use the install_requires/extras_require setup() args instead." + ) + + +def _write_requirements(stream, reqs): + lines = yield_lines(reqs or ()) + append_cr = lambda line: line + '\n' + lines = map(append_cr, lines) + stream.writelines(lines) + + +def write_requirements(cmd, basename, filename): + dist = cmd.distribution + data = six.StringIO() + _write_requirements(data, dist.install_requires) + extras_require = dist.extras_require or {} + for extra in sorted(extras_require): + data.write('\n[{extra}]\n'.format(**vars())) + _write_requirements(data, extras_require[extra]) + cmd.write_or_delete_file("requirements", filename, data.getvalue()) + + +def write_setup_requirements(cmd, basename, filename): + data = io.StringIO() + _write_requirements(data, cmd.distribution.setup_requires) + cmd.write_or_delete_file("setup-requirements", filename, data.getvalue()) + + +def write_toplevel_names(cmd, basename, filename): + pkgs = dict.fromkeys( + [ + k.split('.', 1)[0] + for k in cmd.distribution.iter_distribution_names() + ] + ) + cmd.write_file("top-level names", filename, '\n'.join(sorted(pkgs)) + '\n') + + +def overwrite_arg(cmd, basename, filename): + write_arg(cmd, basename, filename, True) + + +def write_arg(cmd, basename, filename, force=False): + argname = os.path.splitext(basename)[0] + value = getattr(cmd.distribution, argname, None) + if value is not None: + value = '\n'.join(value) + '\n' + cmd.write_or_delete_file(argname, filename, value, force) + + +def write_entries(cmd, basename, filename): + ep = cmd.distribution.entry_points + + if isinstance(ep, six.string_types) or ep is None: + data = ep + elif ep is not None: + data = [] + for section, contents in sorted(ep.items()): + if not isinstance(contents, six.string_types): + contents = EntryPoint.parse_group(section, contents) + contents = '\n'.join(sorted(map(str, contents.values()))) + data.append('[%s]\n%s\n\n' % (section, contents)) + data = ''.join(data) + + cmd.write_or_delete_file('entry points', filename, data, True) + + +def get_pkg_info_revision(): + """ + Get a -r### off of PKG-INFO Version in case this is an sdist of + a subversion revision. + """ + warnings.warn("get_pkg_info_revision is deprecated.", DeprecationWarning) + if os.path.exists('PKG-INFO'): + with io.open('PKG-INFO') as f: + for line in f: + match = re.match(r"Version:.*-r(\d+)\s*$", line) + if match: + return int(match.group(1)) + return 0 diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/install.py b/myenv/lib/python3.7/site-packages/setuptools/command/install.py new file mode 100644 index 000000000..31a5ddb57 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/install.py @@ -0,0 +1,125 @@ +from distutils.errors import DistutilsArgError +import inspect +import glob +import warnings +import platform +import distutils.command.install as orig + +import setuptools + +# Prior to numpy 1.9, NumPy relies on the '_install' name, so provide it for +# now. See https://github.com/pypa/setuptools/issues/199/ +_install = orig.install + + +class install(orig.install): + """Use easy_install to install the package, w/dependencies""" + + user_options = orig.install.user_options + [ + ('old-and-unmanageable', None, "Try not to use this!"), + ('single-version-externally-managed', None, + "used by system package builders to create 'flat' eggs"), + ] + boolean_options = orig.install.boolean_options + [ + 'old-and-unmanageable', 'single-version-externally-managed', + ] + new_commands = [ + ('install_egg_info', lambda self: True), + ('install_scripts', lambda self: True), + ] + _nc = dict(new_commands) + + def initialize_options(self): + orig.install.initialize_options(self) + self.old_and_unmanageable = None + self.single_version_externally_managed = None + + def finalize_options(self): + orig.install.finalize_options(self) + if self.root: + self.single_version_externally_managed = True + elif self.single_version_externally_managed: + if not self.root and not self.record: + raise DistutilsArgError( + "You must specify --record or --root when building system" + " packages" + ) + + def handle_extra_path(self): + if self.root or self.single_version_externally_managed: + # explicit backward-compatibility mode, allow extra_path to work + return orig.install.handle_extra_path(self) + + # Ignore extra_path when installing an egg (or being run by another + # command without --root or --single-version-externally-managed + self.path_file = None + self.extra_dirs = '' + + def run(self): + # Explicit request for old-style install? Just do it + if self.old_and_unmanageable or self.single_version_externally_managed: + return orig.install.run(self) + + if not self._called_from_setup(inspect.currentframe()): + # Run in backward-compatibility mode to support bdist_* commands. + orig.install.run(self) + else: + self.do_egg_install() + + @staticmethod + def _called_from_setup(run_frame): + """ + Attempt to detect whether run() was called from setup() or by another + command. If called by setup(), the parent caller will be the + 'run_command' method in 'distutils.dist', and *its* caller will be + the 'run_commands' method. If called any other way, the + immediate caller *might* be 'run_command', but it won't have been + called by 'run_commands'. Return True in that case or if a call stack + is unavailable. Return False otherwise. + """ + if run_frame is None: + msg = "Call stack not available. bdist_* commands may fail." + warnings.warn(msg) + if platform.python_implementation() == 'IronPython': + msg = "For best results, pass -X:Frames to enable call stack." + warnings.warn(msg) + return True + res = inspect.getouterframes(run_frame)[2] + caller, = res[:1] + info = inspect.getframeinfo(caller) + caller_module = caller.f_globals.get('__name__', '') + return ( + caller_module == 'distutils.dist' + and info.function == 'run_commands' + ) + + def do_egg_install(self): + + easy_install = self.distribution.get_command_class('easy_install') + + cmd = easy_install( + self.distribution, args="x", root=self.root, record=self.record, + ) + cmd.ensure_finalized() # finalize before bdist_egg munges install cmd + cmd.always_copy_from = '.' # make sure local-dir eggs get installed + + # pick up setup-dir .egg files only: no .egg-info + cmd.package_index.scan(glob.glob('*.egg')) + + self.run_command('bdist_egg') + args = [self.distribution.get_command_obj('bdist_egg').egg_output] + + if setuptools.bootstrap_install_from: + # Bootstrap self-installation of setuptools + args.insert(0, setuptools.bootstrap_install_from) + + cmd.args = args + cmd.run() + setuptools.bootstrap_install_from = None + + +# XXX Python 3.1 doesn't see _nc if this is inside the class +install.sub_commands = ( + [cmd for cmd in orig.install.sub_commands if cmd[0] not in install._nc] + + install.new_commands +) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py b/myenv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py new file mode 100644 index 000000000..edc4718b6 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/install_egg_info.py @@ -0,0 +1,62 @@ +from distutils import log, dir_util +import os + +from setuptools import Command +from setuptools import namespaces +from setuptools.archive_util import unpack_archive +import pkg_resources + + +class install_egg_info(namespaces.Installer, Command): + """Install an .egg-info directory for the package""" + + description = "Install an .egg-info directory for the package" + + user_options = [ + ('install-dir=', 'd', "directory to install to"), + ] + + def initialize_options(self): + self.install_dir = None + + def finalize_options(self): + self.set_undefined_options('install_lib', + ('install_dir', 'install_dir')) + ei_cmd = self.get_finalized_command("egg_info") + basename = pkg_resources.Distribution( + None, None, ei_cmd.egg_name, ei_cmd.egg_version + ).egg_name() + '.egg-info' + self.source = ei_cmd.egg_info + self.target = os.path.join(self.install_dir, basename) + self.outputs = [] + + def run(self): + self.run_command('egg_info') + if os.path.isdir(self.target) and not os.path.islink(self.target): + dir_util.remove_tree(self.target, dry_run=self.dry_run) + elif os.path.exists(self.target): + self.execute(os.unlink, (self.target,), "Removing " + self.target) + if not self.dry_run: + pkg_resources.ensure_directory(self.target) + self.execute( + self.copytree, (), "Copying %s to %s" % (self.source, self.target) + ) + self.install_namespaces() + + def get_outputs(self): + return self.outputs + + def copytree(self): + # Copy the .egg-info tree to site-packages + def skimmer(src, dst): + # filter out source-control directories; note that 'src' is always + # a '/'-separated path, regardless of platform. 'dst' is a + # platform-specific path. + for skip in '.svn/', 'CVS/': + if src.startswith(skip) or '/' + skip in src: + return None + self.outputs.append(dst) + log.debug("Copying %s to %s", src, dst) + return dst + + unpack_archive(self.source, self.target, skimmer) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/install_lib.py b/myenv/lib/python3.7/site-packages/setuptools/command/install_lib.py new file mode 100644 index 000000000..2b31c3e38 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/install_lib.py @@ -0,0 +1,121 @@ +import os +import imp +from itertools import product, starmap +import distutils.command.install_lib as orig + + +class install_lib(orig.install_lib): + """Don't add compiled flags to filenames of non-Python files""" + + def run(self): + self.build() + outfiles = self.install() + if outfiles is not None: + # always compile, in case we have any extension stubs to deal with + self.byte_compile(outfiles) + + def get_exclusions(self): + """ + Return a collections.Sized collections.Container of paths to be + excluded for single_version_externally_managed installations. + """ + all_packages = ( + pkg + for ns_pkg in self._get_SVEM_NSPs() + for pkg in self._all_packages(ns_pkg) + ) + + excl_specs = product(all_packages, self._gen_exclusion_paths()) + return set(starmap(self._exclude_pkg_path, excl_specs)) + + def _exclude_pkg_path(self, pkg, exclusion_path): + """ + Given a package name and exclusion path within that package, + compute the full exclusion path. + """ + parts = pkg.split('.') + [exclusion_path] + return os.path.join(self.install_dir, *parts) + + @staticmethod + def _all_packages(pkg_name): + """ + >>> list(install_lib._all_packages('foo.bar.baz')) + ['foo.bar.baz', 'foo.bar', 'foo'] + """ + while pkg_name: + yield pkg_name + pkg_name, sep, child = pkg_name.rpartition('.') + + def _get_SVEM_NSPs(self): + """ + Get namespace packages (list) but only for + single_version_externally_managed installations and empty otherwise. + """ + # TODO: is it necessary to short-circuit here? i.e. what's the cost + # if get_finalized_command is called even when namespace_packages is + # False? + if not self.distribution.namespace_packages: + return [] + + install_cmd = self.get_finalized_command('install') + svem = install_cmd.single_version_externally_managed + + return self.distribution.namespace_packages if svem else [] + + @staticmethod + def _gen_exclusion_paths(): + """ + Generate file paths to be excluded for namespace packages (bytecode + cache files). + """ + # always exclude the package module itself + yield '__init__.py' + + yield '__init__.pyc' + yield '__init__.pyo' + + if not hasattr(imp, 'get_tag'): + return + + base = os.path.join('__pycache__', '__init__.' + imp.get_tag()) + yield base + '.pyc' + yield base + '.pyo' + yield base + '.opt-1.pyc' + yield base + '.opt-2.pyc' + + def copy_tree( + self, infile, outfile, + preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1 + ): + assert preserve_mode and preserve_times and not preserve_symlinks + exclude = self.get_exclusions() + + if not exclude: + return orig.install_lib.copy_tree(self, infile, outfile) + + # Exclude namespace package __init__.py* files from the output + + from setuptools.archive_util import unpack_directory + from distutils import log + + outfiles = [] + + def pf(src, dst): + if dst in exclude: + log.warn("Skipping installation of %s (namespace package)", + dst) + return False + + log.info("copying %s -> %s", src, os.path.dirname(dst)) + outfiles.append(dst) + return dst + + unpack_directory(infile, outfile, pf) + return outfiles + + def get_outputs(self): + outputs = orig.install_lib.get_outputs(self) + exclude = self.get_exclusions() + if exclude: + return [f for f in outputs if f not in exclude] + return outputs diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/install_scripts.py b/myenv/lib/python3.7/site-packages/setuptools/command/install_scripts.py new file mode 100644 index 000000000..16234273a --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/install_scripts.py @@ -0,0 +1,65 @@ +from distutils import log +import distutils.command.install_scripts as orig +import os +import sys + +from pkg_resources import Distribution, PathMetadata, ensure_directory + + +class install_scripts(orig.install_scripts): + """Do normal script install, plus any egg_info wrapper scripts""" + + def initialize_options(self): + orig.install_scripts.initialize_options(self) + self.no_ep = False + + def run(self): + import setuptools.command.easy_install as ei + + self.run_command("egg_info") + if self.distribution.scripts: + orig.install_scripts.run(self) # run first to set up self.outfiles + else: + self.outfiles = [] + if self.no_ep: + # don't install entry point scripts into .egg file! + return + + ei_cmd = self.get_finalized_command("egg_info") + dist = Distribution( + ei_cmd.egg_base, PathMetadata(ei_cmd.egg_base, ei_cmd.egg_info), + ei_cmd.egg_name, ei_cmd.egg_version, + ) + bs_cmd = self.get_finalized_command('build_scripts') + exec_param = getattr(bs_cmd, 'executable', None) + bw_cmd = self.get_finalized_command("bdist_wininst") + is_wininst = getattr(bw_cmd, '_is_running', False) + writer = ei.ScriptWriter + if is_wininst: + exec_param = "python.exe" + writer = ei.WindowsScriptWriter + if exec_param == sys.executable: + # In case the path to the Python executable contains a space, wrap + # it so it's not split up. + exec_param = [exec_param] + # resolve the writer to the environment + writer = writer.best() + cmd = writer.command_spec_class.best().from_param(exec_param) + for args in writer.get_args(dist, cmd.as_header()): + self.write_script(*args) + + def write_script(self, script_name, contents, mode="t", *ignored): + """Write an executable file to the scripts directory""" + from setuptools.command.easy_install import chmod, current_umask + + log.info("Installing %s script to %s", script_name, self.install_dir) + target = os.path.join(self.install_dir, script_name) + self.outfiles.append(target) + + mask = current_umask() + if not self.dry_run: + ensure_directory(target) + f = open(target, "w" + mode) + f.write(contents) + f.close() + chmod(target, 0o777 - mask) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml b/myenv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml new file mode 100644 index 000000000..5972a96d8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/launcher manifest.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <assemblyIdentity version="1.0.0.0" + processorArchitecture="X86" + name="%(name)s" + type="win32"/> + <!-- Identify the application security requirements. --> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"/> + </requestedPrivileges> + </security> + </trustInfo> +</assembly> diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/py36compat.py b/myenv/lib/python3.7/site-packages/setuptools/command/py36compat.py new file mode 100644 index 000000000..61063e754 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/py36compat.py @@ -0,0 +1,136 @@ +import os +from glob import glob +from distutils.util import convert_path +from distutils.command import sdist + +from setuptools.extern.six.moves import filter + + +class sdist_add_defaults: + """ + Mix-in providing forward-compatibility for functionality as found in + distutils on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. Instead, override in the subclass. + """ + + def add_defaults(self): + """Add all the default files to self.filelist: + - README or README.txt + - setup.py + - test/test*.py + - all pure Python modules mentioned in setup script + - all files pointed by package_data (build_py) + - all files defined in data_files. + - all files defined as scripts. + - all C sources listed as part of extensions or C libraries + in the setup script (doesn't catch C headers!) + Warns if (README or README.txt) or setup.py are missing; everything + else is optional. + """ + self._add_defaults_standards() + self._add_defaults_optional() + self._add_defaults_python() + self._add_defaults_data_files() + self._add_defaults_ext() + self._add_defaults_c_libs() + self._add_defaults_scripts() + + @staticmethod + def _cs_path_exists(fspath): + """ + Case-sensitive path existence check + + >>> sdist_add_defaults._cs_path_exists(__file__) + True + >>> sdist_add_defaults._cs_path_exists(__file__.upper()) + False + """ + if not os.path.exists(fspath): + return False + # make absolute so we always have a directory + abspath = os.path.abspath(fspath) + directory, filename = os.path.split(abspath) + return filename in os.listdir(directory) + + def _add_defaults_standards(self): + standards = [self.READMES, self.distribution.script_name] + for fn in standards: + if isinstance(fn, tuple): + alts = fn + got_it = False + for fn in alts: + if self._cs_path_exists(fn): + got_it = True + self.filelist.append(fn) + break + + if not got_it: + self.warn("standard file not found: should have one of " + + ', '.join(alts)) + else: + if self._cs_path_exists(fn): + self.filelist.append(fn) + else: + self.warn("standard file '%s' not found" % fn) + + def _add_defaults_optional(self): + optional = ['test/test*.py', 'setup.cfg'] + for pattern in optional: + files = filter(os.path.isfile, glob(pattern)) + self.filelist.extend(files) + + def _add_defaults_python(self): + # build_py is used to get: + # - python modules + # - files defined in package_data + build_py = self.get_finalized_command('build_py') + + # getting python files + if self.distribution.has_pure_modules(): + self.filelist.extend(build_py.get_source_files()) + + # getting package_data files + # (computed in build_py.data_files by build_py.finalize_options) + for pkg, src_dir, build_dir, filenames in build_py.data_files: + for filename in filenames: + self.filelist.append(os.path.join(src_dir, filename)) + + def _add_defaults_data_files(self): + # getting distribution.data_files + if self.distribution.has_data_files(): + for item in self.distribution.data_files: + if isinstance(item, str): + # plain file + item = convert_path(item) + if os.path.isfile(item): + self.filelist.append(item) + else: + # a (dirname, filenames) tuple + dirname, filenames = item + for f in filenames: + f = convert_path(f) + if os.path.isfile(f): + self.filelist.append(f) + + def _add_defaults_ext(self): + if self.distribution.has_ext_modules(): + build_ext = self.get_finalized_command('build_ext') + self.filelist.extend(build_ext.get_source_files()) + + def _add_defaults_c_libs(self): + if self.distribution.has_c_libraries(): + build_clib = self.get_finalized_command('build_clib') + self.filelist.extend(build_clib.get_source_files()) + + def _add_defaults_scripts(self): + if self.distribution.has_scripts(): + build_scripts = self.get_finalized_command('build_scripts') + self.filelist.extend(build_scripts.get_source_files()) + + +if hasattr(sdist.sdist, '_add_defaults_standards'): + # disable the functionality already available upstream + class sdist_add_defaults: + pass diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/register.py b/myenv/lib/python3.7/site-packages/setuptools/command/register.py new file mode 100644 index 000000000..8d6336a14 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/register.py @@ -0,0 +1,10 @@ +import distutils.command.register as orig + + +class register(orig.register): + __doc__ = orig.register.__doc__ + + def run(self): + # Make sure that we are using valid current name/version info + self.run_command('egg_info') + orig.register.run(self) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/rotate.py b/myenv/lib/python3.7/site-packages/setuptools/command/rotate.py new file mode 100644 index 000000000..b89353f52 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/rotate.py @@ -0,0 +1,66 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import shutil + +from setuptools.extern import six + +from setuptools import Command + + +class rotate(Command): + """Delete older distributions""" + + description = "delete older distributions, keeping N newest files" + user_options = [ + ('match=', 'm', "patterns to match (required)"), + ('dist-dir=', 'd', "directory where the distributions are"), + ('keep=', 'k', "number of matching distributions to keep"), + ] + + boolean_options = [] + + def initialize_options(self): + self.match = None + self.dist_dir = None + self.keep = None + + def finalize_options(self): + if self.match is None: + raise DistutilsOptionError( + "Must specify one or more (comma-separated) match patterns " + "(e.g. '.zip' or '.egg')" + ) + if self.keep is None: + raise DistutilsOptionError("Must specify number of files to keep") + try: + self.keep = int(self.keep) + except ValueError: + raise DistutilsOptionError("--keep must be an integer") + if isinstance(self.match, six.string_types): + self.match = [ + convert_path(p.strip()) for p in self.match.split(',') + ] + self.set_undefined_options('bdist', ('dist_dir', 'dist_dir')) + + def run(self): + self.run_command("egg_info") + from glob import glob + + for pattern in self.match: + pattern = self.distribution.get_name() + '*' + pattern + files = glob(os.path.join(self.dist_dir, pattern)) + files = [(os.path.getmtime(f), f) for f in files] + files.sort() + files.reverse() + + log.info("%d file(s) matching %s", len(files), pattern) + files = files[self.keep:] + for (t, f) in files: + log.info("Deleting %s", f) + if not self.dry_run: + if os.path.isdir(f): + shutil.rmtree(f) + else: + os.unlink(f) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/saveopts.py b/myenv/lib/python3.7/site-packages/setuptools/command/saveopts.py new file mode 100644 index 000000000..611cec552 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/saveopts.py @@ -0,0 +1,22 @@ +from setuptools.command.setopt import edit_config, option_base + + +class saveopts(option_base): + """Save command-line options to a file""" + + description = "save supplied options to setup.cfg or other config file" + + def run(self): + dist = self.distribution + settings = {} + + for cmd in dist.command_options: + + if cmd == 'saveopts': + continue # don't save our own options! + + for opt, (src, val) in dist.get_option_dict(cmd).items(): + if src == "command line": + settings.setdefault(cmd, {})[opt] = val + + edit_config(self.filename, settings, self.dry_run) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/sdist.py b/myenv/lib/python3.7/site-packages/setuptools/command/sdist.py new file mode 100644 index 000000000..bcfae4d82 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/sdist.py @@ -0,0 +1,200 @@ +from distutils import log +import distutils.command.sdist as orig +import os +import sys +import io +import contextlib + +from setuptools.extern import six + +from .py36compat import sdist_add_defaults + +import pkg_resources + +_default_revctrl = list + + +def walk_revctrl(dirname=''): + """Find all files under revision control""" + for ep in pkg_resources.iter_entry_points('setuptools.file_finders'): + for item in ep.load()(dirname): + yield item + + +class sdist(sdist_add_defaults, orig.sdist): + """Smart sdist that finds anything supported by revision control""" + + user_options = [ + ('formats=', None, + "formats for source distribution (comma-separated list)"), + ('keep-temp', 'k', + "keep the distribution tree around after creating " + + "archive file(s)"), + ('dist-dir=', 'd', + "directory to put the source distribution archive(s) in " + "[default: dist]"), + ] + + negative_opt = {} + + README_EXTENSIONS = ['', '.rst', '.txt', '.md'] + READMES = tuple('README{0}'.format(ext) for ext in README_EXTENSIONS) + + def run(self): + self.run_command('egg_info') + ei_cmd = self.get_finalized_command('egg_info') + self.filelist = ei_cmd.filelist + self.filelist.append(os.path.join(ei_cmd.egg_info, 'SOURCES.txt')) + self.check_readme() + + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + self.make_distribution() + + dist_files = getattr(self.distribution, 'dist_files', []) + for file in self.archive_files: + data = ('sdist', '', file) + if data not in dist_files: + dist_files.append(data) + + def initialize_options(self): + orig.sdist.initialize_options(self) + + self._default_to_gztar() + + def _default_to_gztar(self): + # only needed on Python prior to 3.6. + if sys.version_info >= (3, 6, 0, 'beta', 1): + return + self.formats = ['gztar'] + + def make_distribution(self): + """ + Workaround for #516 + """ + with self._remove_os_link(): + orig.sdist.make_distribution(self) + + @staticmethod + @contextlib.contextmanager + def _remove_os_link(): + """ + In a context, remove and restore os.link if it exists + """ + + class NoValue: + pass + + orig_val = getattr(os, 'link', NoValue) + try: + del os.link + except Exception: + pass + try: + yield + finally: + if orig_val is not NoValue: + setattr(os, 'link', orig_val) + + def __read_template_hack(self): + # This grody hack closes the template file (MANIFEST.in) if an + # exception occurs during read_template. + # Doing so prevents an error when easy_install attempts to delete the + # file. + try: + orig.sdist.read_template(self) + except Exception: + _, _, tb = sys.exc_info() + tb.tb_next.tb_frame.f_locals['template'].close() + raise + + # Beginning with Python 2.7.2, 3.1.4, and 3.2.1, this leaky file handle + # has been fixed, so only override the method if we're using an earlier + # Python. + has_leaky_handle = ( + sys.version_info < (2, 7, 2) + or (3, 0) <= sys.version_info < (3, 1, 4) + or (3, 2) <= sys.version_info < (3, 2, 1) + ) + if has_leaky_handle: + read_template = __read_template_hack + + def _add_defaults_python(self): + """getting python files""" + if self.distribution.has_pure_modules(): + build_py = self.get_finalized_command('build_py') + self.filelist.extend(build_py.get_source_files()) + # This functionality is incompatible with include_package_data, and + # will in fact create an infinite recursion if include_package_data + # is True. Use of include_package_data will imply that + # distutils-style automatic handling of package_data is disabled + if not self.distribution.include_package_data: + for _, src_dir, _, filenames in build_py.data_files: + self.filelist.extend([os.path.join(src_dir, filename) + for filename in filenames]) + + def _add_defaults_data_files(self): + try: + if six.PY2: + sdist_add_defaults._add_defaults_data_files(self) + else: + super()._add_defaults_data_files() + except TypeError: + log.warn("data_files contains unexpected objects") + + def check_readme(self): + for f in self.READMES: + if os.path.exists(f): + return + else: + self.warn( + "standard file not found: should have one of " + + ', '.join(self.READMES) + ) + + def make_release_tree(self, base_dir, files): + orig.sdist.make_release_tree(self, base_dir, files) + + # Save any egg_info command line options used to create this sdist + dest = os.path.join(base_dir, 'setup.cfg') + if hasattr(os, 'link') and os.path.exists(dest): + # unlink and re-copy, since it might be hard-linked, and + # we don't want to change the source version + os.unlink(dest) + self.copy_file('setup.cfg', dest) + + self.get_finalized_command('egg_info').save_version_info(dest) + + def _manifest_is_not_generated(self): + # check for special comment used in 2.7.1 and higher + if not os.path.isfile(self.manifest): + return False + + with io.open(self.manifest, 'rb') as fp: + first_line = fp.readline() + return (first_line != + '# file GENERATED by distutils, do NOT edit\n'.encode()) + + def read_manifest(self): + """Read the manifest file (named by 'self.manifest') and use it to + fill in 'self.filelist', the list of files to include in the source + distribution. + """ + log.info("reading manifest file '%s'", self.manifest) + manifest = open(self.manifest, 'rb') + for line in manifest: + # The manifest must contain UTF-8. See #303. + if six.PY3: + try: + line = line.decode('UTF-8') + except UnicodeDecodeError: + log.warn("%r not UTF-8 decodable -- skipping" % line) + continue + # ignore comments and blank lines + line = line.strip() + if line.startswith('#') or not line: + continue + self.filelist.append(line) + manifest.close() diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/setopt.py b/myenv/lib/python3.7/site-packages/setuptools/command/setopt.py new file mode 100644 index 000000000..7e57cc026 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/setopt.py @@ -0,0 +1,149 @@ +from distutils.util import convert_path +from distutils import log +from distutils.errors import DistutilsOptionError +import distutils +import os + +from setuptools.extern.six.moves import configparser + +from setuptools import Command + +__all__ = ['config_file', 'edit_config', 'option_base', 'setopt'] + + +def config_file(kind="local"): + """Get the filename of the distutils, local, global, or per-user config + + `kind` must be one of "local", "global", or "user" + """ + if kind == 'local': + return 'setup.cfg' + if kind == 'global': + return os.path.join( + os.path.dirname(distutils.__file__), 'distutils.cfg' + ) + if kind == 'user': + dot = os.name == 'posix' and '.' or '' + return os.path.expanduser(convert_path("~/%spydistutils.cfg" % dot)) + raise ValueError( + "config_file() type must be 'local', 'global', or 'user'", kind + ) + + +def edit_config(filename, settings, dry_run=False): + """Edit a configuration file to include `settings` + + `settings` is a dictionary of dictionaries or ``None`` values, keyed by + command/section name. A ``None`` value means to delete the entire section, + while a dictionary lists settings to be changed or deleted in that section. + A setting of ``None`` means to delete that setting. + """ + log.debug("Reading configuration from %s", filename) + opts = configparser.RawConfigParser() + opts.read([filename]) + for section, options in settings.items(): + if options is None: + log.info("Deleting section [%s] from %s", section, filename) + opts.remove_section(section) + else: + if not opts.has_section(section): + log.debug("Adding new section [%s] to %s", section, filename) + opts.add_section(section) + for option, value in options.items(): + if value is None: + log.debug( + "Deleting %s.%s from %s", + section, option, filename + ) + opts.remove_option(section, option) + if not opts.options(section): + log.info("Deleting empty [%s] section from %s", + section, filename) + opts.remove_section(section) + else: + log.debug( + "Setting %s.%s to %r in %s", + section, option, value, filename + ) + opts.set(section, option, value) + + log.info("Writing %s", filename) + if not dry_run: + with open(filename, 'w') as f: + opts.write(f) + + +class option_base(Command): + """Abstract base class for commands that mess with config files""" + + user_options = [ + ('global-config', 'g', + "save options to the site-wide distutils.cfg file"), + ('user-config', 'u', + "save options to the current user's pydistutils.cfg file"), + ('filename=', 'f', + "configuration file to use (default=setup.cfg)"), + ] + + boolean_options = [ + 'global-config', 'user-config', + ] + + def initialize_options(self): + self.global_config = None + self.user_config = None + self.filename = None + + def finalize_options(self): + filenames = [] + if self.global_config: + filenames.append(config_file('global')) + if self.user_config: + filenames.append(config_file('user')) + if self.filename is not None: + filenames.append(self.filename) + if not filenames: + filenames.append(config_file('local')) + if len(filenames) > 1: + raise DistutilsOptionError( + "Must specify only one configuration file option", + filenames + ) + self.filename, = filenames + + +class setopt(option_base): + """Save command-line options to a file""" + + description = "set an option in setup.cfg or another config file" + + user_options = [ + ('command=', 'c', 'command to set an option for'), + ('option=', 'o', 'option to set'), + ('set-value=', 's', 'value of the option'), + ('remove', 'r', 'remove (unset) the value'), + ] + option_base.user_options + + boolean_options = option_base.boolean_options + ['remove'] + + def initialize_options(self): + option_base.initialize_options(self) + self.command = None + self.option = None + self.set_value = None + self.remove = None + + def finalize_options(self): + option_base.finalize_options(self) + if self.command is None or self.option is None: + raise DistutilsOptionError("Must specify --command *and* --option") + if self.set_value is None and not self.remove: + raise DistutilsOptionError("Must specify --set-value or --remove") + + def run(self): + edit_config( + self.filename, { + self.command: {self.option.replace('-', '_'): self.set_value} + }, + self.dry_run + ) diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/test.py b/myenv/lib/python3.7/site-packages/setuptools/command/test.py new file mode 100644 index 000000000..51aee1f7b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/test.py @@ -0,0 +1,268 @@ +import os +import operator +import sys +import contextlib +import itertools +import unittest +from distutils.errors import DistutilsError, DistutilsOptionError +from distutils import log +from unittest import TestLoader + +from setuptools.extern import six +from setuptools.extern.six.moves import map, filter + +from pkg_resources import (resource_listdir, resource_exists, normalize_path, + working_set, _namespace_packages, evaluate_marker, + add_activation_listener, require, EntryPoint) +from setuptools import Command + + +class ScanningLoader(TestLoader): + + def __init__(self): + TestLoader.__init__(self) + self._visited = set() + + def loadTestsFromModule(self, module, pattern=None): + """Return a suite of all tests cases contained in the given module + + If the module is a package, load tests from all the modules in it. + If the module has an ``additional_tests`` function, call it and add + the return value to the tests. + """ + if module in self._visited: + return None + self._visited.add(module) + + tests = [] + tests.append(TestLoader.loadTestsFromModule(self, module)) + + if hasattr(module, "additional_tests"): + tests.append(module.additional_tests()) + + if hasattr(module, '__path__'): + for file in resource_listdir(module.__name__, ''): + if file.endswith('.py') and file != '__init__.py': + submodule = module.__name__ + '.' + file[:-3] + else: + if resource_exists(module.__name__, file + '/__init__.py'): + submodule = module.__name__ + '.' + file + else: + continue + tests.append(self.loadTestsFromName(submodule)) + + if len(tests) != 1: + return self.suiteClass(tests) + else: + return tests[0] # don't create a nested suite for only one return + + +# adapted from jaraco.classes.properties:NonDataProperty +class NonDataProperty(object): + def __init__(self, fget): + self.fget = fget + + def __get__(self, obj, objtype=None): + if obj is None: + return self + return self.fget(obj) + + +class test(Command): + """Command to run unit tests after in-place build""" + + description = "run unit tests after in-place build" + + user_options = [ + ('test-module=', 'm', "Run 'test_suite' in specified module"), + ('test-suite=', 's', + "Run single test, case or suite (e.g. 'module.test_suite')"), + ('test-runner=', 'r', "Test runner to use"), + ] + + def initialize_options(self): + self.test_suite = None + self.test_module = None + self.test_loader = None + self.test_runner = None + + def finalize_options(self): + + if self.test_suite and self.test_module: + msg = "You may specify a module or a suite, but not both" + raise DistutilsOptionError(msg) + + if self.test_suite is None: + if self.test_module is None: + self.test_suite = self.distribution.test_suite + else: + self.test_suite = self.test_module + ".test_suite" + + if self.test_loader is None: + self.test_loader = getattr(self.distribution, 'test_loader', None) + if self.test_loader is None: + self.test_loader = "setuptools.command.test:ScanningLoader" + if self.test_runner is None: + self.test_runner = getattr(self.distribution, 'test_runner', None) + + @NonDataProperty + def test_args(self): + return list(self._test_args()) + + def _test_args(self): + if not self.test_suite and sys.version_info >= (2, 7): + yield 'discover' + if self.verbose: + yield '--verbose' + if self.test_suite: + yield self.test_suite + + def with_project_on_sys_path(self, func): + """ + Backward compatibility for project_on_sys_path context. + """ + with self.project_on_sys_path(): + func() + + @contextlib.contextmanager + def project_on_sys_path(self, include_dists=[]): + with_2to3 = six.PY3 and getattr(self.distribution, 'use_2to3', False) + + if with_2to3: + # If we run 2to3 we can not do this inplace: + + # Ensure metadata is up-to-date + self.reinitialize_command('build_py', inplace=0) + self.run_command('build_py') + bpy_cmd = self.get_finalized_command("build_py") + build_path = normalize_path(bpy_cmd.build_lib) + + # Build extensions + self.reinitialize_command('egg_info', egg_base=build_path) + self.run_command('egg_info') + + self.reinitialize_command('build_ext', inplace=0) + self.run_command('build_ext') + else: + # Without 2to3 inplace works fine: + self.run_command('egg_info') + + # Build extensions in-place + self.reinitialize_command('build_ext', inplace=1) + self.run_command('build_ext') + + ei_cmd = self.get_finalized_command("egg_info") + + old_path = sys.path[:] + old_modules = sys.modules.copy() + + try: + project_path = normalize_path(ei_cmd.egg_base) + sys.path.insert(0, project_path) + working_set.__init__() + add_activation_listener(lambda dist: dist.activate()) + require('%s==%s' % (ei_cmd.egg_name, ei_cmd.egg_version)) + with self.paths_on_pythonpath([project_path]): + yield + finally: + sys.path[:] = old_path + sys.modules.clear() + sys.modules.update(old_modules) + working_set.__init__() + + @staticmethod + @contextlib.contextmanager + def paths_on_pythonpath(paths): + """ + Add the indicated paths to the head of the PYTHONPATH environment + variable so that subprocesses will also see the packages at + these paths. + + Do this in a context that restores the value on exit. + """ + nothing = object() + orig_pythonpath = os.environ.get('PYTHONPATH', nothing) + current_pythonpath = os.environ.get('PYTHONPATH', '') + try: + prefix = os.pathsep.join(paths) + to_join = filter(None, [prefix, current_pythonpath]) + new_path = os.pathsep.join(to_join) + if new_path: + os.environ['PYTHONPATH'] = new_path + yield + finally: + if orig_pythonpath is nothing: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = orig_pythonpath + + @staticmethod + def install_dists(dist): + """ + Install the requirements indicated by self.distribution and + return an iterable of the dists that were built. + """ + ir_d = dist.fetch_build_eggs(dist.install_requires) + tr_d = dist.fetch_build_eggs(dist.tests_require or []) + er_d = dist.fetch_build_eggs( + v for k, v in dist.extras_require.items() + if k.startswith(':') and evaluate_marker(k[1:]) + ) + return itertools.chain(ir_d, tr_d, er_d) + + def run(self): + installed_dists = self.install_dists(self.distribution) + + cmd = ' '.join(self._argv) + if self.dry_run: + self.announce('skipping "%s" (dry run)' % cmd) + return + + self.announce('running "%s"' % cmd) + + paths = map(operator.attrgetter('location'), installed_dists) + with self.paths_on_pythonpath(paths): + with self.project_on_sys_path(): + self.run_tests() + + def run_tests(self): + # Purge modules under test from sys.modules. The test loader will + # re-import them from the build location. Required when 2to3 is used + # with namespace packages. + if six.PY3 and getattr(self.distribution, 'use_2to3', False): + module = self.test_suite.split('.')[0] + if module in _namespace_packages: + del_modules = [] + if module in sys.modules: + del_modules.append(module) + module += '.' + for name in sys.modules: + if name.startswith(module): + del_modules.append(name) + list(map(sys.modules.__delitem__, del_modules)) + + test = unittest.main( + None, None, self._argv, + testLoader=self._resolve_as_ep(self.test_loader), + testRunner=self._resolve_as_ep(self.test_runner), + exit=False, + ) + if not test.result.wasSuccessful(): + msg = 'Test failed: %s' % test.result + self.announce(msg, log.ERROR) + raise DistutilsError(msg) + + @property + def _argv(self): + return ['unittest'] + self.test_args + + @staticmethod + def _resolve_as_ep(val): + """ + Load the indicated attribute value, called, as a as if it were + specified as an entry point. + """ + if val is None: + return + parsed = EntryPoint.parse("x=" + val) + return parsed.resolve()() diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/upload.py b/myenv/lib/python3.7/site-packages/setuptools/command/upload.py new file mode 100644 index 000000000..a44173a99 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/upload.py @@ -0,0 +1,42 @@ +import getpass +from distutils.command import upload as orig + + +class upload(orig.upload): + """ + Override default upload behavior to obtain password + in a variety of different ways. + """ + + def finalize_options(self): + orig.upload.finalize_options(self) + self.username = ( + self.username or + getpass.getuser() + ) + # Attempt to obtain password. Short circuit evaluation at the first + # sign of success. + self.password = ( + self.password or + self._load_password_from_keyring() or + self._prompt_for_password() + ) + + def _load_password_from_keyring(self): + """ + Attempt to load password from keyring. Suppress Exceptions. + """ + try: + keyring = __import__('keyring') + return keyring.get_password(self.repository, self.username) + except Exception: + pass + + def _prompt_for_password(self): + """ + Prompt for a password on the tty. Suppress Exceptions. + """ + try: + return getpass.getpass() + except (Exception, KeyboardInterrupt): + pass diff --git a/myenv/lib/python3.7/site-packages/setuptools/command/upload_docs.py b/myenv/lib/python3.7/site-packages/setuptools/command/upload_docs.py new file mode 100644 index 000000000..07aa564af --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/command/upload_docs.py @@ -0,0 +1,206 @@ +# -*- coding: utf-8 -*- +"""upload_docs + +Implements a Distutils 'upload_docs' subcommand (upload documentation to +PyPI's pythonhosted.org). +""" + +from base64 import standard_b64encode +from distutils import log +from distutils.errors import DistutilsOptionError +import os +import socket +import zipfile +import tempfile +import shutil +import itertools +import functools + +from setuptools.extern import six +from setuptools.extern.six.moves import http_client, urllib + +from pkg_resources import iter_entry_points +from .upload import upload + + +def _encode(s): + errors = 'surrogateescape' if six.PY3 else 'strict' + return s.encode('utf-8', errors) + + +class upload_docs(upload): + # override the default repository as upload_docs isn't + # supported by Warehouse (and won't be). + DEFAULT_REPOSITORY = 'https://pypi.python.org/pypi/' + + description = 'Upload documentation to PyPI' + + user_options = [ + ('repository=', 'r', + "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), + ('show-response', None, + 'display full response text from server'), + ('upload-dir=', None, 'directory to upload'), + ] + boolean_options = upload.boolean_options + + def has_sphinx(self): + if self.upload_dir is None: + for ep in iter_entry_points('distutils.commands', 'build_sphinx'): + return True + + sub_commands = [('build_sphinx', has_sphinx)] + + def initialize_options(self): + upload.initialize_options(self) + self.upload_dir = None + self.target_dir = None + + def finalize_options(self): + upload.finalize_options(self) + if self.upload_dir is None: + if self.has_sphinx(): + build_sphinx = self.get_finalized_command('build_sphinx') + self.target_dir = build_sphinx.builder_target_dir + else: + build = self.get_finalized_command('build') + self.target_dir = os.path.join(build.build_base, 'docs') + else: + self.ensure_dirname('upload_dir') + self.target_dir = self.upload_dir + if 'pypi.python.org' in self.repository: + log.warn("Upload_docs command is deprecated. Use RTD instead.") + self.announce('Using upload directory %s' % self.target_dir) + + def create_zipfile(self, filename): + zip_file = zipfile.ZipFile(filename, "w") + try: + self.mkpath(self.target_dir) # just in case + for root, dirs, files in os.walk(self.target_dir): + if root == self.target_dir and not files: + tmpl = "no files found in upload directory '%s'" + raise DistutilsOptionError(tmpl % self.target_dir) + for name in files: + full = os.path.join(root, name) + relative = root[len(self.target_dir):].lstrip(os.path.sep) + dest = os.path.join(relative, name) + zip_file.write(full, dest) + finally: + zip_file.close() + + def run(self): + # Run sub commands + for cmd_name in self.get_sub_commands(): + self.run_command(cmd_name) + + tmp_dir = tempfile.mkdtemp() + name = self.distribution.metadata.get_name() + zip_file = os.path.join(tmp_dir, "%s.zip" % name) + try: + self.create_zipfile(zip_file) + self.upload_file(zip_file) + finally: + shutil.rmtree(tmp_dir) + + @staticmethod + def _build_part(item, sep_boundary): + key, values = item + title = '\nContent-Disposition: form-data; name="%s"' % key + # handle multiple entries for the same name + if not isinstance(values, list): + values = [values] + for value in values: + if isinstance(value, tuple): + title += '; filename="%s"' % value[0] + value = value[1] + else: + value = _encode(value) + yield sep_boundary + yield _encode(title) + yield b"\n\n" + yield value + if value and value[-1:] == b'\r': + yield b'\n' # write an extra newline (lurve Macs) + + @classmethod + def _build_multipart(cls, data): + """ + Build up the MIME payload for the POST data + """ + boundary = b'--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' + sep_boundary = b'\n--' + boundary + end_boundary = sep_boundary + b'--' + end_items = end_boundary, b"\n", + builder = functools.partial( + cls._build_part, + sep_boundary=sep_boundary, + ) + part_groups = map(builder, data.items()) + parts = itertools.chain.from_iterable(part_groups) + body_items = itertools.chain(parts, end_items) + content_type = 'multipart/form-data; boundary=%s' % boundary.decode('ascii') + return b''.join(body_items), content_type + + def upload_file(self, filename): + with open(filename, 'rb') as f: + content = f.read() + meta = self.distribution.metadata + data = { + ':action': 'doc_upload', + 'name': meta.get_name(), + 'content': (os.path.basename(filename), content), + } + # set up the authentication + credentials = _encode(self.username + ':' + self.password) + credentials = standard_b64encode(credentials) + if six.PY3: + credentials = credentials.decode('ascii') + auth = "Basic " + credentials + + body, ct = self._build_multipart(data) + + msg = "Submitting documentation to %s" % (self.repository) + self.announce(msg, log.INFO) + + # build the Request + # We can't use urllib2 since we need to send the Basic + # auth right with the first request + schema, netloc, url, params, query, fragments = \ + urllib.parse.urlparse(self.repository) + assert not params and not query and not fragments + if schema == 'http': + conn = http_client.HTTPConnection(netloc) + elif schema == 'https': + conn = http_client.HTTPSConnection(netloc) + else: + raise AssertionError("unsupported schema " + schema) + + data = '' + try: + conn.connect() + conn.putrequest("POST", url) + content_type = ct + conn.putheader('Content-type', content_type) + conn.putheader('Content-length', str(len(body))) + conn.putheader('Authorization', auth) + conn.endheaders() + conn.send(body) + except socket.error as e: + self.announce(str(e), log.ERROR) + return + + r = conn.getresponse() + if r.status == 200: + msg = 'Server response (%s): %s' % (r.status, r.reason) + self.announce(msg, log.INFO) + elif r.status == 301: + location = r.getheader('Location') + if location is None: + location = 'https://pythonhosted.org/%s/' % meta.get_name() + msg = 'Upload successful. Visit %s' % location + self.announce(msg, log.INFO) + else: + msg = 'Upload failed (%s): %s' % (r.status, r.reason) + self.announce(msg, log.ERROR) + if self.show_response: + print('-' * 75, r.read(), '-' * 75) diff --git a/myenv/lib/python3.7/site-packages/setuptools/config.py b/myenv/lib/python3.7/site-packages/setuptools/config.py new file mode 100644 index 000000000..8eddcae88 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/config.py @@ -0,0 +1,556 @@ +from __future__ import absolute_import, unicode_literals +import io +import os +import sys +from collections import defaultdict +from functools import partial +from importlib import import_module + +from distutils.errors import DistutilsOptionError, DistutilsFileError +from setuptools.extern.six import string_types + + +def read_configuration( + filepath, find_others=False, ignore_option_errors=False): + """Read given configuration file and returns options from it as a dict. + + :param str|unicode filepath: Path to configuration file + to get options from. + + :param bool find_others: Whether to search for other configuration files + which could be on in various places. + + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + + :rtype: dict + """ + from setuptools.dist import Distribution, _Distribution + + filepath = os.path.abspath(filepath) + + if not os.path.isfile(filepath): + raise DistutilsFileError( + 'Configuration file %s does not exist.' % filepath) + + current_directory = os.getcwd() + os.chdir(os.path.dirname(filepath)) + + try: + dist = Distribution() + + filenames = dist.find_config_files() if find_others else [] + if filepath not in filenames: + filenames.append(filepath) + + _Distribution.parse_config_files(dist, filenames=filenames) + + handlers = parse_configuration( + dist, dist.command_options, + ignore_option_errors=ignore_option_errors) + + finally: + os.chdir(current_directory) + + return configuration_to_dict(handlers) + + +def configuration_to_dict(handlers): + """Returns configuration data gathered by given handlers as a dict. + + :param list[ConfigHandler] handlers: Handlers list, + usually from parse_configuration() + + :rtype: dict + """ + config_dict = defaultdict(dict) + + for handler in handlers: + + obj_alias = handler.section_prefix + target_obj = handler.target_obj + + for option in handler.set_options: + getter = getattr(target_obj, 'get_%s' % option, None) + + if getter is None: + value = getattr(target_obj, option) + + else: + value = getter() + + config_dict[obj_alias][option] = value + + return config_dict + + +def parse_configuration( + distribution, command_options, ignore_option_errors=False): + """Performs additional parsing of configuration options + for a distribution. + + Returns a list of used option handlers. + + :param Distribution distribution: + :param dict command_options: + :param bool ignore_option_errors: Whether to silently ignore + options, values of which could not be resolved (e.g. due to exceptions + in directives such as file:, attr:, etc.). + If False exceptions are propagated as expected. + :rtype: list + """ + meta = ConfigMetadataHandler( + distribution.metadata, command_options, ignore_option_errors) + meta.parse() + + options = ConfigOptionsHandler( + distribution, command_options, ignore_option_errors) + options.parse() + + return meta, options + + +class ConfigHandler(object): + """Handles metadata supplied in configuration files.""" + + section_prefix = None + """Prefix for config sections handled by this handler. + Must be provided by class heirs. + + """ + + aliases = {} + """Options aliases. + For compatibility with various packages. E.g.: d2to1 and pbr. + Note: `-` in keys is replaced with `_` by config parser. + + """ + + def __init__(self, target_obj, options, ignore_option_errors=False): + sections = {} + + section_prefix = self.section_prefix + for section_name, section_options in options.items(): + if not section_name.startswith(section_prefix): + continue + + section_name = section_name.replace(section_prefix, '').strip('.') + sections[section_name] = section_options + + self.ignore_option_errors = ignore_option_errors + self.target_obj = target_obj + self.sections = sections + self.set_options = [] + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + raise NotImplementedError( + '%s must provide .parsers property' % self.__class__.__name__) + + def __setitem__(self, option_name, value): + unknown = tuple() + target_obj = self.target_obj + + # Translate alias into real name. + option_name = self.aliases.get(option_name, option_name) + + current_value = getattr(target_obj, option_name, unknown) + + if current_value is unknown: + raise KeyError(option_name) + + if current_value: + # Already inhabited. Skipping. + return + + skip_option = False + parser = self.parsers.get(option_name) + if parser: + try: + value = parser(value) + + except Exception: + skip_option = True + if not self.ignore_option_errors: + raise + + if skip_option: + return + + setter = getattr(target_obj, 'set_%s' % option_name, None) + if setter is None: + setattr(target_obj, option_name, value) + else: + setter(value) + + self.set_options.append(option_name) + + @classmethod + def _parse_list(cls, value, separator=','): + """Represents value as a list. + + Value is split either by separator (defaults to comma) or by lines. + + :param value: + :param separator: List items separator character. + :rtype: list + """ + if isinstance(value, list): # _get_parser_compound case + return value + + if '\n' in value: + value = value.splitlines() + else: + value = value.split(separator) + + return [chunk.strip() for chunk in value if chunk.strip()] + + @classmethod + def _parse_dict(cls, value): + """Represents value as a dict. + + :param value: + :rtype: dict + """ + separator = '=' + result = {} + for line in cls._parse_list(value): + key, sep, val = line.partition(separator) + if sep != separator: + raise DistutilsOptionError( + 'Unable to parse option value to dict: %s' % value) + result[key.strip()] = val.strip() + + return result + + @classmethod + def _parse_bool(cls, value): + """Represents value as boolean. + + :param value: + :rtype: bool + """ + value = value.lower() + return value in ('1', 'true', 'yes') + + @classmethod + def _parse_file(cls, value): + """Represents value as a string, allowing including text + from nearest files using `file:` directive. + + Directive is sandboxed and won't reach anything outside + directory with setup.py. + + Examples: + file: LICENSE + file: README.rst, CHANGELOG.md, src/file.txt + + :param str value: + :rtype: str + """ + include_directive = 'file:' + + if not isinstance(value, string_types): + return value + + if not value.startswith(include_directive): + return value + + spec = value[len(include_directive):] + filepaths = (os.path.abspath(path.strip()) for path in spec.split(',')) + return '\n'.join( + cls._read_file(path) + for path in filepaths + if (cls._assert_local(path) or True) + and os.path.isfile(path) + ) + + @staticmethod + def _assert_local(filepath): + if not filepath.startswith(os.getcwd()): + raise DistutilsOptionError( + '`file:` directive can not access %s' % filepath) + + @staticmethod + def _read_file(filepath): + with io.open(filepath, encoding='utf-8') as f: + return f.read() + + @classmethod + def _parse_attr(cls, value): + """Represents value as a module attribute. + + Examples: + attr: package.attr + attr: package.module.attr + + :param str value: + :rtype: str + """ + attr_directive = 'attr:' + if not value.startswith(attr_directive): + return value + + attrs_path = value.replace(attr_directive, '').strip().split('.') + attr_name = attrs_path.pop() + + module_name = '.'.join(attrs_path) + module_name = module_name or '__init__' + + sys.path.insert(0, os.getcwd()) + try: + module = import_module(module_name) + value = getattr(module, attr_name) + + finally: + sys.path = sys.path[1:] + + return value + + @classmethod + def _get_parser_compound(cls, *parse_methods): + """Returns parser function to represents value as a list. + + Parses a value applying given methods one after another. + + :param parse_methods: + :rtype: callable + """ + def parse(value): + parsed = value + + for method in parse_methods: + parsed = method(parsed) + + return parsed + + return parse + + @classmethod + def _parse_section_to_dict(cls, section_options, values_parser=None): + """Parses section options into a dictionary. + + Optionally applies a given parser to values. + + :param dict section_options: + :param callable values_parser: + :rtype: dict + """ + value = {} + values_parser = values_parser or (lambda val: val) + for key, (_, val) in section_options.items(): + value[key] = values_parser(val) + return value + + def parse_section(self, section_options): + """Parses configuration file section. + + :param dict section_options: + """ + for (name, (_, value)) in section_options.items(): + try: + self[name] = value + + except KeyError: + pass # Keep silent for a new option may appear anytime. + + def parse(self): + """Parses configuration file items from one + or more related sections. + + """ + for section_name, section_options in self.sections.items(): + + method_postfix = '' + if section_name: # [section.option] variant + method_postfix = '_%s' % section_name + + section_parser_method = getattr( + self, + # Dots in section names are tranlsated into dunderscores. + ('parse_section%s' % method_postfix).replace('.', '__'), + None) + + if section_parser_method is None: + raise DistutilsOptionError( + 'Unsupported distribution option section: [%s.%s]' % ( + self.section_prefix, section_name)) + + section_parser_method(section_options) + + +class ConfigMetadataHandler(ConfigHandler): + + section_prefix = 'metadata' + + aliases = { + 'home_page': 'url', + 'summary': 'description', + 'classifier': 'classifiers', + 'platform': 'platforms', + } + + strict_mode = False + """We need to keep it loose, to be partially compatible with + `pbr` and `d2to1` packages which also uses `metadata` section. + + """ + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_file = self._parse_file + parse_dict = self._parse_dict + + return { + 'platforms': parse_list, + 'keywords': parse_list, + 'provides': parse_list, + 'requires': parse_list, + 'obsoletes': parse_list, + 'classifiers': self._get_parser_compound(parse_file, parse_list), + 'license': parse_file, + 'description': parse_file, + 'long_description': parse_file, + 'version': self._parse_version, + 'project_urls': parse_dict, + } + + def _parse_version(self, value): + """Parses `version` option value. + + :param value: + :rtype: str + + """ + version = self._parse_attr(value) + + if callable(version): + version = version() + + if not isinstance(version, string_types): + if hasattr(version, '__iter__'): + version = '.'.join(map(str, version)) + else: + version = '%s' % version + + return version + + +class ConfigOptionsHandler(ConfigHandler): + + section_prefix = 'options' + + @property + def parsers(self): + """Metadata item name to parser function mapping.""" + parse_list = self._parse_list + parse_list_semicolon = partial(self._parse_list, separator=';') + parse_bool = self._parse_bool + parse_dict = self._parse_dict + + return { + 'zip_safe': parse_bool, + 'use_2to3': parse_bool, + 'include_package_data': parse_bool, + 'package_dir': parse_dict, + 'use_2to3_fixers': parse_list, + 'use_2to3_exclude_fixers': parse_list, + 'convert_2to3_doctests': parse_list, + 'scripts': parse_list, + 'eager_resources': parse_list, + 'dependency_links': parse_list, + 'namespace_packages': parse_list, + 'install_requires': parse_list_semicolon, + 'setup_requires': parse_list_semicolon, + 'tests_require': parse_list_semicolon, + 'packages': self._parse_packages, + 'entry_points': self._parse_file, + 'py_modules': parse_list, + } + + def _parse_packages(self, value): + """Parses `packages` option value. + + :param value: + :rtype: list + """ + find_directive = 'find:' + + if not value.startswith(find_directive): + return self._parse_list(value) + + # Read function arguments from a dedicated section. + find_kwargs = self.parse_section_packages__find( + self.sections.get('packages.find', {})) + + from setuptools import find_packages + + return find_packages(**find_kwargs) + + def parse_section_packages__find(self, section_options): + """Parses `packages.find` configuration file section. + + To be used in conjunction with _parse_packages(). + + :param dict section_options: + """ + section_data = self._parse_section_to_dict( + section_options, self._parse_list) + + valid_keys = ['where', 'include', 'exclude'] + + find_kwargs = dict( + [(k, v) for k, v in section_data.items() if k in valid_keys and v]) + + where = find_kwargs.get('where') + if where is not None: + find_kwargs['where'] = where[0] # cast list to single val + + return find_kwargs + + def parse_section_entry_points(self, section_options): + """Parses `entry_points` configuration file section. + + :param dict section_options: + """ + parsed = self._parse_section_to_dict(section_options, self._parse_list) + self['entry_points'] = parsed + + def _parse_package_data(self, section_options): + parsed = self._parse_section_to_dict(section_options, self._parse_list) + + root = parsed.get('*') + if root: + parsed[''] = root + del parsed['*'] + + return parsed + + def parse_section_package_data(self, section_options): + """Parses `package_data` configuration file section. + + :param dict section_options: + """ + self['package_data'] = self._parse_package_data(section_options) + + def parse_section_exclude_package_data(self, section_options): + """Parses `exclude_package_data` configuration file section. + + :param dict section_options: + """ + self['exclude_package_data'] = self._parse_package_data( + section_options) + + def parse_section_extras_require(self, section_options): + """Parses `extras_require` configuration file section. + + :param dict section_options: + """ + parse_list = partial(self._parse_list, separator=';') + self['extras_require'] = self._parse_section_to_dict( + section_options, parse_list) diff --git a/myenv/lib/python3.7/site-packages/setuptools/dep_util.py b/myenv/lib/python3.7/site-packages/setuptools/dep_util.py new file mode 100644 index 000000000..2931c13ec --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/dep_util.py @@ -0,0 +1,23 @@ +from distutils.dep_util import newer_group + +# yes, this is was almost entirely copy-pasted from +# 'newer_pairwise()', this is just another convenience +# function. +def newer_pairwise_group(sources_groups, targets): + """Walk both arguments in parallel, testing if each source group is newer + than its corresponding target. Returns a pair of lists (sources_groups, + targets) where sources is newer than target, according to the semantics + of 'newer_group()'. + """ + if len(sources_groups) != len(targets): + raise ValueError("'sources_group' and 'targets' must be the same length") + + # build a pair of lists (sources_groups, targets) where source is newer + n_sources = [] + n_targets = [] + for i in range(len(sources_groups)): + if newer_group(sources_groups[i], targets[i]): + n_sources.append(sources_groups[i]) + n_targets.append(targets[i]) + + return n_sources, n_targets diff --git a/myenv/lib/python3.7/site-packages/setuptools/depends.py b/myenv/lib/python3.7/site-packages/setuptools/depends.py new file mode 100644 index 000000000..45e7052d8 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/depends.py @@ -0,0 +1,186 @@ +import sys +import imp +import marshal +from distutils.version import StrictVersion +from imp import PKG_DIRECTORY, PY_COMPILED, PY_SOURCE, PY_FROZEN + +from .py33compat import Bytecode + + +__all__ = [ + 'Require', 'find_module', 'get_module_constant', 'extract_constant' +] + + +class Require: + """A prerequisite to building or installing a distribution""" + + def __init__(self, name, requested_version, module, homepage='', + attribute=None, format=None): + + if format is None and requested_version is not None: + format = StrictVersion + + if format is not None: + requested_version = format(requested_version) + if attribute is None: + attribute = '__version__' + + self.__dict__.update(locals()) + del self.self + + def full_name(self): + """Return full package/distribution name, w/version""" + if self.requested_version is not None: + return '%s-%s' % (self.name, self.requested_version) + return self.name + + def version_ok(self, version): + """Is 'version' sufficiently up-to-date?""" + return self.attribute is None or self.format is None or \ + str(version) != "unknown" and version >= self.requested_version + + def get_version(self, paths=None, default="unknown"): + """Get version number of installed module, 'None', or 'default' + + Search 'paths' for module. If not found, return 'None'. If found, + return the extracted version attribute, or 'default' if no version + attribute was specified, or the value cannot be determined without + importing the module. The version is formatted according to the + requirement's version format (if any), unless it is 'None' or the + supplied 'default'. + """ + + if self.attribute is None: + try: + f, p, i = find_module(self.module, paths) + if f: + f.close() + return default + except ImportError: + return None + + v = get_module_constant(self.module, self.attribute, default, paths) + + if v is not None and v is not default and self.format is not None: + return self.format(v) + + return v + + def is_present(self, paths=None): + """Return true if dependency is present on 'paths'""" + return self.get_version(paths) is not None + + def is_current(self, paths=None): + """Return true if dependency is present and up-to-date on 'paths'""" + version = self.get_version(paths) + if version is None: + return False + return self.version_ok(version) + + +def find_module(module, paths=None): + """Just like 'imp.find_module()', but with package support""" + + parts = module.split('.') + + while parts: + part = parts.pop(0) + f, path, (suffix, mode, kind) = info = imp.find_module(part, paths) + + if kind == PKG_DIRECTORY: + parts = parts or ['__init__'] + paths = [path] + + elif parts: + raise ImportError("Can't find %r in %s" % (parts, module)) + + return info + + +def get_module_constant(module, symbol, default=-1, paths=None): + """Find 'module' by searching 'paths', and extract 'symbol' + + Return 'None' if 'module' does not exist on 'paths', or it does not define + 'symbol'. If the module defines 'symbol' as a constant, return the + constant. Otherwise, return 'default'.""" + + try: + f, path, (suffix, mode, kind) = find_module(module, paths) + except ImportError: + # Module doesn't exist + return None + + try: + if kind == PY_COMPILED: + f.read(8) # skip magic & date + code = marshal.load(f) + elif kind == PY_FROZEN: + code = imp.get_frozen_object(module) + elif kind == PY_SOURCE: + code = compile(f.read(), path, 'exec') + else: + # Not something we can parse; we'll have to import it. :( + if module not in sys.modules: + imp.load_module(module, f, path, (suffix, mode, kind)) + return getattr(sys.modules[module], symbol, None) + + finally: + if f: + f.close() + + return extract_constant(code, symbol, default) + + +def extract_constant(code, symbol, default=-1): + """Extract the constant value of 'symbol' from 'code' + + If the name 'symbol' is bound to a constant value by the Python code + object 'code', return that value. If 'symbol' is bound to an expression, + return 'default'. Otherwise, return 'None'. + + Return value is based on the first assignment to 'symbol'. 'symbol' must + be a global, or at least a non-"fast" local in the code block. That is, + only 'STORE_NAME' and 'STORE_GLOBAL' opcodes are checked, and 'symbol' + must be present in 'code.co_names'. + """ + if symbol not in code.co_names: + # name's not there, can't possibly be an assignment + return None + + name_idx = list(code.co_names).index(symbol) + + STORE_NAME = 90 + STORE_GLOBAL = 97 + LOAD_CONST = 100 + + const = default + + for byte_code in Bytecode(code): + op = byte_code.opcode + arg = byte_code.arg + + if op == LOAD_CONST: + const = code.co_consts[arg] + elif arg == name_idx and (op == STORE_NAME or op == STORE_GLOBAL): + return const + else: + const = default + + +def _update_globals(): + """ + Patch the globals to remove the objects not available on some platforms. + + XXX it'd be better to test assertions about bytecode instead. + """ + + if not sys.platform.startswith('java') and sys.platform != 'cli': + return + incompatible = 'extract_constant', 'get_module_constant' + for name in incompatible: + del globals()[name] + __all__.remove(name) + + +_update_globals() diff --git a/myenv/lib/python3.7/site-packages/setuptools/dist.py b/myenv/lib/python3.7/site-packages/setuptools/dist.py new file mode 100644 index 000000000..284d922df --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/dist.py @@ -0,0 +1,1070 @@ +# -*- coding: utf-8 -*- +__all__ = ['Distribution'] + +import re +import os +import warnings +import numbers +import distutils.log +import distutils.core +import distutils.cmd +import distutils.dist +import itertools +from collections import defaultdict +from distutils.errors import ( + DistutilsOptionError, DistutilsPlatformError, DistutilsSetupError, +) +from distutils.util import rfc822_escape +from distutils.version import StrictVersion + +from setuptools.extern import six +from setuptools.extern import packaging +from setuptools.extern.six.moves import map, filter, filterfalse + +from setuptools.depends import Require +from setuptools import windows_support +from setuptools.monkey import get_unpatched +from setuptools.config import parse_configuration +import pkg_resources +from .py36compat import Distribution_parse_config_files + +__import__('setuptools.extern.packaging.specifiers') +__import__('setuptools.extern.packaging.version') + + +def _get_unpatched(cls): + warnings.warn("Do not call this function", DeprecationWarning) + return get_unpatched(cls) + + +def get_metadata_version(dist_md): + if dist_md.long_description_content_type or dist_md.provides_extras: + return StrictVersion('2.1') + elif (dist_md.maintainer is not None or + dist_md.maintainer_email is not None or + getattr(dist_md, 'python_requires', None) is not None): + return StrictVersion('1.2') + elif (dist_md.provides or dist_md.requires or dist_md.obsoletes or + dist_md.classifiers or dist_md.download_url): + return StrictVersion('1.1') + + return StrictVersion('1.0') + + +# Based on Python 3.5 version +def write_pkg_file(self, file): + """Write the PKG-INFO format data to a file object. + """ + version = get_metadata_version(self) + + file.write('Metadata-Version: %s\n' % version) + file.write('Name: %s\n' % self.get_name()) + file.write('Version: %s\n' % self.get_version()) + file.write('Summary: %s\n' % self.get_description()) + file.write('Home-page: %s\n' % self.get_url()) + + if version < StrictVersion('1.2'): + file.write('Author: %s\n' % self.get_contact()) + file.write('Author-email: %s\n' % self.get_contact_email()) + else: + optional_fields = ( + ('Author', 'author'), + ('Author-email', 'author_email'), + ('Maintainer', 'maintainer'), + ('Maintainer-email', 'maintainer_email'), + ) + + for field, attr in optional_fields: + attr_val = getattr(self, attr) + if six.PY2: + attr_val = self._encode_field(attr_val) + + if attr_val is not None: + file.write('%s: %s\n' % (field, attr_val)) + + file.write('License: %s\n' % self.get_license()) + if self.download_url: + file.write('Download-URL: %s\n' % self.download_url) + for project_url in self.project_urls.items(): + file.write('Project-URL: %s, %s\n' % project_url) + + long_desc = rfc822_escape(self.get_long_description()) + file.write('Description: %s\n' % long_desc) + + keywords = ','.join(self.get_keywords()) + if keywords: + file.write('Keywords: %s\n' % keywords) + + if version >= StrictVersion('1.2'): + for platform in self.get_platforms(): + file.write('Platform: %s\n' % platform) + else: + self._write_list(file, 'Platform', self.get_platforms()) + + self._write_list(file, 'Classifier', self.get_classifiers()) + + # PEP 314 + self._write_list(file, 'Requires', self.get_requires()) + self._write_list(file, 'Provides', self.get_provides()) + self._write_list(file, 'Obsoletes', self.get_obsoletes()) + + # Setuptools specific for PEP 345 + if hasattr(self, 'python_requires'): + file.write('Requires-Python: %s\n' % self.python_requires) + + # PEP 566 + if self.long_description_content_type: + file.write( + 'Description-Content-Type: %s\n' % + self.long_description_content_type + ) + if self.provides_extras: + for extra in self.provides_extras: + file.write('Provides-Extra: %s\n' % extra) + + +# from Python 3.4 +def write_pkg_info(self, base_dir): + """Write the PKG-INFO file into the release tree. + """ + with open(os.path.join(base_dir, 'PKG-INFO'), 'w', + encoding='UTF-8') as pkg_info: + self.write_pkg_file(pkg_info) + + +sequence = tuple, list + + +def check_importable(dist, attr, value): + try: + ep = pkg_resources.EntryPoint.parse('x=' + value) + assert not ep.extras + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be importable 'module:attrs' string (got %r)" + % (attr, value) + ) + + +def assert_string_list(dist, attr, value): + """Verify that value is a string list or None""" + try: + assert ''.join(value) != value + except (TypeError, ValueError, AttributeError, AssertionError): + raise DistutilsSetupError( + "%r must be a list of strings (got %r)" % (attr, value) + ) + + +def check_nsp(dist, attr, value): + """Verify that namespace packages are valid""" + ns_packages = value + assert_string_list(dist, attr, ns_packages) + for nsp in ns_packages: + if not dist.has_contents_for(nsp): + raise DistutilsSetupError( + "Distribution contains no modules or packages for " + + "namespace package %r" % nsp + ) + parent, sep, child = nsp.rpartition('.') + if parent and parent not in ns_packages: + distutils.log.warn( + "WARNING: %r is declared as a package namespace, but %r" + " is not: please correct this in setup.py", nsp, parent + ) + + +def check_extras(dist, attr, value): + """Verify that extras_require mapping is valid""" + try: + list(itertools.starmap(_check_extra, value.items())) + except (TypeError, ValueError, AttributeError): + raise DistutilsSetupError( + "'extras_require' must be a dictionary whose values are " + "strings or lists of strings containing valid project/version " + "requirement specifiers." + ) + + +def _check_extra(extra, reqs): + name, sep, marker = extra.partition(':') + if marker and pkg_resources.invalid_marker(marker): + raise DistutilsSetupError("Invalid environment marker: " + marker) + list(pkg_resources.parse_requirements(reqs)) + + +def assert_bool(dist, attr, value): + """Verify that value is True, False, 0, or 1""" + if bool(value) != value: + tmpl = "{attr!r} must be a boolean value (got {value!r})" + raise DistutilsSetupError(tmpl.format(attr=attr, value=value)) + + +def check_requirements(dist, attr, value): + """Verify that install_requires is a valid requirements list""" + try: + list(pkg_resources.parse_requirements(value)) + if isinstance(value, (dict, set)): + raise TypeError("Unordered types are not allowed") + except (TypeError, ValueError) as error: + tmpl = ( + "{attr!r} must be a string or list of strings " + "containing valid project/version requirement specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_specifier(dist, attr, value): + """Verify that value is a valid version specifier""" + try: + packaging.specifiers.SpecifierSet(value) + except packaging.specifiers.InvalidSpecifier as error: + tmpl = ( + "{attr!r} must be a string " + "containing valid version specifiers; {error}" + ) + raise DistutilsSetupError(tmpl.format(attr=attr, error=error)) + + +def check_entry_points(dist, attr, value): + """Verify that entry_points map is parseable""" + try: + pkg_resources.EntryPoint.parse_map(value) + except ValueError as e: + raise DistutilsSetupError(e) + + +def check_test_suite(dist, attr, value): + if not isinstance(value, six.string_types): + raise DistutilsSetupError("test_suite must be a string") + + +def check_package_data(dist, attr, value): + """Verify that value is a dictionary of package names to glob lists""" + if isinstance(value, dict): + for k, v in value.items(): + if not isinstance(k, str): + break + try: + iter(v) + except TypeError: + break + else: + return + raise DistutilsSetupError( + attr + " must be a dictionary mapping package names to lists of " + "wildcard patterns" + ) + + +def check_packages(dist, attr, value): + for pkgname in value: + if not re.match(r'\w+(\.\w+)*', pkgname): + distutils.log.warn( + "WARNING: %r not a valid package name; please use only " + ".-separated package names in setup.py", pkgname + ) + + +_Distribution = get_unpatched(distutils.core.Distribution) + + +class Distribution(Distribution_parse_config_files, _Distribution): + """Distribution with support for features, tests, and package data + + This is an enhanced version of 'distutils.dist.Distribution' that + effectively adds the following new optional keyword arguments to 'setup()': + + 'install_requires' -- a string or sequence of strings specifying project + versions that the distribution requires when installed, in the format + used by 'pkg_resources.require()'. They will be installed + automatically when the package is installed. If you wish to use + packages that are not available in PyPI, or want to give your users an + alternate download location, you can add a 'find_links' option to the + '[easy_install]' section of your project's 'setup.cfg' file, and then + setuptools will scan the listed web pages for links that satisfy the + requirements. + + 'extras_require' -- a dictionary mapping names of optional "extras" to the + additional requirement(s) that using those extras incurs. For example, + this:: + + extras_require = dict(reST = ["docutils>=0.3", "reSTedit"]) + + indicates that the distribution can optionally provide an extra + capability called "reST", but it can only be used if docutils and + reSTedit are installed. If the user installs your package using + EasyInstall and requests one of your extras, the corresponding + additional requirements will be installed if needed. + + 'features' **deprecated** -- a dictionary mapping option names to + 'setuptools.Feature' + objects. Features are a portion of the distribution that can be + included or excluded based on user options, inter-feature dependencies, + and availability on the current system. Excluded features are omitted + from all setup commands, including source and binary distributions, so + you can create multiple distributions from the same source tree. + Feature names should be valid Python identifiers, except that they may + contain the '-' (minus) sign. Features can be included or excluded + via the command line options '--with-X' and '--without-X', where 'X' is + the name of the feature. Whether a feature is included by default, and + whether you are allowed to control this from the command line, is + determined by the Feature object. See the 'Feature' class for more + information. + + 'test_suite' -- the name of a test suite to run for the 'test' command. + If the user runs 'python setup.py test', the package will be installed, + and the named test suite will be run. The format is the same as + would be used on a 'unittest.py' command line. That is, it is the + dotted name of an object to import and call to generate a test suite. + + 'package_data' -- a dictionary mapping package names to lists of filenames + or globs to use to find data files contained in the named packages. + If the dictionary has filenames or globs listed under '""' (the empty + string), those names will be searched for in every package, in addition + to any names for the specific package. Data files found using these + names/globs will be installed along with the package, in the same + location as the package. Note that globs are allowed to reference + the contents of non-package subdirectories, as long as you use '/' as + a path separator. (Globs are automatically converted to + platform-specific paths at runtime.) + + In addition to these new keywords, this class also has several new methods + for manipulating the distribution's contents. For example, the 'include()' + and 'exclude()' methods can be thought of as in-place add and subtract + commands that add or remove packages, modules, extensions, and so on from + the distribution. They are used by the feature subsystem to configure the + distribution for the included and excluded features. + """ + + _patched_dist = None + + def patch_missing_pkg_info(self, attrs): + # Fake up a replacement for the data that would normally come from + # PKG-INFO, but which might not yet be built if this is a fresh + # checkout. + # + if not attrs or 'name' not in attrs or 'version' not in attrs: + return + key = pkg_resources.safe_name(str(attrs['name'])).lower() + dist = pkg_resources.working_set.by_key.get(key) + if dist is not None and not dist.has_metadata('PKG-INFO'): + dist._version = pkg_resources.safe_version(str(attrs['version'])) + self._patched_dist = dist + + def __init__(self, attrs=None): + have_package_data = hasattr(self, "package_data") + if not have_package_data: + self.package_data = {} + attrs = attrs or {} + if 'features' in attrs or 'require_features' in attrs: + Feature.warn_deprecated() + self.require_features = [] + self.features = {} + self.dist_files = [] + self.src_root = attrs.pop("src_root", None) + self.patch_missing_pkg_info(attrs) + self.project_urls = attrs.get('project_urls', {}) + self.dependency_links = attrs.pop('dependency_links', []) + self.setup_requires = attrs.pop('setup_requires', []) + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + vars(self).setdefault(ep.name, None) + _Distribution.__init__(self, attrs) + + # The project_urls attribute may not be supported in distutils, so + # prime it here from our value if not automatically set + self.metadata.project_urls = getattr( + self.metadata, 'project_urls', self.project_urls) + self.metadata.long_description_content_type = attrs.get( + 'long_description_content_type' + ) + self.metadata.provides_extras = getattr( + self.metadata, 'provides_extras', set() + ) + + if isinstance(self.metadata.version, numbers.Number): + # Some people apparently take "version number" too literally :) + self.metadata.version = str(self.metadata.version) + + if self.metadata.version is not None: + try: + ver = packaging.version.Version(self.metadata.version) + normalized_version = str(ver) + if self.metadata.version != normalized_version: + warnings.warn( + "Normalizing '%s' to '%s'" % ( + self.metadata.version, + normalized_version, + ) + ) + self.metadata.version = normalized_version + except (packaging.version.InvalidVersion, TypeError): + warnings.warn( + "The version specified (%r) is an invalid version, this " + "may not work as expected with newer versions of " + "setuptools, pip, and PyPI. Please see PEP 440 for more " + "details." % self.metadata.version + ) + self._finalize_requires() + + def _finalize_requires(self): + """ + Set `metadata.python_requires` and fix environment markers + in `install_requires` and `extras_require`. + """ + if getattr(self, 'python_requires', None): + self.metadata.python_requires = self.python_requires + + if getattr(self, 'extras_require', None): + for extra in self.extras_require.keys(): + # Since this gets called multiple times at points where the + # keys have become 'converted' extras, ensure that we are only + # truly adding extras we haven't seen before here. + extra = extra.split(':')[0] + if extra: + self.metadata.provides_extras.add(extra) + + self._convert_extras_requirements() + self._move_install_requirements_markers() + + def _convert_extras_requirements(self): + """ + Convert requirements in `extras_require` of the form + `"extra": ["barbazquux; {marker}"]` to + `"extra:{marker}": ["barbazquux"]`. + """ + spec_ext_reqs = getattr(self, 'extras_require', None) or {} + self._tmp_extras_require = defaultdict(list) + for section, v in spec_ext_reqs.items(): + # Do not strip empty sections. + self._tmp_extras_require[section] + for r in pkg_resources.parse_requirements(v): + suffix = self._suffix_for(r) + self._tmp_extras_require[section + suffix].append(r) + + @staticmethod + def _suffix_for(req): + """ + For a requirement, return the 'extras_require' suffix for + that requirement. + """ + return ':' + str(req.marker) if req.marker else '' + + def _move_install_requirements_markers(self): + """ + Move requirements in `install_requires` that are using environment + markers `extras_require`. + """ + + # divide the install_requires into two sets, simple ones still + # handled by install_requires and more complex ones handled + # by extras_require. + + def is_simple_req(req): + return not req.marker + + spec_inst_reqs = getattr(self, 'install_requires', None) or () + inst_reqs = list(pkg_resources.parse_requirements(spec_inst_reqs)) + simple_reqs = filter(is_simple_req, inst_reqs) + complex_reqs = filterfalse(is_simple_req, inst_reqs) + self.install_requires = list(map(str, simple_reqs)) + + for r in complex_reqs: + self._tmp_extras_require[':' + str(r.marker)].append(r) + self.extras_require = dict( + (k, [str(r) for r in map(self._clean_req, v)]) + for k, v in self._tmp_extras_require.items() + ) + + def _clean_req(self, req): + """ + Given a Requirement, remove environment markers and return it. + """ + req.marker = None + return req + + def parse_config_files(self, filenames=None, ignore_option_errors=False): + """Parses configuration files from various levels + and loads configuration. + + """ + _Distribution.parse_config_files(self, filenames=filenames) + + parse_configuration(self, self.command_options, + ignore_option_errors=ignore_option_errors) + self._finalize_requires() + + def parse_command_line(self): + """Process features after parsing command line options""" + result = _Distribution.parse_command_line(self) + if self.features: + self._finalize_features() + return result + + def _feature_attrname(self, name): + """Convert feature name to corresponding option attribute name""" + return 'with_' + name.replace('-', '_') + + def fetch_build_eggs(self, requires): + """Resolve pre-setup requirements""" + resolved_dists = pkg_resources.working_set.resolve( + pkg_resources.parse_requirements(requires), + installer=self.fetch_build_egg, + replace_conflicting=True, + ) + for dist in resolved_dists: + pkg_resources.working_set.add(dist, replace=True) + return resolved_dists + + def finalize_options(self): + _Distribution.finalize_options(self) + if self.features: + self._set_global_opts_from_features() + + for ep in pkg_resources.iter_entry_points('distutils.setup_keywords'): + value = getattr(self, ep.name, None) + if value is not None: + ep.require(installer=self.fetch_build_egg) + ep.load()(self, ep.name, value) + if getattr(self, 'convert_2to3_doctests', None): + # XXX may convert to set here when we can rely on set being builtin + self.convert_2to3_doctests = [ + os.path.abspath(p) + for p in self.convert_2to3_doctests + ] + else: + self.convert_2to3_doctests = [] + + def get_egg_cache_dir(self): + egg_cache_dir = os.path.join(os.curdir, '.eggs') + if not os.path.exists(egg_cache_dir): + os.mkdir(egg_cache_dir) + windows_support.hide_file(egg_cache_dir) + readme_txt_filename = os.path.join(egg_cache_dir, 'README.txt') + with open(readme_txt_filename, 'w') as f: + f.write('This directory contains eggs that were downloaded ' + 'by setuptools to build, test, and run plug-ins.\n\n') + f.write('This directory caches those eggs to prevent ' + 'repeated downloads.\n\n') + f.write('However, it is safe to delete this directory.\n\n') + + return egg_cache_dir + + def fetch_build_egg(self, req): + """Fetch an egg needed for building""" + from setuptools.command.easy_install import easy_install + dist = self.__class__({'script_args': ['easy_install']}) + opts = dist.get_option_dict('easy_install') + opts.clear() + opts.update( + (k, v) + for k, v in self.get_option_dict('easy_install').items() + if k in ( + # don't use any other settings + 'find_links', 'site_dirs', 'index_url', + 'optimize', 'site_dirs', 'allow_hosts', + )) + if self.dependency_links: + links = self.dependency_links[:] + if 'find_links' in opts: + links = opts['find_links'][1] + links + opts['find_links'] = ('setup', links) + install_dir = self.get_egg_cache_dir() + cmd = easy_install( + dist, args=["x"], install_dir=install_dir, + exclude_scripts=True, + always_copy=False, build_directory=None, editable=False, + upgrade=False, multi_version=True, no_report=True, user=False + ) + cmd.ensure_finalized() + return cmd.easy_install(req) + + def _set_global_opts_from_features(self): + """Add --with-X/--without-X options based on optional features""" + + go = [] + no = self.negative_opt.copy() + + for name, feature in self.features.items(): + self._set_feature(name, None) + feature.validate(self) + + if feature.optional: + descr = feature.description + incdef = ' (default)' + excdef = '' + if not feature.include_by_default(): + excdef, incdef = incdef, excdef + + new = ( + ('with-' + name, None, 'include ' + descr + incdef), + ('without-' + name, None, 'exclude ' + descr + excdef), + ) + go.extend(new) + no['without-' + name] = 'with-' + name + + self.global_options = self.feature_options = go + self.global_options + self.negative_opt = self.feature_negopt = no + + def _finalize_features(self): + """Add/remove features and resolve dependencies between them""" + + # First, flag all the enabled items (and thus their dependencies) + for name, feature in self.features.items(): + enabled = self.feature_is_included(name) + if enabled or (enabled is None and feature.include_by_default()): + feature.include_in(self) + self._set_feature(name, 1) + + # Then disable the rest, so that off-by-default features don't + # get flagged as errors when they're required by an enabled feature + for name, feature in self.features.items(): + if not self.feature_is_included(name): + feature.exclude_from(self) + self._set_feature(name, 0) + + def get_command_class(self, command): + """Pluggable version of get_command_class()""" + if command in self.cmdclass: + return self.cmdclass[command] + + eps = pkg_resources.iter_entry_points('distutils.commands', command) + for ep in eps: + ep.require(installer=self.fetch_build_egg) + self.cmdclass[command] = cmdclass = ep.load() + return cmdclass + else: + return _Distribution.get_command_class(self, command) + + def print_commands(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.print_commands(self) + + def get_command_list(self): + for ep in pkg_resources.iter_entry_points('distutils.commands'): + if ep.name not in self.cmdclass: + # don't require extras as the commands won't be invoked + cmdclass = ep.resolve() + self.cmdclass[ep.name] = cmdclass + return _Distribution.get_command_list(self) + + def _set_feature(self, name, status): + """Set feature's inclusion status""" + setattr(self, self._feature_attrname(name), status) + + def feature_is_included(self, name): + """Return 1 if feature is included, 0 if excluded, 'None' if unknown""" + return getattr(self, self._feature_attrname(name)) + + def include_feature(self, name): + """Request inclusion of feature named 'name'""" + + if self.feature_is_included(name) == 0: + descr = self.features[name].description + raise DistutilsOptionError( + descr + " is required, but was excluded or is not available" + ) + self.features[name].include_in(self) + self._set_feature(name, 1) + + def include(self, **attrs): + """Add items to distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would add 'x' to + the distribution's 'py_modules' attribute, if it was not already + there. + + Currently, this method only supports inclusion for attributes that are + lists or tuples. If you need to add support for adding to other + attributes in this or a subclass, you can add an '_include_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'include()'. So, 'dist.include(foo={"bar":"baz"})' + will try to call 'dist._include_foo({"bar":"baz"})', which can then + handle whatever special inclusion logic is needed. + """ + for k, v in attrs.items(): + include = getattr(self, '_include_' + k, None) + if include: + include(v) + else: + self._include_misc(k, v) + + def exclude_package(self, package): + """Remove packages, modules, and extensions in named package""" + + pfx = package + '.' + if self.packages: + self.packages = [ + p for p in self.packages + if p != package and not p.startswith(pfx) + ] + + if self.py_modules: + self.py_modules = [ + p for p in self.py_modules + if p != package and not p.startswith(pfx) + ] + + if self.ext_modules: + self.ext_modules = [ + p for p in self.ext_modules + if p.name != package and not p.name.startswith(pfx) + ] + + def has_contents_for(self, package): + """Return true if 'exclude_package(package)' would do something""" + + pfx = package + '.' + + for p in self.iter_distribution_names(): + if p == package or p.startswith(pfx): + return True + + def _exclude_misc(self, name, value): + """Handle 'exclude()' for list/tuple attrs without a special handler""" + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list or tuple (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is not None and not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + elif old: + setattr(self, name, [item for item in old if item not in value]) + + def _include_misc(self, name, value): + """Handle 'include()' for list/tuple attrs without a special handler""" + + if not isinstance(value, sequence): + raise DistutilsSetupError( + "%s: setting must be a list (%r)" % (name, value) + ) + try: + old = getattr(self, name) + except AttributeError: + raise DistutilsSetupError( + "%s: No such distribution setting" % name + ) + if old is None: + setattr(self, name, value) + elif not isinstance(old, sequence): + raise DistutilsSetupError( + name + ": this setting cannot be changed via include/exclude" + ) + else: + new = [item for item in value if item not in old] + setattr(self, name, old + new) + + def exclude(self, **attrs): + """Remove items from distribution that are named in keyword arguments + + For example, 'dist.exclude(py_modules=["x"])' would remove 'x' from + the distribution's 'py_modules' attribute. Excluding packages uses + the 'exclude_package()' method, so all of the package's contained + packages, modules, and extensions are also excluded. + + Currently, this method only supports exclusion from attributes that are + lists or tuples. If you need to add support for excluding from other + attributes in this or a subclass, you can add an '_exclude_X' method, + where 'X' is the name of the attribute. The method will be called with + the value passed to 'exclude()'. So, 'dist.exclude(foo={"bar":"baz"})' + will try to call 'dist._exclude_foo({"bar":"baz"})', which can then + handle whatever special exclusion logic is needed. + """ + for k, v in attrs.items(): + exclude = getattr(self, '_exclude_' + k, None) + if exclude: + exclude(v) + else: + self._exclude_misc(k, v) + + def _exclude_packages(self, packages): + if not isinstance(packages, sequence): + raise DistutilsSetupError( + "packages: setting must be a list or tuple (%r)" % (packages,) + ) + list(map(self.exclude_package, packages)) + + def _parse_command_opts(self, parser, args): + # Remove --with-X/--without-X options when processing command args + self.global_options = self.__class__.global_options + self.negative_opt = self.__class__.negative_opt + + # First, expand any aliases + command = args[0] + aliases = self.get_option_dict('aliases') + while command in aliases: + src, alias = aliases[command] + del aliases[command] # ensure each alias can expand only once! + import shlex + args[:1] = shlex.split(alias, True) + command = args[0] + + nargs = _Distribution._parse_command_opts(self, parser, args) + + # Handle commands that want to consume all remaining arguments + cmd_class = self.get_command_class(command) + if getattr(cmd_class, 'command_consumes_arguments', None): + self.get_option_dict(command)['args'] = ("command line", nargs) + if nargs is not None: + return [] + + return nargs + + def get_cmdline_options(self): + """Return a '{cmd: {opt:val}}' map of all command-line options + + Option names are all long, but do not include the leading '--', and + contain dashes rather than underscores. If the option doesn't take + an argument (e.g. '--quiet'), the 'val' is 'None'. + + Note that options provided by config files are intentionally excluded. + """ + + d = {} + + for cmd, opts in self.command_options.items(): + + for opt, (src, val) in opts.items(): + + if src != "command line": + continue + + opt = opt.replace('_', '-') + + if val == 0: + cmdobj = self.get_command_obj(cmd) + neg_opt = self.negative_opt.copy() + neg_opt.update(getattr(cmdobj, 'negative_opt', {})) + for neg, pos in neg_opt.items(): + if pos == opt: + opt = neg + val = None + break + else: + raise AssertionError("Shouldn't be able to get here") + + elif val == 1: + val = None + + d.setdefault(cmd, {})[opt] = val + + return d + + def iter_distribution_names(self): + """Yield all packages, modules, and extension names in distribution""" + + for pkg in self.packages or (): + yield pkg + + for module in self.py_modules or (): + yield module + + for ext in self.ext_modules or (): + if isinstance(ext, tuple): + name, buildinfo = ext + else: + name = ext.name + if name.endswith('module'): + name = name[:-6] + yield name + + def handle_display_options(self, option_order): + """If there were any non-global "display-only" options + (--help-commands or the metadata display options) on the command + line, display the requested info and return true; else return + false. + """ + import sys + + if six.PY2 or self.help_commands: + return _Distribution.handle_display_options(self, option_order) + + # Stdout may be StringIO (e.g. in tests) + import io + if not isinstance(sys.stdout, io.TextIOWrapper): + return _Distribution.handle_display_options(self, option_order) + + # Don't wrap stdout if utf-8 is already the encoding. Provides + # workaround for #334. + if sys.stdout.encoding.lower() in ('utf-8', 'utf8'): + return _Distribution.handle_display_options(self, option_order) + + # Print metadata in UTF-8 no matter the platform + encoding = sys.stdout.encoding + errors = sys.stdout.errors + newline = sys.platform != 'win32' and '\n' or None + line_buffering = sys.stdout.line_buffering + + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), 'utf-8', errors, newline, line_buffering) + try: + return _Distribution.handle_display_options(self, option_order) + finally: + sys.stdout = io.TextIOWrapper( + sys.stdout.detach(), encoding, errors, newline, line_buffering) + + +class Feature: + """ + **deprecated** -- The `Feature` facility was never completely implemented + or supported, `has reported issues + <https://github.com/pypa/setuptools/issues/58>`_ and will be removed in + a future version. + + A subset of the distribution that can be excluded if unneeded/wanted + + Features are created using these keyword arguments: + + 'description' -- a short, human readable description of the feature, to + be used in error messages, and option help messages. + + 'standard' -- if true, the feature is included by default if it is + available on the current system. Otherwise, the feature is only + included if requested via a command line '--with-X' option, or if + another included feature requires it. The default setting is 'False'. + + 'available' -- if true, the feature is available for installation on the + current system. The default setting is 'True'. + + 'optional' -- if true, the feature's inclusion can be controlled from the + command line, using the '--with-X' or '--without-X' options. If + false, the feature's inclusion status is determined automatically, + based on 'availabile', 'standard', and whether any other feature + requires it. The default setting is 'True'. + + 'require_features' -- a string or sequence of strings naming features + that should also be included if this feature is included. Defaults to + empty list. May also contain 'Require' objects that should be + added/removed from the distribution. + + 'remove' -- a string or list of strings naming packages to be removed + from the distribution if this feature is *not* included. If the + feature *is* included, this argument is ignored. This argument exists + to support removing features that "crosscut" a distribution, such as + defining a 'tests' feature that removes all the 'tests' subpackages + provided by other features. The default for this argument is an empty + list. (Note: the named package(s) or modules must exist in the base + distribution when the 'setup()' function is initially called.) + + other keywords -- any other keyword arguments are saved, and passed to + the distribution's 'include()' and 'exclude()' methods when the + feature is included or excluded, respectively. So, for example, you + could pass 'packages=["a","b"]' to cause packages 'a' and 'b' to be + added or removed from the distribution as appropriate. + + A feature must include at least one 'requires', 'remove', or other + keyword argument. Otherwise, it can't affect the distribution in any way. + Note also that you can subclass 'Feature' to create your own specialized + feature types that modify the distribution in other ways when included or + excluded. See the docstrings for the various methods here for more detail. + Aside from the methods, the only feature attributes that distributions look + at are 'description' and 'optional'. + """ + + @staticmethod + def warn_deprecated(): + msg = ( + "Features are deprecated and will be removed in a future " + "version. See https://github.com/pypa/setuptools/issues/65." + ) + warnings.warn(msg, DeprecationWarning, stacklevel=3) + + def __init__( + self, description, standard=False, available=True, + optional=True, require_features=(), remove=(), **extras): + self.warn_deprecated() + + self.description = description + self.standard = standard + self.available = available + self.optional = optional + if isinstance(require_features, (str, Require)): + require_features = require_features, + + self.require_features = [ + r for r in require_features if isinstance(r, str) + ] + er = [r for r in require_features if not isinstance(r, str)] + if er: + extras['require_features'] = er + + if isinstance(remove, str): + remove = remove, + self.remove = remove + self.extras = extras + + if not remove and not require_features and not extras: + raise DistutilsSetupError( + "Feature %s: must define 'require_features', 'remove', or " + "at least one of 'packages', 'py_modules', etc." + ) + + def include_by_default(self): + """Should this feature be included by default?""" + return self.available and self.standard + + def include_in(self, dist): + """Ensure feature and its requirements are included in distribution + + You may override this in a subclass to perform additional operations on + the distribution. Note that this method may be called more than once + per feature, and so should be idempotent. + + """ + + if not self.available: + raise DistutilsPlatformError( + self.description + " is required, " + "but is not available on this platform" + ) + + dist.include(**self.extras) + + for f in self.require_features: + dist.include_feature(f) + + def exclude_from(self, dist): + """Ensure feature is excluded from distribution + + You may override this in a subclass to perform additional operations on + the distribution. This method will be called at most once per + feature, and only after all included features have been asked to + include themselves. + """ + + dist.exclude(**self.extras) + + if self.remove: + for item in self.remove: + dist.exclude_package(item) + + def validate(self, dist): + """Verify that feature makes sense in context of distribution + + This method is called by the distribution just before it parses its + command line. It checks to ensure that the 'remove' attribute, if any, + contains only valid package/module names that are present in the base + distribution when 'setup()' is called. You may override it in a + subclass to perform any other required validation of the feature + against a target distribution. + """ + + for item in self.remove: + if not dist.has_contents_for(item): + raise DistutilsSetupError( + "%s wants to be able to remove %s, but the distribution" + " doesn't contain any packages or modules under %s" + % (self.description, item, item) + ) diff --git a/myenv/lib/python3.7/site-packages/setuptools/extension.py b/myenv/lib/python3.7/site-packages/setuptools/extension.py new file mode 100644 index 000000000..29468894f --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/extension.py @@ -0,0 +1,57 @@ +import re +import functools +import distutils.core +import distutils.errors +import distutils.extension + +from setuptools.extern.six.moves import map + +from .monkey import get_unpatched + + +def _have_cython(): + """ + Return True if Cython can be imported. + """ + cython_impl = 'Cython.Distutils.build_ext' + try: + # from (cython_impl) import build_ext + __import__(cython_impl, fromlist=['build_ext']).build_ext + return True + except Exception: + pass + return False + + +# for compatibility +have_pyrex = _have_cython + +_Extension = get_unpatched(distutils.core.Extension) + + +class Extension(_Extension): + """Extension that uses '.c' files in place of '.pyx' files""" + + def __init__(self, name, sources, *args, **kw): + # The *args is needed for compatibility as calls may use positional + # arguments. py_limited_api may be set only via keyword. + self.py_limited_api = kw.pop("py_limited_api", False) + _Extension.__init__(self, name, sources, *args, **kw) + + def _convert_pyx_sources_to_lang(self): + """ + Replace sources with .pyx extensions to sources with the target + language extension. This mechanism allows language authors to supply + pre-converted sources but to prefer the .pyx sources. + """ + if _have_cython(): + # the build has Cython, so allow it to compile the .pyx files + return + lang = self.language or '' + target_ext = '.cpp' if lang.lower() == 'c++' else '.c' + sub = functools.partial(re.sub, '.pyx$', target_ext) + self.sources = list(map(sub, self.sources)) + + +class Library(Extension): + """Just like a regular Extension, but built as a library instead""" diff --git a/myenv/lib/python3.7/site-packages/setuptools/extern/__init__.py b/myenv/lib/python3.7/site-packages/setuptools/extern/__init__.py new file mode 100644 index 000000000..da3d668d9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/extern/__init__.py @@ -0,0 +1,73 @@ +import sys + + +class VendorImporter: + """ + A PEP 302 meta path importer for finding optionally-vendored + or otherwise naturally-installed packages from root_name. + """ + + def __init__(self, root_name, vendored_names=(), vendor_pkg=None): + self.root_name = root_name + self.vendored_names = set(vendored_names) + self.vendor_pkg = vendor_pkg or root_name.replace('extern', '_vendor') + + @property + def search_path(self): + """ + Search first the vendor package then as a natural package. + """ + yield self.vendor_pkg + '.' + yield '' + + def find_module(self, fullname, path=None): + """ + Return self when fullname starts with root_name and the + target module is one vendored through this importer. + """ + root, base, target = fullname.partition(self.root_name + '.') + if root: + return + if not any(map(target.startswith, self.vendored_names)): + return + return self + + def load_module(self, fullname): + """ + Iterate over the search path to locate and load fullname. + """ + root, base, target = fullname.partition(self.root_name + '.') + for prefix in self.search_path: + try: + extant = prefix + target + __import__(extant) + mod = sys.modules[extant] + sys.modules[fullname] = mod + # mysterious hack: + # Remove the reference to the extant package/module + # on later Python versions to cause relative imports + # in the vendor package to resolve the same modules + # as those going through this importer. + if sys.version_info > (3, 3): + del sys.modules[extant] + return mod + except ImportError: + pass + else: + raise ImportError( + "The '{target}' package is required; " + "normally this is bundled with this package so if you get " + "this warning, consult the packager of your " + "distribution.".format(**locals()) + ) + + def install(self): + """ + Install this importer into sys.meta_path if not already present. + """ + if self not in sys.meta_path: + sys.meta_path.append(self) + + +names = 'six', 'packaging', 'pyparsing', +VendorImporter(__name__, names, 'setuptools._vendor').install() diff --git a/myenv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc b/myenv/lib/python3.7/site-packages/setuptools/extern/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df9cb479f072d35c8792d899c874ab89bf265ea5 GIT binary patch literal 2434 zcmZ`)TW=dh6rS0e?TwRG6-sCY(MTX#OVlpCh!hGcv=ypAQPo5REUMMUGfp;H?`~$s zNo+PRIN}NM#(VR~@8Dm|D^L9kJaNvf?WB!5t2sNnb31ds?|k#^;$ldk>~1c<{HH<4 zzxXjL9yA_8Rc$bwaGH`X`HpahyC;OZ6Q@hL*L4IHu5h?NabJ0-gu=KD(h6R~9J1a+ zJ1Z_U9zs=U1cBM4>u}n2`4acIe?q&S@Oi*%CuBmq0l&oSya9h}Jmd=}q+91rz6kFI zcVUOiX6c2<crKp~id<?T$0s3!@(p|T<Qcnj>oyw*9kU|VJ1m(FVf|dPev<Jd+h%#8 zlRS&lbaeB;E+n{J0EXmxN65oO36{lrDD9XeQyLnA!;-zdcv~pem-&FnJl9bc4@BF} z{u>UBfy07ttdF3oPr#J4BoWcHbSBtxO1D@o=_{90?wmUC$KwQ!=B{@GaRf)oOf9N> zYx$-z-^sX2XtOl)+U~AQO^PCod%}cOM^x->w>;x1k@lqzyUQ9HK$%E{!kYgMI)zLQ zVl6rcvF!Bolnbdk1KHWyjiNPmFZ=v}-|a=k!R=eRzqY+A)6e?%?%(fhc8a99IStB9 z*}J!PNAJfSaBNuUJWtj6W_6fO6eU@rqo`esOnvr&{8IrKLIWDo@yd%gP;Jk~^(c;k zf^P>Za!W0PDakI7ZiT!+@;TNbLA>z~77--HhKOZv2cVZqGXR%WA(}ynzcLmp7S8~m z^;DqZ5{9-7S#MDrKzO0wXK|DZ@M#v5-6ulQT|)OP6Z|F}Uwi9R=LYr=3@jLgIbGJ^ z1E_(Aqj<Pe`ipz)9(%`r>B?2^Y!K~exAb>C7~xNVQ0gxJEiHk@zt4~U91xKiLl&?@ zJZ68GrpQ+Ye3n|V!vr#9&Mg*a9K$i64}-RaW`mp$Q^69&@@y79$OXM4^WpXmyrE~7 zW@kZ@i*StfR$v+h?3G}`St=Sg&PK)^#DxhfH_!`9&{kkWYw9yUjfdeh9=d3}tyl>Y zR8Cz8Kc;q6dAb4{t0oxYFH;YmD^M@MaBe~mIfbPT6_ex<RP_g#3otkc#8Cl(cOH|M zo5%j>i_$N>6>=N^B*BDIqP<<e46c&nT3NGg`T+k0+}ZPFx9a_hl(h{&T-WwOSx{gv zB|nq>)t{jL2!FY|TkjLyn2<l|g#HF%3#|6X-_N0W3K9XC%kl#u5i<bU(%fpE&RLrG zup1Fg^O(<(e+!?M^BO5AuYno=wF&E7|FsJ6@%33AAn;P`4-+Z)mn_TW07Y>MyJB0z zjH5JKE?F*2MUttUC4Dx^hYVR{yAETSfdGHXdU>XXX_b)E@u0nSv}8O{S|(dV<V<_L z70S!#qt!7?Efaz;SXqxE(8CevUj@7}O$djAS)exk+$>c0!xJfUX#%(a2C+5)h9*_5 zdX>iS;nFB25@{pf$Mu6kihgorl{n5ckTvHQ2!~;v67D0Iq*lQYZ<#i!L+kK_Gz>y` zdvuA0jza_Y0tL@4@rJ}9B$k2*OGz~7z+O!*<NFm{6{kQld(%4O=Vyed?x;7jktG>$ z0V34K3(;y5LXzd0#i<lAA2B$p5}7{Z#d^z?AHcq*F`r|CxF|rH-ywaq=~eI$W>vE1 zftWA9C419BEyqR@)D(cls{r)~a0E;%5TV_SqWxiPl?uLUQN;6J6iG~JQ!iv*2&qRB zsUWYS`54W0G?vU~29;T2a-+6dNvM0C6Z*}1*sOnOds;3~C^<rv!mAy~3C$5mmV)N^ p%GssXo?pi{Ja)42(R(Ft;6Cqiz|<d9C;J+&FMHqB-KEDK{U2C`g)0C6 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/glibc.py b/myenv/lib/python3.7/site-packages/setuptools/glibc.py new file mode 100644 index 000000000..a134591c3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/glibc.py @@ -0,0 +1,86 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/utils/glibc.py +from __future__ import absolute_import + +import ctypes +import re +import warnings + + +def glibc_version_string(): + "Returns glibc version string, or None if not using glibc." + + # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen + # manpage says, "If filename is NULL, then the returned handle is for the + # main program". This way we can let the linker do the work to figure out + # which libc our process is actually using. + process_namespace = ctypes.CDLL(None) + try: + gnu_get_libc_version = process_namespace.gnu_get_libc_version + except AttributeError: + # Symbol doesn't exist -> therefore, we are not linked to + # glibc. + return None + + # Call gnu_get_libc_version, which returns a string like "2.5" + gnu_get_libc_version.restype = ctypes.c_char_p + version_str = gnu_get_libc_version() + # py2 / py3 compatibility: + if not isinstance(version_str, str): + version_str = version_str.decode("ascii") + + return version_str + + +# Separated out from have_compatible_glibc for easier unit testing +def check_glibc_version(version_str, required_major, minimum_minor): + # Parse string and check against requested version. + # + # We use a regexp instead of str.split because we want to discard any + # random junk that might come after the minor version -- this might happen + # in patched/forked versions of glibc (e.g. Linaro's version of glibc + # uses version strings like "2.20-2014.11"). See gh-3588. + m = re.match(r"(?P<major>[0-9]+)\.(?P<minor>[0-9]+)", version_str) + if not m: + warnings.warn("Expected glibc version with 2 components major.minor," + " got: %s" % version_str, RuntimeWarning) + return False + return (int(m.group("major")) == required_major and + int(m.group("minor")) >= minimum_minor) + + +def have_compatible_glibc(required_major, minimum_minor): + version_str = glibc_version_string() + if version_str is None: + return False + return check_glibc_version(version_str, required_major, minimum_minor) + + +# platform.libc_ver regularly returns completely nonsensical glibc +# versions. E.g. on my computer, platform says: +# +# ~$ python2.7 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.7') +# ~$ python3.5 -c 'import platform; print(platform.libc_ver())' +# ('glibc', '2.9') +# +# But the truth is: +# +# ~$ ldd --version +# ldd (Debian GLIBC 2.22-11) 2.22 +# +# This is unfortunate, because it means that the linehaul data on libc +# versions that was generated by pip 8.1.2 and earlier is useless and +# misleading. Solution: instead of using platform, use our code that actually +# works. +def libc_ver(): + """Try to determine the glibc version + + Returns a tuple of strings (lib, version) which default to empty strings + in case the lookup fails. + """ + glibc_version = glibc_version_string() + if glibc_version is None: + return ("", "") + else: + return ("glibc", glibc_version) diff --git a/myenv/lib/python3.7/site-packages/setuptools/glob.py b/myenv/lib/python3.7/site-packages/setuptools/glob.py new file mode 100644 index 000000000..6c781de34 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/glob.py @@ -0,0 +1,176 @@ +""" +Filename globbing utility. Mostly a copy of `glob` from Python 3.5. + +Changes include: + * `yield from` and PEP3102 `*` removed. + * `bytes` changed to `six.binary_type`. + * Hidden files are not ignored. +""" + +import os +import re +import fnmatch +from setuptools.extern.six import binary_type + +__all__ = ["glob", "iglob", "escape"] + + +def glob(pathname, recursive=False): + """Return a list of paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + return list(iglob(pathname, recursive=recursive)) + + +def iglob(pathname, recursive=False): + """Return an iterator which yields the paths matching a pathname pattern. + + The pattern may contain simple shell-style wildcards a la + fnmatch. However, unlike fnmatch, filenames starting with a + dot are special cases that are not matched by '*' and '?' + patterns. + + If recursive is true, the pattern '**' will match any files and + zero or more directories and subdirectories. + """ + it = _iglob(pathname, recursive) + if recursive and _isrecursive(pathname): + s = next(it) # skip empty string + assert not s + return it + + +def _iglob(pathname, recursive): + dirname, basename = os.path.split(pathname) + if not has_magic(pathname): + if basename: + if os.path.lexists(pathname): + yield pathname + else: + # Patterns ending with a slash should match only directories + if os.path.isdir(dirname): + yield pathname + return + if not dirname: + if recursive and _isrecursive(basename): + for x in glob2(dirname, basename): + yield x + else: + for x in glob1(dirname, basename): + yield x + return + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): + dirs = _iglob(dirname, recursive) + else: + dirs = [dirname] + if has_magic(basename): + if recursive and _isrecursive(basename): + glob_in_dir = glob2 + else: + glob_in_dir = glob1 + else: + glob_in_dir = glob0 + for dirname in dirs: + for name in glob_in_dir(dirname, basename): + yield os.path.join(dirname, name) + + +# These 2 helper functions non-recursively glob inside a literal directory. +# They return a list of basenames. `glob1` accepts a pattern while `glob0` +# takes a literal basename (so it only has to check for its existence). + + +def glob1(dirname, pattern): + if not dirname: + if isinstance(pattern, binary_type): + dirname = os.curdir.encode('ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except OSError: + return [] + return fnmatch.filter(names, pattern) + + +def glob0(dirname, basename): + if not basename: + # `os.path.split()` returns an empty basename for paths ending with a + # directory separator. 'q*x/' should match only directories. + if os.path.isdir(dirname): + return [basename] + else: + if os.path.lexists(os.path.join(dirname, basename)): + return [basename] + return [] + + +# This helper function recursively yields relative pathnames inside a literal +# directory. + + +def glob2(dirname, pattern): + assert _isrecursive(pattern) + yield pattern[:0] + for x in _rlistdir(dirname): + yield x + + +# Recursively yields relative pathnames inside a literal directory. +def _rlistdir(dirname): + if not dirname: + if isinstance(dirname, binary_type): + dirname = binary_type(os.curdir, 'ASCII') + else: + dirname = os.curdir + try: + names = os.listdir(dirname) + except os.error: + return + for x in names: + yield x + path = os.path.join(dirname, x) if dirname else x + for y in _rlistdir(path): + yield os.path.join(x, y) + + +magic_check = re.compile('([*?[])') +magic_check_bytes = re.compile(b'([*?[])') + + +def has_magic(s): + if isinstance(s, binary_type): + match = magic_check_bytes.search(s) + else: + match = magic_check.search(s) + return match is not None + + +def _isrecursive(pattern): + if isinstance(pattern, binary_type): + return pattern == b'**' + else: + return pattern == '**' + + +def escape(pathname): + """Escape all special characters. + """ + # Escaping is done by wrapping any of "*?[" between square brackets. + # Metacharacters do not work in the drive part and shouldn't be escaped. + drive, pathname = os.path.splitdrive(pathname) + if isinstance(pathname, binary_type): + pathname = magic_check_bytes.sub(br'[\1]', pathname) + else: + pathname = magic_check.sub(r'[\1]', pathname) + return drive + pathname diff --git a/myenv/lib/python3.7/site-packages/setuptools/gui-32.exe b/myenv/lib/python3.7/site-packages/setuptools/gui-32.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/gui-64.exe b/myenv/lib/python3.7/site-packages/setuptools/gui-64.exe new file mode 100644 index 0000000000000000000000000000000000000000..330c51a5dde15a0bb610a48cd0ca11770c914dae GIT binary patch literal 75264 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 literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/gui.exe b/myenv/lib/python3.7/site-packages/setuptools/gui.exe new file mode 100644 index 0000000000000000000000000000000000000000..f8d3509653ba8f80ca7f3aa7f95616142ba83a94 GIT binary patch literal 65536 zcmeFae|%KMxj%k3yGc&SCTD>S1PQP}R5YmQ5=~qJi^+zl1UE)DtPsG8blp-*!#RLg z0>QIub24npZS_`f<yJ2Gx%RfbwfBl*uV6xG0{-MjRTOJur8;p@W1&fqnDc!<b2dM) z?S0+v>-)#|`^OhvIcH|hGc(UT^E}VYJoC(K^_@E<yCg{t{F$aC?Zcb?`Ni{pesFxw zo%Wkt>DjE;rth;Yer@_4k$X3I);E0Tn+<n;+jI9__ucm$)$@&eJPq1?o_p`}RNPkU z`Sy3#+;eqK&X~ef(Wh%$Pd;(of3Tsy@11*-?Gf=`u?u)lX)Iw+;(cKCl`JOSKK7sD zeHA+<-V4}nyl=nv?g*9f_b?6yBx$kDF4=y~YKCCCB)cu!mL*9qBV~z|I{q@eUHI#w zxZet=Nm4pR@o(rY`E3@_kcQ7q0+8}iX7L_=QKB^Wyd=#Mq5o%(=5t@`n=ZtG%HR8U zwR+EH6(2u6f(PM6ZKcj0_0J<otFLZYbC-ITBt;MrZJ&Yn>-Zb>&yT9Ew!oxAMfl)C z#Z+d`C?Ev=lGJ)}%Ksnx|0)G)SVf_n2-;d?f9!~MzIJJ-=wKb=iHfW2QCpC29wSNm zA=ztsPZ<@3t`2ENV!bW?>DIbrM&c*bCbqaRzr~R~Z-r)Gl=RG-p<NO;x4P=0D?)s` z$m_KCdCiWD6_v>}ugUHp=<&@N<(0nQZ)pc;t^f@UfdU)Xs*a2q9hEj|W&QGS`}Q+V zaO>`-aSJ8yAtP2OBNk%M7Utt!$6gfgmQ40WtW_PKSW_r1oOg}p=vZj3XtBjwwJ#E} zLMNCsnAlP1f|%AM?kIHMo~S5v2kZEcbEs|ZrY(iCq{N>@V-R$%P-2fEhzyjmCh@Sy zXyr*PE_By~_)26%86IRFp<L0yrY(-_6^RN*wl=1!sbqzkNBE#Zr|)1xR)-`}qV{=I zsuT5#vQT;fwD0ZwJO~iAMI5M-JD`zRj|c<(+4vp|@n?~!ADWe%G6eO$3}GdB)>9Ya zkBHB1hGv2=t60ZM@2flwcy2#L^lN{0=%0Q@MjzL)ErkWFb2Ro*N07ImOt!9YmgwvP zqh2yflmnST)@Q6JEa3kv=;e&Js^gRcx7ile@Me+Xh_`B=wJ3|47Z(=9j;P;M4jj9k ze|zYYnyGIobV=&smWsjxVw3XZ39!ke-gcWd&f8i_T!k-^@^CA0*s%-oQ>v?$_-7%o z(GNN8XT7J;F$I$PlNQv_oLiavAq4>E7I2dQhlE)vSn!y;BSSI+5(`L`#@q*i(+$dj ziMR82oKzstr3NgrEei6^p%m@2rUhVv>rK-H3%XZ<_rUh;c(a2dG)%uOg$_v@w_EZo zlu%GsR0^7TQkP%ahpqsf^)t)7t<j1g+Tx`4;LnY}eDrxiuoH=ZlK9$8(KPhsobi4M z$psZiHuGF42=%W3b2x}s^KXwz;=hfa!6-nS00F@ZB2Rzdm-tMKM|!J2$OpkDB&e<W zp=IqLfdhi+jGDI_IfSX1CsWBNHQ^`>)|hz?tCY-06G}<$V~#?~heoED!!4L2akG@t z3k(cUbnpdgqwk%>`n0WAC7vv#rU2V~=4eiAwpse1#pRD3*UlGpF7&;UP%~^>-Uq9> zqqY#gDuX1JM-HRLrTl?x<n8>L1RW6Nzt8%&-UwXtnfuqbCmh#A4k1U7-%L3c7Zx(d zuhG+B-K2d4zoLVczO#ufnYJw*t5&k#)-NC8`0Z!%(?;tLH)1SS=)o%@p*m1Hza}bC zH<@{EP=$nZv|K=--J~^q2RFJ=UsK7|s*{A7<k#1>>2riBOI3;<EmbyBr2Q;!)*t;6 z%bAU*;bM7n=w0Oq89^D~`RGjkug?ON9(0;MXlio>B9VN6@g>xk)TvhhOKNMSeI?sb zNT@@qXG7GtAEH*Z*I7+?xX^=^+#cd{e*xu~c+oK%QC`k~8T1Fj`XSd4etuu)23Ly= znHbY_evF#lbUsH*M$@PjpbB6kZlDn4%Pfry7Wc9o2a;HxjOT7A9>$Ks0zkIpxF}-P z4%J+UwB{X!v+x4J<l9l;41|Nc`2wVB4jNck69S=U@yowNLO-xFpm5`+mK}<8p^v+1 z@>vU3b1r4SD4dNJCLBe`P~a!!^eLzUU1z9JMV04G)5v%Ur4xPh4u|g#Tc-(r0PB00 z<2OM*Q-Cajywm3kTRsx?bLZ%s;?w6_FF__SF*1GDPvs6}`fAHZ`iq5gfrnJz3GS7o z<!S&dC^NOtiE-fBC#iZl6nPcM^GAV==(P<NR;%_=#!(%&0YabZIMPv&92tc<Zx7b+ zhXzbD$Xkg{J4C}ln^mO37mVbwG|+Ar#F^zd@x=IC!wbGLO_1QAONu%pJ?DT&$271> zuc4jxwz7KJ_rCH-tFJ@z@NXc!Q<?yrLiCS+GL^7*>xa$m*N_NRtT_d&`a7duuH`>P zd%}h`&|B{GYny6$%@oA-ep8*S_YbNQ*wMBx)7fGDgK2FaWZ0dLJaOehDVhGlqZp`r z7Zz^Qt{~7!1nOpo+s>!!UDMjSGVG3o1-MTD`U{)X0)7~njK(aO!mRqVS*o4ZX4diz z7)@AzBH#*!OwC!#-^rCEBXGL5j{ilBGX<T2fkEhQ4%vX(Kg~1H*mhHs`C@8C`##CF zP-@@Z>RTv<qVAQ@pPBn4bWbwF*U^~CI`+^PVzL7sfQR?ISVY=gn;M0{7SlKW)I}fC zqn9jO+3r350+pLg-%ap_Gfi*v=m#C!&(myW%O}ynm4I*oqK+MG>rZEnIJKR9see4J z?c)sQ$RrZUz7CZ}&@|&(WWQ<q`Sr-K<@HtG)|Ku2_)JVn%I2W6B{iM@WID!(VycU$ zAsB9F=2CVh#57s7&)3s1WBcH0)V=8v_Ii;ZdYh|;kGm9nx5OzmAxm<M-r)(EdHG#_ z%&)8hSU}eM-Hj9UR#%Y!30j>6oZG7`cz^_)daDP69Az2FAzJQhYnWChD$L)$+G%bx z&7w9mR1|a&sE6y@t-J-J@>a|Gc{fUJ9G}Xg6OuprJK#0?Jp<5bfq@`8o;q|BAqcJM zjQ48!rGWu;JZ~<LXe=JXw;{l)2MihWpCi@?07-K~${g|I>b>4p%t2&K3ny&<l5~GV zu3pxR9szB;9|4i-*m?a+N5i#!@8}=cRcFz$=1jfQrgz)4Ua)YNY;U8N3$K^;Kib>6 z)6|T!KS#l1EVxey4i&6w$J3D-fJnmY;zyL&4<!g*Eqe#L!`;_mM+^g_OUp(vN<5Be z^757py~8$Cr&@$5?KKvp_9ylZ;IzB+5AEvs5img9peJqGr>M}ieC4Y4zD_DwoiJ30 z5_=SJD^>f%DnzwDB3tkBl@`9nM7`62cB()9jX5~Dm1WqE>OH3SAe#W)`7_C8+pfMB zJFd=-^{P|*4uT0K)k$y3)D9UFllj~KNTvgXauGr@LJse7Q7R@RDA(z2H9$+ML+eE& zl=voVrX{czY;0=zrsg&^7y3DBQcnlbCHkTK6wlSv)Ot^a>WupS(t25KWYtdJD_Ul0 zy-WLUG9529T3YX>gnVr^CFHB&()t2Q@MyPDf=8_?tuNH(m)6hH=0j$@t^Sg!YDQJ1 zuYFT*)BGE?V&5z3C3>UFt~~e`G$NV?B%)>wUwRqg;i@z=IXRJXAM6bDgMFlKS|1}* zTJt0-&ot@>P~uYMKt_<u$P@-s+AEV2S~BKcqvp(8p=QmyT9cttF;Z={RhCTEe&@TO zUJAU`$*i*|AeRR6H#UONQ7ve}-xCCI8I5u>iv`@icGQ&50s{!#;tR+P0W?sZB=UJS z28Qw#@F%T&Xsr_aIZ!Op21>PA8)rgy4p7O3{6Pz%JAtoM$hIO)F4a7n)<P~(I+1mw zsEaBknp&{}E9S9cg;s19#kgY<l_YBuq7zou(m!JkZ_XDZ4C_c<Sz6z({V6&l4AE>$ z761{^!~%XE(hS<N02PLEysfKNE<cjeOV#;(?@T_jk3@Cm;TkXqt9DZgBCHyGl8OLl ze024loZPB+*+B-OCpyKzSXkfg%OQ2FrJZf>ewuU#=}f4+5c{H|(n(tWZhp^o;Mq!< zRjo5}SyjYX;$XSHob{6zO6oY4v*QvB236~|OfFpmxC~b5@TKpZgpU&#G7W#1xq3O3 z<3MV!e|?(f)~nX1p%Pni43kl^-$5TcR@NVMSZL^H&<bawx`(eNaR~J2`!Iu(Y+J`C z0zJW~Oj7XExkMpn(#4t%;~T4%mFFE*dY9bPI3TH+th!&nYyDR#lIdl<5c*6ThX%5o z)o1{K7XrAx9cu@a7Dqi{sAWL~{fq}PRa)=Vrtpf1n0nDaYar&YVxnNp4wBU<488MS z$Ov#F&_$zgEukIg3U&rgqrh#QfipJ&H-3{?*0{{-)2wH6CJS^m=O+bRE#HY|gu`h3 zQ11%GUd!rT@l#r+x3&A9Q9zx3!O@^49vFz58}EaJqv95q-s;fX98f>E-&ixCRksAc zLU`VdHD75rv;+qczU;=DL2Y_V&_vjEBUm9@4-7a;8wVN=CKo8r`Ay}yo6Te;LW2km zCg&ma6+&MnuR~}6p@HNqtG1-l;zB9z8^>xc|3Wh`P+C9Ga0W~Xtd-{^<+-e)w&b4$ z@#<dU(6x1DULnRdkk-ueAh5lYQn#C{Kar$Ow9<TkRf^br*Y%_?W&Q~$VHP)oC;9HH zFyAJHX&yxvrvM`re?)<zG~~~V%taK#?<|y#csf;eGzCh<9i|=?_0I;xt5KQHpov;L z0t+x44o?z#lG!W+1*D-aOo%nPp=W3UKr;w$Yf^zMxL9ud2w;v07-z$oAsD^vS<E{m zby9@hJWyh(w=tq-N(%FBH=s4EKk!SDDm?gZ!D=Y;rpVJ_#J@uO_xbUq(@|JK0CxjG zFWX1OhSkXt3h+-+2B}Ra*1Ku6+@(}+E7&(b;`$3RaW^!x%;!_nXlmd+RbD!!1QR4B z_FE9rm@*gPmVoPDY0{)OI<ctVMFcMX1r<MMHnOpPqw!?iR5zQ&PgCM#k=SEs?-`A! z4XsQ6%z?14uc40j6+x?IsGlNoi+Mf&0#Vk_Kfue#FyBrUdP=0G3VR(9^kr$|X)V1p z(52>5nT;nQH;igvjVF^ojjTuW_pKostir4{9NA29mEyNid}uN|4TxhrlC)WdXd>FZ z?h-VBx_toZ4Q;2-s*De{^r4;Sf;^URlfi%h+fm{Ob0O76slOabjS9;G-(|(y5k&(3 zek#h$5I=h*8r>7(VIL+i{Pd0V+%%S+M@0Bp@q8Q%5#q(@z7U^EjPS`!G$(+(`k}%- z#O*6nN~f#>J!8|-`3^7o1-QI(ZAuFG<!BUXr|7cC9O~=~<E*93KqBxcL|`r$JUY0_ zXdKvAeWxU?Elnp|vsSWu9$wq`QH0F=+T|}~+vqdKAAFvq?^E&4-RSZjDSd_`s65hU zRG&`TX^nKMyq3SQ0JH<6%FzP8jJTHXf?$dS7hfb2>L9cj-g!Tk8}ZggIXanNhBaH* z%$w8Ym-akCd{i@ElJ?9)<M@uU6qL**g5q}2PGrmCpJS01uI2wm>6rRw2KnzPg>MHL zWA%sB4CVRi!%2H|Ot>Z(icp)l{Aa9616{Nh!pveS`i2Ma03DLWEO3U&EX$~V4~xO) zi_s8B{5_ln-a`((@w7x)Y?Ng>9x2X(W=@XB{D&Y@N&83*@i)+~?fi2zq<b^Kg`y+v z5aP88t>nK&lp^`u!hZ&&FuC{jXb#dH{4o*tBfc6Xo9PY^qOa0PMpSJ{ZCzqsyow}p zf%M<BWuSR#dCqtgW@LiS;}ezcXc|UfBV(CSnU7I2nZp(sTV-Ruu`=IS>A><O4X8m8 z`<KIx+&Zk48f8hn92h!L6_u+_3i0uI(7<b*=4U`~ZN8*mCh2QsDU3Y53!Q#7L%$!H z3eB4xo3q*2<}}l$JlC3ZDhFC?g1j3YAEs5VX3xrKH#01r4Y8i&cuYB30<u}{<a<eR z%{NgJ^vkx7hmh%A<n-49l)a-~r*D%bZ8pX)TSl^|#co#1><!+CeC5cfjpuKIoO;QX zn!?_AW&vMA1)?e2-dwpnrP{Zj*_<|HxB9IS7{EyBwDfcxYouv%BJm`o#n}5SJ@>yy z&-gy^>=Dmb#gmKYQSodQ&%=1~zFyPB`l*;#0}pG&_qGP<A3uSmH3t5s{m%eUQpd3P zFA&gIum6fH1&3i4>aB!9U}cE=Aq(N(&^msURe%fvtfy@-U04P7ip72!ds&zS{&BQP zfb0S1(?^*E(%8XXe_@jn|0by6J>q*uiPa<2GTum>1O`T;OFUo1v-y$F@r)f;V$*<6 zxxSwOBxBbhyp$c;NNYJb+cR(3rm@O_gUW%XWq<TbdY9tu#j>Q=+o~LhwQWXHG_$SW z5jNrvBb%>H`Q9&KJunO7*<L^=h;ktBPP~l0f^>TYN%sn3?(GrjM9l7u$cB1!?on^i zxm~?p=dyZfRh62Dm=dqUXFWmia`&ynVMq6Z;jpdSi|}><(*!Z>E*$=p)}4=V)0bCj zv$1@#`k8GT@C_RK2^%GGo{Z!or=xEdC3Sy{6c(r8w_3+22VPE8$VUwk?|v1ZjJ?#d z?luIe*vr0NEPYiH|0;?VH0b^(Q6Pm!7br@3K$LQ`y0q!bh+5I~<vKOL>B~(@{BERM z?U4}bzJtJg>$C~wsYFPs)mz=A_+;Vl>b`0??CGA4aEpE3_1cuC2W)e-iRD9CL7-ID zLCiMic?H0A0^lhkGFc%~0KX@IHA?JFdf%(WUZeMSFj1hlro{Hsd$SVTOYdb$?3Z{O zdx;woaT2be^4!6ovG*{7T!u=A;%kW$=Y`c7EJ1>o*h`$ppM(Z)v6oxb##)uwlhE!L zK|BbE?rM}zjMBeG`2mMsRATo-#`XSM<p+O8w<|HUP15;7)dl8RhCjKgN{Rmvqg>NL zPiK55szNTw;(m*0{!-DMiCyRLQJA!hU8fN=;!ohIB&twBXPo+q?3dk7A=(!wGR*;f zmH4Ab9Mw+-q9dQRF(aRtkO%#|sinU_GzQmLfG(6X%$CM}s#}Tu+JSZPpq9P+VJHV9 zPKiuBJL5!5YDD)oz~~%Qe-}8Rt@jtTDY45@HnsU*=;L2kq0UjBUo;Smkm)WFrzQsz zaZ(FGek(>;EF>{BP3w%4xKbs_@hyu6ngw8|fTKh!qlHy>F)CtYnXuY`0oli@9KP4p zxmNRteU+CaBSCFY-H#O=Jk~#|5j}R|7;01ZpAg)=bGW@hevqcf-LE5A?_aO{-~#Ga zVjtqE_ur%Jcu}N(Q~CZ}jI(<Gz3O-M{`=HfdjEHn_!IcnD|)HPLK{d(>RqYcK--f` z*$u-u^BYl7987l&tm;-akLp~@;>4P3jf|vh1&xdm!gT*1BCt>!eya-TOo@qvzBZ|e zQ2iNDWtptbp?AvNZz7_NZTj+?+C3IKAuc7urGmA#W*FkVeLpeU9(>ulfC;|b-cb+0 z5TB6^X%<Qw>XtM(`pIQ=fw7l3m7PqEu?nW_-d^ex*@!pOr$qxsd<Oz4p)`d~h8&rq z3ajISrYI&Ma?}RR;$;Pxhb{D=3(TWzKXJT%s9^iYO(<RUSVE)ar%J3fi`NkNI14-+ zZrV>${!Og_Ogsu`H35A(O_T{B-&NY!RG*-ckbdHk+HO0|vjjb;+l<6Mq$Ue>zCnpS z2ekn9jv3VFG&VekjGbcGz8tU@^*K}|I^kYGwg>=6O-KB9C~8h~{7t+%<45rXFG$@q z7euEagA%`$O73*@wt3Wii!!}!nDQtuEgDEVNO&H@L}t+dCE6duOzQXu&}83R+a_*t z_&PR>?K`O-m-^lvX<SMec7h|`W&K*3_mnRBT55ETVuwp~p@I8^9=ez{SZ8*-mN8u* zozTuQK_62nm3Zs64En5I#e|GLc6$(Z{nJ=O=xuZK^QFcv!65zY-K`mRLCxmeCCUAX zz}cdX$`oRtgCQ~-dxfCh1^&upuQ!#>QA4JXT_&C#wmJUf{F~PzJ;U$!y{?@r5_;)a ze{z;kSR(>#DXe7X%}ph+4-@QPELf`|eLpD~P<#ctkO^UZ+OJ**V<{Lc%j&ADlKD^D zh9X7D?5ESzvDO!l)qQ}Km>9K-c6Fh+qFvOf78^LViKdv`C4?Z?Mm>D}Ux<sHrkH}T z{bB$T9}@}U489THt;{kO)K<u$jjOAT&an#NS6e0M`$=U1ZK_mV8*knE4JHVe8aAHK zFcU=dU^F8UI0qg3C?b`?O8zG-Foc%XW|fLW)no3Zk5>7K>T~>yb3k%G<(9(Q-eiF; zW^X3gPV@i@BfZ3523R;XaoaM4t4g?fQV<VPLD<~ePx?Yq$D4a8z-364{**`yGcn_9 zu{VoRIR+OHmUtLIOw5N{j&^^5_Wq5TtfdgKQ-D3T*Ov2llcss3edmNCzcld*zqAN{ zPvP$i{0-pmrYrr@dVGuC5m`p7(tDsgVeD<hs`T;Hsx-BTiu$7-OpNcxSQ`%eI+Yl0 z+3uk^uu;4d&qOngC&@V-eut#XW`{q0jImkn@E1xQ{!7Pn_%B1Wq{Ba#_7PbQ<=fsy zIk3<2>e|xA*Ok~9;<mt1D%&LHDM>8Dmc9>rVFv`@;FdHt*cs>|&PpyPe0UP`2eD=g zvFfgbQ|!MPHa(pX@+5W&jIJDok-l1%npPJ!4WXp3E&+NLPGjwF!I|Z_iN$Cc<=?U^ znZZOzzo$!rJI}YV`NpupW2zzj{GeLXVuu9W`n0TN!|A}^<;Os!&SP2^>!5w2kEXSK zlwqH1ZHplztSactN=M`gEK3rV&LEFnX(6w~j-W+mrHrb}^}uPE_qw+H$a{*Nr4ow8 zzFGz?FS2RJF{5dTqbb?YQR&zY>tcGecNr|O?N!1;-1-;v**su^4QMcbISfGyV8u(} zHrJScDG^rhPt&Lre=<w&w`&dr<q@ntyCOx>8-P)A48e6~K=WdCcfqdgpaqO6I^4`F zK}}d6kG*)cjinU7J8j5RgJojK+lx)wDSSUVPHfMn%&-B(Q)XB@^Sg$Yn#i#yh~@O~ zVsRFx43?7=Ef)2sPGY2yYNLx2@%IoSZ-cY2)IzclGvc!#BZ>GNJRx94d^Q3p^_h5& z!jF)M8oNlT7}k16tTxu}c%&amYj-5hh}SOCB5QZV4~f@Pt>X1d63xedAT%NiI1<&4 zPEnH$n$emj7>RQLVK)z0v#L&k)I^8W+9{AF*2UBSh?;rJK)tBMPMUdlAe0b@qx*u0 zz--_|=gQGEUJdhoI6@_ud5iH05LI|VzDc?VJ|^iFrVO)~h{mtX2Rs<jUT=0GdoE?K z@BUA8pnw8#vHWzrb`q00b^Jp8{8bHKB&t5u&yU@d8_ih;nmb;558vwB(<^{vG&k%! zJh^pdo8AgDJAVQjA;2wTpWlrwXQZ|B#86U&mE=rW6*#udOc?ZQ44FTOV3_sr7x6ac zpr5hbACXG@(i#&w7m{89U!rw|t_1#yx@tppqPMRN40wMVH16RhJWc`wDK%sSuvOl( zhGtSQ23Gg1ffEq^g;!y3h5f0%X2>^&JPJgM^)vaFePM&_EvDU)I+oE9Fs07GIqHqX z11^%P9Ja(^f5Yo6;XnHbcrS5cpTmkjM)3ePJsfM5_ylButt7FO8?^&$xs!Gcs?X>b z2Gv#YpGi2Dv&9d&6BQ4+j6e@0KF|+?vzxumV=x1vQd_)ri+|f97U*XuQLFZPQzNv0 zA%k>}M&Ys)3L$~QjeLSY;hfdNb|6kIP96bux0l|%;oDvCM=09?jfL4?gx*}APLf3? zdW9{Oqqf`4JW7W@2etzE<v<4eN~O!3>bQtSkrV7NztT#^ri)SK{5ncM`jbVKA(V8A zqm5NETDO0WB>jd|L}{&4iQSGss@PZfoA}gSfE3HzR_E;{tLUXvReu=XF_)L7-vPGW zI1T&ug(L<K(H?`(O0+|jU^^TJtCv|P+|^R7g+j>uD|W&H7y!uIhCFTlmu0not*lf@ z%PpJ;soA9gr~1Dvt?jQ$qirwINSJ_!P(z8X|80r;trDZo$YvUmPe56~N*V7}HN7l` zUbJiFQ3s!dfm&=5g!m1pD2!1O-JKPJcN0a2?d;iL6=5p90XQYcAZI!V9BvPRgvII= z<UY6B(l`@%0aevw=B*$-!(YX+-pB~^A0xFr>WVx{*aQ%P2W9=~sEz*<6$Ha^)DE+C zm#>U`NgC@|U)x7%!fC|bQJSw-Fsaw?)Kw+OUnVmHjbnB*a9TIrTV@F`=E$%dDJoE{ zNHOPT@UOs6VaxZVAY)PTUsB>f>;z*ISlRduY1A6QU9eATGOKj5!%ZL9;a7P+P4oXu zhQz9+kmfozzo;Lh`0P4(oZbabsc?{gTtRZ;^mW2kS?P?m-mmCgUm2CoWTw8v>Cs;? zS0SUm)`78mC2JotUs5$NFlJ#(0K^R^uL<!j;BeBq>EPJpG_u$FQLQ_~`{8sI<jY~X z5BHr6Pi{>ac%$yfJ|br?mbEn9!Zyl#plAg(29qyxaq993=Nu)WqY^=ggyWgg5_M&Y zpdmD4((h4i*n9jYW9dMOmd~&%XK$OXUQ@bM*2V_;Erb~neJY5aoK)H<Ywq5*H0qCQ zQlDTBhDE(`fMYf$RVHI_W!Ab<9q|m-x1tiL9m@*|+ZJFb*@nrGYKJMFZ$cZex59sk z57?Ts@o7{px+DZaeQ6n_Tc7ur#TXrI+SG*OFI5N`C1So|&e1#bc_WmSn8P_M^})g| z$1$5&wX$6=6p%E(_=1_WYzlEl=m6zLPhw&-Uf=4lsX2A#i8_81%m7n(SnrUx4@UAZ zcY9Ajt`fU~Sp=zJ^Zdlf_m5UCx0nX1-JJVdD%Q-iJb55^UDP*sf=9gOB6JS+k*AQT zX!-nE40q9~JPo6)*xcm752*{l5sA41;nJz9gLNkFi{|qz2oN^pd>1r@w}B5jB_~LP z2GvBz@Gwye!c#g`n=Ob@$5oF-2yJ2=AEdmT4d;TyC9{qB$;>+bA$=O^jVu&HK4E_b zWIKwTm7;yh4<KPRO`k7m<AZz#eH2?iV|fL}=dgMGu(uRi4MCOo8We<q#cTTB*m!lc zYnk_W-xt1sb8@R+o5nBn4Yi_<{&5{~%;2!Y{U-2GeuZ7_FW^by>(lJs-b$e-^uex8 z_YNtpTlEe_{|I}9wEOK#Uk`1z=?18z#e^6*kkn=swo*x(4YhC;wXpuQ?+@x&e6FkI z8K=b5&i4oHt`OV^Qc7$M*n^!!;^NY>CiIo+4e=k6IRn<Ccmv930T-<-f(Tk2(H%gL zc-;vM$cPedNA?^6r)F3%teroKHnxMD`WXi>WQ{b0wsmK&RX%S`$|=X#ookhCNZGc? zMGp@>=Fr1Wk03o((_?+&r6#oIX6-0LNq?%hiiHo%0Lbwe>-T<H1phgOUKoYuVWPo~ z>3`g2EIsFYSshpOGWKvb0B0J;;R3Pr9Ne=4_JFJCASN1ch-~a<)#uLsJH92a?)!t@ ziGq7585s9aau52IEp^!s7afJ`bq(Jt%A&4Fp#vW95D%=z4hro*uT^HX!3zQ!R7%dI z%{YlkWf*Ybj#f5>UUqM5dusBp-*XyMDxo5XAHRVjECJKc!11LP6L%wU4tUl+zKk7) z-t<VpU60>cbWELAvkSWx|4Lu$xv}(&QQafl&5^VedHR?41qOhCL(SzYfG{apR7rXi zehd6DB<&$TH((+Lff_Licu&>&&Z=;Xa&GeQ02a#831Q&@0{)cwt77%-W*x#g6dew3 zZ&xR^NH?~t<D+S-N*kTZL%UFEb4F!H#*LM5&0%fuh4Pn7Qs*V@M6IPxD24&wmmBVH zaWzk<^q1so9GjG9{ICT=o53f_1)nJAB449(Lr9zu5!nLysAyc$N}t~%!{MK@_OJlC zA6?!e-}s6;z3KebYQD%>(2;R<WeOUO%|p=iZR1$<8+?-@XiIcP_f*iKdFp5nBjJA| zlmE>}5E$jTfD_!&veX^B!!|{mD)!dLfiakI7!4&)nwbF?Q56J6xBCB<2Ts%>w%swm z5p;*KBsC>VeZc1WcEMA_>6oUa+}=pE|FnRHTlYl^yFJg$z<7}J3wq`~P0uM$(zEyp zdX_zo=h_{4hs7)BMe&;QsCcD6EMAxH6tAmx;Pv<q(p&Mu*@!*Qinn9WKD-lHQ68dr zybA+GXS#&24gYu3$34$ZUnq5^KaFP=t<%zffe^90ScDj20k=CQY~QrpwAO8V`T>NY z?pKA-Fd&Lp!bN`fM?ZqJfYZweK*9>n#u>pxsO*bYa7Ws&dJ+>Tb%xFz>O`IAsLm=O zQ2QL1+O_W+C!P+B$?f~bQkVu*9G$TNH?NtfET{|e3vWV$wJOgaW^Kk+2kj|ub+&!r z%5F<+b^ZM3KYxLSLd<UfT=e=&l(EHaYj*i>)A|w*O+oYkHMGSoBW;P+hf!CE(DpM0 z5b}`~H#WHA9D{t&+~_d#B52-Al#k5v7eFU(YjZ4}1Rw7A4d+_op8>QZP6-}Zt*%b& z`Wy+$bBC4Z?7qXBCKR>#gNcW8=zG+2J1;>KfMPkenBcs6613dtOvDF}1+@iHGXVyL z<Hr4%MR`xvA|0vF*LB06>yW9I-&s!VRgnTfUyT5WT@?XTEPx7$YC8f{O>dh`&23to zF~!xgBb|y(j-~lg9wm7w2?aIp$RKhh<&KyLNYvB=$&f|G&iHAR^HX5#J#vKzvqvZ; z5zD1q_M?eAJ^F=7o19IHb5YANY<MLV{mV(4P;D;iIM(!ur`eUXcSzDg-y01F$#zGJ z`)Ma>aSx^JC#C#K4-ABlVk?97?-pKri`J`C^lj@Tbt2mo!F*JPJ?y@BF^sVe{vm+d zqdEL61~0Kn00=xne8s}G?|LjIF2RCpJ-QOp0mYg#shJ`Ey|aMdO+dz?2ouoA2GDf? z9U76r98&W8OgoJV_Ce35rr%IF@VKibjibJerNfk0;jX6-4r)_7(<um2Ksq*~ppyCl zoHekV`;znY!LPJ&qd`=FBv0vs1LW%01JA;dkI6%n7v6XMv}w;eh8*tT?Kg^FQ|<(H z!uJ5fYA?J@VFAy@X#PBU6VsJlKt`M*DBbrc8mq+qk&wfxq;*bN4}uLJZ#Vf@v`MiZ zklW2}5nh9^@_Z*uFk1xWu+~LNBEW+%vXNYnNO+MXgfvlJK&!FisPOnrU~%IChq1v~ zx|Ayq^`nZW#?Mgv8we$|&s%b1aHBqmi1J(|gyl&0|3P?EF=J5-t3HilzI9{{76*x6 zKTVyaolaiaQfY&n%~GD5Pre=?SyxNb!}usy_@<yV+ah28#!oN{sH|+lH1HVu4R%J% zg!RTQ_=25o=w_Wjt+Sj~N)rDjW|z?nquiM&cO{I+QO=!f*|iJT8gmx<{kLFu<1Bw0 zAl=VHESnbFr#Sq+wvD|gdn;`i%!Lpn%BQ|Ch@zTg*?+Tko|QZJIOIT)My(9TB-mjr zm1SwF2S`&TpDryX9#P`UP%bU|hwRsvKtDhT+>zBJ1RbB^Yju~&e}L^~@^yQUlTv1@ zBA9`54bp31Vp;A`Vs+FFo;0-R!Oux1PR36uu}UPq&<xxl4(!6&r}UW;ygg;Uk7j?E zbav5Xk!BlAd(Ye$8J3W-tTIwY%9LE1?uKlIjg^sFRz^}`zTI279&YZRAX{%bNv2JS z{~i%Yhl;`362EfCp7+o`Rxa=95^v|8(|E&m98A}r-soD(7MHu$8qUB`B>R(Gd?_QH z-I&v|IKQB|xp^Xe=(awPG&MqF<&%bKZr+(s-#&t279BQ>_IM%5!-)So5yF^4AhqV( zL(&Wq!D<g=Km9X4w<j+pdy8lL1*^HWT%}yxc7~?S6A0Ep=5TNs--@($z3dtIhrug1 z`V|kM@4}twlmM)Tr)1W;{Gk^q3G=dc^*d!%Q$WiId*~UYAz@`{zIG>jXrC3Eh!|EY z7vSS$K1aFuPf!CESr0vX5x~160L22pe2&WF2S?JMN02hMS{W-)vY$P42(hb(MT7jG z0Kgu46=5+oFX{|(T_hbv62&x8SSw;YiXi4Zi37hwjAfQJW6M;XSo$borC~ii8Pgl{ z23`)Za5%9Q4#YA!CT!o<zY|=cj%Ar>YBo>+6HO(c(p3ZS!CvGTNzSBX%-rEqrFFu3 z0Co?<?3bD`fsn<-a`2Lp>&&;<_o%rvUkg%%s5cxToQ5N<Bay_aVYD8w(8^-=6rlb9 zoUX?}UWelC0uK~T4Nj*bQPBuGghm`55oDks)Mz;Qe+?~Ie>>rh48y<;K;Ii;b9{a3 ztU9BFw-Hxj#G4%AwBo~BI7~y{qtquD^1>whtP>}mT4}6p>h;5OwHsqC9ZqIF)>vD) z9`m%V7;6i79wo0|ml|-tf?lQpw*fhjoj*v*f!0om%5|)ayzKeCsC3kNR>)f$KpTZ# z(oS2Gu8>(A12ijc0u{}-(1z)|n~*@Jn~B)-r;p}a=23i*SyMmcD|z_=^+VW1hTN%f z(vZ(5bO4ecS%Xg)sAi!w$^tEC9))hiq5*bPOw_*ztWpE_|GlaQ{!Z2H$A+rj`9D={ z=EZ=LI3$p&*UY0PvmQ`%vRUl96ePQckb_@ts@ZwX1kkaveV8H>K#_cc^bsVyzH^9H z=5C@AQ7jit-+@eej-XrjZy-qM+$X4WAH<%?*C+=za1i?FCX6GUl`D33`!UI0WNdYV zc!d@**%TtCdBS*zs2`zLnixwFCz2Rj*LOTbOR4gXhi*l@yt6VwDin(KJ|WcL2{ELQ z01xS2_@d%yBd;a^VFhp+mFvhrvzs^vVRPd;PL|GLdruy6@N~4G9q0j96kkkAf_QJX z2+%UYGU1xVL=^aR|05&-o+3oyB@x=T#j51j9Ez_8cDG*jM$lQ1uh>l_<s=Y-(QuMC z#D7cT17F~WiJVIuFbOAN`CJKp4|{u2(@vz*nS5HG@NK9_)FVe-{DU_DLtmnD<S<cQ zrhN>uohmV!0kO(LP#4N@EEUEoXInA56`O0t{sKJlZJrhT*oyhB*gICN!iv3O#j32> zek-=3jJlF4`2{6_TwNHotTB0O1lr;fG+}riY+8d}9p6U4L%mdI_0qplMx>#0CAM`P z^3JT|XEDzY`-GsY?(L>fDo!{8YcSNAFr^I_G8MT({BkOn2e5fU5+J&7BR1$EhzL7* z)C!{q|C&MXejRWO7HlQ95-6}@;>JkpheGE@o~8F5C;HEPEAq66kR&1Ugosejns4c4 z1cAIHP<u##)CqbS0ZM9)UPeHYIIvl`n`Ckiec4TN)R|5hAHL0xg*icqyp|~MNy(fN zqfyinU<?y975;A|@JEh<CyFUMACGCE1t2ixb`cll39%<)T5`RI68VRSW55-a@n3)~ z(6#qOnrk3<R)J+G0Ia%aNKsY|arX&OIK|y_FXrwsRu+^rnYjC7ieALsWL(PRKSVlN zQ!M2S8y4n?u0%EGkG+hN>*Ykbt&Ao)n-mt{*6AhKP?jY%94~Hblx12JK-Y@>_8|Ya z@ic!yo#WtT9ZhQv^f%X^?+AQJXI8yOn(O;J0_UZLC<zA`*1OI14muNBlL+(&Q4U>I zvK2;A{g4N$!BrACM+=}HS^&Y8>{gx+49pBTn;Or7&0)~d?^^%W(6Xq8yvIX)Ll=!e z*wS={pMFrA$mhcL+bNOhSZs5^_4yh!1ui~0e3JMy1D}!~Vl@W`hY4^|f7+$QzK1ln zMAo|oja+PzpfJ7bbNw(p+ns=bCHrT>9ey@n*N$Ez=Xur1SBo$?&gYQTNOpk^Xaw}_ zR6l~)D4|tHof2!J(sAHyexk~T(_~BXi~4W&UBF?rtyAjg)El2yL=?b=>p-$vKkPxR zwAFGyjIrd9F_|1PCa^X*UbAC3yDeO=Q^&Sbr?DL#6@K`&wKcp2YIo*AFcyszm!j5| zYPnfXPJl+OgQ-YV_ZoaNtm<&qO3g~q3GRleK3%mOhj1-}V-2>KW!mcyelxy;ubQEC z)hx0P>gL3T&+t(6O=xD+&fle0>-{z*HrGlxLJ6P<q;CgoO!zPvAGTkhMTinxh;U>* z6xe^eG3%&($pfjV<2y?PZeXVz>$Lmt-X}S6iyKo8lmZ5udmZUzmo0=mihCbW!DW$U zC?|3ujnvSR;S!V~*Z7@Q8ITD0$oqlgyp1Ix{w_Jpf9A7yMC~ukowZPk+<`)h4#N-~ zx`B|O;c=|D*FvM(Dgs8t-bfH|@N`=*_|`ds>J=6Y_VcmpvIB$y(5+twa-`bh^4O%v zER<BoOVDTNkK}dHb14s(lfL)WLj8iNPK#m*4oR8&6_tmROqT-baL~NI*35epx(gFl zEFkTCC8p;@do>S{8j64{(^7QTCPawj{E9(rUYit}h7g@Mp(B+rD%YhBM7<1yhjko^ zmY)OsH;9v_@%1SW(nOfOU-XAWxkK-FG;FHl#i#~n`^z0+U;l=xeZq~Ye?uDUw0FXS zq=3~1_=XRtBH%J1u?Slf4StbYpGsA)ZM%?$#y!g4gc&=$hmLyDlC={t181roA^xKH zK*znnonf-!iY8+`hF#XfJ0bma#_17&frO%jJp_&EKzcMEXZ^8tMkn$yLF%Dl`Yw>4 z?>r1>nzNv;ej>%FDeTauQzHP|`F8+mk%?fR2YJXB3A>$Dv}_6O>pJI`4$z|xdtn_L z6oykV;-p@u!#CLQh0w8~eVm}^@jpS;!SMOKAImQEat9glJ8{GzLpNtNa1>+tdtj3z zb%M&K;`9!1SUAt#w!K80p86b@7Gy)H)|OV~D-R!J2Zb++b^AohUj#H{RrBnJmFE|_ zYeUNO-_7tI$E`+ke!O?%WY*}!{;KbMLl#>m+u!kBXc%*o-a5<oRs$C7Vr4W`*0BFc zbTH!TgX9T+m)+nHDM<Ge4LiB?!^vgXqXphBm|+l51X2iZ9#GSA<X8&4uA($}h|`y# z_#%UpKISiM<J0<%>Rq<flx4JEjBty=O$T(8%H};T_HRVfM;(yDF3~7Y8Y>4TZF7J( zuYC{P;2|#eZ$@ns1XCPM;#jMHR0+Iqo+R;gfNhVIEl0M?$&$E-bVmD-o(%ETU_qK5 zT9z0VTCrP2XVN;7y<A&bs^+qj-#X>g+nn}yeXlfp_N`W@{h;sg2D!9UbKq>XwL38e zq{ncRI$BE>X#GOE<|NlX;M7fa82thi>H7$<C992UY>PRKC9C24uAi5c_&!R{iJ)Q_ zaOio=e%|+XW8t@sIN8<}`Wl?tU}fU-6#9IV{SQFMcVf#QS^WTZz_zX_`#$!*w5-m` zH6-xKm1R4J;@c^{qzuMH>wApi^UHoT6pvH<>axU8{6UIOE&IVx{2_|xmi>_8nJB*n zadYDu>~fw68(Y`FEdh<JF;Bq$88#|cV+35jYG@n+f9xp%x%bSYho2r5c%)1R#ML=O z>`-aY0k5DhzSZlrYqH+z^mR0xLDTKk@=9OZhIIN2I@h<G#Z(4=_Y3r6d(;yN5;Ii7 zzMS$`IEhhDzmUCcv6{!)qiNxyHgyL6Wc;luYSSwC25>;?I4VwyW0G+f1n&T$xSJly z)#j!Z>;$g|Bg4t3LuMJtJ6XHV6?LA@Gt{CgEVf(T88SN!jZ-e9VBAUm#{oibH$9RQ z4p5tS(<3?N0JVBIJyKhjK|TR(Falj++}F_91<p7LvX%zAv`h>H2Y(B<CAczRh0p;- z2^jJ*ydbM%&^Y*WTySWU*=^vW-x-TmBOUgm+twJ>M>`j-*@0px<!XzYa7>Zq2!_fd z?y<jITK!(*Bv$<%F;?9Qqhc%^Jl{*6;#*-Oz<~v8vy{_{j!KzkZdy}oF6{~@CxNm! zOG{omIQ}Z}JN`gjAiiCU7`6b1u*!hrtg&c~x0Q438dwrX9I+U57-4}u%Px+t5K;K{ ztf$Vs7db7JPyS10-V<Gz?!#&1n$*@WNa#IMHWAFJJlw|GNcy)oc2OLQ7r@g>@N3(^ z%P&G^^+@ezF-7<mvVlOWC{*E53eo0nJ!~-}NHb}BiSTl}Qs3;dYlY13F7u@SXp)*& zHl1F%Wi#lNStj`(qocRwV(L!!5JV2F!csx(&57+{Ow!C!VXq`GthHD%9d4y@@W3}d z^h>zQ!m|l?sHj(CaaV|o+_Jn!u--yr&%?AH<Sz2{0FJiGO5F42*_2t?l7UUDzli1U zkRddkcYk7<Fo)4;SyYJ9^NIVPKtInbQ*DbvJcb>VFkK)fvVRhFEUM$v!Pjt!3mawm z$cOr0u}Y{--h>0H$iPmPH_a~#tJg+twfrpT3RoIRmxOAAyzy!<5uD&a$ss{`>32d< zFhttVlHvaaQ((lOBmugVkdySwv9Nm*6o6ntcZQ)%Aof&0-zuOeDA7Fov^5QaM?$T) zHDqM6KVt{HldRJaBw5WOT@a8R#&`%%)BG8l3pXwW2L5XXF21XzDf>J#6V3{9OGa}V ze3hInQ<dl1;d1{HO>%(rcr%lZo5J{5?QF>~1I}h!B`QF5u~Rs2ipwChpEX_Z;6|?t zS=vuglB44$6TCJcp=C;}8)#79sg8MBT1I8^?2_b%;sY6R>Fg;G#63WSpv$!3ShV*@ zGOco9)BF|cdBXNG>;YmXNOw+PuhiC5G6Ta+Pcp~b3eTUw0Nvgf7&z7qU(Rtii^|hh z+=K=l(Y~OzfCbd00!JAr+&V8yU4-lV%5dg32;iCgT~aG(WKK&4nrAi6#7b?brO6!r zd<w)~X=dWnQfFm%2x<}8Gdt2Gq8Mdxb?1_<gavOoinHq;$+QjKjd8|_)mo^obP5^Y z!QJqhHLdkP1acOtZJx3YPBGSMU^g+nQ9KKs3(IpR+6ET{92kdJ1Kj@mgSEAZ#&diO zCVjNecF0+VS{H1%1?~e_YHhfQ^|yVTmT)L=+`m4^3*Q1*PZ-`7SERDr2kSyqz!BJy ztOBa`(3M_Bu?tTuS;?(4HABVRdiQ!DrUQS7%(KuSb>36tj-g!*n>Ku>RA*;8K@h7Y zXIh3Wy??VdCYrWv4}HK5RiXqes^Z%LMDA8rR&n*l%Sd9KYfGo8xqkmz7~juZuRpWm zXHXlQLW(+TkM;Y5b-30gaL#-SE+?SMHSnB!6a5C_AU3@g%m04N%g+IdY#Zd^Il#kc zJNa;7VgM`BFHjt7Pp*J_y$X}Q_Mn;fG$r-;&ML76&=B|Mj3IB23-stM>hK3q7yl4) z3c&~3PMC6^L=NGYg!)2t{NIa&T&F&eW9ZP*o&*eo19&q+r=wu++=r}t$W0CCrI8Bt z?;&^5lp@9Mtk@yd@97tUQ(O1al8^lV4HFH{2Y0GD@pd(<@8}+KbV#noom6OT-m8SZ zHsICz&Ah`1dwVQ1AiWQXI3})uYbChAId7oH+XLUP%mcTf<YadItcL5yaH&*wk0Cs- z``$8&se+ZOhFU>l2|s9s?}qu+GD(o?7bga`z(b7AVKfwQ9bd&7(*ohyh+`4}Ub+Og zv~|&8Yi1q(z`|cSP+@cEU4GcPtrj1);c|rZ&7h1mZVgY->F%t)Hmt1SgWY1&+h`wk ziIt#zPP^Pv%D*f1Vm5JwRO$jLT-;(^AH~_i0pz?cc3Lg`8R!Yedb}i4O-sI(SZGo$ zMQ!bgg@ePPuZBYdsgTgG=p#sh=EN=;YjpX}YHr_!jV{m#ESP4%jjCI$Fh$&sGdARG zV{Y3xncoc?+o-#V&cN^r^5AYFTt<{n8}c7wSq7U?=`yzxe;l~sE+qF0w9H+L-P`LS zyb5Z{uB#34r~ixcI=Kr)c1o~<NIV@uCN}MdZsZYch+NnCE^M03|AgwIGlp+Qy3eW| z8}&E?3<Oh~_1)h_xEb>lY7N}$NT3DGrK4abA)Kgo*3{O8qP9e}yQbEtcfuZK=8>=> zqZ=+=N_-_{sg~iAwcoHMUl`H~|DeR_&;rTZH|c#rd1w{h)U0FwDVo)N8{&f2<jFM3 zHE9d99Y{7JEU-Bd;r{(O;X6exbR(Wpmr6~vfB)B46j7lve*tySO&_m@aInFh-Kxz( zC%X`Kk~1YciI9wU4{PsRgY?6!gWmRI$wdgSKnh*!2AE^r$4(vl<k-pVBigyXv#bYD zxNZ<%Tzwzek2U1_0JlkQP<(*hn6;z`A134OMeiwuWQ3f3@8YoIyApeuoxt5}sAnav zQq(VPf>4QDbFm0TU4)q%80Ig<ZH+aNXYL(7mtnb79KtP?@*3k(^cS7fn1kgPpl5q0 zvGq>4cVPW_N8w!k%Rwl;KX1G`F?VBP#ecb2HVzT!58yi4SA`b?HokcpJnUbfZl{PF zk>oRLejvmQH=%*0+DR7r7CLCtbRWUtdQMc0GX~zneB53WmY7JsxgPxBf|Zod2bsaC z^#TUXFw*vsD8s3eZn3<={BD8y-F)-Avv^(#5HmvD4qVGVp>f@NoD6p6G0b_;>7TGK zSQ~alR?VS_5WXJ4chmd`;}eKP*Ud!gqJH>H{<sD=5YvY2Qrsmh-(G`xqMJV}n8#Uv zP^OD2chX#X%4<OGp3_jDvaeY9xz2!>=^E&IvG)+-cV%M^_&01SS0H0MKv$grs5Or# ze{;CeD&O0U=GE4*vNezey^K^nxg<}=whvsAzk~U#Wx3i9o(+e0lk$hTOUuO;4{qj4 zl2>04XBKhf3p<6i#H3_&!u-@$Y5C=joC$cF{3W!jqt2D3>B5^fj~M$Vm|SQkqX41q z2T%b2<P|Js=I{^2YZYANlkj<;Okn&Cqz!pI)0U$v@(dBi@hSwcUPkG;WY(QbXmr1d z-iF=-DsbbnLw|(3pGQ*4ZCHu_2obUD6l7>Y3>2D36oLt^mS3MHXxT;nz5fClr6_(g z&5ZNmC;~14*6HL!T?_*!%vVHtjCz-|@_{NWfYVq9UHf&K-&hC=^N&yg7CXr8M9E-I zy78zABU=W%n&G@W?8Qu0LFxuGkGjMv)ARK*Kbna$O|6T+L`^#69$NTe%8totm!w@g zstZths1|A@RqXFjEbE6;4?L#pWi+}9BOlnJ@if*Y@t06S%G-H%h(Gyfd?E*y<6uV~ z#6AVi5o+s34s={NLIlf5uA;m&lJFu6NR3z>mHe*2<gXEcH*zS&2y;W+XH}$5LvL(+ zEyRl`&i{bYhx(h}je^_xt4QkJf*wZx3H$(JBgou`7*3bKRsOip$CwXe2J3re<E&_x z_xLh$I(Ka-;0C~i<E~XSAB#9>h>?FG+|6B3U|-OciP^-Shp#}#vXgWHA5YNa6U!+q zq};yuH@J$<g1PN~sO5)$A+&~=N)4?sb0QFx-Rto9))BY;aB?gTO%(;5xJVOItA;GS z6_+75B!}0e7^caSdZCNP>N+-9bU!#^pzU+qcXRI%2RJ6N!&X5ogfS!cW}_M>(lIwZ zfe*Ebf@|4$_;a(+fU&e6F5DR2dJoz(we3sCE&7)WHrk^L?qs(*e7DNlO|*U1q<`tz zFp0f<BAHm6=IA>yeZ{_t!7Obi5STtGS&+D;Yxv9K`^c{aAF<4kr-vQzf@8HZTke1_ zmA(3$ai@cpRCwMl!x0N;(N4*zTI>7u4{b*MIVBEz6z)~*XZ8JU7aY+A;K^H8`rhA| z#@@HXm?m-|yYDTeyybfrCsN?||6PagyRzmxAaK6m*)Wm4a^kbTx2CJWcd^}}O(&$T zO<t0?wM(QwYhg>D1is$|nkYqPH#_KxLQx{SSvHo)AToTevB1O*7qscSN~{T$U_eed zkFhYIW!is2{v~+Ic>0#e+UgdNtGQYkY->h<h<IsJqawiv@MS^P6G`BcHA#d8bu0E& zWaTHX5I`=Fbre+Cf%tEzVJALG#01`1n3W9}8Ain%xbF9uuqvL#_uX5>?AtOhv79Yn zC|3L;L^vY(C8_NL#a`w7Z<;&Q)?kGqzKblWva^D+h~g})^-+JanYz>}7pa3)<rYAd ztLgr7Nz2k#I|fCHz8M}K_mJYi@c5QU!YDbSM^*y~SgDB32}iIw%Oid-I-FQM_DoHp z%8f0ZPqEmb2{}&T3s7G=!ESWu-<I7%I`*j4B3P9u-6*5>3H#&j%?M%nM&-lef!)5j zxF+{ot!{W}P%Xn+lGGUvThXOjoAq?c<+5_^5yIE&whQ>kp@q=!7ai>|DzP=9c19f$ z$s>&8F1nuZB+A21Ac`DkZgdS-L#<8zL|-DCxMORp!%Qc{SfvY7W`--&hwRbd0Jad8 zc=lZv7M)4Ey|o<on4M?s_qGZtj?Ez{2LA{8?=<|f;dkJ~>n+;3sDoV)i>|hh75n`- zH-jEcA%g)`CS%Vo^jhM_(t0R?r8p(9shquB^hR5^6FWQ$^{ReTZ$6`7g^<`efS2LI z`*Ubd|3D8#gO1K7jsQi{X>oV6_6pY4m`A6R=Sku=CoWqz7RrfR5Ri?94t>qPR0wyK z7ypI$rKPgG<?vuztQB3=yrdk*yEZ!ni$Nqm={r6>C^KCCKePnH(pwNhEInLUcsSYH zMK#c96Wcyf*vntjXy@2%131BRv+s+<meK(>&8T)^0jzv~DG<Z29w_ku0@xTitNg%+ z5L8dwc?Wc0zkYtf#*FBKFqz|5Iee>Rt=!UY=RF%PA!+PSEVc;+x04jyWuz`9C8z0a zP;et3AKyt09HrxKlTn%hWp|r{ZIg}rF;RCFy>6=>AcKtZ{igs;$2D+d$8_A5SbQzE zWQCGl#p=%`3N9G+E+|OKU+*%)vT>_}G|H_qp1!cG)wL|ngccc3S|rn<o1P5?O^xG8 zi@Y&PKTJwg?5tpKBt7DrD{<S`lt)Y;jpQLYcM03pK%(M0T<2^ow&BiPq`>lI+%#ZR zT-V<{52V9tuLLh8L3{Ji<yXM}V2RDRbs(|AJHRwo+n{3!Mh_(DgQ7_*d*Pd+#G9ze z+5mkX`T*kiZW|s@25CTf9m9s2F+}g&kpX3i7*NEQzalmU6wrH<P_~<7luG(mgH3k8 zu<#kKu=-rW`31Y5NJ(zbpzp1C%BhhJWX%{-&KV9J2!X6ZIloR*nx+$<lX5N<WPP2; zif?Fq*Qk&8I}$0fE*VAEfXlEO75M|0>5gV__imv8s%5AodpfBay=|iYK@SFKaA)n! z`gu>Nt}$DG-8}J`UfpjdbHH}`%ci&Y#3wXN=Lo&`4(0{54(6M=w14Jc_S@PRz1<CO z58ufK?mMY%V^gT$zXS6QVBXP|C$S{L-FYK9dyw<mRL-o6zP;1XgB*GM3HZRUlc*=P z-<6d{Gt?Vl;|{Z1U51U7yYv!M{gW|8AX)BWE~p&+OU!%N4#9YA%g&0K)r9jKI4BOA zDYN*os)CgcwIvtV!Lomhf%vd$BtIr?^VgEUcxQ#zocTJu@~whVXw<U`dh^Jl_z~#M z>T~Rl^A0wq2=ksVQv3&T--<cSN^FnE$Xv{BarkbLwH1&hAwi9ou{TJ-2NGLKz>P-z znVBn^D-8S%Dw>y7pTWRCJv%uY(qn<`5JRE`J$=%kf*e{lfB-uER!3^0(2sg#_74u@ zeg`UK|3HdCiDBCf3TcQlZ;=fE)DVDCBd73MX>n%uU>mry8C=>pv#Bv#(y|5XL25qF z^05&n9mv|!TtSltfaHuYXx0NX=SsY2p}M3?Oo~o?mUROZ8H~u;#u#JqSQ2{ZLaoPs zjN}?g*Fmh$vE0P{He)`F%a{13&^QZnW3DA83tFarDJ79wHRQxiju9p&yOE5s7iX5S zPAT9u2VnQ0f2q4R-q|na&DrhAn{dUUuHF#hhY!*=#Yui>7P*An_97irPU5O2oo*Uy zOh-vz=E?#LyJLd<zBXDrY%Rb6BQbbjLFbGdr3IZAHR<>@1MDHwJ>lqR{3b&uuKRc$ zRa&(RM0m(TfwmKzbj_mbq{47k@OqTc9^%<gP!){>A+hT{dTmTLg5;Yh9^SeHWDVf^ zPG5p0ObJX>BS$}QtpRL@Mtm;(zl^;l;yDM;Qq3i-!QHSe;4YHOc?FQc!u3kLQijC| zsD%F~sDR}K4dDj>ip4gzraN(+OJc5dkxPd4`v&&TmSu%$r;c7Q_Rd1_&ATqgv*|(_ z?NHdXIT(ccj?t#VW&9LM1V(fCO9+gvYLQh{cRA|8<q{rsEL{q0S&;6=DPwd4Eo9!r zW)iLHV!I&tETgv~)6t~Fb|S(Vncn^DVBD;7C*lRb0QSuw%P{9=8VL`gW?mO&LX>$m z-~lI6RXK*E5J9AvdGFyn+a;(a3c&7Xd>(S*x&q~)n?QFXUV&&!oZ5%W|Ki_-47X%6 z(Q0oier1I=N8(f&F4phVH{(93yq4hH=B4MFtN%i`>qOJ&mZjva%7L~Zf16w=u@t|N zC8*A#SM1f;Df0UcD-S(|f&m-%BOMFxd0<LRMB$-j-MCk73Ph5VvHN8KVQD`KCgGqF zGZ>7f<DRA(*bWm^Pz|n5Bf6w=TUJEN0bvC)z;Q^lHVAw7xgd*ES279YvmA$ra903~ ziK<zG7|GsNx|axK#EH3-9eMb!@2B=lxPuWaG+ZWd7*%LT;9Sl{1s{d2O5aaK*_0h` zAY#U;d{dMw?7Z{fzcMdPo31?X^&VNP4}#Qf<>k6SCe7GO?X$W$1$etD()gv9Vi~;F zCn%}JBUFzlG%bavdIc_e2^!)%?=Kt;>=SrU%PeegG`3XKr#yK6E3D-&$9I<7GTy?n z`3_|+%QY&LlI~o5@E#!+04sw(UjlbAOA19tfaBt{6O-buYH*haS#ZIU;3SqHLg-Hs zuSrFMHxltGM10k*4W;Z6`f7@<Y8kh%>B}+rAq7FL4k^cPF$PXBT7m8RsSpzmmpDjw z(ki70#|jhi*+>t9d8k}VN=CZ*CV?+O*aWS7?aGcDMH*FIBw7N4g!15Gl-=#Y7fUc8 z@=E*|8dge8sz&-qlL!y}Da!v>O{!#%h_6;(D$kEwxNxnGW=+sVv(lnD%hwwDe!ni- zoR)g6HC%rGcEK}))V{s{`}Tc<hF(E|k@npw(g=@H?OQ<Y^W%$X&=vwo{8d9pPOHwF z=1S_Gc~)D{2-{wQw7)Kzg4=|s4fYP3kQeKT7T7zi7Ca5L*YJ|JHx!C2&B3B3(F6Ns zO(H?%7PX1HD1)pGw?xy?yOiLb#1H<&ew-3A(VeWls3Vw&6;tNFCBUlFzLx-f?{9l0 z>9qC<EY3&D3QMr9)>{HC`gjazkX!(kNl;e$`2}+?sVj5N5W~RbMG#Yeilh*{Kq7N- z`TBlJleBgEegUIi6-{4RDkK!Ye(|3$(WdsYeuJPfC%GUcy$8s6o4ht97ee3rVQ>{3 z*i>?fSUVT;29du2q~QO6pzaa7^iC!aDH2SyYB^>J-q%+0le@$TI#;BJhU*x>X_1dz zx5<3Im6y*H#lbF0#fZf#2J+6~4Y=t%4*)nya{)$p3vFvi*Ad5XiK~d{2YC_&;{G)_ z^N738ShjLt@wE>91DpC%ke8C8!RXHHy%lqCamNHAt94P%)%{coTzgL^C-6sytKd%{ zXq3?0V#s7l7}AWv0d&MKAn8;p*_K`XXxr1skZRj_e%o+C)TVz&PM8<lhud@szj_!z z7#R6;&svQ+YBgrw#f?$Wm|W4Ajv!w*lNy7K-^|{M3^e9i8mYTxAQ8Kvr@Ls()v{CE zhE~~Oc`mI#txn>vp$=Ak8g~#pgOEkaztzB*z)dvpU#TW*zC*i%^otfUrgsg<oidAx zdCQmoC2)sbB}zs~Y#m<0mwXN8Eei%e7lYqNAQKEO>xN5v5AXO1A$2ZMX_kg%wV(<c z%bUh1&$)Ul#!PYGZUX$=5<0QyizTeXI(=)M+#R+c(40lwc(fEUf{q;CM01l*0;X;B z<2AIM>7t+Gz<}TVG4u+y55@fqQ~6UsY}D@M)fS$(ouQTV5b`>jrzVexEzt|w)aI#N zy*R^HVsFpgJqzGszw-<~`_IG)*zc4z>|D6(fMAI483X=4<m#rM&C+qtIIY4vG^Isp zmi>!x@xnA5Z%tk@9F=du4^mXSwa*9zdvm_ucS4CD1|OA7qubHlHmx|ZnXXEN7wgnS z;0*lz@p~IMQ+O2fS>f%E3)S)CGy@y{NI!rx@H7_Z?IdD!#rd6>sbX_x<Bf?e8G}Zn z8)Zzl%5aM^c8n^+U8=cJ1|0a`D5}QgJ(w3XPfI$QS7ewa_5E}h;2a$Whz6I5-@E~V zYC(}vJF@TnT5!i`VC)C2VTX%e*UzVIsZMN8p^$2Zg+kU}qkv|(aU`Iic^dCQne1@% z%4LR)%AH8wAvk%E%pG0JuqQJ1(IA+Z`HjQ<;oD1okMpr~3NjyTKJtSt?vZ(XZHV^3 zzbKs&qZLp|Z7uocN7j5ord0GEJiB{@l&P{&Mj*+&p*>)DhIFP=QW{8&p4&QuZtn=V zZZ64JWj}sasaHP&)^HcKRrvz$Mw{OVxOWpg+%}ZhFHktf{@9bmBIHp*J5%CknLM~! zDg$THjev(0pF!ntz^E@IzYsSTJS0hu-vSnn7@Eg&KT%>oK*H8?Yd@n8<u}}rs91o@ zwlQbiG@gGSqRkFrPrIN~dKG79l4G&ogo_NrNXqJzh(@qC!Y76F$GK7%=410wAb9zl zwRKIuc7eKRn))GXX2nF4+FA=hxbVHj4r2lCd&N3h-WPCE)#?@aRU{?$46^vD3zQ%H z8v>?Q0LdAhvwJ6fe`RYRwH-s~!y=QFLVp5(V+N``2PuwrW)S-D;7ncuuNm@@yQl^5 zq{4{+04@|hEdqVZ!7$Z_Giqz;*Q^}1waE+%5ds8dJ=VAn`)kNLqK&-#SD1*x6dLXh zi>|>AN)PEo(K~LOaHQYF8ty96%N`FY>%bYTCBzzVI`a7f9wl}PErhQVybREN)Ngz~ zK(XBinxh53W5rw$6x7C7i=e;-u05IF-tOm-duy5A-?ga(-DGv@1pdNwP-OsaOTX{T z6jbRHRG||$U!zJtr~(%S^;t9)hal$sQ0PuX&<juy=;P5f;%@)sr63L*bI?(^Zve#6 z&hW%EREPVNdVqD``;&WTB0EnEpt9s8L!?Ausgc&qqXse1>ztZJw0smo9EP4mYn}Lg zE^>m6i=>XkJzX#^h#3U`@gu{ROkxZINommdM<klsEClhJTLK&6Ad4}9I-dn3aAN6i zc}djNj0pPfW{938?dL(*8_Dqqo2(%r>u`JO2f|PrvQbQc$+@G%oE*SJV!9|q$nP8I z6q4UgyoLO71cdzNgDEnF{N|6yuZQH<CFIvRBER`V^80h@;(6Om`0H-lG<US@9w)kg zO?HFi#CI|0V-sDyH{n=-AGfXLOLmGLuA?eJA(CFygvQ}sD>rRF!-bZb3l^*8N6734 zE>CLSUJ?$0JlMN{egkf}CFo+la0=L)c$<dwMLzW6RAOounA#ac75rWR(2ok{Lj>Q$ zUfysYQH_xMymQ19{rHMwSr7e+IHEIg&za%wfAmLxqx*k|M0C99esJQ&eLrE4S_+%) zUwg>Vbb$Q-w?hbVkqe)I`pk_o&lPVc&k%1HAN&tWck^EH&gY-e`+EMdh<f-R#JiBc zE#9;E8{$2icZxTRE#f_wKQG<|{8!>#!v9UY=kcH7tsnB68~yxYkyOEVh<6o_iT7f@ zMZAMt74JLvI`Lk{*NFEDzCyfL^E<?Q4PPwY5ndtQ>-aqJUeD)>x5{UW_hw!w-dlJ9 z-h{$)P2e(~OR3MrC}<bKW(xNIl2XafoPR2Uq?Gv|Metz?zAb`}Qt(v~B<C*PCW22; z@Hr8Dl7c@M!KW$s1cLgZ+2r{$^edZi5-DaGzI1Uj1N1;6KydCBzXrFM?rK2Fw?xWD z__G8>3XE}-^0h*?;$R@I?@Z;n!79b&OJ9~sxztK=`_fmWQpQ^;`M&hksT7-)Qs7Hp zlS=s<yY|4w<NLqbI~TyH$}92TWF}+?ff*Du$iqP%Vo{9pkPv7SlR!`c1A&CB28d)Z zi6M!TdwH}35(aFNF%?^D)!J5kl|I(mt;I)cOMoVTu0rvFO50#rz3H$TD?+G|`Tx#$ zXOc+->u&r1?|-{HaPr;z-S7Q8-#O<yC$1#y^E>6UW^C%za^;g}z92r4(tvF!fmr5a zJS;8b)P|e0exUHohGYxhZ`mP@AX0KDZ5H&@jzzaO0|%#HqT8=uV2JGLdyRwY6Rw{P zZfILze29pq3yoW+h-X>*`ylx9UblY0a`M9B*I1homJT+iV-t39e{gq<^GEivs4|2< zxIctH(uR%w)Tfph=Ogy9)$eh8aj!dan?uoa!GU_A&X^QuR$}#!sT!$NiInD|WsypK z@cl@oUX5VR2hjPJdRQURhZNc?IBx<t@AcGc6!i)Y>wa}Ch{Aa>SxA)w3SZ@#Yhsy4 zP|l_8>ll<EneUNRq#ZVgWjMl({z6ar_DQIo@-6HxUvi|;htcSVlw|m9^sjX{^f0q2 zDud=;4IP%?MDR>Zfjds`wlS(vm=`-E#+XE-j-OE!V~k5Uu8(XsT{F^SjbV5Wo>62o zT<|wAW1Dc?K<tD|0o#V}I@IRh6|?8`ZdN2sPil;%uSn)yI*3R|Pw$Qu|3_B^_#o-O zgl~(a{~OYO-rpP>td9tk(*OB#{DS-|bmL}j7PX|FWyW+mHw#8tcSev`A9oJxVHI)r zIzJC}fBtuzsb`lhHyq2B7q(vsO*?GTbSPF)F~!QACEpi5d@MBfo5$}?)3ya#pOeb^ z+wDFs;M#2aFzVB}Ee+c~O(*3$?mBTD{FwqQ1;$A8#-k^weojo|>{!yRpA+kEvH4q7 z>MwSu&baIjt3t*2TVnmKu~LS|yF+cW!eGx;N{A6zzSehtC5^Ypb04q^cm{Y9*a18Q z+y?|QzjnMK^RDB#Ca#Hl0`~-N2W|)MN!*jTow%L2@I~+HYO)IpN3(U<I>XHo2uY>8 z0LRzUv=IOkf7x;r-b;<6pRL-5ePmunw+PJ<3EQM!11~D2E8GcVdpcp@Cm%l6MZUG) zAeYeTH)!c(9!V?GCugianJ9g-g|ZMr0&lyA=VyR6pmDZs%%S=@HvfC7_1;&l_b*XN zOWDF<div_USpWN~7wV%zZi@;>4X9zb&)&27-<O_sZq8$>M#UiQDHLcXkO|BK76Uf} z#lTvCwjM!SkHAgBO~M_5i$(9Rxo{B{{aPX}0;*qg;5u;axG3t6?i;I(wvpa_zz*P- zl6ItTX4`0isJ>9|)HbRgs2gD{zg~S8nQXY9Z@mqK)Iy6ygSF6p0HGslrCqpCm`1G2 z;9Z;(^RWclWeyq46nhzTuGJW9#yt`t)dX4tuLo}cfojU>0>2U&dF`0O*a&!`g`0xV z_4k;kA7(QOzN}0Egl%J6RIw(gU$yQ}!0lkN%H_SXAtlK|yb2Nn4zyTm#DsuFp&Ma7 zD86p=D&kt?qCiXFwf2KdgFYlWA0Z&oE$t3yk?7jCs|_Kz@3TpCaH_7c61cce0^hR| zfE^y#9lXh7R=MOj)kDYw_3Jrdm_JacpQ{0d!b{qMmzevB9VT=h;!((XN0kPz2uUxI znxI8Eu%ykLM9zxn_0N)pg_>Bl_LQ`Z`7HfVfMfuoFEsK%|J+1JYkHCh$OH%TVsA<x z!Y90B#YVEnUxec3m?&x#7b;>A&K4fHf7Uk66I`ltZsj&7R0VDxhlW0=Fkw-#@dXy@ zu!@b7A95+hI%W^S*JI9mhC12D9vA;dB$?1_9`icO^Puv)C+vBd<@uEIyf5rI5YK`~ z9^#E!3@LfgO5S6Bgp7W{BM;)gUH*W%EJztC!Sp#EGnYuAsq%&%{n?U&=mI&VUx|R@ z1a*oS)|At^uneK~6R^KLq1Q>g-zjw58~y8YXd<^3OxZ5wBHd(<X_F)fGETGtb@4D_ zyOfWQ7kbQhq$K!pJm^y2(JRJB^QEvq#}_%lsPh8><X$d#N%$%f9VFK`UfM7U+R{d} zGuVtF+cVu9-X<ugVW4^$Za(q7-VD)cyj#3iOI+9^v*J}e;Vc&lXZa5i&a#eYG-tW% zyOEf|+=!~-=?Key^f>iksOFkOUX!ORB!u+=f$A>*d;LXqo()}ik#PvqOcQxo7xa^` z@U5Mxjg)?i`Azae-;PKbp!Cpg?s<&Vxbtd;>g7S<K6NK1urK!<Y){2)122uq;|6Df zc^Ecxf%(I|FtKRWvWv_g^H^X7f$C&&#>8Gt!{6CPg@Gm!dqdbrnApUK0RyqD<OR~Y z%HRTuNg>O0h8WWLVO``+2=Y<3G|DjLB=$9ia`_xPL_ArhHO^tYf=jil8$%&$eMWkI zi4vc`?|vp2)R?@>G_6q1mZ(4el)V47>MBBZ*W`WXWm}cJzboLGuqfaeyGU%~LYr}X zO59&AF>v!?iHD2!50OdOri9fKdp%8<tGBF05Nd+lU65M~A$^8_!`Le^bD64-y>iV} z+*$}E{;UCe_Hu1u!_T<4aItl7A@gSrbFQo>^01tT;L}p<V$19Vr)uiLU8~{%Oe`?G z^>!%(riK?L1{NizEOZ!g>MFyY+=aimhXD~B5Pl#LWVaj*8TN+T5|=FWEG;N3xQQDI zp@R`>{}80hh1PPy9JfV?0WL60S@XFHgl;qAN^|vty=6Q;f{xDws;%i1O)wTw7-IVo z7Oj+;A$lT+eC&q({2jXq%NZwf8%HrWFxKvW_Qw=GX5+;|faYRmnZsj>B|O3~3NX%n z_ddS!0S!0TV{e-=9M^d1oM3D1$5$Es{5eUnLBt*=8a6zktU`~x^G5O%`pcH<)x%il zT`4@k75PH#$H`DPvxY#6hn&+GKXV<{<CiKghj@+V8_N|Jx&56k<3fTPgH$N{%%z5X zj%4vuDUPg%DAqg;`E}<D&ZiUSpK7-24(G34@V6%ihjWRG{Pb%YU#M*_sy#Cd|Ft%M zyW8KqKQ(7a^)L$U;AW@qa>Jf_V9jV=?aCN2TCS58VA02|^dqCPIZ-x?;7#1{bN-}o zi0uuSK2r4nwDHiU9o!Ay5o65qx5euH>!5ZZySBDJwVVjmf6aLFMYs^BvXWw2H3q!~ z(;%lS6m;T)pvO`cGg}L5FC9yR#x_hBf8BPvu&Y-G!c+(*MZzTa`h*7T?%V$yJG&R< zlsGYzZp4?Y8_s}3d(e-V;|z>mx-JBb`a7IgHZbhZcV4;YyWqYN+&KEYvg11nH-1#U zgCkE6_Zj?-0}fug&mf<5UXj$nXS>6m`@EvcaNhGuIE?^Ftplon5?}?e6z~Aq066a7 z;k+W51wvBk9|O+-FN#kDC;q>7UP*pP@>S=Rw(p(yyfTGPa-t#dwoIN&fNenJjB(EM ziiG}r=M|N1B&}|&{<F?2;k1uah7-U^pbM~*Wg;*HxE!Ew{to9A$t(~`<8L;w6et&; zNZ<S|=ap^>TYjGTJnR>t)#{$@V%5uk7VPX)tx)}9i~;_$vBro~X_@fGK`p*c(6Shm z_ccfy4kG%9JhMigIdnL{Oju?TtP=+pgkUA)nQwrAeEPsq(87sB6bdBfn??76cEAp| zFgA55t4gq}O8mn|j^XANy!bhC48jd_s9~TBmfYvWp%H)+$2)KWtZ>$eqk?x<o6jQ@ zFjndlb(Y{tn8SR5BZNr*1)XM~JLz*V$<OjtoflNI^pG;4K<@DCqjos-ON6xiv-?6J zOlF@(WELF<T-v}C_iTHFPzXn(2WbOwO_}<n&=VJMziw2zc9yI3Z?jcxmlwrAV&7qN zs>*}%En;RExS~IXSp9J;Iv|J~YrNURrg*tQC773oWE%2dA{FNFz}RpRg_uvaG0X<4 z)KO#ha9-1rjzt~`h)KCbm8#yvWnIKul`Kc%2BF2HVwY^#;84=0h8L9xUmS)sI5efu zrMsq&67AV?*ESC6u?BQ53x=+at{vtpUy=Tn>%hjPRv@fb>>NZei@|TH*Pe_fyaRH> z+qn}v>wgrKRZayp#0=C6%HTf}vvC}PLL1zZe+v)J`OV#n=)i?}W&PEaUEz{$-9>27 zp&VDLisExmUlyYe57bJ0b^X`NPKqF`ALem;0ng^WuokSF$I*omA&wcc<->L*C)w^$ z#@105(>pikRtXe*PBn`NCWH?v<}230wAUWEut~0FW8dub!7=*+d&g-odQ$iK5(3Qy z_h7xtK6cMla=P5A1>046G*w<cCcFx)i|N%1)tOq!yEKKxMVy%I^Uq`)PYo*;6We2$ zTQD^YA7k^_xG=ZuWYCdY_EFH5TXqWbD|B)ozF|Z^c5}pE?uQK+J}++<j-Xp4a=J}l zakf&I<nr=2+>|;{F2`5r2AUC14SawNdSxguK5Tff1wp(ReX7WYCr5Ogjhy&`?wYGR z=ANe%{=|N?Z*Zu2VNWTB^VlE?Ocdog(hMR#lw^kPwpNPcxZNv7<o5n$;YK>g4Sid) z6wVlH{)&i*#y*M@7L64NAM;8{S4rUpV*{F;2Dw!$>r^WrA`-cQ)8U#<Q56p>`$0fv znZuaInX8j&uMF()eo2pcLnnx>(zYf-IaoN1od1%^SY&iYDsf*+$~R27Y08`qCv9kw zOjU%BzDgnXV4bl>PIk|Hi{z}OM`r1#lo2###z@=|#HAWZB~MB<G^wA6Od~yVv}}Oc zD2cG1tE)pIs)t{SDt=8@1B!q`Y0f6O5)zp5y!5f~&z_^WLMO5-pE#vhuEXgU;kZ+? zY1^Cq8@XtZLJ2!0ade)5xhlUAJ#C?g0Fp6RV~+-Hw1!~2<^&S)*Bs>t)U+%SQ46WK zB&rYRMQY-2Nega9LlI`8$l&K}0|k3jgm<t?8RH)mnrIcY`7Fk7o7>`SaHx-?&M0K8 zpVK~(`KfGoUd_k~D_z%%ni5q-x@~s`2G{LYmD*i>aUc7g{$0pyv;}|H{B9h!nN)WL zUiKfmwE0-SaEG;II_xp|W(#Pq)Xsjc&7=7)dXaWM%_h<<V3pXj6<F3`OYF>lRvOXO z85-I}-KDi;2ThPg+FW5{1GBi~x37s}lTPVLNDgi}h!h;*XoQB5g8>Z+<530+()tZK zFJd{Zq2?7VEIGF<moA=KLMA90Wm|bIFw$B=^=1AVGsajdN=1e4B242Ol~)#u>RYp3 zk*$D3t&n7nnB$*kl5`ZzPCdQxrn<9=cb(gmIV~)raJ6}nWV089VtQEa<f?oQnn#H$ zENN7Yp|Rw&!I`%G5XpMXb<MO8!J}nTM5e9gIM<@}BTe>cB93s}thilfElNyKiX5FB zh20b=d=UdqBPF8|xe|g0#4%;}<MWD!!ZyxWBjq)v<`v|%_;rU;<<V!N5W?)D)6|fm zI1>rNMjB4)Fa%gu-8S<#aM?jA+JXZZks&=UkaMtsY8^M%zQqUB);D>DSY`Fu^Sbnz z9EH?R_5+6qyE$#m!}kwpE@*%Aj0mNMed8m(d-3J$gc?6^mj*7%!t#ONljFiJRIp#u zw`n$PCsp<X=3^16GSAJQWnvLZj6^NKYg0a6o0j8Mxhjo66(0VqS;3!;ReZP=zfG0+ zZCZ=prcG5%ic1_ZAN5FpJfXlwEJ%%Ls5wb7L?DqXT6^wC)dOZe4@^8jO~mPKS}Jge z%S$)FeG9zgKenkM$4vb|zi{FQa#{Xz<|bVzD_M@oO_jA=i-V16J3R3amYHlvCUXAm z2pA^<H5~-_@KFK=b5mb7rk;Mo-|TA0L3_5<636+L<FMgD>?OyU0~523dloHJmcFbU zP~8$~Hm(%6$A0)&fb!Z@qM~U}s(4aSiKMN|60DmM&JR=xyNS9Y5{cTQLKM`#N~?$Q zo0C4SFd!5($($SLEhu>i$`o5mG-d%t7uwW*Kd}{0RewR9?YS|sW`dc}C;Hbv9UcDh ziZCuU5_E%s?J)f;3)E6_$qeH*!BiRx(LTW&J?5NP%1SGDICsWdK2z~QIB`xW$E7>K z;_T?p{nv?5AA`?EQ&$y+s*d;QL_}$vSwe}zd#92F?PyRHRFw)|o?;~GN9$@_QpL50 zmld|RlMRz5f)(wwup+itb$P<(DYKQ(5NRdz6g_+d$jKvuobFKwFjsu#<RJ$b5g=A} z2ewyPm~oF!L}&6W(JUs{f<=p%l1^EfkA8vSDO25e=(%PKt;BMAgB1c|cAC=FHA7mk zhzdaA4qlF?S$RxtT{A4uuXg72S;k;#Vs0c^ZOroFL<_1I`ZEqoOEEP1v17*sPa+n4 zM7G<zX_B&d^IcgPxQc^9BOxdwOU^~57MgIJe7|UU!*tb-<`WQg86vE2?VD+fhRN`U zQd@-T2JWe(g?Kwa8=6CCRz+2A(U*G6C!S{A?VMA_&NHf9jnW1i>0fOAh6Kav3!dXq z?80KUg~bXBPJ0m=Vx*8_SeLKkt19<Mp3~VmBPdEl`nezF-9v?D%4!&)7ADEE3iaPK zPgjyhp+nhrLiNF7W@?1OH$-+2(H}P+3byz|-WwRG6MC9xuSS8WG-sghMe*2aPilXJ zhp=X8OXGB4Py2)Tp{m;dj72rP=A0U@e=eOSr-g{d>#q93Pg=6hqVamD`4n}uFnm#d z-PMxyNw@NAd()E6GTWks!eGk_RjC4-b#F+Uj1@sg>J}2h;?As2y}xs3&Y9*m$AIQu z%CF^|W3A_kzLm?mJYc_`1BZ|K{dD@z{%NOMXcprWjyJ~Zm&45;17{F6_KbIZ{bu}e zZEWm2Gg^7t!&A$QHqPbkF~*_E`)9Q2{lOhWAz$q2Hv-K!375J1@D*NnHdIKnx<rqK zabfft!)E#mn$231ett*qHE9;_=UkKORg^^iU-Q(Gl={+|OU!kBB5PLU;Floyinuep zIFV-*=8VbhaamJ>(>RWaAK)m75saoPQO<SdcQ}8;3PteF6<t~u9jAZSS<CAj!rqb9 zLu|B?et0onh?Zn50t9Bs^cHP$@r-J(wX4g_Dhqk?@-UZx1Z9i9ShSj7CF~O>P!}E< ze1oA{77AS_p%^*SP=cQ4F^^FR8A&yRA*$-stIIql@yG$)hLVY~J-k8+UUo_X?2-UM z<Oom%gzBXM`-IwV^yl4v`WQNpa!(%%t6?f0JH%!wWIAR$d=sCn6HbmJ7(cg`%WVD9 zxQY4ET-I&`hP!v2E2Ggnv;>371>VH8VBt}wcFL?3AnC^RvY2N?V43;m0q+?)mX(uQ zq0UY|3&z$*Xj!~joxy-y8^^P}1W>JPEimlCNvW@I9L4Elk$Dq-frAANOOk>YK&1}V zyv^VeAr<cYZa5hjD9ONib8b099;q)ow|s!hQ9gB_@fwGTlo}Bx93*Nsaz>C9o6YOa ztq(}POI+yjj9uDpkXY(L=UuCDxd^z?US<onTev6Ef`Xq?k47ox6(FIpzBVys)s*#~ z{(7S)X3KB&gN*}baKm86fi*u(OQR7DGx&T;P145c5?ZW3rL|u`(vev2Td_>;MKty& zqGQGZ=N%wsAuIB+;7gXkrXY{5TxbhO8@?u2qF;d{xFy6G{I!TRZ+&ZHnkB3Jp~xyD zt~uP1+KQa@_)|34UWyzgXZ`3-1_)l!IBlC{*+^9KIJfK|Swu41)K-aUUX`gVK<MV> zj-MbS2)iEdE)9a7U)gwlRQ}V#`Cnu{{t@|iL4f<GULwJxKUD;ajz_?2M21@>AIVq0 zSiD|Q1yX!hHJmt9<eT3+NL2*$y_bhT){%ntpHsxiSZNkpzdd5ns^2XMc3Acfv;T(# z?<nBdz-f|`QmQdRM^2S%Pgx=ieU#}q!n{fX9f8Xw*0b&*locR}09b`1K%xXdNn{c# ze$d@C2d-T~`)vf2xgaM#sfN{v)}n;98YTjFFyGP#<(d~0KHnTHv9J`<<lWbenqO8L zb(~_sQ9{Qf@I>k~u!L34tz=Iv!Bbg~%oQ*tDag5`PK7=eUZUS9p}<RIi9Y<PC0eA0 zttI*b_@L4EYaXaQ&k`+CnA~dVUZP)PiGG#9(UA+S$iW+haF*?2Zx|}8FSIhXN?*(P zkX8Cip(@NqbcnZ*(bPf>s(3~%va&`GH@`wk7UTQ#F4tl7D>yozE_0YEh!wNxgDVXT z^lP-oqmXtastbojFsL^IEfeDeUu*7+J$*!Qsh)S%Q^CX+qM#iF>Sf01?38#!8=LKE z{uIqPotIW-_m~Bn)v%J~8DuZ1tiSmtofaH~-8AOB(pWEA+eHby5gd&=z^<r`l#3cd z;NrRi)g5Wxxv6(U4&j}RQkMA&3_RtN2bgkh*{nSCVz5D_KDXusa+_(`ewsOX*YxEv zN_T7LcBxWo+z9>}3FcG=(Id)dkFi2JZ*0m)g_4diCv&o6S-8O*OjcG)lN*C_|DKe> zPUqJ9SW6KAxSHWn5Kcn>eM6EJ-?)%Z7=huFBnRnrPXof{k`og8l=P{IV&b^VyoD|m z-KGT_7GW-We$$j+A=;cs!xfMT>ZV1t5G~P=q!3VqaOJgQPSccUuom4x2BMF(tjvz2 zf+TKk!b_0IJ^GU1d{xf38J4LZ*TkOwL(`mC)S}%vjX1L;p3^S`7*Cl!95*8p*SX~a zK8Oz2#Ag}?i^>ipZHB2zN*k?1rwGJWr9UgJAPqSn#-g-1&3$uTp7|uwx8k2~e(-8| zjOha{LEEVit?4$=cF;Pp#g=t~yHuy&7{34Xp)vawvNKLlJEP(B=bXgCWlaP(%s0=F zg*1uI$-c`BN`@FXpiQ$*wwKU`;wzKQ@?{&$m4=l;${>=7EF$sgij8i%C|{sscAoiz zCwZ{SeHl{%nV_`31>ORATngM8mTc+X_hl7PSLVJ^ta6nbg~kN)I2DYZ@a0y8qvt3E z(GfB`Dbz_0IEfzfF1o0o05xVi51q=qcBEauB(2dk<FNik=hOS0JAd1J%rO8B;)%w9 z?BGb}(}z-)B<cep3+#08eHCj+E3SO!!c~`Czfu%*xqj7SAJd}ws|M-5qjxRM##m8w z@TTiSH|>e2I4vFvme2^slp8n#QjKhFSgw`}{Rtuy`-1-Rmi_v|u&`}#z>)mGp5{Ng z@&+6UB>Xyb_UuLkUQbVc0qM*${trU_j?m<nC$}JLTX#&0iK#P2j1xycEKZE!sC$R{ z*BX1#1uMF_ukS+kcN$C4`!oKiUydf#cSUk{k3JNyqj>eh>y_ZW%a&VZz8-;Dihlhk zmctry)1J_{gP<lB{<cKX$q%!JWYd??eRJ^3s&8ctaU<#d2UG*0M)XJ^hS~F5?ufmV zyKs?tA)1$Hq=?-;|A`T786qQCc6KQ@i5iw1N5|E0GbCxbHS;)bH~qW49)wk>^dEB9 zbgEKdd%5{4AsUj*U*LobqX^v@l7L#!+7}W_G4Jv}Magf>wu>%_A?96HDh7^~U9ha~ zFZAc8wI1j)Tu<EMAQi0FI=6<vh-BJc*O)docGtnq`mD1kq|Pq07jVH7{YAS^ALJt6 zF#p?U8<wEUjLWwt+w15N>w_`c9Ao9xU*#o~1#2$fy<U|#I3=+Akcsjq6yw<%ve<uJ z<|T}Jka=0UN12BR7e4d8p&lJ1L8G^qP%uuQa^1z;@EWto*^oJCf=H|Ebu}y=bY;M4 zd+AiVJzLis=f<I5LN6C~)~)r9fHMu+NNZLHOR(0GIVdh+df{1pe!$r{Z_qdim>~hb z7ztQga~5kD9qc(0cw7QlgM=I}A%{uGA(4=TV)Kwt;}f_zV{%Gzc>?jFDg8o2uT)Eu zbIVs`dx28+g7eNQ9=Z4K{OYaZ7axNjI_?0U(rTSsL~kVdf_q;?z6`5@+={GCNigDS z9jK<Mb$^W3DOPgZ9`sH%aP8`d(|?exIWjiJ%)G?8<q2M9VhFn4mXS{5syldu&&CGE z#ZBobCQmRD(&bBwEdf(g80=mh%0kVXb*yj7;tqUtxg!i>w%ROkZ%zM_bzwPMM@T4? zpg-GU8yJXh%n70CCN4NGweY0TPknd@d&?n?V)W6GSER#T%G*x(49X+gK{n4};01>U z;;q`JNga^`YK)=m+{({7DIGu^om-`bf;kJ7;l{=RTlTN(m(hL)FB}B0bjwk*)4u6K zGWQL-(YbR#TJ5uKkd!ptY`oC9^MLbL4f4t<Y@oSeZDel<emR}<jNNu5nASaD#%6%` z*Ds9Q(7*A*fU|z_pmBKEjL6&gjEP5r7o0wFe_6~Tg$tcMtZK%gYGUEZLyEG_s61Jw zg;fp+?VSqHc;Q=T9&<DWDDdZ;V8=NL$zE>7EMbB`R_1o$S?AUO1Az8v_gik@;>r8D zjrPrE+b$Ann0HZfu!T`Eh*7c1|JlO=CNn9yoKHJe`Oh#iUgw>sfx2^5!+?y8G*}?6 z_NOEe7QdR$V!2~fQ+BLMb)bJ2w^Uta35sVg!)OcP{8=ufj?_RwBTMIb2g*%qpe%_D zlnJZ+HJu6izo0T?RfA0iOQ#GLc{szvxIlbMX20<X!7s?*iMIl8Rig)Xgu{H`x2laT ze~cAMA{pI7Xt)faq=2(YA7nq(PlnK-*q~!oKvSXU6;`!&WxR0c&2$C|6cjzpFe2-p zS;J#Pa(k)Z$epX5TMKwVBUJm%xDW-zNEcMVPN4z@2nwQLDL%;J#m~z9h3=$eZ4y0A zh_1GDD+w5Fj!+qxvEAV;8et>nQx@(%G7g<#wxK9KNU<x$2hYm#%yKb&e>w~JOGJa; z`4o<YTn3-?n3u|pS)rGp8DTnHwu@MQ!bgLRXC#}jW`vC@mfAPuc-)YDF1FU6_@ZPY zN+s0@fhw8(=v0=g7E#F#crEpXXIrxlCQ@4t(R%-e!XqtNAy+V=HA`d#wfe$PQ&yYD zbRyd&hvYCCR{>F7p>eKfv|6V0K4b9dW-TpVGvZRR+H`wuPN-Hau-PW=d5%<e{hB|u z`kZWiQno(cJX}qYli&@SJ9&z_?*AoTNw!^xRVZ5v4m;KC&>f_#k@9=3S)C-4ChR7p z^M{nV#Lmohz!!j#fXi>D8QW88Iu)kh5gZj>&Vxh4tA8+&2dS1^qwZi%Jx9XWe|uJl z2C2=;l>MeuJ(>OgO4v%5&JrRFhh1XK(pci1Thr*n)~pkFYr(5|Af6T+&jVkz;K*50 za@{#gL!*hlB6YWOtJ8`gnUY^CYavftTQN{K&;h;<-kX!eG8oSn34`Ii3+i%C@?@{e zp}H}eKc@rT@(}8DTmPDqJKT})jv(5DPmrA!e0+yXkGEpE%twyVxcx*v<r1@uZn7FW zho@F8iO^~#VDJZK2}NI4IZOXKSBRUk4ze0{Kzoxh_d4_|NoF<p<TFIvHD({{>_o;+ zj6SZ;+bN@2q7#d_=ZH8ZFzwSKNY<T)vzAbd$9xM$VS)J*{sy#moz@f*!O%2jIH*JB zUrj)4ncXKzsA$5F;O^d&=5oARHIc#%KEg)8PL>l&3-*^SK!zr=?8iA}P5C{!_6uMu z>r%`F28JjbfdyC%C}10`-5(>`Vn6kr&rO-JV{6^D^*Nu^dOyjo&q0H7Em@svX50TM zBZC%-)o(A0<<dw#**pTeqb9BiUvilFS`{Kl)BQxybNJf+21<7R!V)FYKwVg>g9vVZ z{UbHk*={a@gmH<%S=hXvoobr-5Ce<E7@T{+o2Hqwt;Bi%*{Q4$1xTg<zm}Q!td_<= zt8p1z*J~ToYQ*)=aRqJt;Xr4(#<Zq3>zT7;c<EPQD+lK?-eRpc9C@=NIm|c2pGQKh zj|p<Fa6J=aW4_2Z=#O7)(8ls{I*Y*>&ouct1DHajH58i8tvh((V#~ACbJv(=lGD<h zTjZX+Jl5)KQ=6Szx2P~D*cR_t&m%pxW)KL#nq;h?JGZXF%lWIUvy(&F&Mo74$#!mC zgwvX3hR%wkW?}m!c!@1X8e{s4(rm5)yY*HuR6H)nBVygrx#erp$~Hy3oMv8qQZ+FH z+_}Zz1DWf$F+iMK|Cs{T)tK-9;@6r{AT@74iVxemlvCK?1a;nV3&WqXI=|}SA)Nm+ zFNE`VZppycD#Ig|C&eJEt#=c@J&ye7(QzU^HtQ^ZjA0b^53kEqcoepQx+96slVYki zOX>=vyeyU=ORe5lh28~WP4z*#s_HE3Q}BM8M~WU^k|;Ko%bPN1fzwP=H$50VDt;~T zZJjAKCpNvsAQzoIVY3-B9b}NljBRvWn{&4I*rsHm9G)|TV5@MtUAvCO*S@_e;Xpk? zW1kqKnE?(2yNJ}+AP33XYaQ-DjkTl%URHx?gIZM9bWh^&vQmaIb7&mz%1Q&t6CnXv zvM7BI7WVDcY7U<}ANN`6{PLSLYx{j46K-1IrKoBu#Y7GEL16{B+`URV18z`Bin5yu zcd$*kd?H~6t})W=&lhW}wl@B|%cZ*&3ChQw%~oBOW^LB8Wi}xm)W9N12xL4We7g%| zDAgQIJ*&?&pCx|7^dO3_Qj9hoIq{=N9AzCB5w4u$y@XgWIcTq?Hi#~K=PjzUhhXLa zieqi+3l|D27#8qI(@UDFbXGylf4{A}j5i1a`1fF9g7T@gM&TCb2DU({2Atd@YU!sY z(EiOO>@84LxMNf!ya%JxG;pD+VmqRn-8Dq1MTAU;>YI<zn(=Ss7e3W07WC@w{M(N) zno*a7xQkGyUJVFQ>}5{bFXWZooNo>R1u454oWxAviCN5S+ge9!p*~nCs4tt5Z_aw3 zUK9hH9~#y9=G+J5jk~Kti~4sN2x6f~mBhJ4W^suQ=Nh8UZF{8LqW3?HzWf9-Bvq!K zd_B_K=j+|p*QT|xNOA-dAlBJaThMRb!B!k9o0Mmkh`k2EhOT6wazPNGP<eH3Jwc`s zjIGODA<K$jY#r@~)rT(g-uta0$4QZA$Vij#qDDl?dp&OjgVXiQ?mmU;f>y1H++{A5 zL^^FXodxC^4ranbMx##W#M8D8u!s|vieB!Mp=7G&>zm3>D;0{}X%>P$s#-Yxt54eN zYEHHhvu1B_l<6i_s==KPhI0eEWv40heyc9>RxXWQ<0wcGd$`gBH{l`5L!iBM4-L4` zsL~Ff??Jbq<eK-kFyymLwI(A)B4e&VEuNeYzRb74zA*>rdokmiu0%py6FY|g#aZ7% z!)!tn!g<FpdHRK*L%CvRZVKxGB6XI<1+K2aVP8q_g{cioc?@WZVyhH$%PB+*MhKq~ z<JlV$HrZ1@^w}}gBt{>ohXnZXk5o;iXw&YO+}HKnba?BjwJ)QdmAXri*(wdfLrIGi zVFf75<hRsW*8EUfd3u~Nz<iA-3lUM*IZp<kPyKk)?HkCp`ZhYjWi1!xrr$*GQ<=2B zWb<uEA|m0POeHNds@eB5n8xhJXn-t&SD0(NlQ%c<7_q1TiP-2EW1Lj{oKuWKvZ5<Z zNpwiBtlr=wv{G>tu}tV%dFEx3vE<+~hpHUppdnPU9AUdD@*%~N+pf$wDXN9d35AqN z0X;L0SW32h`1ugPPsHd#n3gJHv68V0+cd<IU5yQ2kxfi)OowWf@7%fG4%Mpe-CD|W zsI%^4L2q;qE*|>zxPr`#7Z?0xl(=9nvufwsYXb==`ySgkxc2S3+5<85gM*j%_T5~2 zAU0^$7TGri2ljla9bLOssQpH~I^q=WkuDgg?GiogWF0O$h%{@j+8+M2s`t|C<DD5> zcG1#cLSSGqtXL&^-AzC)AueaJeC7qGEEdC|2s7xejTeE1Yy?-e8;KmnVnEmE^x$;! zJERBQ(2o<n!Va*qku&QPj7w!y48z&ehv{)Gnmf>peX(F(S>`hIn%;+4*DG^L#ken^ zsFBQQR=0^<f<{d2VAS6D_NC2l_nUt6U<@+M&t|o4W9r=rnyA&Cy>>EanSTn;ftK5L z#X(?L)sS_-`SdQ~;@>JA&+K}U)q9JJFsUClBnPryY|6GbZAiv4c<06xx$Ydsxxq7R zc7=8~dhDlm!*i}5%yJeVjH@5!=j4>tnGS;}#pv8{fJCMjhV&~*Y4UI75aB;-tFZ^p z25n`w<(O<uB!(k&eLCd{A|-PYyjU~KywYS%Sx4FL?h~~-Ecqv`6^XeFK9R_*jm(;m z@gi3&?v@%*<No>Pmxx^uT#6tPCx~40(S=MBCG;fhgpooLJIeJ7QjoiH>cuX}6`ly9 z63$^a;>GVZQA2%Hn6<C5&I~g5!Y#0tCweS;xlD_aBf#PXV<RvBSL@ionrb>8du-KX zSRGa3Bn>%jXfb=VEVdzQU!arL$}xq%T6m(NaPP99%VS>q4aQxoU2IAQ;!#3moM5wQ zFkUndFj5fHrGNV2I|dAt;WVYYJmyUGC=Dlr>1vxs#X4xY6AYVQf<?(_!RnU3^CIJR zH3H3B!Gam$!CRCB$+KT4{mwaa5V<^<Qg}i*H7CqR@w8!~w&oxPN{POpjE$5<SxQ>Z zH@J;W8{%UE{ZvV}i!DkDmtmf`3&vddZ7QV>O_ST==AWew6nqq{pLTC7gHUP_sM&`? zr)h#Rd_eJMw=ZGnA=3?ZF`*I3y4o|d^h@*1B=SQ-_c+!CVpL8|Q?Pw<ym8Qs7mTC$ zH{=`%PMp3pM!%|dUF;0w^4fK_S;lBal*jzt-74x4@YlG&Kq(gtcUyDq^jZ2#Fxn?( zA@2B!4J+Wgf|shs_%RV^yADCSF9wrhS7U9=p}O$xerKyWD6(PG8DXkNpeHxLb#QLI zR@VM$rcCOBhEe9dG;nw``>wP#P0%W$&{}&bHEhk=%U><{ln2%<%(NFhdFH0)R7dsT zI(t^AJ_=oD4x>miDi|EWX&z360WA`1Zr@l<-Ld|-jSlP}PD?-cY<RWw4(O*@zYM)E zf#j6JS1et}A_7h$yo^D3t9@+y7Ur3!NOxk*aYl~qbfD&y;Iu&2F6tV(j*Md{?V)G; zly+!$zPFLDGK?xKz@<h@O5tAP)<DfcX;ZFGeXDQGx0b7VmaO<ASMl@AScJ~Vwx=C_ zVSSf@If{WvkUt=#*DJ_<RuJ217DZ;DnVO8Q$5FHEM}>!_4vqJACP_iVNErc=6xh!R zvrzm*aX}7R947zkP3G;{-2w|?%zUi*duj%~Z!b<Xf<Dixu<Q~`P|A0P?l%srEp<Bk zt8Bs-MQ9~IA!vc==Wl=u^gCR}Ww32Voytm#)sxIkc()4m37hTeQBgk*!S?IkaE1uR zG5IZS5hERJ9))NRTNm!(1oLWQMDHn2TMf}$ePi%;Ht7ywS`K6FTxgat`w9vqOnyY+ z<NW-_!Ooq#ojW^EWnKpxb98#+VAz;Lojd;`vU#m3S&7Iyq=N!>1qY@SqV`^VY#0zq zpK;jOvphOOkp_q$lb_~TDs07nLbQs)z)`yV9$+pg!HyHACUvt^ev0%|7|UvXMfEqC zIJc}OaJbaU7PTmMhkGqrNRbr2l=?@v$M=`1u@zlBh8L2;<47hCMywNdl;YJMnsX{M zb|mstU3y02#Z-#x6kWlkaBvCr+f@VDDEF@ld@zRqt5U06zC`|Bu(sbSTh)-@G@dW= zCG$6F?HBO5BskXjwD90#Po<A^=>tijVI&!nM9}7Z`hcVXCmyaPU;1NA)+#}F0kROd zZoD8;hWwr~SV2`0vQ-hXRS~jP5wcYgvQ-hXKUWc?DlZwMS21h)(;3dKLD0$Qwqg*< zxnTG%E=Om}2PDQV4WaLLGo&M(G={jWmA&p}i3F#}Z_-DY?cN{y^Ajj!Ld^XAn8vKc zPk3vMnI5kTgFiOV+J!78v!L(q!M|`%9C!&h4x9o8fh3LvW&(?W5}*p$3~U1)2A%?1 zfY*TIKo{WZA|8+iECYPNX5eeU1Hj|JuYlKpHsAzs7D)U=(~^MkKr)a9<N>z;KHvf1 zDd0um9iR)i2=dQZ;96iFa5LZo?gZ`w9tU;;Ex-}r1keRs09olWU<xoBSPGN@Yk)1l zJ-`ov=YRvi5#Uci7cdr7IvGd<76E;KCz8^%x6@ItaATTwc4?ZXtpLKm8~-^?`_8bQ z_lW<hqSA72v0JZn-|E%f-gTwAdu3&@*S*SDx!PUjt6b@=uAam}x+mO9pSMW&Mt^gU ztJe6hWmFpF#qNqqNyocVeDN!)5RX-*6~%7PdcCBwLVYy!qFc(n1Q8trV@6l0FO!HS z<r*`(J6>g#w?c)ws(Pibv`U{;wSF!6__8Rd$10tst=6iwm0G3d)4cqfq!nxB{L{1v zT7_n)=PM*xZ9;`nUT!@KBcPu&p-Z#%)B44_>{(e^aq^p*ta(&m_jJ$Fc!zdfa&o>0 zQjFUz`@7~?QL=)crmd@5$In3sh^!6=j)Q;ls_ht^PA3EWVq$IfxPI}D{s{vT2M%(& z248UDkf9e{oHXo`;Uh+ly3{@TvN2=FjlX=t6<?Tm<yDiePQK>a$y26IyKZ{QjMSO4 zzWAlI^y@P+vu4l9o_oWM^K#}d@GM-EyBG_ZOAG$#rke|wEniV|%gSQ!s#{A+%Wf-Q zT~S$eyRTX|)~sE({>xw4P_uE9BI{;VNSAslODlA*k22k;Wifu{^LL&$S-X}N%j9XE zDsQH@ci7qG)w6wGuZElJ)$@wV4fQ-H>N&l<ymF;P_8Ap=>1war>+@Cm+?qC!&Rslj zL2j<)Bd=QS-1&2&UbV~xIq7rf_xLQDmOOdNz=ZS)cTrVUdFjd`y_6wSQdI3;UBs{~ z!e7_DtE+SwvgMUU4BZm1JHs8xyS(%kUy*OUyOcWneBPCM`T9u-o^o$dwU>cip%<+r zCNZK?zr5OAZB$iN`uO54TJ2s%;a6AsyrjY7YE^<ss_>Lw$~Spn!d33{o?;lJos&Cv zUewIdOG>NVMb*{b)wh(dcNZJJ(u!N%6(qGria|w6D@yg!qVm!&tK<_FOL*ppRM<;Q z_btY)yt~&|8oubVPIAxH-2`1-S*^RvOK<a%x>U#Ktv1SacjYSg%A)de$&8kgGF`Q@ za&?uO;uEf3S?;^Sy~?OqsoGS{@S>hVRaEOfW2H{z`L8}^mY3%gl~$;_OTDj^daLPO zQEA*-;;ybLTFFX5a0WmT(>bcaqTB15KJC?AcdylXixyk$t(Q>f%8HfVNuR$xBp)eT zvgDCLN>aX_42r|wubnR6jS98uFmifAxJ$f6RaR+9=i2K&qmFA!qavz)>xnn*yz#2_ z;?IaTRpM0{jJ7qUKHVrP@97}vNtJ<=i#c(gwqIUZA<OpF3>;a#)xz3cu4_^xUQfN% zddfVguB5w)y=zKWdV9i#+sM1Fih0APAT84~GgUiZquR$H$8ea{47*ajggv2HM!{`; z!=Jxh!jX!L^dgEd(CYH2X{jc?&wIP!t(L;bC|?v_VCX<rvel(bC<dMMw+wfq!l;%8 zTwC;aobt4NvTDO~j(cwfy;fPV+FPMh2MMd%@SI_be771Buv#^^gjMrt6^ocI6Shj$ z=kAqAl91)it46S<<&>`URaRH7(%pHbs+JiOCw8~TJZsTodD0S?50fTM(q^)E-|AyE zt0-bcHY#qbs9am|Mfxz@gjupik4{Kn6O~{y+!C1|CzV~0(baDx&%#KT-@Q@KO+2g3 z5Px(|bU!05+5NmN>KW!*w?DG^-Ot~MdhS<Sdq-_uEgQ1!j@mmm*A9t`V@KY)bt?r* zPOkOT)@u%J!sXLF`L*n~Y|0)_J=wb_)YjJ$OJiFuDJgL{;@4GGt*xr+wIB2OfBes_ z_5C*i{K)#(_shB7v%!=;>)#gb)Bk#huhV+|#b}@JUvvtawVr>m5R*U8zes%d|M>pb zKGpwjG%Ef-9sx0R-Tx3U{#?IE4~n}vrsrR5%;)<TiGQv!{U7uDYcoJ{8p6Lwj`G&? z>=Kdc|G=+r_|I3{o=`5W=h=FSiIGWATesQ2W$PVZt#4=y+}ZTCySCl^^>5ts&3nIf z-~A7K`@!#g_j?a*fB2C{AA9`!JAUxPAN}~BpZLj>KmC`VJ@xaQPe1eQbHDiI^S}D_ zuIAl)_Wq`&b>IF2FTD7#FTH&5&~FdF^6G1^A9>@=w~qeq_kU<R_Vyo-|Jyt7n(coI zp7{6o-tYL}&mW%r=+x=XGk^KGi_3_A^MUC62cFM$Ao{Pa|9^G<e{=i)wFBw-zpDf3 ze|7z{vuCVcJ)>Gk6IwC9E8RK#-14xVpO%wzb#d|4Jn-}6Xj(eJnV55&Iy!6fE7x>C zFW|H!-nrf?j-*zAbmLZ|TGzB2jB=I64dBX>R(h4MRA>@8MZT3KxU;>t_zVuJ^6iGA z3iU`nlD<Z|lBPylk`7Qoy!DcX#Fw}dN6RhJ4PP-IBt2iLdRkm!_^QKx`QG9RZ}?>~ zXta3eR92|3xklJ6(j~4&JdN-g;UtX4ca1}Sn8uRN(X?`HuC5L};=iQY>sxS38Rvw# zJ%?nWc<^mrQMI1V8FLLJhbp5=`C0E)GFlEarJ`HC*H^Af*OugFEt-7oq|AAcAIOue zDFFqcJQRx>TJ1xXsW}ZmJJ1}o3XMY>(NwgUG#tN-1@jjySv*#o#F<y#BlM(6x2R<B zUtO&HZziwxoGMl?s;ra@_+?wpf9h}T1?k#BID$5bJzdkDEY-A!?mu@@kWr!JX&N+d z<wo9*Lc5b+<b7YC@4p<=`+I%V_rHvT-Y0<HF5Fkb&ywDqQQ=CaqB9SWUnHNt<+w1l z_xFQQ@g?4|KHp#L^ZmA2R(uJ29na^>r{jxOxbuA<lXm{^Iq7LyDImY|#V?%G`+MJV zPJ~7(zw^ca_WaNO{yR@k-A+V3AL-K`-&@oZ?nhD2ecRnz&^y2AbOzj%rd<liFH+v< z?}dCT>hpb9pK?62tatqAe$8H<rY#5L7fHWw`JOH7{XIIq#5+*l`+MK`FRkzWy>I;A z*M0W)UvKXHy>EX$_08Vj`=+0B-)Db6zP<PNzU9B^@!sG2&d<?1tnV7X!teL=dEasz zeWG_deZP0^?)|-QJ->Y*O}qIFnS_5Aagx&7B5%Fj|K+XxZM>C5F>|~XULQoJ42xox zq5I0S)<DC7ufsQ8xDXjaT90rdD(v}1rTXkjUoI4#a<8>RYTwi{6wf3ajBWBKHi+p_ ziDnm76qkcZd?cynR2CcM-q{ds=R><8^qX3iQ0_B)kc=S;=CbQT6xXzqvGcq|YrLQG z|4UCQR>Jw3HqoA2?ggi~ES4OkAnC=$5RJiu;$otiDOD0TqjL3XN;I#ug6wBX47Pr# zlU1_Wr)wQjdMjmEKGGUrw89iyo^Y)s6{*4E^;KTv-ZQ=BURtqF1+KF%j!^NsTkwY} ze*@BeMFjcKvh7PMN>mFKXRTWavPJDlTro2)wNsY!ets=>Zgr*?TKcVCpNHy7*S#w_ z2#%siU~uYUv!Qb;CWrR0dbSuEH>;9(q{`ZFV&_T^2!YdEJhuWCm{9UGtvT8sEF|Ke zD{<2^JeoE{T4q63jy$(f8aODW#cIre0cl^fFD|bpfW=ptDQ{tJ%9rH1o8vM|-c%7! zO4~=3{)wpeTCB*hbHQ=GWzVOr)fm!F#m<9{7$y-inx3P~VctXE9!ak#&aEn~usZd| z7|AfJhr*ew3m2n0UE3vje)@wp?>sT`wJrAi(qeB$Ns(`HWsXpcuV1fwwcY1Vhtc|| z>IZAqXj+jy&!Ua17AUYSG`zm`9<NVvXJ8ko@-lnMq^%d1uDmTgDt{E!HsJwA<K(Kb zs?fj1aI4a*)i~uzd%(6xFJDrz7GziZfhxfwuhkvPA|(j-&K8w&cu}Bd?~QtA`hxLa zA2Yk$s4kJTuQyh$^7@!*@5Ii_$SJC_+L4~P)Yjb=iz_1yq?ys7Xp1y!Zb{qAY$9Gp zZy&<6OaAi|6ULgN+PgANB=>H%-;Y#{a!bEV=`yv9^2%y&c)H$cjh66wl&(DxRhtEd zUS;SqdhhKODqrg-GcQ-~p7ZO&tDIzty+F9MtE-B9-tOAw_4c9EN2H8V<0!AlS1Jse zbnV8hMf0=faV{t>=g?GPTLgPS($%zAtvJOCR$1@kr7gmpEAtpkL`ts;p)+7_G2o}s zX8-&9|FZ>li2^!);#w4{a5-IJH_Ab<NwA&s{^YyB|Nj2B1wL;J%zr2C7e5{L>&!om zNmFB|{B7`Sfa6oBRs<IQlRp`!7XgtmX$wEwapk&a954_-4n^w^!~=<dBkYQwyh{<} zoABf!-y~g$D=u0vR30*2#BVTgK^P?O(SZ0*1>`+F{GJhhXJJ=y7KQzD!!FCSO1}VC z@@5%U>8!?e11z-K2*3wOS*0FQo?1Z4To-mX<H~nGAm6tDQXaW*cLng>@cVXLDc_@j z<oA6*!aWU0on8Xu`|E&wPohzzeIjkfWB1w+BQH_E$a}<%e2TpHb^Ctr`~KI$pYMAl zoqs&nb>5#<SNC~;{}^p?ex`&~zw;Bt|1s(>wK(q(2=C<Q9RluuoHn2)|ILR&$x!gH zSi9p<Hmnt!*KZyj?wrT}U_ESq%yR3#Cla)pmbS50xjP8o{K%V+xUJ8h`df$WtNhZ! z?$1AG`1El2orHh+;o}cqqW#;$=EFBxiADYGPJiQe6+?72Eqrs?n{I9Sn`Lia8x_)e ztUG+<_ifP8uGwhCEdO_lW|t8T8Ck<W74dKM*mg;JuN3~)cPVGzvWk7^$gd=rrgglJ z-J}oFwE7Y0+I{3N;l-7{7Cc9OvbT1cX$r@95m)x?hj3*tci_q-KKgE&+KYdTD>z0y z?uEEF;|fkQ7IzqK*E?z2CAfQWhvVLfE4V^2?kL<$+)HuW{w+;&<L<y6jr-*BH0?56 z7w$S-4R<|G#~;(QFXOi1%3wQ+8^V1NcNuiu&jSn}g-1!cQm62uq)Gdf(f9X#n5NwW zYy<8D>VYjlEwB!#0!o0J0S}N3%mk(bQ-EaPN?-yo7H|V2fFxiD-~ti>JJ9)O`UEfm z3Ezf$1ULxn1%3%U2|Nls1Uv|A12zCvK!1BrpG%)kqCT1Q`JGq%b=VaC$ry<tp2QV5 z@{@LQ$9+S(@ti*yC(*y!Dl2}+2Nplele;+j^MCl+lliyBKS;e?D5H`w9mzcUS@;_Q z@{_Tc3j7lw<KkO@C}w>H_z)OO!z2Uq0lAnGi8F(51;AS1Uf?O<Fz{zUE>~U+<N)Qs ffA`;C6IqGv^RtD2k$RV(<URs$Gq4!wJAVETV*lf- literal 0 HcmV?d00001 diff --git a/myenv/lib/python3.7/site-packages/setuptools/launch.py b/myenv/lib/python3.7/site-packages/setuptools/launch.py new file mode 100644 index 000000000..308283ea9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/launch.py @@ -0,0 +1,35 @@ +""" +Launch the Python script on the command line after +setuptools is bootstrapped via import. +""" + +# Note that setuptools gets imported implicitly by the +# invocation of this script using python -m setuptools.launch + +import tokenize +import sys + + +def run(): + """ + Run the script in sys.argv[1] as if it had + been invoked naturally. + """ + __builtins__ + script_name = sys.argv[1] + namespace = dict( + __file__=script_name, + __name__='__main__', + __doc__=None, + ) + sys.argv[:] = sys.argv[1:] + + open_ = getattr(tokenize, 'open', open) + script = open_(script_name).read() + norm_script = script.replace('\\r\\n', '\\n') + code = compile(norm_script, script_name, 'exec') + exec(code, namespace) + + +if __name__ == '__main__': + run() diff --git a/myenv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py b/myenv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py new file mode 100644 index 000000000..4b1a73feb --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/lib2to3_ex.py @@ -0,0 +1,62 @@ +""" +Customized Mixin2to3 support: + + - adds support for converting doctests + + +This module raises an ImportError on Python 2. +""" + +from distutils.util import Mixin2to3 as _Mixin2to3 +from distutils import log +from lib2to3.refactor import RefactoringTool, get_fixers_from_package + +import setuptools + + +class DistutilsRefactoringTool(RefactoringTool): + def log_error(self, msg, *args, **kw): + log.error(msg, *args) + + def log_message(self, msg, *args): + log.info(msg, *args) + + def log_debug(self, msg, *args): + log.debug(msg, *args) + + +class Mixin2to3(_Mixin2to3): + def run_2to3(self, files, doctests=False): + # See of the distribution option has been set, otherwise check the + # setuptools default. + if self.distribution.use_2to3 is not True: + return + if not files: + return + log.info("Fixing " + " ".join(files)) + self.__build_fixer_names() + self.__exclude_fixers() + if doctests: + if setuptools.run_2to3_on_doctests: + r = DistutilsRefactoringTool(self.fixer_names) + r.refactor(files, write=True, doctests_only=True) + else: + _Mixin2to3.run_2to3(self, files) + + def __build_fixer_names(self): + if self.fixer_names: + return + self.fixer_names = [] + for p in setuptools.lib2to3_fixer_packages: + self.fixer_names.extend(get_fixers_from_package(p)) + if self.distribution.use_2to3_fixers is not None: + for p in self.distribution.use_2to3_fixers: + self.fixer_names.extend(get_fixers_from_package(p)) + + def __exclude_fixers(self): + excluded_fixers = getattr(self, 'exclude_fixers', []) + if self.distribution.use_2to3_exclude_fixers is not None: + excluded_fixers.extend(self.distribution.use_2to3_exclude_fixers) + for fixer_name in excluded_fixers: + if fixer_name in self.fixer_names: + self.fixer_names.remove(fixer_name) diff --git a/myenv/lib/python3.7/site-packages/setuptools/monkey.py b/myenv/lib/python3.7/site-packages/setuptools/monkey.py new file mode 100644 index 000000000..d9eb7d7b2 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/monkey.py @@ -0,0 +1,197 @@ +""" +Monkey patching of distutils. +""" + +import sys +import distutils.filelist +import platform +import types +import functools +from importlib import import_module +import inspect + +from setuptools.extern import six + +import setuptools + +__all__ = [] +""" +Everything is private. Contact the project team +if you think you need this functionality. +""" + + +def _get_mro(cls): + """ + Returns the bases classes for cls sorted by the MRO. + + Works around an issue on Jython where inspect.getmro will not return all + base classes if multiple classes share the same name. Instead, this + function will return a tuple containing the class itself, and the contents + of cls.__bases__. See https://github.com/pypa/setuptools/issues/1024. + """ + if platform.python_implementation() == "Jython": + return (cls,) + cls.__bases__ + return inspect.getmro(cls) + + +def get_unpatched(item): + lookup = ( + get_unpatched_class if isinstance(item, six.class_types) else + get_unpatched_function if isinstance(item, types.FunctionType) else + lambda item: None + ) + return lookup(item) + + +def get_unpatched_class(cls): + """Protect against re-patching the distutils if reloaded + + Also ensures that no other distutils extension monkeypatched the distutils + first. + """ + external_bases = ( + cls + for cls in _get_mro(cls) + if not cls.__module__.startswith('setuptools') + ) + base = next(external_bases) + if not base.__module__.startswith('distutils'): + msg = "distutils has already been patched by %r" % cls + raise AssertionError(msg) + return base + + +def patch_all(): + # we can't patch distutils.cmd, alas + distutils.core.Command = setuptools.Command + + has_issue_12885 = sys.version_info <= (3, 5, 3) + + if has_issue_12885: + # fix findall bug in distutils (http://bugs.python.org/issue12885) + distutils.filelist.findall = setuptools.findall + + needs_warehouse = ( + sys.version_info < (2, 7, 13) + or + (3, 0) < sys.version_info < (3, 3, 7) + or + (3, 4) < sys.version_info < (3, 4, 6) + or + (3, 5) < sys.version_info <= (3, 5, 3) + ) + + if needs_warehouse: + warehouse = 'https://upload.pypi.org/legacy/' + distutils.config.PyPIRCCommand.DEFAULT_REPOSITORY = warehouse + + _patch_distribution_metadata_write_pkg_file() + _patch_distribution_metadata_write_pkg_info() + + # Install Distribution throughout the distutils + for module in distutils.dist, distutils.core, distutils.cmd: + module.Distribution = setuptools.dist.Distribution + + # Install the patched Extension + distutils.core.Extension = setuptools.extension.Extension + distutils.extension.Extension = setuptools.extension.Extension + if 'distutils.command.build_ext' in sys.modules: + sys.modules['distutils.command.build_ext'].Extension = ( + setuptools.extension.Extension + ) + + patch_for_msvc_specialized_compiler() + + +def _patch_distribution_metadata_write_pkg_file(): + """Patch write_pkg_file to also write Requires-Python/Requires-External""" + distutils.dist.DistributionMetadata.write_pkg_file = ( + setuptools.dist.write_pkg_file + ) + + +def _patch_distribution_metadata_write_pkg_info(): + """ + Workaround issue #197 - Python 3 prior to 3.2.2 uses an environment-local + encoding to save the pkg_info. Monkey-patch its write_pkg_info method to + correct this undesirable behavior. + """ + environment_local = (3,) <= sys.version_info[:3] < (3, 2, 2) + if not environment_local: + return + + distutils.dist.DistributionMetadata.write_pkg_info = ( + setuptools.dist.write_pkg_info + ) + + +def patch_func(replacement, target_mod, func_name): + """ + Patch func_name in target_mod with replacement + + Important - original must be resolved by name to avoid + patching an already patched function. + """ + original = getattr(target_mod, func_name) + + # set the 'unpatched' attribute on the replacement to + # point to the original. + vars(replacement).setdefault('unpatched', original) + + # replace the function in the original module + setattr(target_mod, func_name, replacement) + + +def get_unpatched_function(candidate): + return getattr(candidate, 'unpatched') + + +def patch_for_msvc_specialized_compiler(): + """ + Patch functions in distutils to use standalone Microsoft Visual C++ + compilers. + """ + # import late to avoid circular imports on Python < 3.5 + msvc = import_module('setuptools.msvc') + + if platform.system() != 'Windows': + # Compilers only availables on Microsoft Windows + return + + def patch_params(mod_name, func_name): + """ + Prepare the parameters for patch_func to patch indicated function. + """ + repl_prefix = 'msvc9_' if 'msvc9' in mod_name else 'msvc14_' + repl_name = repl_prefix + func_name.lstrip('_') + repl = getattr(msvc, repl_name) + mod = import_module(mod_name) + if not hasattr(mod, func_name): + raise ImportError(func_name) + return repl, mod, func_name + + # Python 2.7 to 3.4 + msvc9 = functools.partial(patch_params, 'distutils.msvc9compiler') + + # Python 3.5+ + msvc14 = functools.partial(patch_params, 'distutils._msvccompiler') + + try: + # Patch distutils.msvc9compiler + patch_func(*msvc9('find_vcvarsall')) + patch_func(*msvc9('query_vcvarsall')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler._get_vc_env + patch_func(*msvc14('_get_vc_env')) + except ImportError: + pass + + try: + # Patch distutils._msvccompiler.gen_lib_options for Numpy + patch_func(*msvc14('gen_lib_options')) + except ImportError: + pass diff --git a/myenv/lib/python3.7/site-packages/setuptools/msvc.py b/myenv/lib/python3.7/site-packages/setuptools/msvc.py new file mode 100644 index 000000000..5e20b3f1d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/msvc.py @@ -0,0 +1,1302 @@ +""" +Improved support for Microsoft Visual C++ compilers. + +Known supported compilers: +-------------------------- +Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + +Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + +Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) +""" + +import os +import sys +import platform +import itertools +import distutils.errors +from setuptools.extern.packaging.version import LegacyVersion + +from setuptools.extern.six.moves import filterfalse + +from .monkey import get_unpatched + +if platform.system() == 'Windows': + from setuptools.extern.six.moves import winreg + safe_env = os.environ +else: + """ + Mock winreg and environ so the module can be imported + on this platform. + """ + + class winreg: + HKEY_USERS = None + HKEY_CURRENT_USER = None + HKEY_LOCAL_MACHINE = None + HKEY_CLASSES_ROOT = None + + safe_env = dict() + +_msvc9_suppress_errors = ( + # msvc9compiler isn't available on some platforms + ImportError, + + # msvc9compiler raises DistutilsPlatformError in some + # environments. See #1118. + distutils.errors.DistutilsPlatformError, +) + +try: + from distutils.msvc9compiler import Reg +except _msvc9_suppress_errors: + pass + + +def msvc9_find_vcvarsall(version): + """ + Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone + compiler build for Python (VCForPython). Fall back to original behavior + when the standalone compiler is not available. + + Redirect the path of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + + Parameters + ---------- + version: float + Required Microsoft Visual C++ version. + + Return + ------ + vcvarsall.bat path: str + """ + VC_BASE = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f' + key = VC_BASE % ('', version) + try: + # Per-user installs register the compiler path here + productdir = Reg.get_value(key, "installdir") + except KeyError: + try: + # All-user installs on a 64-bit system register here + key = VC_BASE % ('Wow6432Node\\', version) + productdir = Reg.get_value(key, "installdir") + except KeyError: + productdir = None + + if productdir: + vcvarsall = os.path.os.path.join(productdir, "vcvarsall.bat") + if os.path.isfile(vcvarsall): + return vcvarsall + + return get_unpatched(msvc9_find_vcvarsall)(version) + + +def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs): + """ + Patched "distutils.msvc9compiler.query_vcvarsall" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 9.0: + Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64) + Microsoft Windows SDK 6.1 (x86, x64, ia64) + Microsoft Windows SDK 7.0 (x86, x64, ia64) + + Microsoft Visual C++ 10.0: + Microsoft Windows SDK 7.1 (x86, x64, ia64) + + Parameters + ---------- + ver: float + Required Microsoft Visual C++ version. + arch: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environement from vcvarsall.bat (Classical way) + try: + orig = get_unpatched(msvc9_query_vcvarsall) + return orig(ver, arch, *args, **kwargs) + except distutils.errors.DistutilsPlatformError: + # Pass error if Vcvarsall.bat is missing + pass + except ValueError: + # Pass error if environment not set after executing vcvarsall.bat + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(arch, ver).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, ver, arch) + raise + + +def msvc14_get_vc_env(plat_spec): + """ + Patched "distutils._msvccompiler._get_vc_env" for support extra + compilers. + + Set environment without use of "vcvarsall.bat". + + Known supported compilers + ------------------------- + Microsoft Visual C++ 14.0: + Microsoft Visual C++ Build Tools 2015 (x86, x64, arm) + Microsoft Visual Studio 2017 (x86, x64, arm, arm64) + Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64) + + Parameters + ---------- + plat_spec: str + Target architecture. + + Return + ------ + environment: dict + """ + # Try to get environment from vcvarsall.bat (Classical way) + try: + return get_unpatched(msvc14_get_vc_env)(plat_spec) + except distutils.errors.DistutilsPlatformError: + # Pass error Vcvarsall.bat is missing + pass + + # If error, try to set environment directly + try: + return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env() + except distutils.errors.DistutilsPlatformError as exc: + _augment_exception(exc, 14.0) + raise + + +def msvc14_gen_lib_options(*args, **kwargs): + """ + Patched "distutils._msvccompiler.gen_lib_options" for fix + compatibility between "numpy.distutils" and "distutils._msvccompiler" + (for Numpy < 1.11.2) + """ + if "numpy.distutils" in sys.modules: + import numpy as np + if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'): + return np.distutils.ccompiler.gen_lib_options(*args, **kwargs) + return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs) + + +def _augment_exception(exc, version, arch=''): + """ + Add details to the exception message to help guide the user + as to what action will resolve it. + """ + # Error if MSVC++ directory not found or environment not set + message = exc.args[0] + + if "vcvarsall" in message.lower() or "visual c" in message.lower(): + # Special error message if MSVC++ not installed + tmpl = 'Microsoft Visual C++ {version:0.1f} is required.' + message = tmpl.format(**locals()) + msdownload = 'www.microsoft.com/download/details.aspx?id=%d' + if version == 9.0: + if arch.lower().find('ia64') > -1: + # For VC++ 9.0, if IA64 support is needed, redirect user + # to Windows SDK 7.0 + message += ' Get it with "Microsoft Windows SDK 7.0": ' + message += msdownload % 3138 + else: + # For VC++ 9.0 redirect user to Vc++ for Python 2.7 : + # This redirection link is maintained by Microsoft. + # Contact vspython@microsoft.com if it needs updating. + message += ' Get it from http://aka.ms/vcpython27' + elif version == 10.0: + # For VC++ 10.0 Redirect user to Windows SDK 7.1 + message += ' Get it with "Microsoft Windows SDK 7.1": ' + message += msdownload % 8279 + elif version >= 14.0: + # For VC++ 14.0 Redirect user to Visual C++ Build Tools + message += (' Get it with "Microsoft Visual C++ Build Tools": ' + r'http://landinghub.visualstudio.com/' + 'visual-cpp-build-tools') + + exc.args = (message, ) + + +class PlatformInfo: + """ + Current and Target Architectures informations. + + Parameters + ---------- + arch: str + Target architecture. + """ + current_cpu = safe_env.get('processor_architecture', '').lower() + + def __init__(self, arch): + self.arch = arch.lower().replace('x64', 'amd64') + + @property + def target_cpu(self): + return self.arch[self.arch.find('_') + 1:] + + def target_is_x86(self): + return self.target_cpu == 'x86' + + def current_is_x86(self): + return self.current_cpu == 'x86' + + def current_dir(self, hidex86=False, x64=False): + """ + Current platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\target', or '' (see hidex86 parameter) + """ + return ( + '' if (self.current_cpu == 'x86' and hidex86) else + r'\x64' if (self.current_cpu == 'amd64' and x64) else + r'\%s' % self.current_cpu + ) + + def target_dir(self, hidex86=False, x64=False): + r""" + Target platform specific subfolder. + + Parameters + ---------- + hidex86: bool + return '' and not '\x86' if architecture is x86. + x64: bool + return '\x64' and not '\amd64' if architecture is amd64. + + Return + ------ + subfolder: str + '\current', or '' (see hidex86 parameter) + """ + return ( + '' if (self.target_cpu == 'x86' and hidex86) else + r'\x64' if (self.target_cpu == 'amd64' and x64) else + r'\%s' % self.target_cpu + ) + + def cross_dir(self, forcex86=False): + r""" + Cross platform specific subfolder. + + Parameters + ---------- + forcex86: bool + Use 'x86' as current architecture even if current acritecture is + not x86. + + Return + ------ + subfolder: str + '' if target architecture is current architecture, + '\current_target' if not. + """ + current = 'x86' if forcex86 else self.current_cpu + return ( + '' if self.target_cpu == current else + self.target_dir().replace('\\', '\\%s_' % current) + ) + + +class RegistryInfo: + """ + Microsoft Visual Studio related registry informations. + + Parameters + ---------- + platform_info: PlatformInfo + "PlatformInfo" instance. + """ + HKEYS = (winreg.HKEY_USERS, + winreg.HKEY_CURRENT_USER, + winreg.HKEY_LOCAL_MACHINE, + winreg.HKEY_CLASSES_ROOT) + + def __init__(self, platform_info): + self.pi = platform_info + + @property + def visualstudio(self): + """ + Microsoft Visual Studio root registry key. + """ + return 'VisualStudio' + + @property + def sxs(self): + """ + Microsoft Visual Studio SxS registry key. + """ + return os.path.join(self.visualstudio, 'SxS') + + @property + def vc(self): + """ + Microsoft Visual C++ VC7 registry key. + """ + return os.path.join(self.sxs, 'VC7') + + @property + def vs(self): + """ + Microsoft Visual Studio VS7 registry key. + """ + return os.path.join(self.sxs, 'VS7') + + @property + def vc_for_python(self): + """ + Microsoft Visual C++ for Python registry key. + """ + return r'DevDiv\VCForPython' + + @property + def microsoft_sdk(self): + """ + Microsoft SDK registry key. + """ + return 'Microsoft SDKs' + + @property + def windows_sdk(self): + """ + Microsoft Windows/Platform SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'Windows') + + @property + def netfx_sdk(self): + """ + Microsoft .NET Framework SDK registry key. + """ + return os.path.join(self.microsoft_sdk, 'NETFXSDK') + + @property + def windows_kits_roots(self): + """ + Microsoft Windows Kits Roots registry key. + """ + return r'Windows Kits\Installed Roots' + + def microsoft(self, key, x86=False): + """ + Return key in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + x86: str + Force x86 software registry. + + Return + ------ + str: value + """ + node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node' + return os.path.join('Software', node64, 'Microsoft', key) + + def lookup(self, key, name): + """ + Look for values in registry in Microsoft software registry. + + Parameters + ---------- + key: str + Registry key path where look. + name: str + Value name to find. + + Return + ------ + str: value + """ + KEY_READ = winreg.KEY_READ + openkey = winreg.OpenKey + ms = self.microsoft + for hkey in self.HKEYS: + try: + bkey = openkey(hkey, ms(key), 0, KEY_READ) + except (OSError, IOError): + if not self.pi.current_is_x86(): + try: + bkey = openkey(hkey, ms(key, True), 0, KEY_READ) + except (OSError, IOError): + continue + else: + continue + try: + return winreg.QueryValueEx(bkey, name)[0] + except (OSError, IOError): + pass + + +class SystemInfo: + """ + Microsoft Windows and Visual Studio related system inormations. + + Parameters + ---------- + registry_info: RegistryInfo + "RegistryInfo" instance. + vc_ver: float + Required Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + WinDir = safe_env.get('WinDir', '') + ProgramFiles = safe_env.get('ProgramFiles', '') + ProgramFilesx86 = safe_env.get('ProgramFiles(x86)', ProgramFiles) + + def __init__(self, registry_info, vc_ver=None): + self.ri = registry_info + self.pi = self.ri.pi + self.vc_ver = vc_ver or self._find_latest_available_vc_ver() + + def _find_latest_available_vc_ver(self): + try: + return self.find_available_vc_vers()[-1] + except IndexError: + err = 'No Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + def find_available_vc_vers(self): + """ + Find all available Microsoft Visual C++ versions. + """ + ms = self.ri.microsoft + vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs) + vc_vers = [] + for hkey in self.ri.HKEYS: + for key in vckeys: + try: + bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ) + except (OSError, IOError): + continue + subkeys, values, _ = winreg.QueryInfoKey(bkey) + for i in range(values): + try: + ver = float(winreg.EnumValue(bkey, i)[0]) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + for i in range(subkeys): + try: + ver = float(winreg.EnumKey(bkey, i)) + if ver not in vc_vers: + vc_vers.append(ver) + except ValueError: + pass + return sorted(vc_vers) + + @property + def VSInstallDir(self): + """ + Microsoft Visual Studio directory. + """ + # Default path + name = 'Microsoft Visual Studio %0.1f' % self.vc_ver + default = os.path.join(self.ProgramFilesx86, name) + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vs, '%0.1f' % self.vc_ver) or default + + @property + def VCInstallDir(self): + """ + Microsoft Visual C++ directory. + """ + self.VSInstallDir + + guess_vc = self._guess_vc() or self._guess_vc_legacy() + + # Try to get "VC++ for Python" path from registry as default path + reg_path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + python_vc = self.ri.lookup(reg_path, 'installdir') + default_vc = os.path.join(python_vc, 'VC') if python_vc else guess_vc + + # Try to get path from registry, if fail use default path + path = self.ri.lookup(self.ri.vc, '%0.1f' % self.vc_ver) or default_vc + + if not os.path.isdir(path): + msg = 'Microsoft Visual C++ directory not found' + raise distutils.errors.DistutilsPlatformError(msg) + + return path + + def _guess_vc(self): + """ + Locate Visual C for 2017 + """ + if self.vc_ver <= 14.0: + return + + default = r'VC\Tools\MSVC' + guess_vc = os.path.join(self.VSInstallDir, default) + # Subdir with VC exact version as name + try: + vc_exact_ver = os.listdir(guess_vc)[-1] + return os.path.join(guess_vc, vc_exact_ver) + except (OSError, IOError, IndexError): + pass + + def _guess_vc_legacy(self): + """ + Locate Visual C for versions prior to 2017 + """ + default = r'Microsoft Visual Studio %0.1f\VC' % self.vc_ver + return os.path.join(self.ProgramFilesx86, default) + + @property + def WindowsSdkVersion(self): + """ + Microsoft Windows SDK versions for specified MSVC++ version. + """ + if self.vc_ver <= 9.0: + return ('7.0', '6.1', '6.0a') + elif self.vc_ver == 10.0: + return ('7.1', '7.0a') + elif self.vc_ver == 11.0: + return ('8.0', '8.0a') + elif self.vc_ver == 12.0: + return ('8.1', '8.1a') + elif self.vc_ver >= 14.0: + return ('10.0', '8.1') + + @property + def WindowsSdkLastVersion(self): + """ + Microsoft Windows SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.WindowsSdkDir, 'lib')) + + @property + def WindowsSdkDir(self): + """ + Microsoft Windows SDK directory. + """ + sdkdir = '' + for ver in self.WindowsSdkVersion: + # Try to get it from registry + loc = os.path.join(self.ri.windows_sdk, 'v%s' % ver) + sdkdir = self.ri.lookup(loc, 'installationfolder') + if sdkdir: + break + if not sdkdir or not os.path.isdir(sdkdir): + # Try to get "VC++ for Python" version from registry + path = os.path.join(self.ri.vc_for_python, '%0.1f' % self.vc_ver) + install_base = self.ri.lookup(path, 'installdir') + if install_base: + sdkdir = os.path.join(install_base, 'WinSDK') + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default new path + for ver in self.WindowsSdkVersion: + intver = ver[:ver.rfind('.')] + path = r'Microsoft SDKs\Windows Kits\%s' % (intver) + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir or not os.path.isdir(sdkdir): + # If fail, use default old path + for ver in self.WindowsSdkVersion: + path = r'Microsoft SDKs\Windows\v%s' % ver + d = os.path.join(self.ProgramFiles, path) + if os.path.isdir(d): + sdkdir = d + if not sdkdir: + # If fail, use Platform SDK + sdkdir = os.path.join(self.VCInstallDir, 'PlatformSDK') + return sdkdir + + @property + def WindowsSDKExecutablePath(self): + """ + Microsoft Windows SDK executable directory. + """ + # Find WinSDK NetFx Tools registry dir name + if self.vc_ver <= 11.0: + netfxver = 35 + arch = '' + else: + netfxver = 40 + hidex86 = True if self.vc_ver <= 12.0 else False + arch = self.pi.current_dir(x64=True, hidex86=hidex86) + fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-')) + + # liste all possibles registry paths + regpaths = [] + if self.vc_ver >= 14.0: + for ver in self.NetFxSdkVersion: + regpaths += [os.path.join(self.ri.netfx_sdk, ver, fx)] + + for ver in self.WindowsSdkVersion: + regpaths += [os.path.join(self.ri.windows_sdk, 'v%sA' % ver, fx)] + + # Return installation folder from the more recent path + for path in regpaths: + execpath = self.ri.lookup(path, 'installationfolder') + if execpath: + break + return execpath + + @property + def FSharpInstallDir(self): + """ + Microsoft Visual F# directory. + """ + path = r'%0.1f\Setup\F#' % self.vc_ver + path = os.path.join(self.ri.visualstudio, path) + return self.ri.lookup(path, 'productdir') or '' + + @property + def UniversalCRTSdkDir(self): + """ + Microsoft Universal CRT SDK directory. + """ + # Set Kit Roots versions for specified MSVC++ version + if self.vc_ver >= 14.0: + vers = ('10', '81') + else: + vers = () + + # Find path of the more recent Kit + for ver in vers: + sdkdir = self.ri.lookup(self.ri.windows_kits_roots, + 'kitsroot%s' % ver) + if sdkdir: + break + return sdkdir or '' + + @property + def UniversalCRTSdkLastVersion(self): + """ + Microsoft Universal C Runtime SDK last version + """ + return self._use_last_dir_name(os.path.join( + self.UniversalCRTSdkDir, 'lib')) + + @property + def NetFxSdkVersion(self): + """ + Microsoft .NET Framework SDK versions. + """ + # Set FxSdk versions for specified MSVC++ version + if self.vc_ver >= 14.0: + return ('4.6.1', '4.6') + else: + return () + + @property + def NetFxSdkDir(self): + """ + Microsoft .NET Framework SDK directory. + """ + for ver in self.NetFxSdkVersion: + loc = os.path.join(self.ri.netfx_sdk, ver) + sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder') + if sdkdir: + break + return sdkdir or '' + + @property + def FrameworkDir32(self): + """ + Microsoft .NET Framework 32bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw + + @property + def FrameworkDir64(self): + """ + Microsoft .NET Framework 64bit directory. + """ + # Default path + guess_fw = os.path.join(self.WinDir, r'Microsoft.NET\Framework64') + + # Try to get path from registry, if fail use default path + return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw + + @property + def FrameworkVersion32(self): + """ + Microsoft .NET Framework 32bit versions. + """ + return self._find_dot_net_versions(32) + + @property + def FrameworkVersion64(self): + """ + Microsoft .NET Framework 64bit versions. + """ + return self._find_dot_net_versions(64) + + def _find_dot_net_versions(self, bits): + """ + Find Microsoft .NET Framework versions. + + Parameters + ---------- + bits: int + Platform number of bits: 32 or 64. + """ + # Find actual .NET version in registry + reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits) + dot_net_dir = getattr(self, 'FrameworkDir%d' % bits) + ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or '' + + # Set .NET versions for specified MSVC++ version + if self.vc_ver >= 12.0: + frameworkver = (ver, 'v4.0') + elif self.vc_ver >= 10.0: + frameworkver = ('v4.0.30319' if ver.lower()[:2] != 'v4' else ver, + 'v3.5') + elif self.vc_ver == 9.0: + frameworkver = ('v3.5', 'v2.0.50727') + if self.vc_ver == 8.0: + frameworkver = ('v3.0', 'v2.0.50727') + return frameworkver + + def _use_last_dir_name(self, path, prefix=''): + """ + Return name of the last dir in path or '' if no dir found. + + Parameters + ---------- + path: str + Use dirs in this path + prefix: str + Use only dirs startings by this prefix + """ + matching_dirs = ( + dir_name + for dir_name in reversed(os.listdir(path)) + if os.path.isdir(os.path.join(path, dir_name)) and + dir_name.startswith(prefix) + ) + return next(matching_dirs, None) or '' + + +class EnvironmentInfo: + """ + Return environment variables for specified Microsoft Visual C++ version + and platform : Lib, Include, Path and libpath. + + This function is compatible with Microsoft Visual C++ 9.0 to 14.0. + + Script created by analysing Microsoft environment configuration files like + "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ... + + Parameters + ---------- + arch: str + Target architecture. + vc_ver: float + Required Microsoft Visual C++ version. If not set, autodetect the last + version. + vc_min_ver: float + Minimum Microsoft Visual C++ version. + """ + + # Variables and properties in this class use originals CamelCase variables + # names from Microsoft source files for more easy comparaison. + + def __init__(self, arch, vc_ver=None, vc_min_ver=0): + self.pi = PlatformInfo(arch) + self.ri = RegistryInfo(self.pi) + self.si = SystemInfo(self.ri, vc_ver) + + if self.vc_ver < vc_min_ver: + err = 'No suitable Microsoft Visual C++ version found' + raise distutils.errors.DistutilsPlatformError(err) + + @property + def vc_ver(self): + """ + Microsoft Visual C++ version. + """ + return self.si.vc_ver + + @property + def VSTools(self): + """ + Microsoft Visual Studio Tools + """ + paths = [r'Common7\IDE', r'Common7\Tools'] + + if self.vc_ver >= 14.0: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow'] + paths += [r'Team Tools\Performance Tools'] + paths += [r'Team Tools\Performance Tools%s' % arch_subdir] + + return [os.path.join(self.si.VSInstallDir, path) for path in paths] + + @property + def VCIncludes(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Includes + """ + return [os.path.join(self.si.VCInstallDir, 'Include'), + os.path.join(self.si.VCInstallDir, r'ATLMFC\Include')] + + @property + def VCLibraries(self): + """ + Microsoft Visual C++ & Microsoft Foundation Class Libraries + """ + if self.vc_ver >= 15.0: + arch_subdir = self.pi.target_dir(x64=True) + else: + arch_subdir = self.pi.target_dir(hidex86=True) + paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir] + + if self.vc_ver >= 14.0: + paths += [r'Lib\store%s' % arch_subdir] + + return [os.path.join(self.si.VCInstallDir, path) for path in paths] + + @property + def VCStoreRefs(self): + """ + Microsoft Visual C++ store references Libraries + """ + if self.vc_ver < 14.0: + return [] + return [os.path.join(self.si.VCInstallDir, r'Lib\store\references')] + + @property + def VCTools(self): + """ + Microsoft Visual C++ Tools + """ + si = self.si + tools = [os.path.join(si.VCInstallDir, 'VCPackages')] + + forcex86 = True if self.vc_ver <= 10.0 else False + arch_subdir = self.pi.cross_dir(forcex86) + if arch_subdir: + tools += [os.path.join(si.VCInstallDir, 'Bin%s' % arch_subdir)] + + if self.vc_ver == 14.0: + path = 'Bin%s' % self.pi.current_dir(hidex86=True) + tools += [os.path.join(si.VCInstallDir, path)] + + elif self.vc_ver >= 15.0: + host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else + r'bin\HostX64%s') + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))] + + if self.pi.current_cpu != self.pi.target_cpu: + tools += [os.path.join( + si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))] + + else: + tools += [os.path.join(si.VCInstallDir, 'Bin')] + + return tools + + @property + def OSLibraries(self): + """ + Microsoft Windows SDK Libraries + """ + if self.vc_ver <= 10.0: + arch_subdir = self.pi.target_dir(hidex86=True, x64=True) + return [os.path.join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)] + + else: + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.WindowsSdkDir, 'lib') + libver = self._sdk_subdir + return [os.path.join(lib, '%sum%s' % (libver , arch_subdir))] + + @property + def OSIncludes(self): + """ + Microsoft Windows SDK Include + """ + include = os.path.join(self.si.WindowsSdkDir, 'include') + + if self.vc_ver <= 10.0: + return [include, os.path.join(include, 'gl')] + + else: + if self.vc_ver >= 14.0: + sdkver = self._sdk_subdir + else: + sdkver = '' + return [os.path.join(include, '%sshared' % sdkver), + os.path.join(include, '%sum' % sdkver), + os.path.join(include, '%swinrt' % sdkver)] + + @property + def OSLibpath(self): + """ + Microsoft Windows SDK Libraries Paths + """ + ref = os.path.join(self.si.WindowsSdkDir, 'References') + libpath = [] + + if self.vc_ver <= 9.0: + libpath += self.OSLibraries + + if self.vc_ver >= 11.0: + libpath += [os.path.join(ref, r'CommonConfiguration\Neutral')] + + if self.vc_ver >= 14.0: + libpath += [ + ref, + os.path.join(self.si.WindowsSdkDir, 'UnionMetadata'), + os.path.join( + ref, + 'Windows.Foundation.UniversalApiContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Foundation.FoundationContract', + '1.0.0.0', + ), + os.path.join( + ref, + 'Windows.Networking.Connectivity.WwanContract', + '1.0.0.0', + ), + os.path.join( + self.si.WindowsSdkDir, + 'ExtensionSDKs', + 'Microsoft.VCLibs', + '%0.1f' % self.vc_ver, + 'References', + 'CommonConfiguration', + 'neutral', + ), + ] + return libpath + + @property + def SdkTools(self): + """ + Microsoft Windows SDK Tools + """ + return list(self._sdk_tools()) + + def _sdk_tools(self): + """ + Microsoft Windows SDK Tools paths generator + """ + if self.vc_ver < 15.0: + bin_dir = 'Bin' if self.vc_ver <= 11.0 else r'Bin\x86' + yield os.path.join(self.si.WindowsSdkDir, bin_dir) + + if not self.pi.current_is_x86(): + arch_subdir = self.pi.current_dir(x64=True) + path = 'Bin%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + if self.vc_ver == 10.0 or self.vc_ver == 11.0: + if self.pi.target_is_x86(): + arch_subdir = '' + else: + arch_subdir = self.pi.current_dir(hidex86=True, x64=True) + path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir + yield os.path.join(self.si.WindowsSdkDir, path) + + elif self.vc_ver >= 15.0: + path = os.path.join(self.si.WindowsSdkDir, 'Bin') + arch_subdir = self.pi.current_dir(x64=True) + sdkver = self.si.WindowsSdkLastVersion + yield os.path.join(path, '%s%s' % (sdkver, arch_subdir)) + + if self.si.WindowsSDKExecutablePath: + yield self.si.WindowsSDKExecutablePath + + @property + def _sdk_subdir(self): + """ + Microsoft Windows SDK version subdir + """ + ucrtver = self.si.WindowsSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def SdkSetup(self): + """ + Microsoft Windows SDK Setup + """ + if self.vc_ver > 9.0: + return [] + + return [os.path.join(self.si.WindowsSdkDir, 'Setup')] + + @property + def FxTools(self): + """ + Microsoft .NET Framework Tools + """ + pi = self.pi + si = self.si + + if self.vc_ver <= 10.0: + include32 = True + include64 = not pi.target_is_x86() and not pi.current_is_x86() + else: + include32 = pi.target_is_x86() or pi.current_is_x86() + include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64' + + tools = [] + if include32: + tools += [os.path.join(si.FrameworkDir32, ver) + for ver in si.FrameworkVersion32] + if include64: + tools += [os.path.join(si.FrameworkDir64, ver) + for ver in si.FrameworkVersion64] + return tools + + @property + def NetFxSDKLibraries(self): + """ + Microsoft .Net Framework SDK Libraries + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + return [os.path.join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)] + + @property + def NetFxSDKIncludes(self): + """ + Microsoft .Net Framework SDK Includes + """ + if self.vc_ver < 14.0 or not self.si.NetFxSdkDir: + return [] + + return [os.path.join(self.si.NetFxSdkDir, r'include\um')] + + @property + def VsTDb(self): + """ + Microsoft Visual Studio Team System Database + """ + return [os.path.join(self.si.VSInstallDir, r'VSTSDB\Deploy')] + + @property + def MSBuild(self): + """ + Microsoft Build Engine + """ + if self.vc_ver < 12.0: + return [] + elif self.vc_ver < 15.0: + base_path = self.si.ProgramFilesx86 + arch_subdir = self.pi.current_dir(hidex86=True) + else: + base_path = self.si.VSInstallDir + arch_subdir = '' + + path = r'MSBuild\%0.1f\bin%s' % (self.vc_ver, arch_subdir) + build = [os.path.join(base_path, path)] + + if self.vc_ver >= 15.0: + # Add Roslyn C# & Visual Basic Compiler + build += [os.path.join(base_path, path, 'Roslyn')] + + return build + + @property + def HTMLHelpWorkshop(self): + """ + Microsoft HTML Help Workshop + """ + if self.vc_ver < 11.0: + return [] + + return [os.path.join(self.si.ProgramFilesx86, 'HTML Help Workshop')] + + @property + def UCRTLibraries(self): + """ + Microsoft Universal C Runtime SDK Libraries + """ + if self.vc_ver < 14.0: + return [] + + arch_subdir = self.pi.target_dir(x64=True) + lib = os.path.join(self.si.UniversalCRTSdkDir, 'lib') + ucrtver = self._ucrt_subdir + return [os.path.join(lib, '%sucrt%s' % (ucrtver, arch_subdir))] + + @property + def UCRTIncludes(self): + """ + Microsoft Universal C Runtime SDK Include + """ + if self.vc_ver < 14.0: + return [] + + include = os.path.join(self.si.UniversalCRTSdkDir, 'include') + return [os.path.join(include, '%sucrt' % self._ucrt_subdir)] + + @property + def _ucrt_subdir(self): + """ + Microsoft Universal C Runtime SDK version subdir + """ + ucrtver = self.si.UniversalCRTSdkLastVersion + return ('%s\\' % ucrtver) if ucrtver else '' + + @property + def FSharp(self): + """ + Microsoft Visual F# + """ + if self.vc_ver < 11.0 and self.vc_ver > 12.0: + return [] + + return self.si.FSharpInstallDir + + @property + def VCRuntimeRedist(self): + """ + Microsoft Visual C++ runtime redistribuable dll + """ + arch_subdir = self.pi.target_dir(x64=True) + if self.vc_ver < 15: + redist_path = self.si.VCInstallDir + vcruntime = 'redist%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + else: + redist_path = self.si.VCInstallDir.replace('\\Tools', '\\Redist') + vcruntime = 'onecore%s\\Microsoft.VC%d0.CRT\\vcruntime%d0.dll' + + # Visual Studio 2017 is still Visual C++ 14.0 + dll_ver = 14.0 if self.vc_ver == 15 else self.vc_ver + + vcruntime = vcruntime % (arch_subdir, self.vc_ver, dll_ver) + return os.path.join(redist_path, vcruntime) + + def return_env(self, exists=True): + """ + Return environment dict. + + Parameters + ---------- + exists: bool + It True, only return existing paths. + """ + env = dict( + include=self._build_paths('include', + [self.VCIncludes, + self.OSIncludes, + self.UCRTIncludes, + self.NetFxSDKIncludes], + exists), + lib=self._build_paths('lib', + [self.VCLibraries, + self.OSLibraries, + self.FxTools, + self.UCRTLibraries, + self.NetFxSDKLibraries], + exists), + libpath=self._build_paths('libpath', + [self.VCLibraries, + self.FxTools, + self.VCStoreRefs, + self.OSLibpath], + exists), + path=self._build_paths('path', + [self.VCTools, + self.VSTools, + self.VsTDb, + self.SdkTools, + self.SdkSetup, + self.FxTools, + self.MSBuild, + self.HTMLHelpWorkshop, + self.FSharp], + exists), + ) + if self.vc_ver >= 14 and os.path.isfile(self.VCRuntimeRedist): + env['py_vcruntime_redist'] = self.VCRuntimeRedist + return env + + def _build_paths(self, name, spec_path_lists, exists): + """ + Given an environment variable name and specified paths, + return a pathsep-separated string of paths containing + unique, extant, directories from those paths and from + the environment variable. Raise an error if no paths + are resolved. + """ + # flatten spec_path_lists + spec_paths = itertools.chain.from_iterable(spec_path_lists) + env_paths = safe_env.get(name, '').split(os.pathsep) + paths = itertools.chain(spec_paths, env_paths) + extant_paths = list(filter(os.path.isdir, paths)) if exists else paths + if not extant_paths: + msg = "%s environment variable is empty" % name.upper() + raise distutils.errors.DistutilsPlatformError(msg) + unique_paths = self._unique_everseen(extant_paths) + return os.pathsep.join(unique_paths) + + # from Python docs + def _unique_everseen(self, iterable, key=None): + """ + List unique elements, preserving order. + Remember all elements ever seen. + + _unique_everseen('AAAABBBCCDAABBB') --> A B C D + + _unique_everseen('ABBCcAD', str.lower) --> A B C D + """ + seen = set() + seen_add = seen.add + if key is None: + for element in filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element diff --git a/myenv/lib/python3.7/site-packages/setuptools/namespaces.py b/myenv/lib/python3.7/site-packages/setuptools/namespaces.py new file mode 100644 index 000000000..dc16106d3 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/namespaces.py @@ -0,0 +1,107 @@ +import os +from distutils import log +import itertools + +from setuptools.extern.six.moves import map + + +flatten = itertools.chain.from_iterable + + +class Installer: + + nspkg_ext = '-nspkg.pth' + + def install_namespaces(self): + nsp = self._get_all_ns_packages() + if not nsp: + return + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + self.outputs.append(filename) + log.info("Installing %s", filename) + lines = map(self._gen_nspkg_line, nsp) + + if self.dry_run: + # always generate the lines, even in dry run + list(lines) + return + + with open(filename, 'wt') as f: + f.writelines(lines) + + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + + def _get_target(self): + return self.target + + _nspkg_tmpl = ( + "import sys, types, os", + "has_mfs = sys.version_info > (3, 5)", + "p = os.path.join(%(root)s, *%(pth)r)", + "importlib = has_mfs and __import__('importlib.util')", + "has_mfs and __import__('importlib.machinery')", + "m = has_mfs and " + "sys.modules.setdefault(%(pkg)r, " + "importlib.util.module_from_spec(" + "importlib.machinery.PathFinder.find_spec(%(pkg)r, " + "[os.path.dirname(p)])))", + "m = m or " + "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", + "mp = (m or []) and m.__dict__.setdefault('__path__',[])", + "(p not in mp) and mp.append(p)", + ) + "lines for the namespace installer" + + _nspkg_tmpl_multi = ( + 'm and setattr(sys.modules[%(parent)r], %(child)r, m)', + ) + "additional line(s) when a parent package is indicated" + + def _get_root(self): + return "sys._getframe(1).f_locals['sitedir']" + + def _gen_nspkg_line(self, pkg): + # ensure pkg is not a unicode string under Python 2.7 + pkg = str(pkg) + pth = tuple(pkg.split('.')) + root = self._get_root() + tmpl_lines = self._nspkg_tmpl + parent, sep, child = pkg.rpartition('.') + if parent: + tmpl_lines += self._nspkg_tmpl_multi + return ';'.join(tmpl_lines) % locals() + '\n' + + def _get_all_ns_packages(self): + """Return sorted list of all package namespaces""" + pkgs = self.distribution.namespace_packages or [] + return sorted(flatten(map(self._pkg_names, pkgs))) + + @staticmethod + def _pkg_names(pkg): + """ + Given a namespace package, yield the components of that + package. + + >>> names = Installer._pkg_names('a.b.c') + >>> set(names) == set(['a', 'a.b', 'a.b.c']) + True + """ + parts = pkg.split('.') + while parts: + yield '.'.join(parts) + parts.pop() + + +class DevelopInstaller(Installer): + def _get_root(self): + return repr(str(self.egg_path)) + + def _get_target(self): + return self.egg_link diff --git a/myenv/lib/python3.7/site-packages/setuptools/package_index.py b/myenv/lib/python3.7/site-packages/setuptools/package_index.py new file mode 100644 index 000000000..914b5e615 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/package_index.py @@ -0,0 +1,1119 @@ +"""PyPI and direct package downloading""" +import sys +import os +import re +import shutil +import socket +import base64 +import hashlib +import itertools +from functools import wraps + +from setuptools.extern import six +from setuptools.extern.six.moves import urllib, http_client, configparser, map + +import setuptools +from pkg_resources import ( + CHECKOUT_DIST, Distribution, BINARY_DIST, normalize_path, SOURCE_DIST, + Environment, find_distributions, safe_name, safe_version, + to_filename, Requirement, DEVELOP_DIST, EGG_DIST, +) +from setuptools import ssl_support +from distutils import log +from distutils.errors import DistutilsError +from fnmatch import translate +from setuptools.py27compat import get_all_headers +from setuptools.py33compat import unescape +from setuptools.wheel import Wheel + +EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.+!]+)$') +HREF = re.compile("""href\\s*=\\s*['"]?([^'"> ]+)""", re.I) +# this is here to fix emacs' cruddy broken syntax highlighting +PYPI_MD5 = re.compile( + '<a href="([^"#]+)">([^<]+)</a>\n\\s+\\(<a (?:title="MD5 hash"\n\\s+)' + 'href="[^?]+\\?:action=show_md5&digest=([0-9a-f]{32})">md5</a>\\)' +) +URL_SCHEME = re.compile('([-+.a-z0-9]{2,}):', re.I).match +EXTENSIONS = ".tar.gz .tar.bz2 .tar .zip .tgz".split() + +__all__ = [ + 'PackageIndex', 'distros_for_url', 'parse_bdist_wininst', + 'interpret_distro_name', +] + +_SOCKET_TIMEOUT = 15 + +_tmpl = "setuptools/{setuptools.__version__} Python-urllib/{py_major}" +user_agent = _tmpl.format(py_major=sys.version[:3], setuptools=setuptools) + + +def parse_requirement_arg(spec): + try: + return Requirement.parse(spec) + except ValueError: + raise DistutilsError( + "Not a URL, existing file, or requirement spec: %r" % (spec,) + ) + + +def parse_bdist_wininst(name): + """Return (base,pyversion) or (None,None) for possible .exe name""" + + lower = name.lower() + base, py_ver, plat = None, None, None + + if lower.endswith('.exe'): + if lower.endswith('.win32.exe'): + base = name[:-10] + plat = 'win32' + elif lower.startswith('.win32-py', -16): + py_ver = name[-7:-4] + base = name[:-16] + plat = 'win32' + elif lower.endswith('.win-amd64.exe'): + base = name[:-14] + plat = 'win-amd64' + elif lower.startswith('.win-amd64-py', -20): + py_ver = name[-7:-4] + base = name[:-20] + plat = 'win-amd64' + return base, py_ver, plat + + +def egg_info_for_url(url): + parts = urllib.parse.urlparse(url) + scheme, server, path, parameters, query, fragment = parts + base = urllib.parse.unquote(path.split('/')[-1]) + if server == 'sourceforge.net' and base == 'download': # XXX Yuck + base = urllib.parse.unquote(path.split('/')[-2]) + if '#' in base: + base, fragment = base.split('#', 1) + return base, fragment + + +def distros_for_url(url, metadata=None): + """Yield egg or source distribution objects that might be found at a URL""" + base, fragment = egg_info_for_url(url) + for dist in distros_for_location(url, base, metadata): + yield dist + if fragment: + match = EGG_FRAGMENT.match(fragment) + if match: + for dist in interpret_distro_name( + url, match.group(1), metadata, precedence=CHECKOUT_DIST + ): + yield dist + + +def distros_for_location(location, basename, metadata=None): + """Yield egg or source distribution objects based on basename""" + if basename.endswith('.egg.zip'): + basename = basename[:-4] # strip the .zip + if basename.endswith('.egg') and '-' in basename: + # only one, unambiguous interpretation + return [Distribution.from_location(location, basename, metadata)] + if basename.endswith('.whl') and '-' in basename: + wheel = Wheel(basename) + if not wheel.is_compatible(): + return [] + return [Distribution( + location=location, + project_name=wheel.project_name, + version=wheel.version, + # Increase priority over eggs. + precedence=EGG_DIST + 1, + )] + if basename.endswith('.exe'): + win_base, py_ver, platform = parse_bdist_wininst(basename) + if win_base is not None: + return interpret_distro_name( + location, win_base, metadata, py_ver, BINARY_DIST, platform + ) + # Try source distro extensions (.zip, .tgz, etc.) + # + for ext in EXTENSIONS: + if basename.endswith(ext): + basename = basename[:-len(ext)] + return interpret_distro_name(location, basename, metadata) + return [] # no extension matched + + +def distros_for_filename(filename, metadata=None): + """Yield possible egg or source distribution objects based on a filename""" + return distros_for_location( + normalize_path(filename), os.path.basename(filename), metadata + ) + + +def interpret_distro_name( + location, basename, metadata, py_version=None, precedence=SOURCE_DIST, + platform=None +): + """Generate alternative interpretations of a source distro name + + Note: if `location` is a filesystem filename, you should call + ``pkg_resources.normalize_path()`` on it before passing it to this + routine! + """ + # Generate alternative interpretations of a source distro name + # Because some packages are ambiguous as to name/versions split + # e.g. "adns-python-1.1.0", "egenix-mx-commercial", etc. + # So, we generate each possible interepretation (e.g. "adns, python-1.1.0" + # "adns-python, 1.1.0", and "adns-python-1.1.0, no version"). In practice, + # the spurious interpretations should be ignored, because in the event + # there's also an "adns" package, the spurious "python-1.1.0" version will + # compare lower than any numeric version number, and is therefore unlikely + # to match a request for it. It's still a potential problem, though, and + # in the long run PyPI and the distutils should go for "safe" names and + # versions in distribution archive names (sdist and bdist). + + parts = basename.split('-') + if not py_version and any(re.match(r'py\d\.\d$', p) for p in parts[2:]): + # it is a bdist_dumb, not an sdist -- bail out + return + + for p in range(1, len(parts) + 1): + yield Distribution( + location, metadata, '-'.join(parts[:p]), '-'.join(parts[p:]), + py_version=py_version, precedence=precedence, + platform=platform + ) + + +# From Python 2.7 docs +def unique_everseen(iterable, key=None): + "List unique elements, preserving order. Remember all elements ever seen." + # unique_everseen('AAAABBBCCDAABBB') --> A B C D + # unique_everseen('ABBCcAD', str.lower) --> A B C D + seen = set() + seen_add = seen.add + if key is None: + for element in six.moves.filterfalse(seen.__contains__, iterable): + seen_add(element) + yield element + else: + for element in iterable: + k = key(element) + if k not in seen: + seen_add(k) + yield element + + +def unique_values(func): + """ + Wrap a function returning an iterable such that the resulting iterable + only ever yields unique items. + """ + + @wraps(func) + def wrapper(*args, **kwargs): + return unique_everseen(func(*args, **kwargs)) + + return wrapper + + +REL = re.compile(r"""<([^>]*\srel\s*=\s*['"]?([^'">]+)[^>]*)>""", re.I) +# this line is here to fix emacs' cruddy broken syntax highlighting + + +@unique_values +def find_external_links(url, page): + """Find rel="homepage" and rel="download" links in `page`, yielding URLs""" + + for match in REL.finditer(page): + tag, rel = match.groups() + rels = set(map(str.strip, rel.lower().split(','))) + if 'homepage' in rels or 'download' in rels: + for match in HREF.finditer(tag): + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + for tag in ("<th>Home Page", "<th>Download URL"): + pos = page.find(tag) + if pos != -1: + match = HREF.search(page, pos) + if match: + yield urllib.parse.urljoin(url, htmldecode(match.group(1))) + + +class ContentChecker(object): + """ + A null content checker that defines the interface for checking content + """ + + def feed(self, block): + """ + Feed a block of data to the hash. + """ + return + + def is_valid(self): + """ + Check the hash. Return False if validation fails. + """ + return True + + def report(self, reporter, template): + """ + Call reporter with information about the checker (hash name) + substituted into the template. + """ + return + + +class HashChecker(ContentChecker): + pattern = re.compile( + r'(?P<hash_name>sha1|sha224|sha384|sha256|sha512|md5)=' + r'(?P<expected>[a-f0-9]+)' + ) + + def __init__(self, hash_name, expected): + self.hash_name = hash_name + self.hash = hashlib.new(hash_name) + self.expected = expected + + @classmethod + def from_url(cls, url): + "Construct a (possibly null) ContentChecker from a URL" + fragment = urllib.parse.urlparse(url)[-1] + if not fragment: + return ContentChecker() + match = cls.pattern.search(fragment) + if not match: + return ContentChecker() + return cls(**match.groupdict()) + + def feed(self, block): + self.hash.update(block) + + def is_valid(self): + return self.hash.hexdigest() == self.expected + + def report(self, reporter, template): + msg = template % self.hash_name + return reporter(msg) + + +class PackageIndex(Environment): + """A distribution index that scans web pages for download URLs""" + + def __init__( + self, index_url="https://pypi.python.org/simple", hosts=('*',), + ca_bundle=None, verify_ssl=True, *args, **kw + ): + Environment.__init__(self, *args, **kw) + self.index_url = index_url + "/" [:not index_url.endswith('/')] + self.scanned_urls = {} + self.fetched_urls = {} + self.package_pages = {} + self.allows = re.compile('|'.join(map(translate, hosts))).match + self.to_scan = [] + use_ssl = ( + verify_ssl + and ssl_support.is_available + and (ca_bundle or ssl_support.find_ca_bundle()) + ) + if use_ssl: + self.opener = ssl_support.opener_for(ca_bundle) + else: + self.opener = urllib.request.urlopen + + def process_url(self, url, retrieve=False): + """Evaluate a URL as a possible download, and maybe retrieve it""" + if url in self.scanned_urls and not retrieve: + return + self.scanned_urls[url] = True + if not URL_SCHEME(url): + self.process_filename(url) + return + else: + dists = list(distros_for_url(url)) + if dists: + if not self.url_ok(url): + return + self.debug("Found link: %s", url) + + if dists or not retrieve or url in self.fetched_urls: + list(map(self.add, dists)) + return # don't need the actual page + + if not self.url_ok(url): + self.fetched_urls[url] = True + return + + self.info("Reading %s", url) + self.fetched_urls[url] = True # prevent multiple fetch attempts + tmpl = "Download error on %s: %%s -- Some packages may not be found!" + f = self.open_url(url, tmpl % url) + if f is None: + return + self.fetched_urls[f.url] = True + if 'html' not in f.headers.get('content-type', '').lower(): + f.close() # not html, we can't process it + return + + base = f.url # handle redirects + page = f.read() + if not isinstance(page, str): + # In Python 3 and got bytes but want str. + if isinstance(f, urllib.error.HTTPError): + # Errors have no charset, assume latin1: + charset = 'latin-1' + else: + charset = f.headers.get_param('charset') or 'latin-1' + page = page.decode(charset, "ignore") + f.close() + for match in HREF.finditer(page): + link = urllib.parse.urljoin(base, htmldecode(match.group(1))) + self.process_url(link) + if url.startswith(self.index_url) and getattr(f, 'code', None) != 404: + page = self.process_index(url, page) + + def process_filename(self, fn, nested=False): + # process filenames or directories + if not os.path.exists(fn): + self.warn("Not found: %s", fn) + return + + if os.path.isdir(fn) and not nested: + path = os.path.realpath(fn) + for item in os.listdir(path): + self.process_filename(os.path.join(path, item), True) + + dists = distros_for_filename(fn) + if dists: + self.debug("Found: %s", fn) + list(map(self.add, dists)) + + def url_ok(self, url, fatal=False): + s = URL_SCHEME(url) + is_file = s and s.group(1).lower() == 'file' + if is_file or self.allows(urllib.parse.urlparse(url)[1]): + return True + msg = ( + "\nNote: Bypassing %s (disallowed host; see " + "http://bit.ly/2hrImnY for details).\n") + if fatal: + raise DistutilsError(msg % url) + else: + self.warn(msg, url) + + def scan_egg_links(self, search_path): + dirs = filter(os.path.isdir, search_path) + egg_links = ( + (path, entry) + for path in dirs + for entry in os.listdir(path) + if entry.endswith('.egg-link') + ) + list(itertools.starmap(self.scan_egg_link, egg_links)) + + def scan_egg_link(self, path, entry): + with open(os.path.join(path, entry)) as raw_lines: + # filter non-empty lines + lines = list(filter(None, map(str.strip, raw_lines))) + + if len(lines) != 2: + # format is not recognized; punt + return + + egg_path, setup_path = lines + + for dist in find_distributions(os.path.join(path, egg_path)): + dist.location = os.path.join(path, *lines) + dist.precedence = SOURCE_DIST + self.add(dist) + + def process_index(self, url, page): + """Process the contents of a PyPI page""" + + def scan(link): + # Process a URL to see if it's for a package page + if link.startswith(self.index_url): + parts = list(map( + urllib.parse.unquote, link[len(self.index_url):].split('/') + )) + if len(parts) == 2 and '#' not in parts[1]: + # it's a package page, sanitize and index it + pkg = safe_name(parts[0]) + ver = safe_version(parts[1]) + self.package_pages.setdefault(pkg.lower(), {})[link] = True + return to_filename(pkg), to_filename(ver) + return None, None + + # process an index page into the package-page index + for match in HREF.finditer(page): + try: + scan(urllib.parse.urljoin(url, htmldecode(match.group(1)))) + except ValueError: + pass + + pkg, ver = scan(url) # ensure this page is in the page index + if pkg: + # process individual package page + for new_url in find_external_links(url, page): + # Process the found URL + base, frag = egg_info_for_url(new_url) + if base.endswith('.py') and not frag: + if ver: + new_url += '#egg=%s-%s' % (pkg, ver) + else: + self.need_version_info(url) + self.scan_url(new_url) + + return PYPI_MD5.sub( + lambda m: '<a href="%s#md5=%s">%s</a>' % m.group(1, 3, 2), page + ) + else: + return "" # no sense double-scanning non-package pages + + def need_version_info(self, url): + self.scan_all( + "Page at %s links to .py file(s) without version info; an index " + "scan is required.", url + ) + + def scan_all(self, msg=None, *args): + if self.index_url not in self.fetched_urls: + if msg: + self.warn(msg, *args) + self.info( + "Scanning index of all packages (this may take a while)" + ) + self.scan_url(self.index_url) + + def find_packages(self, requirement): + self.scan_url(self.index_url + requirement.unsafe_name + '/') + + if not self.package_pages.get(requirement.key): + # Fall back to safe version of the name + self.scan_url(self.index_url + requirement.project_name + '/') + + if not self.package_pages.get(requirement.key): + # We couldn't find the target package, so search the index page too + self.not_found_in_index(requirement) + + for url in list(self.package_pages.get(requirement.key, ())): + # scan each page that might be related to the desired package + self.scan_url(url) + + def obtain(self, requirement, installer=None): + self.prescan() + self.find_packages(requirement) + for dist in self[requirement.key]: + if dist in requirement: + return dist + self.debug("%s does not match %s", requirement, dist) + return super(PackageIndex, self).obtain(requirement, installer) + + def check_hash(self, checker, filename, tfp): + """ + checker is a ContentChecker + """ + checker.report( + self.debug, + "Validating %%s checksum for %s" % filename) + if not checker.is_valid(): + tfp.close() + os.unlink(filename) + raise DistutilsError( + "%s validation failed for %s; " + "possible download problem?" + % (checker.hash.name, os.path.basename(filename)) + ) + + def add_find_links(self, urls): + """Add `urls` to the list that will be prescanned for searches""" + for url in urls: + if ( + self.to_scan is None # if we have already "gone online" + or not URL_SCHEME(url) # or it's a local file/directory + or url.startswith('file:') + or list(distros_for_url(url)) # or a direct package link + ): + # then go ahead and process it now + self.scan_url(url) + else: + # otherwise, defer retrieval till later + self.to_scan.append(url) + + def prescan(self): + """Scan urls scheduled for prescanning (e.g. --find-links)""" + if self.to_scan: + list(map(self.scan_url, self.to_scan)) + self.to_scan = None # from now on, go ahead and process immediately + + def not_found_in_index(self, requirement): + if self[requirement.key]: # we've seen at least one distro + meth, msg = self.info, "Couldn't retrieve index page for %r" + else: # no distros seen for this name, might be misspelled + meth, msg = ( + self.warn, + "Couldn't find index page for %r (maybe misspelled?)") + meth(msg, requirement.unsafe_name) + self.scan_all() + + def download(self, spec, tmpdir): + """Locate and/or download `spec` to `tmpdir`, returning a local path + + `spec` may be a ``Requirement`` object, or a string containing a URL, + an existing local filename, or a project/version requirement spec + (i.e. the string form of a ``Requirement`` object). If it is the URL + of a .py file with an unambiguous ``#egg=name-version`` tag (i.e., one + that escapes ``-`` as ``_`` throughout), a trivial ``setup.py`` is + automatically created alongside the downloaded file. + + If `spec` is a ``Requirement`` object or a string containing a + project/version requirement spec, this method returns the location of + a matching distribution (possibly after downloading it to `tmpdir`). + If `spec` is a locally existing file or directory name, it is simply + returned unchanged. If `spec` is a URL, it is downloaded to a subpath + of `tmpdir`, and the local filename is returned. Various errors may be + raised if a problem occurs during downloading. + """ + if not isinstance(spec, Requirement): + scheme = URL_SCHEME(spec) + if scheme: + # It's a url, download it to tmpdir + found = self._download_url(scheme.group(1), spec, tmpdir) + base, fragment = egg_info_for_url(spec) + if base.endswith('.py'): + found = self.gen_setup(found, fragment, tmpdir) + return found + elif os.path.exists(spec): + # Existing file or directory, just return it + return spec + else: + spec = parse_requirement_arg(spec) + return getattr(self.fetch_distribution(spec, tmpdir), 'location', None) + + def fetch_distribution( + self, requirement, tmpdir, force_scan=False, source=False, + develop_ok=False, local_index=None): + """Obtain a distribution suitable for fulfilling `requirement` + + `requirement` must be a ``pkg_resources.Requirement`` instance. + If necessary, or if the `force_scan` flag is set, the requirement is + searched for in the (online) package index as well as the locally + installed packages. If a distribution matching `requirement` is found, + the returned distribution's ``location`` is the value you would have + gotten from calling the ``download()`` method with the matching + distribution's URL or filename. If no matching distribution is found, + ``None`` is returned. + + If the `source` flag is set, only source distributions and source + checkout links will be considered. Unless the `develop_ok` flag is + set, development and system eggs (i.e., those using the ``.egg-info`` + format) will be ignored. + """ + # process a Requirement + self.info("Searching for %s", requirement) + skipped = {} + dist = None + + def find(req, env=None): + if env is None: + env = self + # Find a matching distribution; may be called more than once + + for dist in env[req.key]: + + if dist.precedence == DEVELOP_DIST and not develop_ok: + if dist not in skipped: + self.warn( + "Skipping development or system egg: %s", dist, + ) + skipped[dist] = 1 + continue + + test = ( + dist in req + and (dist.precedence <= SOURCE_DIST or not source) + ) + if test: + loc = self.download(dist.location, tmpdir) + dist.download_location = loc + if os.path.exists(dist.download_location): + return dist + + if force_scan: + self.prescan() + self.find_packages(requirement) + dist = find(requirement) + + if not dist and local_index is not None: + dist = find(requirement, local_index) + + if dist is None: + if self.to_scan is not None: + self.prescan() + dist = find(requirement) + + if dist is None and not force_scan: + self.find_packages(requirement) + dist = find(requirement) + + if dist is None: + self.warn( + "No local packages or working download links found for %s%s", + (source and "a source distribution of " or ""), + requirement, + ) + else: + self.info("Best match: %s", dist) + return dist.clone(location=dist.download_location) + + def fetch(self, requirement, tmpdir, force_scan=False, source=False): + """Obtain a file suitable for fulfilling `requirement` + + DEPRECATED; use the ``fetch_distribution()`` method now instead. For + backward compatibility, this routine is identical but returns the + ``location`` of the downloaded distribution instead of a distribution + object. + """ + dist = self.fetch_distribution(requirement, tmpdir, force_scan, source) + if dist is not None: + return dist.location + return None + + def gen_setup(self, filename, fragment, tmpdir): + match = EGG_FRAGMENT.match(fragment) + dists = match and [ + d for d in + interpret_distro_name(filename, match.group(1), None) if d.version + ] or [] + + if len(dists) == 1: # unambiguous ``#egg`` fragment + basename = os.path.basename(filename) + + # Make sure the file has been downloaded to the temp dir. + if os.path.dirname(filename) != tmpdir: + dst = os.path.join(tmpdir, basename) + from setuptools.command.easy_install import samefile + if not samefile(filename, dst): + shutil.copy2(filename, dst) + filename = dst + + with open(os.path.join(tmpdir, 'setup.py'), 'w') as file: + file.write( + "from setuptools import setup\n" + "setup(name=%r, version=%r, py_modules=[%r])\n" + % ( + dists[0].project_name, dists[0].version, + os.path.splitext(basename)[0] + ) + ) + return filename + + elif match: + raise DistutilsError( + "Can't unambiguously interpret project/version identifier %r; " + "any dashes in the name or version should be escaped using " + "underscores. %r" % (fragment, dists) + ) + else: + raise DistutilsError( + "Can't process plain .py files without an '#egg=name-version'" + " suffix to enable automatic setup script generation." + ) + + dl_blocksize = 8192 + + def _download_to(self, url, filename): + self.info("Downloading %s", url) + # Download the file + fp = None + try: + checker = HashChecker.from_url(url) + fp = self.open_url(url) + if isinstance(fp, urllib.error.HTTPError): + raise DistutilsError( + "Can't download %s: %s %s" % (url, fp.code, fp.msg) + ) + headers = fp.info() + blocknum = 0 + bs = self.dl_blocksize + size = -1 + if "content-length" in headers: + # Some servers return multiple Content-Length headers :( + sizes = get_all_headers(headers, 'Content-Length') + size = max(map(int, sizes)) + self.reporthook(url, filename, blocknum, bs, size) + with open(filename, 'wb') as tfp: + while True: + block = fp.read(bs) + if block: + checker.feed(block) + tfp.write(block) + blocknum += 1 + self.reporthook(url, filename, blocknum, bs, size) + else: + break + self.check_hash(checker, filename, tfp) + return headers + finally: + if fp: + fp.close() + + def reporthook(self, url, filename, blocknum, blksize, size): + pass # no-op + + def open_url(self, url, warning=None): + if url.startswith('file:'): + return local_open(url) + try: + return open_with_auth(url, self.opener) + except (ValueError, http_client.InvalidURL) as v: + msg = ' '.join([str(arg) for arg in v.args]) + if warning: + self.warn(warning, msg) + else: + raise DistutilsError('%s %s' % (url, msg)) + except urllib.error.HTTPError as v: + return v + except urllib.error.URLError as v: + if warning: + self.warn(warning, v.reason) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v.reason)) + except http_client.BadStatusLine as v: + if warning: + self.warn(warning, v.line) + else: + raise DistutilsError( + '%s returned a bad status line. The server might be ' + 'down, %s' % + (url, v.line) + ) + except (http_client.HTTPException, socket.error) as v: + if warning: + self.warn(warning, v) + else: + raise DistutilsError("Download error for %s: %s" + % (url, v)) + + def _download_url(self, scheme, url, tmpdir): + # Determine download filename + # + name, fragment = egg_info_for_url(url) + if name: + while '..' in name: + name = name.replace('..', '.').replace('\\', '_') + else: + name = "__downloaded__" # default if URL has no path contents + + if name.endswith('.egg.zip'): + name = name[:-4] # strip the extra .zip before download + + filename = os.path.join(tmpdir, name) + + # Download the file + # + if scheme == 'svn' or scheme.startswith('svn+'): + return self._download_svn(url, filename) + elif scheme == 'git' or scheme.startswith('git+'): + return self._download_git(url, filename) + elif scheme.startswith('hg+'): + return self._download_hg(url, filename) + elif scheme == 'file': + return urllib.request.url2pathname(urllib.parse.urlparse(url)[2]) + else: + self.url_ok(url, True) # raises error if not allowed + return self._attempt_download(url, filename) + + def scan_url(self, url): + self.process_url(url, True) + + def _attempt_download(self, url, filename): + headers = self._download_to(url, filename) + if 'html' in headers.get('content-type', '').lower(): + return self._download_html(url, headers, filename) + else: + return filename + + def _download_html(self, url, headers, filename): + file = open(filename) + for line in file: + if line.strip(): + # Check for a subversion index page + if re.search(r'<title>([^- ]+ - )?Revision \d+:', line): + # it's a subversion index page: + file.close() + os.unlink(filename) + return self._download_svn(url, filename) + break # not an index page + file.close() + os.unlink(filename) + raise DistutilsError("Unexpected HTML page found at " + url) + + def _download_svn(self, url, filename): + url = url.split('#', 1)[0] # remove any fragment for svn's sake + creds = '' + if url.lower().startswith('svn:') and '@' in url: + scheme, netloc, path, p, q, f = urllib.parse.urlparse(url) + if not netloc and path.startswith('//') and '/' in path[2:]: + netloc, path = path[2:].split('/', 1) + auth, host = urllib.parse.splituser(netloc) + if auth: + if ':' in auth: + user, pw = auth.split(':', 1) + creds = " --username=%s --password=%s" % (user, pw) + else: + creds = " --username=" + auth + netloc = host + parts = scheme, netloc, url, p, q, f + url = urllib.parse.urlunparse(parts) + self.info("Doing subversion checkout from %s to %s", url, filename) + os.system("svn checkout%s -q %s %s" % (creds, url, filename)) + return filename + + @staticmethod + def _vcs_split_rev_from_url(url, pop_prefix=False): + scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) + + scheme = scheme.split('+', 1)[-1] + + # Some fragment identification fails + path = path.split('#', 1)[0] + + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + + # Also, discard fragment + url = urllib.parse.urlunsplit((scheme, netloc, path, query, '')) + + return url, rev + + def _download_git(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing git clone from %s to %s", url, filename) + os.system("git clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Checking out %s", rev) + os.system("(cd %s && git checkout --quiet %s)" % ( + filename, + rev, + )) + + return filename + + def _download_hg(self, url, filename): + filename = filename.split('#', 1)[0] + url, rev = self._vcs_split_rev_from_url(url, pop_prefix=True) + + self.info("Doing hg clone from %s to %s", url, filename) + os.system("hg clone --quiet %s %s" % (url, filename)) + + if rev is not None: + self.info("Updating to %s", rev) + os.system("(cd %s && hg up -C -r %s -q)" % ( + filename, + rev, + )) + + return filename + + def debug(self, msg, *args): + log.debug(msg, *args) + + def info(self, msg, *args): + log.info(msg, *args) + + def warn(self, msg, *args): + log.warn(msg, *args) + + +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + + +def decode_entity(match): + what = match.group(1) + return unescape(what) + + +def htmldecode(text): + """Decode HTML entities in the given text.""" + return entity_sub(decode_entity, text) + + +def socket_timeout(timeout=15): + def _socket_timeout(func): + def _socket_timeout(*args, **kwargs): + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + return func(*args, **kwargs) + finally: + socket.setdefaulttimeout(old_timeout) + + return _socket_timeout + + return _socket_timeout + + +def _encode_auth(auth): + """ + A function compatible with Python 2.3-3.3 that will encode + auth from a URL suitable for an HTTP header. + >>> str(_encode_auth('username%3Apassword')) + 'dXNlcm5hbWU6cGFzc3dvcmQ=' + + Long auth strings should not cause a newline to be inserted. + >>> long_auth = 'username:' + 'password'*10 + >>> chr(10) in str(_encode_auth(long_auth)) + False + """ + auth_s = urllib.parse.unquote(auth) + # convert to bytes + auth_bytes = auth_s.encode() + # use the legacy interface for Python 2.3 support + encoded_bytes = base64.encodestring(auth_bytes) + # convert back to a string + encoded = encoded_bytes.decode() + # strip the trailing carriage return + return encoded.replace('\n', '') + + +class Credential(object): + """ + A username/password pair. Use like a namedtuple. + """ + + def __init__(self, username, password): + self.username = username + self.password = password + + def __iter__(self): + yield self.username + yield self.password + + def __str__(self): + return '%(username)s:%(password)s' % vars(self) + + +class PyPIConfig(configparser.RawConfigParser): + def __init__(self): + """ + Load from ~/.pypirc + """ + defaults = dict.fromkeys(['username', 'password', 'repository'], '') + configparser.RawConfigParser.__init__(self, defaults) + + rc = os.path.join(os.path.expanduser('~'), '.pypirc') + if os.path.exists(rc): + self.read(rc) + + @property + def creds_by_repository(self): + sections_with_repositories = [ + section for section in self.sections() + if self.get(section, 'repository').strip() + ] + + return dict(map(self._get_repo_cred, sections_with_repositories)) + + def _get_repo_cred(self, section): + repo = self.get(section, 'repository').strip() + return repo, Credential( + self.get(section, 'username').strip(), + self.get(section, 'password').strip(), + ) + + def find_credential(self, url): + """ + If the URL indicated appears to be a repository defined in this + config, return the credential for that repository. + """ + for repository, cred in self.creds_by_repository.items(): + if url.startswith(repository): + return cred + + +def open_with_auth(url, opener=urllib.request.urlopen): + """Open a urllib2 request, handling HTTP authentication""" + + scheme, netloc, path, params, query, frag = urllib.parse.urlparse(url) + + # Double scheme does not raise on Mac OS X as revealed by a + # failing test. We would expect "nonnumeric port". Refs #20. + if netloc.endswith(':'): + raise http_client.InvalidURL("nonnumeric port: ''") + + if scheme in ('http', 'https'): + auth, host = urllib.parse.splituser(netloc) + else: + auth = None + + if not auth: + cred = PyPIConfig().find_credential(url) + if cred: + auth = str(cred) + info = cred.username, url + log.info('Authenticating as %s for %s (from .pypirc)', *info) + + if auth: + auth = "Basic " + _encode_auth(auth) + parts = scheme, host, path, params, query, frag + new_url = urllib.parse.urlunparse(parts) + request = urllib.request.Request(new_url) + request.add_header("Authorization", auth) + else: + request = urllib.request.Request(url) + + request.add_header('User-Agent', user_agent) + fp = opener(request) + + if auth: + # Put authentication info back into request URL if same host, + # so that links found on the page will work + s2, h2, path2, param2, query2, frag2 = urllib.parse.urlparse(fp.url) + if s2 == scheme and h2 == host: + parts = s2, netloc, path2, param2, query2, frag2 + fp.url = urllib.parse.urlunparse(parts) + + return fp + + +# adding a timeout to avoid freezing package_index +open_with_auth = socket_timeout(_SOCKET_TIMEOUT)(open_with_auth) + + +def fix_sf_url(url): + return url # backward compatibility + + +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urllib.parse.urlparse(url) + filename = urllib.request.url2pathname(path) + if os.path.isfile(filename): + return urllib.request.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + filepath = os.path.join(filename, f) + if f == 'index.html': + with open(filepath, 'r') as fp: + body = fp.read() + break + elif os.path.isdir(filepath): + f += '/' + files.append('<a href="{name}">{name}</a>'.format(name=f)) + else: + tmpl = ( + "<html><head><title>{url}" + "{files}") + body = tmpl.format(url=url, files='\n'.join(files)) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + headers = {'content-type': 'text/html'} + body_stream = six.StringIO(body) + return urllib.error.HTTPError(url, status, message, headers, body_stream) diff --git a/myenv/lib/python3.7/site-packages/setuptools/pep425tags.py b/myenv/lib/python3.7/site-packages/setuptools/pep425tags.py new file mode 100644 index 000000000..dfe55d587 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/pep425tags.py @@ -0,0 +1,316 @@ +# This file originally from pip: +# https://github.com/pypa/pip/blob/8f4f15a5a95d7d5b511ceaee9ed261176c181970/src/pip/_internal/pep425tags.py +"""Generate and work with PEP 425 Compatibility Tags.""" +from __future__ import absolute_import + +import distutils.util +import platform +import re +import sys +import sysconfig +import warnings +from collections import OrderedDict + +from . import glibc + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + """Return abbreviated implementation name.""" + if hasattr(sys, 'pypy_version_info'): + pyimpl = 'pp' + elif sys.platform.startswith('java'): + pyimpl = 'jy' + elif sys.platform == 'cli': + pyimpl = 'ip' + else: + pyimpl = 'cp' + return pyimpl + + +def get_impl_ver(): + """Return implementation version.""" + impl_ver = get_config_var("py_version_nodot") + if not impl_ver or get_abbr_impl() == 'pp': + impl_ver = ''.join(map(str, get_impl_version_info())) + return impl_ver + + +def get_impl_version_info(): + """Return sys.version_info-like tuple for use in decrementing the minor + version.""" + if get_abbr_impl() == 'pp': + # as per https://github.com/pypa/pip/issues/2882 + return (sys.version_info[0], sys.pypy_version_info.major, + sys.pypy_version_info.minor) + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + """Use a fallback method for determining SOABI flags if the needed config + var is unset or unavailable.""" + val = get_config_var(var) + if val is None: + if warn: + warnings.warn("Config variable '{0}' is unset, Python ABI tag may " + "be incorrect".format(var), RuntimeWarning, 2) + return fallback() + return val == expected + + +def get_abi_tag(): + """Return the ABI tag based on SOABI (if available) or emulate SOABI + (CPython 2, PyPy).""" + soabi = get_config_var('SOABI') + impl = get_abbr_impl() + if not soabi and impl in {'cp', 'pp'} and hasattr(sys, 'maxunicode'): + d = '' + m = '' + u = '' + if get_flag('Py_DEBUG', + lambda: hasattr(sys, 'gettotalrefcount'), + warn=(impl == 'cp')): + d = 'd' + if get_flag('WITH_PYMALLOC', + lambda: impl == 'cp', + warn=(impl == 'cp')): + m = 'm' + if get_flag('Py_UNICODE_SIZE', + lambda: sys.maxunicode == 0x10ffff, + expected=4, + warn=(impl == 'cp' and + sys.version_info < (3, 3))) \ + and sys.version_info < (3, 3): + u = 'u' + abi = '%s%s%s%s%s' % (impl, get_impl_ver(), d, m, u) + elif soabi and soabi.startswith('cpython-'): + abi = 'cp' + soabi.split('-')[1] + elif soabi: + abi = soabi.replace('.', '_').replace('-', '_') + else: + abi = None + return abi + + +def _is_running_32bit(): + return sys.maxsize == 2147483647 + + +def get_platform(): + """Return our platform name 'win32', 'linux_x86_64'""" + if sys.platform == 'darwin': + # distutils.util.get_platform() returns the release based on the value + # of MACOSX_DEPLOYMENT_TARGET on which Python was built, which may + # be significantly older than the user's current machine. + release, _, machine = platform.mac_ver() + split_ver = release.split('.') + + if machine == "x86_64" and _is_running_32bit(): + machine = "i386" + elif machine == "ppc64" and _is_running_32bit(): + machine = "ppc" + + return 'macosx_{}_{}_{}'.format(split_ver[0], split_ver[1], machine) + + # XXX remove distutils dependency + result = distutils.util.get_platform().replace('.', '_').replace('-', '_') + if result == "linux_x86_64" and _is_running_32bit(): + # 32 bit Python program (running on a 64 bit Linux): pip should only + # install and run 32 bit compiled extensions in that case. + result = "linux_i686" + + return result + + +def is_manylinux1_compatible(): + # Only Linux, and only x86-64 / i686 + if get_platform() not in {"linux_x86_64", "linux_i686"}: + return False + + # Check for presence of _manylinux module + try: + import _manylinux + return bool(_manylinux.manylinux1_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 5 uses glibc 2.5. + return glibc.have_compatible_glibc(2, 5) + + +def get_darwin_arches(major, minor, machine): + """Return a list of supported arches (including group arches) for + the given major, minor and machine architecture of an macOS machine. + """ + arches = [] + + def _supports_arch(major, minor, arch): + # Looking at the application support for macOS versions in the chart + # provided by https://en.wikipedia.org/wiki/OS_X#Versions it appears + # our timeline looks roughly like: + # + # 10.0 - Introduces ppc support. + # 10.4 - Introduces ppc64, i386, and x86_64 support, however the ppc64 + # and x86_64 support is CLI only, and cannot be used for GUI + # applications. + # 10.5 - Extends ppc64 and x86_64 support to cover GUI applications. + # 10.6 - Drops support for ppc64 + # 10.7 - Drops support for ppc + # + # Given that we do not know if we're installing a CLI or a GUI + # application, we must be conservative and assume it might be a GUI + # application and behave as if ppc64 and x86_64 support did not occur + # until 10.5. + # + # Note: The above information is taken from the "Application support" + # column in the chart not the "Processor support" since I believe + # that we care about what instruction sets an application can use + # not which processors the OS supports. + if arch == 'ppc': + return (major, minor) <= (10, 5) + if arch == 'ppc64': + return (major, minor) == (10, 5) + if arch == 'i386': + return (major, minor) >= (10, 4) + if arch == 'x86_64': + return (major, minor) >= (10, 5) + if arch in groups: + for garch in groups[arch]: + if _supports_arch(major, minor, garch): + return True + return False + + groups = OrderedDict([ + ("fat", ("i386", "ppc")), + ("intel", ("x86_64", "i386")), + ("fat64", ("x86_64", "ppc64")), + ("fat32", ("x86_64", "i386", "ppc")), + ]) + + if _supports_arch(major, minor, machine): + arches.append(machine) + + for garch in groups: + if machine in groups[garch] and _supports_arch(major, minor, garch): + arches.append(garch) + + arches.append('universal') + + return arches + + +def get_supported(versions=None, noarch=False, platform=None, + impl=None, abi=None): + """Return a list of supported tags for each version specified in + `versions`. + + :param versions: a list of string versions, of the form ["33", "32"], + or None. The first version will be assumed to support our ABI. + :param platform: specify the exact platform you want valid + tags for, or None. If None, use the local system platform. + :param impl: specify the exact implementation you want valid + tags for, or None. If None, use the local interpreter impl. + :param abi: specify the exact abi you want valid + tags for, or None. If None, use the local interpreter abi. + """ + supported = [] + + # Versions must be given with respect to the preference + if versions is None: + versions = [] + version_info = get_impl_version_info() + major = version_info[:-1] + # Support all previous minor Python versions. + for minor in range(version_info[-1], -1, -1): + versions.append(''.join(map(str, major + (minor,)))) + + impl = impl or get_abbr_impl() + + abis = [] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + import imp + for suffix in imp.get_suffixes(): + if suffix[0].startswith('.abi'): + abi3s.add(suffix[0].split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + if arch.startswith('macosx'): + # support macosx-10.6-intel on macosx-10.9-x86_64 + match = _osx_arch_pat.match(arch) + if match: + name, major, minor, actual_arch = match.groups() + tpl = '{}_{}_%i_%s'.format(name, major) + arches = [] + for m in reversed(range(int(minor) + 1)): + for a in get_darwin_arches(int(major), m, actual_arch): + arches.append(tpl % (m, a)) + else: + # arch pattern didn't match (?!) + arches = [arch] + elif platform is None and is_manylinux1_compatible(): + arches = [arch.replace('linux', 'manylinux1'), arch] + else: + arches = [arch] + + # Current version, current API (built specifically for our Python): + for abi in abis: + for arch in arches: + supported.append(('%s%s' % (impl, versions[0]), abi, arch)) + + # abi3 modules compatible with older version of Python + for version in versions[1:]: + # abi3 was introduced in Python 3.2 + if version in {'31', '30'}: + break + for abi in abi3s: # empty set if not Python 3 + for arch in arches: + supported.append(("%s%s" % (impl, version), abi, arch)) + + # Has binaries, does not use the Python API: + for arch in arches: + supported.append(('py%s' % (versions[0][0]), 'none', arch)) + + # No abi / arch, but requires our implementation: + supported.append(('%s%s' % (impl, versions[0]), 'none', 'any')) + # Tagged specifically as being cross-version compatible + # (with just the major version specified) + supported.append(('%s%s' % (impl, versions[0][0]), 'none', 'any')) + + # No abi / arch, generic Python + for i, version in enumerate(versions): + supported.append(('py%s' % (version,), 'none', 'any')) + if i == 0: + supported.append(('py%s' % (version[0]), 'none', 'any')) + + return supported + + +implementation_tag = get_impl_tag() diff --git a/myenv/lib/python3.7/site-packages/setuptools/py27compat.py b/myenv/lib/python3.7/site-packages/setuptools/py27compat.py new file mode 100644 index 000000000..2985011b9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/py27compat.py @@ -0,0 +1,28 @@ +""" +Compatibility Support for Python 2.7 and earlier +""" + +import platform + +from setuptools.extern import six + + +def get_all_headers(message, key): + """ + Given an HTTPMessage, return all headers matching a given key. + """ + return message.get_all(key) + + +if six.PY2: + def get_all_headers(message, key): + return message.getheaders(key) + + +linux_py2_ascii = ( + platform.system() == 'Linux' and + six.PY2 +) + +rmtree_safe = str if linux_py2_ascii else lambda x: x +"""Workaround for http://bugs.python.org/issue24672""" diff --git a/myenv/lib/python3.7/site-packages/setuptools/py31compat.py b/myenv/lib/python3.7/site-packages/setuptools/py31compat.py new file mode 100644 index 000000000..4ea953201 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/py31compat.py @@ -0,0 +1,41 @@ +__all__ = ['get_config_vars', 'get_path'] + +try: + # Python 2.7 or >=3.2 + from sysconfig import get_config_vars, get_path +except ImportError: + from distutils.sysconfig import get_config_vars, get_python_lib + + def get_path(name): + if name not in ('platlib', 'purelib'): + raise ValueError("Name must be purelib or platlib") + return get_python_lib(name == 'platlib') + + +try: + # Python >=3.2 + from tempfile import TemporaryDirectory +except ImportError: + import shutil + import tempfile + + class TemporaryDirectory(object): + """ + Very simple temporary directory context manager. + Will try to delete afterward, but will also ignore OS and similar + errors on deletion. + """ + + def __init__(self): + self.name = None # Handle mkdtemp raising an exception + self.name = tempfile.mkdtemp() + + def __enter__(self): + return self.name + + def __exit__(self, exctype, excvalue, exctrace): + try: + shutil.rmtree(self.name, True) + except OSError: # removal errors are not the only possible + pass + self.name = None diff --git a/myenv/lib/python3.7/site-packages/setuptools/py33compat.py b/myenv/lib/python3.7/site-packages/setuptools/py33compat.py new file mode 100644 index 000000000..2a73ebb3c --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/py33compat.py @@ -0,0 +1,54 @@ +import dis +import array +import collections + +try: + import html +except ImportError: + html = None + +from setuptools.extern import six +from setuptools.extern.six.moves import html_parser + + +OpArg = collections.namedtuple('OpArg', 'opcode arg') + + +class Bytecode_compat(object): + def __init__(self, code): + self.code = code + + def __iter__(self): + """Yield '(op,arg)' pair for each operation in code object 'code'""" + + bytes = array.array('b', self.code.co_code) + eof = len(self.code.co_code) + + ptr = 0 + extended_arg = 0 + + while ptr < eof: + + op = bytes[ptr] + + if op >= dis.HAVE_ARGUMENT: + + arg = bytes[ptr + 1] + bytes[ptr + 2] * 256 + extended_arg + ptr += 3 + + if op == dis.EXTENDED_ARG: + long_type = six.integer_types[-1] + extended_arg = arg * long_type(65536) + continue + + else: + arg = None + ptr += 1 + + yield OpArg(op, arg) + + +Bytecode = getattr(dis, 'Bytecode', Bytecode_compat) + + +unescape = getattr(html, 'unescape', html_parser.HTMLParser().unescape) diff --git a/myenv/lib/python3.7/site-packages/setuptools/py36compat.py b/myenv/lib/python3.7/site-packages/setuptools/py36compat.py new file mode 100644 index 000000000..f52796964 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/py36compat.py @@ -0,0 +1,82 @@ +import sys +from distutils.errors import DistutilsOptionError +from distutils.util import strtobool +from distutils.debug import DEBUG + + +class Distribution_parse_config_files: + """ + Mix-in providing forward-compatibility for functionality to be + included by default on Python 3.7. + + Do not edit the code in this class except to update functionality + as implemented in distutils. + """ + def parse_config_files(self, filenames=None): + from configparser import ConfigParser + + # Ignore install directory options if we have a venv + if sys.prefix != sys.base_prefix: + ignore_options = [ + 'install-base', 'install-platbase', 'install-lib', + 'install-platlib', 'install-purelib', 'install-headers', + 'install-scripts', 'install-data', 'prefix', 'exec-prefix', + 'home', 'user', 'root'] + else: + ignore_options = [] + + ignore_options = frozenset(ignore_options) + + if filenames is None: + filenames = self.find_config_files() + + if DEBUG: + self.announce("Distribution.parse_config_files():") + + parser = ConfigParser(interpolation=None) + for filename in filenames: + if DEBUG: + self.announce(" reading %s" % filename) + parser.read(filename) + for section in parser.sections(): + options = parser.options(section) + opt_dict = self.get_option_dict(section) + + for opt in options: + if opt != '__name__' and opt not in ignore_options: + val = parser.get(section,opt) + opt = opt.replace('-', '_') + opt_dict[opt] = (filename, val) + + # Make the ConfigParser forget everything (so we retain + # the original filenames that options come from) + parser.__init__() + + # If there was a "global" section in the config file, use it + # to set Distribution options. + + if 'global' in self.command_options: + for (opt, (src, val)) in self.command_options['global'].items(): + alias = self.negative_opt.get(opt) + try: + if alias: + setattr(self, alias, not strtobool(val)) + elif opt in ('verbose', 'dry_run'): # ugh! + setattr(self, opt, strtobool(val)) + else: + setattr(self, opt, val) + except ValueError as msg: + raise DistutilsOptionError(msg) + + +if sys.version_info < (3,): + # Python 2 behavior is sufficient + class Distribution_parse_config_files: + pass + + +if False: + # When updated behavior is available upstream, + # disable override here. + class Distribution_parse_config_files: + pass diff --git a/myenv/lib/python3.7/site-packages/setuptools/sandbox.py b/myenv/lib/python3.7/site-packages/setuptools/sandbox.py new file mode 100644 index 000000000..685f3f72e --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/sandbox.py @@ -0,0 +1,491 @@ +import os +import sys +import tempfile +import operator +import functools +import itertools +import re +import contextlib +import pickle +import textwrap + +from setuptools.extern import six +from setuptools.extern.six.moves import builtins, map + +import pkg_resources.py31compat + +if sys.platform.startswith('java'): + import org.python.modules.posix.PosixModule as _os +else: + _os = sys.modules[os.name] +try: + _file = file +except NameError: + _file = None +_open = open +from distutils.errors import DistutilsError +from pkg_resources import working_set + + +__all__ = [ + "AbstractSandbox", "DirectorySandbox", "SandboxViolation", "run_setup", +] + + +def _execfile(filename, globals, locals=None): + """ + Python 3 implementation of execfile. + """ + mode = 'rb' + with open(filename, mode) as stream: + script = stream.read() + if locals is None: + locals = globals + code = compile(script, filename, 'exec') + exec(code, globals, locals) + + +@contextlib.contextmanager +def save_argv(repl=None): + saved = sys.argv[:] + if repl is not None: + sys.argv[:] = repl + try: + yield saved + finally: + sys.argv[:] = saved + + +@contextlib.contextmanager +def save_path(): + saved = sys.path[:] + try: + yield saved + finally: + sys.path[:] = saved + + +@contextlib.contextmanager +def override_temp(replacement): + """ + Monkey-patch tempfile.tempdir with replacement, ensuring it exists + """ + pkg_resources.py31compat.makedirs(replacement, exist_ok=True) + + saved = tempfile.tempdir + + tempfile.tempdir = replacement + + try: + yield + finally: + tempfile.tempdir = saved + + +@contextlib.contextmanager +def pushd(target): + saved = os.getcwd() + os.chdir(target) + try: + yield saved + finally: + os.chdir(saved) + + +class UnpickleableException(Exception): + """ + An exception representing another Exception that could not be pickled. + """ + + @staticmethod + def dump(type, exc): + """ + Always return a dumped (pickled) type and exc. If exc can't be pickled, + wrap it in UnpickleableException first. + """ + try: + return pickle.dumps(type), pickle.dumps(exc) + except Exception: + # get UnpickleableException inside the sandbox + from setuptools.sandbox import UnpickleableException as cls + return cls.dump(cls, cls(repr(exc))) + + +class ExceptionSaver: + """ + A Context Manager that will save an exception, serialized, and restore it + later. + """ + + def __enter__(self): + return self + + def __exit__(self, type, exc, tb): + if not exc: + return + + # dump the exception + self._saved = UnpickleableException.dump(type, exc) + self._tb = tb + + # suppress the exception + return True + + def resume(self): + "restore and re-raise any exception" + + if '_saved' not in vars(self): + return + + type, exc = map(pickle.loads, self._saved) + six.reraise(type, exc, self._tb) + + +@contextlib.contextmanager +def save_modules(): + """ + Context in which imported modules are saved. + + Translates exceptions internal to the context into the equivalent exception + outside the context. + """ + saved = sys.modules.copy() + with ExceptionSaver() as saved_exc: + yield saved + + sys.modules.update(saved) + # remove any modules imported since + del_modules = ( + mod_name for mod_name in sys.modules + if mod_name not in saved + # exclude any encodings modules. See #285 + and not mod_name.startswith('encodings.') + ) + _clear_modules(del_modules) + + saved_exc.resume() + + +def _clear_modules(module_names): + for mod_name in list(module_names): + del sys.modules[mod_name] + + +@contextlib.contextmanager +def save_pkg_resources_state(): + saved = pkg_resources.__getstate__() + try: + yield saved + finally: + pkg_resources.__setstate__(saved) + + +@contextlib.contextmanager +def setup_context(setup_dir): + temp_dir = os.path.join(setup_dir, 'temp') + with save_pkg_resources_state(): + with save_modules(): + hide_setuptools() + with save_path(): + with save_argv(): + with override_temp(temp_dir): + with pushd(setup_dir): + # ensure setuptools commands are available + __import__('setuptools') + yield + + +def _needs_hiding(mod_name): + """ + >>> _needs_hiding('setuptools') + True + >>> _needs_hiding('pkg_resources') + True + >>> _needs_hiding('setuptools_plugin') + False + >>> _needs_hiding('setuptools.__init__') + True + >>> _needs_hiding('distutils') + True + >>> _needs_hiding('os') + False + >>> _needs_hiding('Cython') + True + """ + pattern = re.compile(r'(setuptools|pkg_resources|distutils|Cython)(\.|$)') + return bool(pattern.match(mod_name)) + + +def hide_setuptools(): + """ + Remove references to setuptools' modules from sys.modules to allow the + invocation to import the most appropriate setuptools. This technique is + necessary to avoid issues such as #315 where setuptools upgrading itself + would fail to find a function declared in the metadata. + """ + modules = filter(_needs_hiding, sys.modules) + _clear_modules(modules) + + +def run_setup(setup_script, args): + """Run a distutils setup script, sandboxed in its directory""" + setup_dir = os.path.abspath(os.path.dirname(setup_script)) + with setup_context(setup_dir): + try: + sys.argv[:] = [setup_script] + list(args) + sys.path.insert(0, setup_dir) + # reset to include setup dir, w/clean callback list + working_set.__init__() + working_set.callbacks.append(lambda dist: dist.activate()) + + # __file__ should be a byte string on Python 2 (#712) + dunder_file = ( + setup_script + if isinstance(setup_script, str) else + setup_script.encode(sys.getfilesystemencoding()) + ) + + with DirectorySandbox(setup_dir): + ns = dict(__file__=dunder_file, __name__='__main__') + _execfile(setup_script, ns) + except SystemExit as v: + if v.args and v.args[0]: + raise + # Normal exit, just return + + +class AbstractSandbox: + """Wrap 'os' module and 'open()' builtin for virtualizing setup scripts""" + + _active = False + + def __init__(self): + self._attrs = [ + name for name in dir(_os) + if not name.startswith('_') and hasattr(self, name) + ] + + def _copy(self, source): + for name in self._attrs: + setattr(os, name, getattr(source, name)) + + def __enter__(self): + self._copy(self) + if _file: + builtins.file = self._file + builtins.open = self._open + self._active = True + + def __exit__(self, exc_type, exc_value, traceback): + self._active = False + if _file: + builtins.file = _file + builtins.open = _open + self._copy(_os) + + def run(self, func): + """Run 'func' under os sandboxing""" + with self: + return func() + + def _mk_dual_path_wrapper(name): + original = getattr(_os, name) + + def wrap(self, src, dst, *args, **kw): + if self._active: + src, dst = self._remap_pair(name, src, dst, *args, **kw) + return original(src, dst, *args, **kw) + + return wrap + + for name in ["rename", "link", "symlink"]: + if hasattr(_os, name): + locals()[name] = _mk_dual_path_wrapper(name) + + def _mk_single_path_wrapper(name, original=None): + original = original or getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return original(path, *args, **kw) + + return wrap + + if _file: + _file = _mk_single_path_wrapper('file', _file) + _open = _mk_single_path_wrapper('open', _open) + for name in [ + "stat", "listdir", "chdir", "open", "chmod", "chown", "mkdir", + "remove", "unlink", "rmdir", "utime", "lchown", "chroot", "lstat", + "startfile", "mkfifo", "mknod", "pathconf", "access" + ]: + if hasattr(_os, name): + locals()[name] = _mk_single_path_wrapper(name) + + def _mk_single_with_return(name): + original = getattr(_os, name) + + def wrap(self, path, *args, **kw): + if self._active: + path = self._remap_input(name, path, *args, **kw) + return self._remap_output(name, original(path, *args, **kw)) + return original(path, *args, **kw) + + return wrap + + for name in ['readlink', 'tempnam']: + if hasattr(_os, name): + locals()[name] = _mk_single_with_return(name) + + def _mk_query(name): + original = getattr(_os, name) + + def wrap(self, *args, **kw): + retval = original(*args, **kw) + if self._active: + return self._remap_output(name, retval) + return retval + + return wrap + + for name in ['getcwd', 'tmpnam']: + if hasattr(_os, name): + locals()[name] = _mk_query(name) + + def _validate_path(self, path): + """Called to remap or validate any path, whether input or output""" + return path + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + return self._validate_path(path) + + def _remap_output(self, operation, path): + """Called for path outputs""" + return self._validate_path(path) + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + return ( + self._remap_input(operation + '-from', src, *args, **kw), + self._remap_input(operation + '-to', dst, *args, **kw) + ) + + +if hasattr(os, 'devnull'): + _EXCEPTIONS = [os.devnull,] +else: + _EXCEPTIONS = [] + + +class DirectorySandbox(AbstractSandbox): + """Restrict operations to a single subdirectory - pseudo-chroot""" + + write_ops = dict.fromkeys([ + "open", "chmod", "chown", "mkdir", "remove", "unlink", "rmdir", + "utime", "lchown", "chroot", "mkfifo", "mknod", "tempnam", + ]) + + _exception_patterns = [ + # Allow lib2to3 to attempt to save a pickled grammar object (#121) + r'.*lib2to3.*\.pickle$', + ] + "exempt writing to paths that match the pattern" + + def __init__(self, sandbox, exceptions=_EXCEPTIONS): + self._sandbox = os.path.normcase(os.path.realpath(sandbox)) + self._prefix = os.path.join(self._sandbox, '') + self._exceptions = [ + os.path.normcase(os.path.realpath(path)) + for path in exceptions + ] + AbstractSandbox.__init__(self) + + def _violation(self, operation, *args, **kw): + from setuptools.sandbox import SandboxViolation + raise SandboxViolation(operation, args, kw) + + if _file: + + def _file(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("file", path, mode, *args, **kw) + return _file(path, mode, *args, **kw) + + def _open(self, path, mode='r', *args, **kw): + if mode not in ('r', 'rt', 'rb', 'rU', 'U') and not self._ok(path): + self._violation("open", path, mode, *args, **kw) + return _open(path, mode, *args, **kw) + + def tmpnam(self): + self._violation("tmpnam") + + def _ok(self, path): + active = self._active + try: + self._active = False + realpath = os.path.normcase(os.path.realpath(path)) + return ( + self._exempted(realpath) + or realpath == self._sandbox + or realpath.startswith(self._prefix) + ) + finally: + self._active = active + + def _exempted(self, filepath): + start_matches = ( + filepath.startswith(exception) + for exception in self._exceptions + ) + pattern_matches = ( + re.match(pattern, filepath) + for pattern in self._exception_patterns + ) + candidates = itertools.chain(start_matches, pattern_matches) + return any(candidates) + + def _remap_input(self, operation, path, *args, **kw): + """Called for path inputs""" + if operation in self.write_ops and not self._ok(path): + self._violation(operation, os.path.realpath(path), *args, **kw) + return path + + def _remap_pair(self, operation, src, dst, *args, **kw): + """Called for path pairs like rename, link, and symlink operations""" + if not self._ok(src) or not self._ok(dst): + self._violation(operation, src, dst, *args, **kw) + return (src, dst) + + def open(self, file, flags, mode=0o777, *args, **kw): + """Called for low-level os.open()""" + if flags & WRITE_FLAGS and not self._ok(file): + self._violation("os.open", file, flags, mode, *args, **kw) + return _os.open(file, flags, mode, *args, **kw) + + +WRITE_FLAGS = functools.reduce( + operator.or_, [getattr(_os, a, 0) for a in + "O_WRONLY O_RDWR O_APPEND O_CREAT O_TRUNC O_TEMPORARY".split()] +) + + +class SandboxViolation(DistutilsError): + """A setup script attempted to modify the filesystem outside the sandbox""" + + tmpl = textwrap.dedent(""" + SandboxViolation: {cmd}{args!r} {kwargs} + + The package setup script has attempted to modify files on your system + that are not within the EasyInstall build area, and has been aborted. + + This package cannot be safely installed by EasyInstall, and may not + support alternate installation locations even if you run its setup + script by hand. Please inform the package's author and the EasyInstall + maintainers to find out if a fix or workaround is available. + """).lstrip() + + def __str__(self): + cmd, args, kwargs = self.args + return self.tmpl.format(**locals()) diff --git a/myenv/lib/python3.7/site-packages/setuptools/script (dev).tmpl b/myenv/lib/python3.7/site-packages/setuptools/script (dev).tmpl new file mode 100644 index 000000000..d58b1bb5b --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/script (dev).tmpl @@ -0,0 +1,5 @@ +# EASY-INSTALL-DEV-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').require(%(spec)r) +__file__ = %(dev_path)r +exec(compile(open(__file__).read(), __file__, 'exec')) diff --git a/myenv/lib/python3.7/site-packages/setuptools/script.tmpl b/myenv/lib/python3.7/site-packages/setuptools/script.tmpl new file mode 100644 index 000000000..ff5efbcab --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/script.tmpl @@ -0,0 +1,3 @@ +# EASY-INSTALL-SCRIPT: %(spec)r,%(script_name)r +__requires__ = %(spec)r +__import__('pkg_resources').run_script(%(spec)r, %(script_name)r) diff --git a/myenv/lib/python3.7/site-packages/setuptools/site-patch.py b/myenv/lib/python3.7/site-packages/setuptools/site-patch.py new file mode 100644 index 000000000..0d2d2ff8d --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/site-patch.py @@ -0,0 +1,74 @@ +def __boot(): + import sys + import os + PYTHONPATH = os.environ.get('PYTHONPATH') + if PYTHONPATH is None or (sys.platform == 'win32' and not PYTHONPATH): + PYTHONPATH = [] + else: + PYTHONPATH = PYTHONPATH.split(os.pathsep) + + pic = getattr(sys, 'path_importer_cache', {}) + stdpath = sys.path[len(PYTHONPATH):] + mydir = os.path.dirname(__file__) + + for item in stdpath: + if item == mydir or not item: + continue # skip if current dir. on Windows, or my own directory + importer = pic.get(item) + if importer is not None: + loader = importer.find_module('site') + if loader is not None: + # This should actually reload the current module + loader.load_module('site') + break + else: + try: + import imp # Avoid import loop in Python >= 3.3 + stream, path, descr = imp.find_module('site', [item]) + except ImportError: + continue + if stream is None: + continue + try: + # This should actually reload the current module + imp.load_module('site', stream, path, descr) + finally: + stream.close() + break + else: + raise ImportError("Couldn't find the real 'site' module") + + known_paths = dict([(makepath(item)[1], 1) for item in sys.path]) # 2.2 comp + + oldpos = getattr(sys, '__egginsert', 0) # save old insertion position + sys.__egginsert = 0 # and reset the current one + + for item in PYTHONPATH: + addsitedir(item) + + sys.__egginsert += oldpos # restore effective old position + + d, nd = makepath(stdpath[0]) + insert_at = None + new_path = [] + + for item in sys.path: + p, np = makepath(item) + + if np == nd and insert_at is None: + # We've hit the first 'system' path entry, so added entries go here + insert_at = len(new_path) + + if np in known_paths or insert_at is None: + new_path.append(item) + else: + # new path after the insert point, back-insert it + new_path.insert(insert_at, item) + insert_at += 1 + + sys.path[:] = new_path + + +if __name__ == 'site': + __boot() + del __boot diff --git a/myenv/lib/python3.7/site-packages/setuptools/ssl_support.py b/myenv/lib/python3.7/site-packages/setuptools/ssl_support.py new file mode 100644 index 000000000..6362f1f42 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/ssl_support.py @@ -0,0 +1,260 @@ +import os +import socket +import atexit +import re +import functools + +from setuptools.extern.six.moves import urllib, http_client, map, filter + +from pkg_resources import ResolutionError, ExtractionError + +try: + import ssl +except ImportError: + ssl = None + +__all__ = [ + 'VerifyingHTTPSHandler', 'find_ca_bundle', 'is_available', 'cert_paths', + 'opener_for' +] + +cert_paths = """ +/etc/pki/tls/certs/ca-bundle.crt +/etc/ssl/certs/ca-certificates.crt +/usr/share/ssl/certs/ca-bundle.crt +/usr/local/share/certs/ca-root.crt +/etc/ssl/cert.pem +/System/Library/OpenSSL/certs/cert.pem +/usr/local/share/certs/ca-root-nss.crt +/etc/ssl/ca-bundle.pem +""".strip().split() + +try: + HTTPSHandler = urllib.request.HTTPSHandler + HTTPSConnection = http_client.HTTPSConnection +except AttributeError: + HTTPSHandler = HTTPSConnection = object + +is_available = ssl is not None and object not in (HTTPSHandler, HTTPSConnection) + + +try: + from ssl import CertificateError, match_hostname +except ImportError: + try: + from backports.ssl_match_hostname import CertificateError + from backports.ssl_match_hostname import match_hostname + except ImportError: + CertificateError = None + match_hostname = None + +if not CertificateError: + + class CertificateError(ValueError): + pass + + +if not match_hostname: + + def _dnsname_match(dn, hostname, max_wildcards=1): + """Matching according to RFC 6125, section 6.4.3 + + http://tools.ietf.org/html/rfc6125#section-6.4.3 + """ + pats = [] + if not dn: + return False + + # Ported from python3-syntax: + # leftmost, *remainder = dn.split(r'.') + parts = dn.split(r'.') + leftmost = parts[0] + remainder = parts[1:] + + wildcards = leftmost.count('*') + if wildcards > max_wildcards: + # Issue #17980: avoid denials of service by refusing more + # than one wildcard per fragment. A survey of established + # policy among SSL implementations showed it to be a + # reasonable choice. + raise CertificateError( + "too many wildcards in certificate DNS name: " + repr(dn)) + + # speed up common case w/o wildcards + if not wildcards: + return dn.lower() == hostname.lower() + + # RFC 6125, section 6.4.3, subitem 1. + # The client SHOULD NOT attempt to match a presented identifier in which + # the wildcard character comprises a label other than the left-most label. + if leftmost == '*': + # When '*' is a fragment by itself, it matches a non-empty dotless + # fragment. + pats.append('[^.]+') + elif leftmost.startswith('xn--') or hostname.startswith('xn--'): + # RFC 6125, section 6.4.3, subitem 3. + # The client SHOULD NOT attempt to match a presented identifier + # where the wildcard character is embedded within an A-label or + # U-label of an internationalized domain name. + pats.append(re.escape(leftmost)) + else: + # Otherwise, '*' matches any dotless string, e.g. www* + pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) + + # add the remaining fragments, ignore any wildcards + for frag in remainder: + pats.append(re.escape(frag)) + + pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) + return pat.match(hostname) + + def match_hostname(cert, hostname): + """Verify that *cert* (in decoded format as returned by + SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 + rules are followed, but IP addresses are not accepted for *hostname*. + + CertificateError is raised on failure. On success, the function + returns nothing. + """ + if not cert: + raise ValueError("empty or no certificate") + dnsnames = [] + san = cert.get('subjectAltName', ()) + for key, value in san: + if key == 'DNS': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if not dnsnames: + # The subject is only checked when there is no dNSName entry + # in subjectAltName + for sub in cert.get('subject', ()): + for key, value in sub: + # XXX according to RFC 2818, the most specific Common Name + # must be used. + if key == 'commonName': + if _dnsname_match(value, hostname): + return + dnsnames.append(value) + if len(dnsnames) > 1: + raise CertificateError("hostname %r " + "doesn't match either of %s" + % (hostname, ', '.join(map(repr, dnsnames)))) + elif len(dnsnames) == 1: + raise CertificateError("hostname %r " + "doesn't match %r" + % (hostname, dnsnames[0])) + else: + raise CertificateError("no appropriate commonName or " + "subjectAltName fields were found") + + +class VerifyingHTTPSHandler(HTTPSHandler): + """Simple verifying handler: no auth, subclasses, timeouts, etc.""" + + def __init__(self, ca_bundle): + self.ca_bundle = ca_bundle + HTTPSHandler.__init__(self) + + def https_open(self, req): + return self.do_open( + lambda host, **kw: VerifyingHTTPSConn(host, self.ca_bundle, **kw), req + ) + + +class VerifyingHTTPSConn(HTTPSConnection): + """Simple verifying connection: no auth, subclasses, timeouts, etc.""" + + def __init__(self, host, ca_bundle, **kw): + HTTPSConnection.__init__(self, host, **kw) + self.ca_bundle = ca_bundle + + def connect(self): + sock = socket.create_connection( + (self.host, self.port), getattr(self, 'source_address', None) + ) + + # Handle the socket if a (proxy) tunnel is present + if hasattr(self, '_tunnel') and getattr(self, '_tunnel_host', None): + self.sock = sock + self._tunnel() + # http://bugs.python.org/issue7776: Python>=3.4.1 and >=2.7.7 + # change self.host to mean the proxy server host when tunneling is + # being used. Adapt, since we are interested in the destination + # host for the match_hostname() comparison. + actual_host = self._tunnel_host + else: + actual_host = self.host + + if hasattr(ssl, 'create_default_context'): + ctx = ssl.create_default_context(cafile=self.ca_bundle) + self.sock = ctx.wrap_socket(sock, server_hostname=actual_host) + else: + # This is for python < 2.7.9 and < 3.4? + self.sock = ssl.wrap_socket( + sock, cert_reqs=ssl.CERT_REQUIRED, ca_certs=self.ca_bundle + ) + try: + match_hostname(self.sock.getpeercert(), actual_host) + except CertificateError: + self.sock.shutdown(socket.SHUT_RDWR) + self.sock.close() + raise + + +def opener_for(ca_bundle=None): + """Get a urlopen() replacement that uses ca_bundle for verification""" + return urllib.request.build_opener( + VerifyingHTTPSHandler(ca_bundle or find_ca_bundle()) + ).open + + +# from jaraco.functools +def once(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + if not hasattr(func, 'always_returns'): + func.always_returns = func(*args, **kwargs) + return func.always_returns + return wrapper + + +@once +def get_win_certfile(): + try: + import wincertstore + except ImportError: + return None + + class CertFile(wincertstore.CertFile): + def __init__(self): + super(CertFile, self).__init__() + atexit.register(self.close) + + def close(self): + try: + super(CertFile, self).close() + except OSError: + pass + + _wincerts = CertFile() + _wincerts.addstore('CA') + _wincerts.addstore('ROOT') + return _wincerts.name + + +def find_ca_bundle(): + """Return an existing CA bundle path, or None""" + extant_cert_paths = filter(os.path.isfile, cert_paths) + return ( + get_win_certfile() + or next(extant_cert_paths, None) + or _certifi_where() + ) + + +def _certifi_where(): + try: + return __import__('certifi').where() + except (ImportError, ResolutionError, ExtractionError): + pass diff --git a/myenv/lib/python3.7/site-packages/setuptools/unicode_utils.py b/myenv/lib/python3.7/site-packages/setuptools/unicode_utils.py new file mode 100644 index 000000000..7c63efd20 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/unicode_utils.py @@ -0,0 +1,44 @@ +import unicodedata +import sys + +from setuptools.extern import six + + +# HFS Plus uses decomposed UTF-8 +def decompose(path): + if isinstance(path, six.text_type): + return unicodedata.normalize('NFD', path) + try: + path = path.decode('utf-8') + path = unicodedata.normalize('NFD', path) + path = path.encode('utf-8') + except UnicodeError: + pass # Not UTF-8 + return path + + +def filesys_decode(path): + """ + Ensure that the given path is decoded, + NONE when no expected encoding works + """ + + if isinstance(path, six.text_type): + return path + + fs_enc = sys.getfilesystemencoding() or 'utf-8' + candidates = fs_enc, 'utf-8' + + for enc in candidates: + try: + return path.decode(enc) + except UnicodeDecodeError: + continue + + +def try_encode(string, enc): + "turn unicode encoding into a functional routine" + try: + return string.encode(enc) + except UnicodeEncodeError: + return None diff --git a/myenv/lib/python3.7/site-packages/setuptools/version.py b/myenv/lib/python3.7/site-packages/setuptools/version.py new file mode 100644 index 000000000..95e186965 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/version.py @@ -0,0 +1,6 @@ +import pkg_resources + +try: + __version__ = pkg_resources.get_distribution('setuptools').version +except Exception: + __version__ = 'unknown' diff --git a/myenv/lib/python3.7/site-packages/setuptools/wheel.py b/myenv/lib/python3.7/site-packages/setuptools/wheel.py new file mode 100644 index 000000000..37dfa5310 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/wheel.py @@ -0,0 +1,163 @@ +'''Wheels support.''' + +from distutils.util import get_platform +import email +import itertools +import os +import re +import zipfile + +from pkg_resources import Distribution, PathMetadata, parse_version +from setuptools.extern.six import PY3 +from setuptools import Distribution as SetuptoolsDistribution +from setuptools import pep425tags +from setuptools.command.egg_info import write_requirements + + +WHEEL_NAME = re.compile( + r"""^(?P.+?)-(?P\d.*?) + ((-(?P\d.*?))?-(?P.+?)-(?P.+?)-(?P.+?) + )\.whl$""", +re.VERBOSE).match + +NAMESPACE_PACKAGE_INIT = '''\ +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + __path__ = __import__('pkgutil').extend_path(__path__, __name__) +''' + + +def unpack(src_dir, dst_dir): + '''Move everything under `src_dir` to `dst_dir`, and delete the former.''' + for dirpath, dirnames, filenames in os.walk(src_dir): + subdir = os.path.relpath(dirpath, src_dir) + for f in filenames: + src = os.path.join(dirpath, f) + dst = os.path.join(dst_dir, subdir, f) + os.renames(src, dst) + for n, d in reversed(list(enumerate(dirnames))): + src = os.path.join(dirpath, d) + dst = os.path.join(dst_dir, subdir, d) + if not os.path.exists(dst): + # Directory does not exist in destination, + # rename it and prune it from os.walk list. + os.renames(src, dst) + del dirnames[n] + # Cleanup. + for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True): + assert not filenames + os.rmdir(dirpath) + + +class Wheel(object): + + def __init__(self, filename): + match = WHEEL_NAME(os.path.basename(filename)) + if match is None: + raise ValueError('invalid wheel name: %r' % filename) + self.filename = filename + for k, v in match.groupdict().items(): + setattr(self, k, v) + + def tags(self): + '''List tags (py_version, abi, platform) supported by this wheel.''' + return itertools.product(self.py_version.split('.'), + self.abi.split('.'), + self.platform.split('.')) + + def is_compatible(self): + '''Is the wheel is compatible with the current platform?''' + supported_tags = pep425tags.get_supported() + return next((True for t in self.tags() if t in supported_tags), False) + + def egg_name(self): + return Distribution( + project_name=self.project_name, version=self.version, + platform=(None if self.platform == 'any' else get_platform()), + ).egg_name() + '.egg' + + def install_as_egg(self, destination_eggdir): + '''Install wheel as an egg directory.''' + with zipfile.ZipFile(self.filename) as zf: + dist_basename = '%s-%s' % (self.project_name, self.version) + dist_info = '%s.dist-info' % dist_basename + dist_data = '%s.data' % dist_basename + def get_metadata(name): + with zf.open('%s/%s' % (dist_info, name)) as fp: + value = fp.read().decode('utf-8') if PY3 else fp.read() + return email.parser.Parser().parsestr(value) + wheel_metadata = get_metadata('WHEEL') + dist_metadata = get_metadata('METADATA') + # Check wheel format version is supported. + wheel_version = parse_version(wheel_metadata.get('Wheel-Version')) + if not parse_version('1.0') <= wheel_version < parse_version('2.0dev0'): + raise ValueError('unsupported wheel format version: %s' % wheel_version) + # Extract to target directory. + os.mkdir(destination_eggdir) + zf.extractall(destination_eggdir) + # Convert metadata. + dist_info = os.path.join(destination_eggdir, dist_info) + dist = Distribution.from_location( + destination_eggdir, dist_info, + metadata=PathMetadata(destination_eggdir, dist_info) + ) + # Note: we need to evaluate and strip markers now, + # as we can't easily convert back from the syntax: + # foobar; "linux" in sys_platform and extra == 'test' + def raw_req(req): + req.marker = None + return str(req) + install_requires = list(sorted(map(raw_req, dist.requires()))) + extras_require = { + extra: list(sorted( + req + for req in map(raw_req, dist.requires((extra,))) + if req not in install_requires + )) + for extra in dist.extras + } + egg_info = os.path.join(destination_eggdir, 'EGG-INFO') + os.rename(dist_info, egg_info) + os.rename(os.path.join(egg_info, 'METADATA'), + os.path.join(egg_info, 'PKG-INFO')) + setup_dist = SetuptoolsDistribution(attrs=dict( + install_requires=install_requires, + extras_require=extras_require, + )) + write_requirements(setup_dist.get_command_obj('egg_info'), + None, os.path.join(egg_info, 'requires.txt')) + # Move data entries to their correct location. + dist_data = os.path.join(destination_eggdir, dist_data) + dist_data_scripts = os.path.join(dist_data, 'scripts') + if os.path.exists(dist_data_scripts): + egg_info_scripts = os.path.join(destination_eggdir, + 'EGG-INFO', 'scripts') + os.mkdir(egg_info_scripts) + for entry in os.listdir(dist_data_scripts): + # Remove bytecode, as it's not properly handled + # during easy_install scripts install phase. + if entry.endswith('.pyc'): + os.unlink(os.path.join(dist_data_scripts, entry)) + else: + os.rename(os.path.join(dist_data_scripts, entry), + os.path.join(egg_info_scripts, entry)) + os.rmdir(dist_data_scripts) + for subdir in filter(os.path.exists, ( + os.path.join(dist_data, d) + for d in ('data', 'headers', 'purelib', 'platlib') + )): + unpack(subdir, destination_eggdir) + if os.path.exists(dist_data): + os.rmdir(dist_data) + # Fix namespace packages. + namespace_packages = os.path.join(egg_info, 'namespace_packages.txt') + if os.path.exists(namespace_packages): + with open(namespace_packages) as fp: + namespace_packages = fp.read().split() + for mod in namespace_packages: + mod_dir = os.path.join(destination_eggdir, *mod.split('.')) + mod_init = os.path.join(mod_dir, '__init__.py') + if os.path.exists(mod_dir) and not os.path.exists(mod_init): + with open(mod_init, 'w') as fp: + fp.write(NAMESPACE_PACKAGE_INIT) diff --git a/myenv/lib/python3.7/site-packages/setuptools/windows_support.py b/myenv/lib/python3.7/site-packages/setuptools/windows_support.py new file mode 100644 index 000000000..cb977cff9 --- /dev/null +++ b/myenv/lib/python3.7/site-packages/setuptools/windows_support.py @@ -0,0 +1,29 @@ +import platform +import ctypes + + +def windows_only(func): + if platform.system() != 'Windows': + return lambda *args, **kwargs: None + return func + + +@windows_only +def hide_file(path): + """ + Set the hidden attribute on a file or directory. + + From http://stackoverflow.com/questions/19622133/ + + `path` must be text. + """ + __import__('ctypes.wintypes') + SetFileAttributes = ctypes.windll.kernel32.SetFileAttributesW + SetFileAttributes.argtypes = ctypes.wintypes.LPWSTR, ctypes.wintypes.DWORD + SetFileAttributes.restype = ctypes.wintypes.BOOL + + FILE_ATTRIBUTE_HIDDEN = 0x02 + + ret = SetFileAttributes(path, FILE_ATTRIBUTE_HIDDEN) + if not ret: + raise ctypes.WinError() diff --git a/myenv/pyvenv.cfg b/myenv/pyvenv.cfg new file mode 100644 index 000000000..7345c1993 --- /dev/null +++ b/myenv/pyvenv.cfg @@ -0,0 +1,3 @@ +home = /Library/Frameworks/Python.framework/Versions/3.7/bin +include-system-site-packages = false +version = 3.7.0 diff --git a/run.py b/run.py new file mode 100755 index 000000000..a8a6b86c1 --- /dev/null +++ b/run.py @@ -0,0 +1,23 @@ +from flask import Flask, render_template, jsonify +from random import * +from flask_cors import CORS +import requests + +app = Flask(__name__, + static_folder = "./dist/static", + template_folder = "./dist") +cors = CORS(app, resources={r"/api/*": {"origins": "*"}}) + +@app.route('/api/random') +def random_number(): + response = { + 'randomNumber': randint(1, 100) + } + return jsonify(response) + +@app.route('/', defaults={'path': ''}) +@app.route('/') +def catch_all(path): + if app.debug: + return requests.get('http://localhost:8080/{}'.format(path)).text + return render_template("index.html")