From 2cfc150f36668bdb00b882ada49997280ccc2943 Mon Sep 17 00:00:00 2001 From: k17pine <47183551+k17pine@users.noreply.github.com> Date: Wed, 18 Dec 2019 15:28:26 +0200 Subject: [PATCH 1/4] Adding client-server part Data structures done --- .../k17pine/data_structures/.idea/.gitignore | 2 + .../data_structures/.idea/data_structures.iml | 13 + .../inspectionProfiles/profiles_settings.xml | 6 + .../k17pine/data_structures/.idea/misc.xml | 4 + .../k17pine/data_structures/.idea/modules.xml | 8 + .../k17pine/data_structures/.idea/vcs.xml | 7 + submissions/k17pine/data_structures/README.md | 21 + submissions/k17pine/data_structures/client.py | 15 + submissions/k17pine/data_structures/server.py | 86 + .../venv/Lib/site-packages/easy-install.pth | 2 + .../pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO | 73 + .../pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt | 391 + .../EGG-INFO/dependency_links.txt | 1 + .../EGG-INFO/entry_points.txt | 5 + .../EGG-INFO/not-zip-safe | 1 + .../EGG-INFO/top_level.txt | 1 + .../pip-19.0.3-py3.8.egg/pip/__init__.py | 1 + .../pip-19.0.3-py3.8.egg/pip/__main__.py | 19 + .../pip/_internal/__init__.py | 78 + .../pip/_internal/build_env.py | 215 + .../pip/_internal/cache.py | 224 + .../pip/_internal/cli/__init__.py | 4 + .../pip/_internal/cli/autocompletion.py | 152 + .../pip/_internal/cli/base_command.py | 341 + .../pip/_internal/cli/cmdoptions.py | 809 ++ .../pip/_internal/cli/main_parser.py | 104 + .../pip/_internal/cli/parser.py | 261 + .../pip/_internal/cli/status_codes.py | 8 + .../pip/_internal/commands/__init__.py | 79 + .../pip/_internal/commands/check.py | 41 + .../pip/_internal/commands/completion.py | 94 + .../pip/_internal/commands/configuration.py | 227 + .../pip/_internal/commands/download.py | 176 + .../pip/_internal/commands/freeze.py | 96 + .../pip/_internal/commands/hash.py | 57 + .../pip/_internal/commands/help.py | 37 + .../pip/_internal/commands/install.py | 566 ++ .../pip/_internal/commands/list.py | 301 + .../pip/_internal/commands/search.py | 135 + .../pip/_internal/commands/show.py | 168 + .../pip/_internal/commands/uninstall.py | 78 + .../pip/_internal/commands/wheel.py | 186 + .../pip/_internal/configuration.py | 387 + .../pip/_internal/download.py | 971 ++ .../pip/_internal/exceptions.py | 274 + .../pip/_internal/index.py | 990 ++ .../pip/_internal/locations.py | 211 + .../pip/_internal/models/__init__.py | 2 + .../pip/_internal/models/candidate.py | 31 + .../pip/_internal/models/format_control.py | 73 + .../pip/_internal/models/index.py | 31 + .../pip/_internal/models/link.py | 163 + .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/check.py | 155 + .../pip/_internal/operations/freeze.py | 247 + .../pip/_internal/operations/prepare.py | 413 + .../pip/_internal/pep425tags.py | 381 + .../pip/_internal/pyproject.py | 171 + .../pip/_internal/req/__init__.py | 77 + .../pip/_internal/req/constructors.py | 339 + .../pip/_internal/req/req_file.py | 382 + .../pip/_internal/req/req_install.py | 1021 ++ .../pip/_internal/req/req_set.py | 197 + .../pip/_internal/req/req_tracker.py | 88 + .../pip/_internal/req/req_uninstall.py | 596 ++ .../pip/_internal/resolve.py | 393 + .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/appdirs.py | 270 + .../pip/_internal/utils/compat.py | 264 + .../pip/_internal/utils/deprecation.py | 90 + .../pip/_internal/utils/encoding.py | 39 + .../pip/_internal/utils/filesystem.py | 30 + .../pip/_internal/utils/glibc.py | 93 + .../pip/_internal/utils/hashes.py | 115 + .../pip/_internal/utils/logging.py | 318 + .../pip/_internal/utils/misc.py | 1040 +++ .../pip/_internal/utils/models.py | 40 + .../pip/_internal/utils/outdated.py | 164 + .../pip/_internal/utils/packaging.py | 85 + .../pip/_internal/utils/setuptools_build.py | 8 + .../pip/_internal/utils/temp_dir.py | 155 + .../pip/_internal/utils/typing.py | 29 + .../pip/_internal/utils/ui.py | 441 + .../pip/_internal/vcs/__init__.py | 534 ++ .../pip/_internal/vcs/bazaar.py | 114 + .../pip/_internal/vcs/git.py | 369 + .../pip/_internal/vcs/mercurial.py | 103 + .../pip/_internal/vcs/subversion.py | 200 + .../pip/_internal/wheel.py | 1095 +++ .../pip/_vendor/__init__.py | 111 + .../pip/_vendor/appdirs.py | 604 ++ .../pip/_vendor/cachecontrol/__init__.py | 11 + .../pip/_vendor/cachecontrol/_cmd.py | 57 + .../pip/_vendor/cachecontrol/adapter.py | 133 + .../pip/_vendor/cachecontrol/cache.py | 39 + .../_vendor/cachecontrol/caches/__init__.py | 2 + .../_vendor/cachecontrol/caches/file_cache.py | 146 + .../cachecontrol/caches/redis_cache.py | 33 + .../pip/_vendor/cachecontrol/compat.py | 29 + .../pip/_vendor/cachecontrol/controller.py | 367 + .../pip/_vendor/cachecontrol/filewrapper.py | 80 + .../pip/_vendor/cachecontrol/heuristics.py | 135 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 29 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 2 + .../pip/_vendor/certifi/cacert.pem | 4512 +++++++++ .../pip/_vendor/certifi/core.py | 20 + .../pip/_vendor/chardet/__init__.py | 39 + .../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 + .../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 | 6 + .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 257 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../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 | 1339 +++ .../pip/_vendor/distlib/index.py | 516 ++ .../pip/_vendor/distlib/locators.py | 1295 +++ .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 131 + .../pip/_vendor/distlib/metadata.py | 1094 +++ .../pip/_vendor/distlib/resources.py | 355 + .../pip/_vendor/distlib/scripts.py | 417 + .../pip/_vendor/distlib/t32.exe | Bin 0 -> 92672 bytes .../pip/_vendor/distlib/t64.exe | Bin 0 -> 102400 bytes .../pip/_vendor/distlib/util.py | 1756 ++++ .../pip/_vendor/distlib/version.py | 736 ++ .../pip/_vendor/distlib/w32.exe | Bin 0 -> 89088 bytes .../pip/_vendor/distlib/w64.exe | Bin 0 -> 99328 bytes .../pip/_vendor/distlib/wheel.py | 988 ++ .../pip/_vendor/distro.py | 1197 +++ .../pip/_vendor/html5lib/__init__.py | 35 + .../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 + .../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 .../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 + .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../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 + .../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 + .../pip/_vendor/idna/codec.py | 118 + .../pip/_vendor/idna/compat.py | 12 + .../pip/_vendor/idna/core.py | 396 + .../pip/_vendor/idna/idnadata.py | 1979 ++++ .../pip/_vendor/idna/intranges.py | 53 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8205 +++++++++++++++++ .../pip/_vendor/ipaddress.py | 2419 +++++ .../pip/_vendor/lockfile/__init__.py | 347 + .../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 + .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 41 + .../pip/_vendor/msgpack/fallback.py | 977 ++ .../pip/_vendor/packaging/__about__.py | 27 + .../pip/_vendor/packaging/__init__.py | 26 + .../pip/_vendor/packaging/_compat.py | 31 + .../pip/_vendor/packaging/_structures.py | 68 + .../pip/_vendor/packaging/markers.py | 296 + .../pip/_vendor/packaging/requirements.py | 138 + .../pip/_vendor/packaging/specifiers.py | 749 ++ .../pip/_vendor/packaging/utils.py | 57 + .../pip/_vendor/packaging/version.py | 420 + .../pip/_vendor/pep517/__init__.py | 4 + .../pip/_vendor/pep517/_in_process.py | 207 + .../pip/_vendor/pep517/build.py | 108 + .../pip/_vendor/pep517/check.py | 202 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 23 + .../pip/_vendor/pep517/envbuild.py | 158 + .../pip/_vendor/pep517/wrappers.py | 163 + .../pip/_vendor/pkg_resources/__init__.py | 3171 +++++++ .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/progress/__init__.py | 127 + .../pip/_vendor/progress/bar.py | 94 + .../pip/_vendor/progress/counter.py | 48 + .../pip/_vendor/progress/helpers.py | 91 + .../pip/_vendor/progress/spinner.py | 44 + .../pip/_vendor/pyparsing.py | 6452 +++++++++++++ .../pip/_vendor/pytoml/__init__.py | 4 + .../pip/_vendor/pytoml/core.py | 13 + .../pip/_vendor/pytoml/parser.py | 341 + .../pip/_vendor/pytoml/test.py | 30 + .../pip/_vendor/pytoml/utils.py | 67 + .../pip/_vendor/pytoml/writer.py | 106 + .../pip/_vendor/requests/__init__.py | 133 + .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 533 ++ .../pip/_vendor/requests/api.py | 158 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 74 + .../pip/_vendor/requests/cookies.py | 549 ++ .../pip/_vendor/requests/exceptions.py | 126 + .../pip/_vendor/requests/help.py | 119 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 953 ++ .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 770 ++ .../pip/_vendor/requests/status_codes.py | 120 + .../pip/_vendor/requests/structures.py | 103 + .../pip/_vendor/requests/utils.py | 977 ++ .../pip/_vendor/retrying.py | 267 + .../pip-19.0.3-py3.8.egg/pip/_vendor/six.py | 952 ++ .../pip/_vendor/urllib3/__init__.py | 92 + .../pip/_vendor/urllib3/_collections.py | 329 + .../pip/_vendor/urllib3/connection.py | 391 + .../pip/_vendor/urllib3/connectionpool.py | 896 ++ .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 30 + .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 ++ .../contrib/_securetransport/low_level.py | 346 + .../pip/_vendor/urllib3/contrib/appengine.py | 289 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 + .../urllib3/contrib/securetransport.py | 804 ++ .../pip/_vendor/urllib3/contrib/socks.py | 192 + .../pip/_vendor/urllib3/exceptions.py | 246 + .../pip/_vendor/urllib3/fields.py | 178 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 5 + .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 + .../pip/_vendor/urllib3/packages/six.py | 868 ++ .../packages/ssl_match_hostname/__init__.py | 19 + .../ssl_match_hostname/_implementation.py | 156 + .../pip/_vendor/urllib3/poolmanager.py | 450 + .../pip/_vendor/urllib3/request.py | 150 + .../pip/_vendor/urllib3/response.py | 705 ++ .../pip/_vendor/urllib3/util/__init__.py | 54 + .../pip/_vendor/urllib3/util/connection.py | 134 + .../pip/_vendor/urllib3/util/queue.py | 21 + .../pip/_vendor/urllib3/util/request.py | 118 + .../pip/_vendor/urllib3/util/response.py | 87 + .../pip/_vendor/urllib3/util/retry.py | 411 + .../pip/_vendor/urllib3/util/ssl_.py | 381 + .../pip/_vendor/urllib3/util/timeout.py | 242 + .../pip/_vendor/urllib3/util/url.py | 230 + .../pip/_vendor/urllib3/util/wait.py | 150 + .../pip/_vendor/webencodings/__init__.py | 342 + .../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/setuptools-40.8.0-py3.8.egg | Bin 0 -> 571910 bytes .../venv/Lib/site-packages/setuptools.pth | 1 + .../data_structures/venv/Scripts/Activate.ps1 | 375 + .../data_structures/venv/Scripts/activate | 76 + .../data_structures/venv/Scripts/activate.bat | 33 + .../venv/Scripts/deactivate.bat | 21 + .../venv/Scripts/easy_install-3.8-script.py | 12 + .../venv/Scripts/easy_install-3.8.exe | Bin 0 -> 65536 bytes .../Scripts/easy_install-3.8.exe.manifest | 15 + .../venv/Scripts/easy_install-script.py | 12 + .../venv/Scripts/easy_install.exe | Bin 0 -> 65536 bytes .../venv/Scripts/easy_install.exe.manifest | 15 + .../venv/Scripts/pip-script.py | 12 + .../data_structures/venv/Scripts/pip.exe | Bin 0 -> 65536 bytes .../venv/Scripts/pip.exe.manifest | 15 + .../venv/Scripts/pip3-script.py | 12 + .../venv/Scripts/pip3.8-script.py | 12 + .../data_structures/venv/Scripts/pip3.8.exe | Bin 0 -> 65536 bytes .../venv/Scripts/pip3.8.exe.manifest | 15 + .../data_structures/venv/Scripts/pip3.exe | Bin 0 -> 65536 bytes .../venv/Scripts/pip3.exe.manifest | 15 + .../data_structures/venv/Scripts/python.exe | Bin 0 -> 416840 bytes .../data_structures/venv/Scripts/pythonw.exe | Bin 0 -> 415816 bytes .../k17pine/data_structures/venv/pyvenv.cfg | 3 + 348 files changed, 107011 insertions(+) create mode 100644 submissions/k17pine/data_structures/.idea/.gitignore create mode 100644 submissions/k17pine/data_structures/.idea/data_structures.iml create mode 100644 submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 submissions/k17pine/data_structures/.idea/misc.xml create mode 100644 submissions/k17pine/data_structures/.idea/modules.xml create mode 100644 submissions/k17pine/data_structures/.idea/vcs.xml create mode 100644 submissions/k17pine/data_structures/README.md create mode 100644 submissions/k17pine/data_structures/client.py create mode 100644 submissions/k17pine/data_structures/server.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools-40.8.0-py3.8.egg create mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth create mode 100644 submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 create mode 100644 submissions/k17pine/data_structures/venv/Scripts/activate create mode 100644 submissions/k17pine/data_structures/venv/Scripts/activate.bat create mode 100644 submissions/k17pine/data_structures/venv/Scripts/deactivate.bat create mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py create mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe create mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest create mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py create mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install.exe create mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip-script.py create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip.exe create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3-script.py create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.exe create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest create mode 100644 submissions/k17pine/data_structures/venv/Scripts/python.exe create mode 100644 submissions/k17pine/data_structures/venv/Scripts/pythonw.exe create mode 100644 submissions/k17pine/data_structures/venv/pyvenv.cfg diff --git a/submissions/k17pine/data_structures/.idea/.gitignore b/submissions/k17pine/data_structures/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/submissions/k17pine/data_structures/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/data_structures.iml b/submissions/k17pine/data_structures/.idea/data_structures.iml new file mode 100644 index 0000000..85c7612 --- /dev/null +++ b/submissions/k17pine/data_structures/.idea/data_structures.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml b/submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/misc.xml b/submissions/k17pine/data_structures/.idea/misc.xml new file mode 100644 index 0000000..69be26c --- /dev/null +++ b/submissions/k17pine/data_structures/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/modules.xml b/submissions/k17pine/data_structures/.idea/modules.xml new file mode 100644 index 0000000..eecf825 --- /dev/null +++ b/submissions/k17pine/data_structures/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/vcs.xml b/submissions/k17pine/data_structures/.idea/vcs.xml new file mode 100644 index 0000000..0f6c7cd --- /dev/null +++ b/submissions/k17pine/data_structures/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/submissions/k17pine/data_structures/README.md b/submissions/k17pine/data_structures/README.md new file mode 100644 index 0000000..8a20ac5 --- /dev/null +++ b/submissions/k17pine/data_structures/README.md @@ -0,0 +1,21 @@ +# Stack and linked list + +Here is client and server for exchanging information via web. + +## Getting Started + +Some commands, that you could use on the client side: +push arg - push something into stack +pop - pop last arg from stack +insert arg arg2* arg3* - insert element to the linked list. arg2 could be 'before' or 'after', and arg3 show point from this insertion +remove arg - remove one argument from list +show all - show all linked list +exit - exit from client +* - optional arguments + +## Acknowledgments + +* Hat tip to anyone whose code was used +* Inspiration +* etc + diff --git a/submissions/k17pine/data_structures/client.py b/submissions/k17pine/data_structures/client.py new file mode 100644 index 0000000..442b744 --- /dev/null +++ b/submissions/k17pine/data_structures/client.py @@ -0,0 +1,15 @@ +import socket + +HOST = '127.0.0.1' # The server's hostname or IP address +PORT = 65432 # The port used by the server +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +s.connect((HOST, PORT)) +while True: + #s.sendall(b'Hello, world') + mess = (input()) + if mess.split()[0] == 'exit': + exit() + s.sendall(bytes((mess), encoding='utf-8')) + data = s.recv(1023) + print('Received:', (data.decode("utf-8"))) + diff --git a/submissions/k17pine/data_structures/server.py b/submissions/k17pine/data_structures/server.py new file mode 100644 index 0000000..b0f2003 --- /dev/null +++ b/submissions/k17pine/data_structures/server.py @@ -0,0 +1,86 @@ +import socket +import time + + +def stack_push(arg): + stack.append(arg) + return f'{arg} pushed' + + +def stack_pop(): + if len(stack) == 0: + return 'Stack is NULL' + else: + return stack.pop() + + +def list_insert(arg): + try: + if arg[2] == 'before': + pos = arr.index(arg[3]) + arr.insert(pos, arg[1]) + return f'{arg[1]} inserted before {arg[3]}' + if arg[2] == 'after': + pos = arr.index(arg[3]) + arr.insert(pos+1, arg[1]) + return f'{arg[1]} inserted after {arg[3]}' + except IndexError: + arr.insert(len(arr), arg[1]) + return f'{arg[1]} inserted' + except ValueError: + return f'There is no {arg[3]} in the list' + + +def list_remove(arg): + try: + arr.remove(arg) + return f'{arg} removed' + except ValueError: + return f'How dare you? {arg} not in list' + + +def list_show(): + if len(arr) == 0: + return 'List is empty' + else: + ans = '' + for i in arr: + if ans == '': + ans = i + else: + ans = ans + ' - ' + i + return ans + + +def com(txt): + x = txt.split() + try: + if x[0] == 'push': + ans = stack_push(x[1]) + if x[0] == 'pop': + ans = stack_pop() + if x[0] == 'insert': + ans = list_insert(x) + if x[0] == 'remove': + ans = list_remove(x[1]) + if x[0] == 'show' and x[1] == 'all': + ans = list_show() + return ans + except IndexError: + return f'Look like you forgot some arguments, lol' + + +HOST = '127.0.0.1' # Standard loopback interface address (localhost) +PORT = 65432 # Port to listen on (non-privileged ports are > 1023) +s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +stack = [] +arr = [] + +s.bind((HOST, PORT)) +s.listen(2) # 2 connections +conn, addr = s.accept() # conn is client socket +print('Connected by', addr) +while True: + data = conn.recv(1023) + new_data = com(data.decode("utf-8")) + conn.sendall(bytes(new_data, encoding='utf-8')) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth b/submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth new file mode 100644 index 0000000..c5c7346 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth @@ -0,0 +1,2 @@ +./setuptools-40.8.0-py3.8.egg +./pip-19.0.3-py3.8.egg diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO new file mode 100644 index 0000000..0b410a2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO @@ -0,0 +1,73 @@ +Metadata-Version: 1.2 +Name: pip +Version: 19.0.3 +Summary: The PyPA recommended tool for installing Python packages. +Home-page: https://pip.pypa.io/ +Author: The pip developers +Author-email: pypa-dev@groups.google.com +License: MIT +Description: pip - The Python Package Installer + ================================== + + .. image:: https://img.shields.io/pypi/v/pip.svg + :target: https://pypi.org/project/pip/ + + .. image:: https://readthedocs.org/projects/pip/badge/?version=latest + :target: https://pip.pypa.io/en/latest + + pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. + + Please take a look at our documentation for how to install and use pip: + + * `Installation`_ + * `Usage`_ + * `Release notes`_ + + If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: + + * `Issue tracking`_ + * `Discourse channel`_ + * `User IRC`_ + + If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: + + * `GitHub page`_ + * `Dev mailing list`_ + * `Dev IRC`_ + + 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`_. + + .. _package installer: https://packaging.python.org/en/latest/current/ + .. _Python Package Index: https://pypi.org + .. _Installation: https://pip.pypa.io/en/stable/installing.html + .. _Usage: https://pip.pypa.io/en/stable/ + .. _Release notes: https://pip.pypa.io/en/stable/news.html + .. _GitHub page: https://github.com/pypa/pip + .. _Issue tracking: https://github.com/pypa/pip/issues + .. _Discourse channel: https://discuss.python.org/c/packaging + .. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev + .. _User IRC: https://webchat.freenode.net/?channels=%23pypa + .. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev + .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ + +Keywords: distutils easy_install egg setuptools wheel 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.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt new file mode 100644 index 0000000..eb4810d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt @@ -0,0 +1,391 @@ +AUTHORS.txt +LICENSE.txt +MANIFEST.in +NEWS.rst +README.rst +pyproject.toml +setup.cfg +setup.py +docs/pip_sphinxext.py +docs/html/conf.py +docs/html/cookbook.rst +docs/html/index.rst +docs/html/installing.rst +docs/html/logic.rst +docs/html/news.rst +docs/html/quickstart.rst +docs/html/usage.rst +docs/html/user_guide.rst +docs/html/development/configuration.rst +docs/html/development/contributing.rst +docs/html/development/getting-started.rst +docs/html/development/index.rst +docs/html/development/release-process.rst +docs/html/development/vendoring-policy.rst +docs/html/reference/index.rst +docs/html/reference/pip.rst +docs/html/reference/pip_check.rst +docs/html/reference/pip_config.rst +docs/html/reference/pip_download.rst +docs/html/reference/pip_freeze.rst +docs/html/reference/pip_hash.rst +docs/html/reference/pip_install.rst +docs/html/reference/pip_list.rst +docs/html/reference/pip_search.rst +docs/html/reference/pip_show.rst +docs/html/reference/pip_uninstall.rst +docs/html/reference/pip_wheel.rst +docs/man/index.rst +docs/man/commands/check.rst +docs/man/commands/config.rst +docs/man/commands/download.rst +docs/man/commands/freeze.rst +docs/man/commands/hash.rst +docs/man/commands/help.rst +docs/man/commands/install.rst +docs/man/commands/list.rst +docs/man/commands/search.rst +docs/man/commands/show.rst +docs/man/commands/uninstall.rst +docs/man/commands/wheel.rst +src/pip/__init__.py +src/pip/__main__.py +src/pip.egg-info/PKG-INFO +src/pip.egg-info/SOURCES.txt +src/pip.egg-info/dependency_links.txt +src/pip.egg-info/entry_points.txt +src/pip.egg-info/not-zip-safe +src/pip.egg-info/top_level.txt +src/pip/_internal/__init__.py +src/pip/_internal/build_env.py +src/pip/_internal/cache.py +src/pip/_internal/configuration.py +src/pip/_internal/download.py +src/pip/_internal/exceptions.py +src/pip/_internal/index.py +src/pip/_internal/locations.py +src/pip/_internal/pep425tags.py +src/pip/_internal/pyproject.py +src/pip/_internal/resolve.py +src/pip/_internal/wheel.py +src/pip/_internal/cli/__init__.py +src/pip/_internal/cli/autocompletion.py +src/pip/_internal/cli/base_command.py +src/pip/_internal/cli/cmdoptions.py +src/pip/_internal/cli/main_parser.py +src/pip/_internal/cli/parser.py +src/pip/_internal/cli/status_codes.py +src/pip/_internal/commands/__init__.py +src/pip/_internal/commands/check.py +src/pip/_internal/commands/completion.py +src/pip/_internal/commands/configuration.py +src/pip/_internal/commands/download.py +src/pip/_internal/commands/freeze.py +src/pip/_internal/commands/hash.py +src/pip/_internal/commands/help.py +src/pip/_internal/commands/install.py +src/pip/_internal/commands/list.py +src/pip/_internal/commands/search.py +src/pip/_internal/commands/show.py +src/pip/_internal/commands/uninstall.py +src/pip/_internal/commands/wheel.py +src/pip/_internal/models/__init__.py +src/pip/_internal/models/candidate.py +src/pip/_internal/models/format_control.py +src/pip/_internal/models/index.py +src/pip/_internal/models/link.py +src/pip/_internal/operations/__init__.py +src/pip/_internal/operations/check.py +src/pip/_internal/operations/freeze.py +src/pip/_internal/operations/prepare.py +src/pip/_internal/req/__init__.py +src/pip/_internal/req/constructors.py +src/pip/_internal/req/req_file.py +src/pip/_internal/req/req_install.py +src/pip/_internal/req/req_set.py +src/pip/_internal/req/req_tracker.py +src/pip/_internal/req/req_uninstall.py +src/pip/_internal/utils/__init__.py +src/pip/_internal/utils/appdirs.py +src/pip/_internal/utils/compat.py +src/pip/_internal/utils/deprecation.py +src/pip/_internal/utils/encoding.py +src/pip/_internal/utils/filesystem.py +src/pip/_internal/utils/glibc.py +src/pip/_internal/utils/hashes.py +src/pip/_internal/utils/logging.py +src/pip/_internal/utils/misc.py +src/pip/_internal/utils/models.py +src/pip/_internal/utils/outdated.py +src/pip/_internal/utils/packaging.py +src/pip/_internal/utils/setuptools_build.py +src/pip/_internal/utils/temp_dir.py +src/pip/_internal/utils/typing.py +src/pip/_internal/utils/ui.py +src/pip/_internal/vcs/__init__.py +src/pip/_internal/vcs/bazaar.py +src/pip/_internal/vcs/git.py +src/pip/_internal/vcs/mercurial.py +src/pip/_internal/vcs/subversion.py +src/pip/_vendor/README.rst +src/pip/_vendor/__init__.py +src/pip/_vendor/appdirs.LICENSE.txt +src/pip/_vendor/appdirs.py +src/pip/_vendor/distro.LICENSE +src/pip/_vendor/distro.py +src/pip/_vendor/ipaddress.LICENSE +src/pip/_vendor/ipaddress.py +src/pip/_vendor/pyparsing.LICENSE +src/pip/_vendor/pyparsing.py +src/pip/_vendor/retrying.LICENSE +src/pip/_vendor/retrying.py +src/pip/_vendor/six.LICENSE +src/pip/_vendor/six.py +src/pip/_vendor/vendor.txt +src/pip/_vendor/cachecontrol/LICENSE.txt +src/pip/_vendor/cachecontrol/__init__.py +src/pip/_vendor/cachecontrol/_cmd.py +src/pip/_vendor/cachecontrol/adapter.py +src/pip/_vendor/cachecontrol/cache.py +src/pip/_vendor/cachecontrol/compat.py +src/pip/_vendor/cachecontrol/controller.py +src/pip/_vendor/cachecontrol/filewrapper.py +src/pip/_vendor/cachecontrol/heuristics.py +src/pip/_vendor/cachecontrol/serialize.py +src/pip/_vendor/cachecontrol/wrapper.py +src/pip/_vendor/cachecontrol/caches/__init__.py +src/pip/_vendor/cachecontrol/caches/file_cache.py +src/pip/_vendor/cachecontrol/caches/redis_cache.py +src/pip/_vendor/certifi/LICENSE +src/pip/_vendor/certifi/__init__.py +src/pip/_vendor/certifi/__main__.py +src/pip/_vendor/certifi/cacert.pem +src/pip/_vendor/certifi/core.py +src/pip/_vendor/chardet/LICENSE +src/pip/_vendor/chardet/__init__.py +src/pip/_vendor/chardet/big5freq.py +src/pip/_vendor/chardet/big5prober.py +src/pip/_vendor/chardet/chardistribution.py +src/pip/_vendor/chardet/charsetgroupprober.py +src/pip/_vendor/chardet/charsetprober.py +src/pip/_vendor/chardet/codingstatemachine.py +src/pip/_vendor/chardet/compat.py +src/pip/_vendor/chardet/cp949prober.py +src/pip/_vendor/chardet/enums.py +src/pip/_vendor/chardet/escprober.py +src/pip/_vendor/chardet/escsm.py +src/pip/_vendor/chardet/eucjpprober.py +src/pip/_vendor/chardet/euckrfreq.py +src/pip/_vendor/chardet/euckrprober.py +src/pip/_vendor/chardet/euctwfreq.py +src/pip/_vendor/chardet/euctwprober.py +src/pip/_vendor/chardet/gb2312freq.py +src/pip/_vendor/chardet/gb2312prober.py +src/pip/_vendor/chardet/hebrewprober.py +src/pip/_vendor/chardet/jisfreq.py +src/pip/_vendor/chardet/jpcntx.py +src/pip/_vendor/chardet/langbulgarianmodel.py +src/pip/_vendor/chardet/langcyrillicmodel.py +src/pip/_vendor/chardet/langgreekmodel.py +src/pip/_vendor/chardet/langhebrewmodel.py +src/pip/_vendor/chardet/langhungarianmodel.py +src/pip/_vendor/chardet/langthaimodel.py +src/pip/_vendor/chardet/langturkishmodel.py +src/pip/_vendor/chardet/latin1prober.py +src/pip/_vendor/chardet/mbcharsetprober.py +src/pip/_vendor/chardet/mbcsgroupprober.py +src/pip/_vendor/chardet/mbcssm.py +src/pip/_vendor/chardet/sbcharsetprober.py +src/pip/_vendor/chardet/sbcsgroupprober.py +src/pip/_vendor/chardet/sjisprober.py +src/pip/_vendor/chardet/universaldetector.py +src/pip/_vendor/chardet/utf8prober.py +src/pip/_vendor/chardet/version.py +src/pip/_vendor/chardet/cli/__init__.py +src/pip/_vendor/chardet/cli/chardetect.py +src/pip/_vendor/colorama/LICENSE.txt +src/pip/_vendor/colorama/__init__.py +src/pip/_vendor/colorama/ansi.py +src/pip/_vendor/colorama/ansitowin32.py +src/pip/_vendor/colorama/initialise.py +src/pip/_vendor/colorama/win32.py +src/pip/_vendor/colorama/winterm.py +src/pip/_vendor/distlib/LICENSE.txt +src/pip/_vendor/distlib/__init__.py +src/pip/_vendor/distlib/compat.py +src/pip/_vendor/distlib/database.py +src/pip/_vendor/distlib/index.py +src/pip/_vendor/distlib/locators.py +src/pip/_vendor/distlib/manifest.py +src/pip/_vendor/distlib/markers.py +src/pip/_vendor/distlib/metadata.py +src/pip/_vendor/distlib/resources.py +src/pip/_vendor/distlib/scripts.py +src/pip/_vendor/distlib/t32.exe +src/pip/_vendor/distlib/t64.exe +src/pip/_vendor/distlib/util.py +src/pip/_vendor/distlib/version.py +src/pip/_vendor/distlib/w32.exe +src/pip/_vendor/distlib/w64.exe +src/pip/_vendor/distlib/wheel.py +src/pip/_vendor/distlib/_backport/__init__.py +src/pip/_vendor/distlib/_backport/misc.py +src/pip/_vendor/distlib/_backport/shutil.py +src/pip/_vendor/distlib/_backport/sysconfig.cfg +src/pip/_vendor/distlib/_backport/sysconfig.py +src/pip/_vendor/distlib/_backport/tarfile.py +src/pip/_vendor/html5lib/LICENSE +src/pip/_vendor/html5lib/__init__.py +src/pip/_vendor/html5lib/_ihatexml.py +src/pip/_vendor/html5lib/_inputstream.py +src/pip/_vendor/html5lib/_tokenizer.py +src/pip/_vendor/html5lib/_utils.py +src/pip/_vendor/html5lib/constants.py +src/pip/_vendor/html5lib/html5parser.py +src/pip/_vendor/html5lib/serializer.py +src/pip/_vendor/html5lib/_trie/__init__.py +src/pip/_vendor/html5lib/_trie/_base.py +src/pip/_vendor/html5lib/_trie/datrie.py +src/pip/_vendor/html5lib/_trie/py.py +src/pip/_vendor/html5lib/filters/__init__.py +src/pip/_vendor/html5lib/filters/alphabeticalattributes.py +src/pip/_vendor/html5lib/filters/base.py +src/pip/_vendor/html5lib/filters/inject_meta_charset.py +src/pip/_vendor/html5lib/filters/lint.py +src/pip/_vendor/html5lib/filters/optionaltags.py +src/pip/_vendor/html5lib/filters/sanitizer.py +src/pip/_vendor/html5lib/filters/whitespace.py +src/pip/_vendor/html5lib/treeadapters/__init__.py +src/pip/_vendor/html5lib/treeadapters/genshi.py +src/pip/_vendor/html5lib/treeadapters/sax.py +src/pip/_vendor/html5lib/treebuilders/__init__.py +src/pip/_vendor/html5lib/treebuilders/base.py +src/pip/_vendor/html5lib/treebuilders/dom.py +src/pip/_vendor/html5lib/treebuilders/etree.py +src/pip/_vendor/html5lib/treebuilders/etree_lxml.py +src/pip/_vendor/html5lib/treewalkers/__init__.py +src/pip/_vendor/html5lib/treewalkers/base.py +src/pip/_vendor/html5lib/treewalkers/dom.py +src/pip/_vendor/html5lib/treewalkers/etree.py +src/pip/_vendor/html5lib/treewalkers/etree_lxml.py +src/pip/_vendor/html5lib/treewalkers/genshi.py +src/pip/_vendor/idna/LICENSE.rst +src/pip/_vendor/idna/__init__.py +src/pip/_vendor/idna/codec.py +src/pip/_vendor/idna/compat.py +src/pip/_vendor/idna/core.py +src/pip/_vendor/idna/idnadata.py +src/pip/_vendor/idna/intranges.py +src/pip/_vendor/idna/package_data.py +src/pip/_vendor/idna/uts46data.py +src/pip/_vendor/lockfile/LICENSE +src/pip/_vendor/lockfile/__init__.py +src/pip/_vendor/lockfile/linklockfile.py +src/pip/_vendor/lockfile/mkdirlockfile.py +src/pip/_vendor/lockfile/pidlockfile.py +src/pip/_vendor/lockfile/sqlitelockfile.py +src/pip/_vendor/lockfile/symlinklockfile.py +src/pip/_vendor/msgpack/COPYING +src/pip/_vendor/msgpack/__init__.py +src/pip/_vendor/msgpack/_version.py +src/pip/_vendor/msgpack/exceptions.py +src/pip/_vendor/msgpack/fallback.py +src/pip/_vendor/packaging/LICENSE +src/pip/_vendor/packaging/LICENSE.APACHE +src/pip/_vendor/packaging/LICENSE.BSD +src/pip/_vendor/packaging/__about__.py +src/pip/_vendor/packaging/__init__.py +src/pip/_vendor/packaging/_compat.py +src/pip/_vendor/packaging/_structures.py +src/pip/_vendor/packaging/markers.py +src/pip/_vendor/packaging/requirements.py +src/pip/_vendor/packaging/specifiers.py +src/pip/_vendor/packaging/utils.py +src/pip/_vendor/packaging/version.py +src/pip/_vendor/pep517/LICENSE +src/pip/_vendor/pep517/__init__.py +src/pip/_vendor/pep517/_in_process.py +src/pip/_vendor/pep517/build.py +src/pip/_vendor/pep517/check.py +src/pip/_vendor/pep517/colorlog.py +src/pip/_vendor/pep517/compat.py +src/pip/_vendor/pep517/envbuild.py +src/pip/_vendor/pep517/wrappers.py +src/pip/_vendor/pkg_resources/LICENSE +src/pip/_vendor/pkg_resources/__init__.py +src/pip/_vendor/pkg_resources/py31compat.py +src/pip/_vendor/progress/LICENSE +src/pip/_vendor/progress/__init__.py +src/pip/_vendor/progress/bar.py +src/pip/_vendor/progress/counter.py +src/pip/_vendor/progress/helpers.py +src/pip/_vendor/progress/spinner.py +src/pip/_vendor/pytoml/LICENSE +src/pip/_vendor/pytoml/__init__.py +src/pip/_vendor/pytoml/core.py +src/pip/_vendor/pytoml/parser.py +src/pip/_vendor/pytoml/test.py +src/pip/_vendor/pytoml/utils.py +src/pip/_vendor/pytoml/writer.py +src/pip/_vendor/requests/LICENSE +src/pip/_vendor/requests/__init__.py +src/pip/_vendor/requests/__version__.py +src/pip/_vendor/requests/_internal_utils.py +src/pip/_vendor/requests/adapters.py +src/pip/_vendor/requests/api.py +src/pip/_vendor/requests/auth.py +src/pip/_vendor/requests/certs.py +src/pip/_vendor/requests/compat.py +src/pip/_vendor/requests/cookies.py +src/pip/_vendor/requests/exceptions.py +src/pip/_vendor/requests/help.py +src/pip/_vendor/requests/hooks.py +src/pip/_vendor/requests/models.py +src/pip/_vendor/requests/packages.py +src/pip/_vendor/requests/sessions.py +src/pip/_vendor/requests/status_codes.py +src/pip/_vendor/requests/structures.py +src/pip/_vendor/requests/utils.py +src/pip/_vendor/urllib3/LICENSE.txt +src/pip/_vendor/urllib3/__init__.py +src/pip/_vendor/urllib3/_collections.py +src/pip/_vendor/urllib3/connection.py +src/pip/_vendor/urllib3/connectionpool.py +src/pip/_vendor/urllib3/exceptions.py +src/pip/_vendor/urllib3/fields.py +src/pip/_vendor/urllib3/filepost.py +src/pip/_vendor/urllib3/poolmanager.py +src/pip/_vendor/urllib3/request.py +src/pip/_vendor/urllib3/response.py +src/pip/_vendor/urllib3/contrib/__init__.py +src/pip/_vendor/urllib3/contrib/_appengine_environ.py +src/pip/_vendor/urllib3/contrib/appengine.py +src/pip/_vendor/urllib3/contrib/ntlmpool.py +src/pip/_vendor/urllib3/contrib/pyopenssl.py +src/pip/_vendor/urllib3/contrib/securetransport.py +src/pip/_vendor/urllib3/contrib/socks.py +src/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +src/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +src/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +src/pip/_vendor/urllib3/packages/__init__.py +src/pip/_vendor/urllib3/packages/six.py +src/pip/_vendor/urllib3/packages/backports/__init__.py +src/pip/_vendor/urllib3/packages/backports/makefile.py +src/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +src/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +src/pip/_vendor/urllib3/util/__init__.py +src/pip/_vendor/urllib3/util/connection.py +src/pip/_vendor/urllib3/util/queue.py +src/pip/_vendor/urllib3/util/request.py +src/pip/_vendor/urllib3/util/response.py +src/pip/_vendor/urllib3/util/retry.py +src/pip/_vendor/urllib3/util/ssl_.py +src/pip/_vendor/urllib3/util/timeout.py +src/pip/_vendor/urllib3/util/url.py +src/pip/_vendor/urllib3/util/wait.py +src/pip/_vendor/webencodings/LICENSE +src/pip/_vendor/webencodings/__init__.py +src/pip/_vendor/webencodings/labels.py +src/pip/_vendor/webencodings/mklabels.py +src/pip/_vendor/webencodings/tests.py +src/pip/_vendor/webencodings/x_user_defined.py \ No newline at end of file diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt new file mode 100644 index 0000000..6d3bbc1 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt @@ -0,0 +1,5 @@ +[console_scripts] +pip = pip._internal:main +pip3 = pip._internal:main +pip3.8 = pip._internal:main + diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe @@ -0,0 +1 @@ + diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt @@ -0,0 +1 @@ +pip diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py new file mode 100644 index 0000000..f48c1ca --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py @@ -0,0 +1 @@ +__version__ = "19.0.3" diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py new file mode 100644 index 0000000..0c223f8 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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 # isort:skip # noqa + +if __name__ == '__main__': + sys.exit(_main()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py new file mode 100644 index 0000000..276124d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +from __future__ import absolute_import + +import locale +import logging +import os +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._internal.cli.autocompletion import autocomplete +from pip._internal.cli.main_parser import parse_command +from pip._internal.commands import commands_dict +from pip._internal.exceptions import PipError +from pip._internal.utils import deprecation +from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa +from pip._vendor.urllib3.exceptions import InsecureRequestWarning + +logger = logging.getLogger(__name__) + +# Hide the InsecureRequestWarning from urllib3 +warnings.filterwarnings("ignore", category=InsecureRequestWarning) + + +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 = parse_command(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=("--isolated" in cmd_args)) + return command.main(cmd_args) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py new file mode 100644 index 0000000..d744cc7 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py @@ -0,0 +1,215 @@ +"""Build Environment used for isolation during sdist building +""" + +import logging +import os +import sys +import textwrap +from collections import OrderedDict +from distutils.sysconfig import get_python_lib +from sysconfig import get_paths + +from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet + +from pip import __file__ as pip_location +from pip._internal.utils.misc import call_subprocess +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 Tuple, Set, Iterable, Optional, List # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + +logger = logging.getLogger(__name__) + + +class _Prefix: + + def __init__(self, path): + # type: (str) -> None + self.path = path + self.setup = False + self.bin_dir = get_paths( + 'nt' if os.name == 'nt' else 'posix_prefix', + vars={'base': path, 'platbase': path} + )['scripts'] + # Note: prefer distutils' sysconfig to get the + # library paths so PyPy is correctly supported. + purelib = get_python_lib(plat_specific=False, prefix=path) + platlib = get_python_lib(plat_specific=True, prefix=path) + if purelib == platlib: + self.lib_dirs = [purelib] + else: + self.lib_dirs = [purelib, platlib] + + +class BuildEnvironment(object): + """Creates and manages an isolated environment to install build deps + """ + + def __init__(self): + # type: () -> None + self._temp_dir = TempDirectory(kind="build-env") + self._temp_dir.create() + + self._prefixes = OrderedDict(( + (name, _Prefix(os.path.join(self._temp_dir.path, name))) + for name in ('normal', 'overlay') + )) + + self._bin_dirs = [] # type: List[str] + self._lib_dirs = [] # type: List[str] + for prefix in reversed(list(self._prefixes.values())): + self._bin_dirs.append(prefix.bin_dir) + self._lib_dirs.extend(prefix.lib_dirs) + + # Customize site to: + # - ensure .pth files are honored + # - prevent access to system site packages + system_sites = { + os.path.normcase(site) for site in ( + get_python_lib(plat_specific=False), + get_python_lib(plat_specific=True), + ) + } + self._site_dir = os.path.join(self._temp_dir.path, 'site') + if not os.path.exists(self._site_dir): + os.mkdir(self._site_dir) + with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: + fp.write(textwrap.dedent( + ''' + import os, site, sys + + # First, drop system-sites related paths. + original_sys_path = sys.path[:] + known_paths = set() + for path in {system_sites!r}: + site.addsitedir(path, known_paths=known_paths) + system_paths = set( + os.path.normcase(path) + for path in sys.path[len(original_sys_path):] + ) + original_sys_path = [ + path for path in original_sys_path + if os.path.normcase(path) not in system_paths + ] + sys.path = original_sys_path + + # Second, add lib directories. + # ensuring .pth file are processed. + for path in {lib_dirs!r}: + assert not path in sys.path + site.addsitedir(path) + ''' + ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) + + def __enter__(self): + self._save_env = { + name: os.environ.get(name, None) + for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') + } + + path = self._bin_dirs[:] + old_path = self._save_env['PATH'] + if old_path: + path.extend(old_path.split(os.pathsep)) + + pythonpath = [self._site_dir] + + os.environ.update({ + 'PATH': os.pathsep.join(path), + 'PYTHONNOUSERSITE': '1', + 'PYTHONPATH': os.pathsep.join(pythonpath), + }) + + def __exit__(self, exc_type, exc_val, exc_tb): + for varname, old_value in self._save_env.items(): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + def cleanup(self): + # type: () -> None + self._temp_dir.cleanup() + + def check_requirements(self, reqs): + # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] + """Return 2 sets: + - conflicting requirements: set of (installed, wanted) reqs tuples + - missing requirements: set of reqs + """ + missing = set() + conflicting = set() + if reqs: + ws = WorkingSet(self._lib_dirs) + for req in reqs: + try: + if ws.find(Requirement.parse(req)) is None: + missing.add(req) + except VersionConflict as e: + conflicting.add((str(e.args[0].as_requirement()), + str(e.args[1]))) + return conflicting, missing + + def install_requirements( + self, + finder, # type: PackageFinder + requirements, # type: Iterable[str] + prefix_as_string, # type: str + message # type: Optional[str] + ): + # type: (...) -> None + prefix = self._prefixes[prefix_as_string] + assert not prefix.setup + prefix.setup = True + if not requirements: + return + args = [ + sys.executable, os.path.dirname(pip_location), 'install', + '--ignore-installed', '--no-user', '--prefix', prefix.path, + '--no-warn-script-location', + ] # type: List[str] + if logger.getEffectiveLevel() <= logging.DEBUG: + args.append('-v') + for format_control in ('no_binary', 'only_binary'): + formats = getattr(finder.format_control, format_control) + args.extend(('--' + format_control.replace('_', '-'), + ','.join(sorted(formats or {':none:'})))) + if finder.index_urls: + args.extend(['-i', finder.index_urls[0]]) + for extra_index in finder.index_urls[1:]: + args.extend(['--extra-index-url', extra_index]) + else: + args.append('--no-index') + for link in finder.find_links: + args.extend(['--find-links', link]) + for _, host, _ in finder.secure_origins: + args.extend(['--trusted-host', host]) + if finder.allow_all_prereleases: + args.append('--pre') + args.append('--') + args.extend(requirements) + with open_spinner(message) as spinner: + call_subprocess(args, show_stdout=False, spinner=spinner) + + +class NoOpBuildEnvironment(BuildEnvironment): + """A no-op drop-in replacement for BuildEnvironment + """ + + def __init__(self): + pass + + def __enter__(self): + pass + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + def cleanup(self): + pass + + def install_requirements(self, finder, requirements, prefix, message): + raise NotImplementedError() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py new file mode 100644 index 0000000..eb295c4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py @@ -0,0 +1,224 @@ +"""Cache Management +""" + +import errno +import hashlib +import logging +import os + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.download import path_to_url +from pip._internal.models.link import Link +from pip._internal.utils.compat import expanduser +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import InvalidWheelFilename, Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, List, Any # noqa: F401 + from pip._internal.index import FormatControl # noqa: F401 + +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: An object of FormatControl class 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): + # type: (str, FormatControl, Set[str]) -> None + 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): + # type: (Link) -> List[str] + """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): + # type: (Link, Optional[str]) -> List[Any] + 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 = self.format_control.get_allowed_formats( + 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): + # type: (Link) -> str + """Return a directory to store cached items in for link. + """ + raise NotImplementedError() + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + """Returns a link to a cached item if it exists, otherwise returns the + passed link. + """ + raise NotImplementedError() + + def _link_for_candidate(self, link, candidate): + # type: (Link, str) -> Link + root = self.get_path_for_link(link) + path = os.path.join(root, candidate) + + return Link(path_to_url(path)) + + def cleanup(self): + # type: () -> None + pass + + +class SimpleWheelCache(Cache): + """A cache of wheels for future installs. + """ + + def __init__(self, cache_dir, format_control): + # type: (str, FormatControl) -> None + super(SimpleWheelCache, self).__init__( + cache_dir, format_control, {"binary"} + ) + + def get_path_for_link(self, link): + # type: (Link) -> str + """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): + # type: (Link, Optional[str]) -> Link + 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): + # type: (FormatControl) -> None + 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): + # type: () -> None + 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): + # type: (str, FormatControl) -> None + 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): + # type: (Link) -> str + return self._wheel_cache.get_path_for_link(link) + + def get_ephem_path_for_link(self, link): + # type: (Link) -> str + return self._ephem_cache.get_path_for_link(link) + + def get(self, link, package_name): + # type: (Link, Optional[str]) -> Link + 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): + # type: () -> None + self._wheel_cache.cleanup() + self._ephem_cache.cleanup() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py new file mode 100644 index 0000000..e589bb9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py @@ -0,0 +1,4 @@ +"""Subpackage containing all of pip's command line interface related code +""" + +# This file intentionally does not import submodules diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py new file mode 100644 index 0000000..0a04199 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py @@ -0,0 +1,152 @@ +"""Logic that powers autocompletion installed by ``pip completion``. +""" + +import optparse +import os +import sys + +from pip._internal.cli.main_parser import create_main_parser +from pip._internal.commands import commands_dict, get_summaries +from pip._internal.utils.misc import get_installed_distributions + + +def autocomplete(): + """Entry Point for completion of main and subcommand options. + """ + # 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)] + # get completion type given cwords and available subcommand options + completion_type = get_path_completion_type( + cwords, cword, subcommand.parser.option_list_all, + ) + # get completion files and directories if ``completion_type`` is + # ````, ```` or ```` + if completion_type: + options = auto_complete_paths(current, completion_type) + options = ((opt, 0) for opt in options) + 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 + + 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) + if current.startswith('-'): + for opt in opts: + if opt.help != optparse.SUPPRESS_HELP: + subcommands += opt._long_opts + opt._short_opts + else: + # get completion type given cwords and all available options + completion_type = get_path_completion_type(cwords, cword, opts) + if completion_type: + subcommands = auto_complete_paths(current, completion_type) + + print(' '.join([x for x in subcommands if x.startswith(current)])) + sys.exit(1) + + +def get_path_completion_type(cwords, cword, opts): + """Get the type of path completion (``file``, ``dir``, ``path`` or None) + + :param cwords: same as the environmental variable ``COMP_WORDS`` + :param cword: same as the environmental variable ``COMP_CWORD`` + :param opts: The available options to check + :return: path completion type (``file``, ``dir``, ``path`` or None) + """ + if cword < 2 or not cwords[cword - 2].startswith('-'): + return + for opt in opts: + if opt.help == optparse.SUPPRESS_HELP: + continue + for o in str(opt).split('/'): + if cwords[cword - 2].split('=')[0] == o: + if not opt.metavar or any( + x in ('path', 'file', 'dir') + for x in opt.metavar.split('/')): + return opt.metavar + + +def auto_complete_paths(current, completion_type): + """If ``completion_type`` is ``file`` or ``path``, list all regular files + and directories starting with ``current``; otherwise only list directories + starting with ``current``. + + :param current: The word to be completed + :param completion_type: path completion type(`file`, `path` or `dir`)i + :return: A generator of regular files and/or directories + """ + directory, filename = os.path.split(current) + current_path = os.path.abspath(directory) + # Don't complete paths if they can't be accessed + if not os.access(current_path, os.R_OK): + return + filename = os.path.normcase(filename) + # list all files that start with ``filename`` + file_list = (x for x in os.listdir(current_path) + if os.path.normcase(x).startswith(filename)) + for f in file_list: + opt = os.path.join(current_path, f) + comp_file = os.path.normcase(os.path.join(directory, f)) + # complete regular files when there is not ```` after option + # complete directories when there is ````, ```` or + # ````after option + if completion_type != 'dir' and os.path.isfile(opt): + yield comp_file + elif os.path.isdir(opt): + yield os.path.join(comp_file, '') diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py new file mode 100644 index 0000000..3ceea49 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py @@ -0,0 +1,341 @@ +"""Base Command class, and related routines""" +from __future__ import absolute_import, print_function + +import logging +import logging.config +import optparse +import os +import platform +import sys +import traceback + +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.cli.status_codes import ( + ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, + VIRTUALENV_NOT_FOUND, +) +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.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import parse_requirements +from pip._internal.utils.deprecation import deprecated +from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging +from pip._internal.utils.misc import ( + get_prog, normalize_path, redact_password_from_url, +) +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, List, Tuple, Any # noqa: F401 + from optparse import Values # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.req.req_set import RequirementSet # noqa: F401 + +__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 + + def __init__(self, isolated=False): + # type: (bool) -> None + 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 run(self, options, args): + # type: (Values, List[Any]) -> Any + raise NotImplementedError + + def _build_session(self, options, retries=None, timeout=None): + # type: (Values, Optional[int], Optional[int]) -> PipSession + 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): + # type: (List[str]) -> Tuple + # factored out for testability + return self.parser.parse_args(args) + + def main(self, args): + # type: (List[str]) -> int + options, args = self.parse_args(args) + + # Set verbosity so that it can be used elsewhere. + self.verbosity = options.verbose - options.quiet + + level_number = setup_logging( + verbosity=self.verbosity, + no_color=options.no_color, + user_log_file=options.log, + ) + + if sys.version_info[:2] == (3, 4): + deprecated( + "Python 3.4 support has been deprecated. pip 19.1 will be the " + "last one supporting it. Please upgrade your Python as Python " + "3.4 won't be maintained after March 2019 (cf PEP 429).", + replacement=None, + gone_in='19.2', + ) + elif sys.version_info[:2] == (2, 7): + message = ( + "A future version of pip will drop support for Python 2.7." + ) + if platform.python_implementation() == "CPython": + message = ( + "Python 2.7 will reach the end of its life on January " + "1st, 2020. Please upgrade your Python as Python 2.7 " + "won't be maintained after that date. " + ) + message + deprecated(message, replacement=None, gone_in=None) + + # TODO: Try to get these passing down from the command? + # without resorting to os.environ to hold these. + # This also affects isolated builds and it should. + + 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) + + 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 BrokenStdoutLoggingError: + # Bypass our logger and write any remaining messages to stderr + # because stdout no longer works. + print('ERROR: Pipe to stdout was broken', file=sys.stderr) + if level_number <= logging.DEBUG: + traceback.print_exc(file=sys.stderr) + + return ERROR + except KeyboardInterrupt: + logger.critical('Operation cancelled by user') + logger.debug('Exception information:', exc_info=True) + + return ERROR + except BaseException: + logger.critical('Exception:', exc_info=True) + + return UNKNOWN_ERROR + finally: + allow_version_check = ( + # Does this command have the index_group options? + hasattr(options, "no_index") and + # Is this command allowed to perform this check? + not (options.disable_pip_version_check or options.no_index) + ) + # Check if we're using the latest version of pip available + if allow_version_check: + session = self._build_session( + options, + retries=0, + timeout=min(5, options.timeout) + ) + with session: + pip_version_check(session, options) + + # Shutdown the logging module + logging.shutdown() + + return SUCCESS + + +class RequirementCommand(Command): + + @staticmethod + def populate_requirement_set(requirement_set, # type: RequirementSet + args, # type: List[str] + options, # type: Values + finder, # type: PackageFinder + session, # type: PipSession + name, # type: str + wheel_cache # type: Optional[WheelCache] + ): + # type: (...) -> None + """ + 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 = install_req_from_line( + req, None, isolated=options.isolated_mode, + use_pep517=options.use_pep517, + 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 = install_req_from_editable( + req, + isolated=options.isolated_mode, + use_pep517=options.use_pep517, + 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, + use_pep517=options.use_pep517): + 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) + + def _build_package_finder( + self, + options, # type: Values + session, # type: PipSession + platform=None, # type: Optional[str] + python_versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None # type: Optional[str] + ): + # type: (...) -> PackageFinder + """ + 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(redact_password_from_url(url) for url in 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, + session=session, + platform=platform, + versions=python_versions, + abi=abi, + implementation=implementation, + prefer_binary=options.prefer_binary, + ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py new file mode 100644 index 0000000..5cf5ee9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py @@ -0,0 +1,809 @@ +""" +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 textwrap +import warnings +from distutils.util import strtobool +from functools import partial +from optparse import SUPPRESS_HELP, Option, OptionGroup + +from pip._internal.exceptions import CommandError +from pip._internal.locations import USER_CACHE_DIR, src_prefix +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index 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, Callable, Dict, List, Optional, Union # noqa: F401 + from optparse import OptionParser, Values # noqa: F401 + from pip._internal.cli.parser import ConfigOptionParser # noqa: F401 + + +def raise_option_error(parser, option, msg): + """ + Raise an option parsing error using parser.error(). + + Args: + parser: an OptionParser instance. + option: an Option instance. + msg: the error text. + """ + msg = '{} error: {}'.format(option, msg) + msg = textwrap.fill(' '.join(msg.split())) + parser.error(msg) + + +def make_option_group(group, parser): + # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup + """ + 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): + # type: (Values, Optional[Values]) -> 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 + control.disallow_binaries() + warnings.warn( + 'Disabling all use of wheels due to the use of --build-options ' + '/ --global-options / --install-options.', stacklevel=2, + ) + + +def check_dist_restriction(options, check_target=False): + # type: (Values, bool) -> None + """Function for determining if custom platform options are allowed. + + :param options: The OptionParser options. + :param check_target: Whether or not to check if --target is being used. + """ + dist_restriction_set = any([ + options.python_version, + options.platform, + options.abi, + options.implementation, + ]) + + binary_only = FormatControl(set(), {':all:'}) + sdist_dependencies_allowed = ( + options.format_control != binary_only and + not options.ignore_dependencies + ) + + # Installations or downloads using dist restrictions must not combine + # source distributions and dist-specific wheels, as they are not + # gauranteed to be locally compatible. + if dist_restriction_set and sdist_dependencies_allowed: + 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:)." + ) + + if check_target: + if dist_restriction_set and not options.target_dir: + raise CommandError( + "Can not use any platform or abi specific options unless " + "installing via '--target'" + ) + + +########### +# options # +########### + +help_ = partial( + Option, + '-h', '--help', + dest='help', + action='help', + help='Show help.', +) # type: Callable[..., Option] + +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." + ), +) # type: Callable[..., Option] + +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: Callable[..., Option] + +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.' +) # type: Callable[..., Option] + +no_color = partial( + Option, + '--no-color', + dest='no_color', + action='store_true', + default=False, + help="Suppress colored output", +) # type: Callable[..., Option] + +version = partial( + Option, + '-V', '--version', + dest='version', + action='store_true', + help='Show version and exit.', +) # type: Callable[..., Option] + +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: Callable[..., Option] + +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: Callable[..., Option] + +log = partial( + Option, + "--log", "--log-file", "--local-log", + dest="log", + metavar="path", + help="Path to a verbose appending log." +) # type: Callable[..., Option] + +no_input = partial( + Option, + # Don't ask for input + '--no-input', + dest='no_input', + action='store_true', + default=False, + help=SUPPRESS_HELP +) # type: Callable[..., Option] + +proxy = partial( + Option, + '--proxy', + dest='proxy', + type='str', + default='', + help="Specify a proxy in the form [user:passwd@]proxy.server:port." +) # type: Callable[..., Option] + +retries = partial( + Option, + '--retries', + dest='retries', + type='int', + default=5, + help="Maximum number of retries each connection should attempt " + "(default %default times).", +) # type: Callable[..., Option] + +timeout = partial( + Option, + '--timeout', '--default-timeout', + metavar='sec', + dest='timeout', + type='float', + default=15, + help='Set the socket timeout (default %default seconds).', +) # type: Callable[..., Option] + +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: Callable[..., Option] + + +def exists_action(): + # type: () -> Option + 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: Callable[..., Option] + +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: Callable[..., Option] + +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: Callable[..., Option] + + +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: Callable[..., Option] + + +def find_links(): + # type: () -> Option + 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(): + # type: () -> Option + 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.", + ) + + +def constraints(): + # type: () -> Option + 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(): + # type: () -> Option + 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(): + # type: () -> Option + 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: Callable[..., Option] + + +def _get_format_control(values, option): + # type: (Values, Option) -> Any + """Get a format_control object.""" + return getattr(values, option.dest) + + +def _handle_no_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.no_binary, existing.only_binary, + ) + + +def _handle_only_binary(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + existing = _get_format_control(parser.values, option) + FormatControl.handle_mutual_excludes( + value, existing.only_binary, existing.no_binary, + ) + + +def no_binary(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--no-binary", dest="format_control", action="callback", + callback=_handle_no_binary, type="str", + default=format_control, + 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(): + # type: () -> Option + format_control = FormatControl(set(), set()) + return Option( + "--only-binary", dest="format_control", action="callback", + callback=_handle_only_binary, type="str", + default=format_control, + 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.", + ) + + +platform = partial( + Option, + '--platform', + dest='platform', + metavar='platform', + default=None, + help=("Only use wheels compatible with . " + "Defaults to the platform of the running system."), +) # type: Callable[..., Option] + + +python_version = partial( + Option, + '--python-version', + dest='python_version', + metavar='python_version', + default=None, + help=("Only use 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."), +) # type: Callable[..., Option] + + +implementation = partial( + Option, + '--implementation', + dest='implementation', + metavar='implementation', + default=None, + help=("Only use 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."), +) # type: Callable[..., Option] + + +abi = partial( + Option, + '--abi', + dest='abi', + metavar='abi', + default=None, + help=("Only use 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."), +) # type: Callable[..., Option] + + +def prefer_binary(): + # type: () -> Option + return Option( + "--prefer-binary", + dest="prefer_binary", + action="store_true", + default=False, + help="Prefer older binary packages over newer source packages." + ) + + +cache_dir = partial( + Option, + "--cache-dir", + dest="cache_dir", + default=USER_CACHE_DIR, + metavar="dir", + help="Store the cache data in ." +) # type: Callable[..., Option] + + +def no_cache_dir_callback(option, opt, value, parser): + """ + Process a value provided for the --no-cache-dir option. + + This is an optparse.Option callback for the --no-cache-dir option. + """ + # The value argument will be None if --no-cache-dir is passed via the + # command-line, since the option doesn't accept arguments. However, + # the value can be non-None if the option is triggered e.g. by an + # environment variable, like PIP_NO_CACHE_DIR=true. + if value is not None: + # Then parse the string value to get argument error-checking. + try: + strtobool(value) + except ValueError as exc: + raise_option_error(parser, option=option, msg=str(exc)) + + # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() + # converted to 0 (like "false" or "no") caused cache_dir to be disabled + # rather than enabled (logic would say the latter). Thus, we disable + # the cache directory not just on values that parse to True, but (for + # backwards compatibility reasons) also on values that parse to False. + # In other words, always set it to False if the option is provided in + # some (valid) form. + parser.values.cache_dir = False + + +no_cache = partial( + Option, + "--no-cache-dir", + dest="cache_dir", + action="callback", + callback=no_cache_dir_callback, + help="Disable the cache.", +) # type: Callable[..., Option] + +no_deps = partial( + Option, + '--no-deps', '--no-dependencies', + dest='ignore_dependencies', + action='store_true', + default=False, + help="Don't install package dependencies.", +) # type: Callable[..., Option] + +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: Callable[..., Option] + +ignore_requires_python = partial( + Option, + '--ignore-requires-python', + dest='ignore_requires_python', + action='store_true', + help='Ignore the Requires-Python information.' +) # type: Callable[..., Option] + +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: Callable[..., Option] + + +def no_use_pep517_callback(option, opt, value, parser): + """ + Process a value provided for the --no-use-pep517 option. + + This is an optparse.Option callback for the no_use_pep517 option. + """ + # Since --no-use-pep517 doesn't accept arguments, the value argument + # will be None if --no-use-pep517 is passed via the command-line. + # However, the value can be non-None if the option is triggered e.g. + # by an environment variable, for example "PIP_NO_USE_PEP517=true". + if value is not None: + msg = """A value was passed for --no-use-pep517, + probably using either the PIP_NO_USE_PEP517 environment variable + or the "no-use-pep517" config file option. Use an appropriate value + of the PIP_USE_PEP517 environment variable or the "use-pep517" + config file option instead. + """ + raise_option_error(parser, option=option, msg=msg) + + # Otherwise, --no-use-pep517 was passed via the command-line. + parser.values.use_pep517 = False + + +use_pep517 = partial( + Option, + '--use-pep517', + dest='use_pep517', + action='store_true', + default=None, + help='Use PEP 517 for building source distributions ' + '(use --no-use-pep517 to force legacy behaviour).' +) # type: Any + +no_use_pep517 = partial( + Option, + '--no-use-pep517', + dest='use_pep517', + action='callback', + callback=no_use_pep517_callback, + default=None, + help=SUPPRESS_HELP +) # 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: Callable[..., Option] + +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: Callable[..., Option] + +no_clean = partial( + Option, + '--no-clean', + action='store_true', + default=False, + help="Don't clean up build directories." +) # type: Callable[..., Option] + +pre = partial( + Option, + '--pre', + action='store_true', + default=False, + help="Include pre-release and development versions. By default, " + "pip only finds stable versions.", +) # type: Callable[..., Option] + +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: Callable[..., Option] + + +# Deprecated, Remove later +always_unzip = partial( + Option, + '-Z', '--always-unzip', + dest='always_unzip', + action='store_true', + help=SUPPRESS_HELP, +) # type: Callable[..., Option] + + +def _merge_hash(option, opt_str, value, parser): + # type: (Option, str, str, OptionParser) -> None + """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 = {} # type: ignore + 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: Callable[..., Option] + + +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: Callable[..., Option] + + +########## +# 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, + ] +} # type: Dict[str, Any] + +index_group = { + 'name': 'Package Index Options', + 'options': [ + index_url, + extra_index_url, + no_index, + find_links, + ] +} # type: Dict[str, Any] diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py new file mode 100644 index 0000000..b17c749 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py @@ -0,0 +1,104 @@ +"""A single place for constructing and exposing the main parser +""" + +import os +import sys + +from pip import __version__ +from pip._internal.cli import cmdoptions +from pip._internal.cli.parser import ( + ConfigOptionParser, UpdatingDefaultsHelpFormatter, +) +from pip._internal.commands import ( + commands_dict, get_similar_commands, get_summaries, +) +from pip._internal.exceptions import CommandError +from pip._internal.utils.misc import get_prog +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, List # noqa: F401 + + +__all__ = ["create_main_parser", "parse_command"] + + +def create_main_parser(): + # type: () -> ConfigOptionParser + """Creates and returns the main parser for pip's CLI + """ + + 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.abspath(os.path.join( + os.path.dirname(__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) + + # so the help formatter knows + parser.main = True # type: ignore + + # 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 parse_command(args): + # type: (List[str]) -> Tuple[str, List[str]] + 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) # type: ignore + 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py new file mode 100644 index 0000000..e1eaac4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py @@ -0,0 +1,261 @@ +"""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.cli.status_codes import UNKNOWN_ERROR +from pip._internal.configuration import Configuration, ConfigurationError +from pip._internal.utils.compat import get_terminal_size + +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'): + try: + val = strtobool(val) + except ValueError: + error_msg = invalid_config_error_message( + option.action, key, val + ) + self.error(error_msg) + + 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(UNKNOWN_ERROR, str(err)) + + 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(UNKNOWN_ERROR, "%s\n" % msg) + + +def invalid_config_error_message(action, key, val): + """Returns a better error message when invalid configuration option + is provided.""" + if action in ('store_true', 'store_false'): + return ("{0} is not a valid value for {1} option, " + "please specify a boolean value like yes/no, " + "true/false or 1/0 instead.").format(val, key) + + return ("{0} is not a valid value for {1} option, " + "please specify a numerical value like 1/0 " + "instead.").format(val, key) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py new file mode 100644 index 0000000..275360a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py new file mode 100644 index 0000000..c7d1da3 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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 # noqa: F401 + from pip._internal.cli.base_command import Command # noqa: F401 + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py new file mode 100644 index 0000000..801cecc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py @@ -0,0 +1,41 @@ +import logging + +from pip._internal.cli.base_command import Command +from pip._internal.operations.check import ( + check_package_set, create_package_set_from_installed, +) + +logger = logging.getLogger(__name__) + + +class CheckCommand(Command): + """Verify installed packages have compatible dependencies.""" + name = 'check' + usage = """ + %prog [options]""" + summary = 'Verify installed packages have compatible dependencies.' + + def run(self, options, args): + package_set, parsing_probs = create_package_set_from_installed() + missing, conflicting = check_package_set(package_set) + + for project_name in missing: + version = package_set[project_name].version + for dependency in missing[project_name]: + logger.info( + "%s %s requires %s, which is not installed.", + project_name, version, dependency[0], + ) + + for project_name in conflicting: + version = package_set[project_name].version + for dep_name, dep_version, req in conflicting[project_name]: + logger.info( + "%s %s has requirement %s, but you have %s %s.", + project_name, version, req, dep_name, dep_version, + ) + + if missing or conflicting or parsing_probs: + return 1 + else: + logger.info("No broken requirements found.") diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py new file mode 100644 index 0000000..2fcdd39 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py @@ -0,0 +1,94 @@ +from __future__ import absolute_import + +import sys +import textwrap + +from pip._internal.cli.base_command import Command +from pip._internal.utils.misc import get_prog + +BASE_COMPLETION = """ +# pip %(shell)s completion start%(script)s# pip %(shell)s completion end +""" + +COMPLETION_SCRIPTS = { + 'bash': """ + _pip_completion() + { + COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ + COMP_CWORD=$COMP_CWORD \\ + PIP_AUTO_COMPLETE=1 $1 ) ) + } + complete -o default -F _pip_completion %(prog)s + """, + 'zsh': """ + function _pip_completion { + local words cword + read -Ac words + read -cn cword + reply=( $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$(( cword-1 )) \\ + PIP_AUTO_COMPLETE=1 $words[1] ) ) + } + compctl -K _pip_completion %(prog)s + """, + 'fish': """ + function __fish_complete_pip + set -lx COMP_WORDS (commandline -o) "" + set -lx COMP_CWORD ( \\ + math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ + ) + set -lx PIP_AUTO_COMPLETE 1 + string split \\ -- (eval $COMP_WORDS[1]) + end + complete -fa "(__fish_complete_pip)" -c %(prog)s + """, +} + + +class CompletionCommand(Command): + """A helper command to be used for command completion.""" + name = 'completion' + summary = 'A helper command used for command completion.' + ignore_require_venv = True + + def __init__(self, *args, **kw): + super(CompletionCommand, self).__init__(*args, **kw) + + cmd_opts = self.cmd_opts + + cmd_opts.add_option( + '--bash', '-b', + action='store_const', + const='bash', + dest='shell', + help='Emit completion code for bash') + cmd_opts.add_option( + '--zsh', '-z', + action='store_const', + const='zsh', + dest='shell', + help='Emit completion code for zsh') + cmd_opts.add_option( + '--fish', '-f', + action='store_const', + const='fish', + dest='shell', + help='Emit completion code for fish') + + self.parser.insert_option_group(0, cmd_opts) + + def run(self, options, args): + """Prints the completion code of the given shell""" + shells = COMPLETION_SCRIPTS.keys() + shell_options = ['--' + shell for shell in sorted(shells)] + if options.shell in shells: + script = textwrap.dedent( + COMPLETION_SCRIPTS.get(options.shell, '') % { + 'prog': get_prog(), + } + ) + print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) + else: + sys.stderr.write( + 'ERROR: You must pass %s\n' % ' or '.join(shell_options) + ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py new file mode 100644 index 0000000..826c08d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py @@ -0,0 +1,227 @@ +import logging +import os +import subprocess + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS +from pip._internal.configuration import Configuration, kinds +from pip._internal.exceptions import PipError +from pip._internal.locations import venv_config_file +from pip._internal.utils.misc import get_prog + +logger = logging.getLogger(__name__) + + +class ConfigurationCommand(Command): + """Manage local and global configuration. + + Subcommands: + + list: List the active configuration (or from the file specified) + edit: Edit the configuration file in an editor + get: Get the value associated with name + set: Set the name=value + unset: Unset the value associated with name + + If none of --user, --global and --venv are passed, a virtual + environment configuration file is used if one is active and the file + exists. Otherwise, all modifications happen on the to the user file by + default. + """ + + name = 'config' + usage = """ + %prog [] 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py new file mode 100644 index 0000000..a57e4bc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py @@ -0,0 +1,176 @@ +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +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.prefer_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(cmdoptions.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + 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(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + 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 + + cmdoptions.check_dist_restriction(options) + + 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 RequirementTracker() as req_tracker, 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, + req_tracker=req_tracker, + ) + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py new file mode 100644 index 0000000..dc9c53a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import + +import sys + +from pip._internal.cache import WheelCache +from pip._internal.cli.base_command import Command +from pip._internal.models.format_control import FormatControl +from pip._internal.operations.freeze import freeze +from pip._internal.utils.compat import stdlib_pkgs + +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 = 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py new file mode 100644 index 0000000..423440e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py @@ -0,0 +1,57 @@ +from __future__ import absolute_import + +import hashlib +import logging +import sys + +from pip._internal.cli.base_command import Command +from pip._internal.cli.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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py new file mode 100644 index 0000000..49a81cb --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py @@ -0,0 +1,37 @@ +from __future__ import absolute_import + +from pip._internal.cli.base_command import Command +from pip._internal.cli.status_codes import SUCCESS +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py new file mode 100644 index 0000000..1c244d2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py @@ -0,0 +1,566 @@ +from __future__ import absolute_import + +import errno +import logging +import operator +import os +import shutil +from optparse import SUPPRESS_HELP + +from pip._vendor import pkg_resources + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.cli.status_codes import ERROR +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.req.req_tracker import RequirementTracker +from pip._internal.resolve import Resolver +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ( + ensure_dir, get_installed_version, + protect_pip_from_modification_on_windows, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.wheel import WheelBuilder + +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(cmdoptions.platform()) + cmd_opts.add_option(cmdoptions.python_version()) + cmd_opts.add_option(cmdoptions.implementation()) + cmd_opts.add_option(cmdoptions.abi()) + + 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.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + + 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.prefer_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) + + cmdoptions.check_dist_restriction(options, check_target=True) + + if options.python_version: + python_versions = [options.python_version] + else: + python_versions = None + + 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=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)) + 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 RequirementTracker() as req_tracker, TempDirectory( + options.build_dir, delete=build_delete, kind="install" + ) as directory: + requirement_set = RequirementSet( + require_hashes=options.require_hashes, + check_supported_wheels=not options.target_dir, + ) + + 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, + req_tracker=req_tracker, + ) + + 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, + use_pep517=options.use_pep517 + ) + resolver.resolve(requirement_set) + + protect_pip_from_modification_on_windows( + modifying_pip=requirement_set.has_requirement("pip") + ) + + # Consider legacy and PEP517-using requirements separately + legacy_requirements = [] + pep517_requirements = [] + for req in requirement_set.requirements.values(): + if req.use_pep517: + pep517_requirements.append(req) + else: + legacy_requirements.append(req) + + # We don't build wheels for legacy requirements if we + # don't have wheel installed or we don't have a cache dir + try: + import wheel # noqa: F401 + build_legacy = bool(options.cache_dir) + except ImportError: + build_legacy = False + + wb = WheelBuilder( + finder, preparer, wheel_cache, + build_options=[], global_options=[], + ) + + # Always build PEP 517 requirements + build_failures = wb.build( + pep517_requirements, + session=session, autobuilding=True + ) + + if build_legacy: + # We don't care about failures building legacy + # requirements, as we'll fall through to a direct + # install for those. + wb.build( + legacy_requirements, + session=session, autobuilding=True + ) + + # If we're using PEP 517, we cannot do a direct install + # so we fail here. + if build_failures: + raise InstallationError( + "Could not build wheels for {} which use" + " PEP 517 and cannot be installed directly".format( + ", ".join(r.name for r in build_failures))) + + 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, + ) + + 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, + ) + working_set = pkg_resources.WorkingSet(lib_locations) + + reqs = sorted(installed, key=operator.attrgetter('name')) + items = [] + for req in reqs: + item = req.name + try: + installed_version = get_installed_version( + req.name, working_set=working_set + ) + 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): + try: + package_set, _dep_info = check_install_conflicts(to_install) + except Exception: + logger.error("Error checking for conflicts.", exc_info=True) + return + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py new file mode 100644 index 0000000..a640274 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py @@ -0,0 +1,301 @@ +from __future__ import absolute_import + +import json +import logging + +from pip._vendor import six +from pip._vendor.six.moves import zip_longest + +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import CommandError +from pip._internal.index import PackageFinder +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=('columns', 'freeze', 'json'), + help="Select the output format among: columns (default), freeze, " + "or json", + ) + + 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 = 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 _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, + session=session, + ) + + def run(self, options, args): + 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, + ) + + # get_not_required must be called firstly in order to find and + # filter out all dependencies correctly. Otherwise a package + # can't be identified as requirement because some parent packages + # could be filtered out before. + if options.not_required: + packages = self.get_not_required(packages, options) + + if options.outdated: + packages = self.get_outdated(packages, options) + elif options.uptodate: + packages = self.get_uptodate(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 = [] + + with self._build_session(options) as session: + finder = self._build_package_finder(options, index_urls, session) + + 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_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)) + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py new file mode 100644 index 0000000..c157a31 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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.cli.base_command import Command +from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS +from pip._internal.download import PipXmlrpcTransport +from pip._internal.exceptions import CommandError +from pip._internal.models.index import PyPI +from pip._internal.utils.compat import get_terminal_size +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py new file mode 100644 index 0000000..f92c9bc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py @@ -0,0 +1,168 @@ +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.cli.base_command import Command +from pip._internal.cli.status_codes import ERROR, SUCCESS + +logger = logging.getLogger(__name__) + + +class ShowCommand(Command): + """ + Show information about one or more installed packages. + + The output is in RFC-compliant mail header format. + """ + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py new file mode 100644 index 0000000..0cd6f54 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py @@ -0,0 +1,78 @@ +from __future__ import absolute_import + +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.cli.base_command import Command +from pip._internal.exceptions import InstallationError +from pip._internal.req import parse_requirements +from pip._internal.req.constructors import install_req_from_line +from pip._internal.utils.misc import protect_pip_from_modification_on_windows + + +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 = install_req_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) + ) + + protect_pip_from_modification_on_windows( + modifying_pip="pip" in reqs_to_uninstall + ) + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py new file mode 100644 index 0000000..cd72a3d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py @@ -0,0 +1,186 @@ +# -*- coding: utf-8 -*- +from __future__ import absolute_import + +import logging +import os + +from pip._internal.cache import WheelCache +from pip._internal.cli import cmdoptions +from pip._internal.cli.base_command import RequirementCommand +from pip._internal.exceptions import CommandError, PreviousBuildDirError +from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req import RequirementSet +from pip._internal.req.req_tracker import RequirementTracker +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(cmdoptions.prefer_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.use_pep517()) + cmd_opts.add_option(cmdoptions.no_use_pep517()) + 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 RequirementTracker() as req_tracker, 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, + req_tracker=req_tracker, + ) + + 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, + use_pep517=options.use_pep517 + ) + 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, + ) + build_failures = wb.build( + requirement_set.requirements.values(), session=session, + ) + if len(build_failures) != 0: + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py new file mode 100644 index 0000000..fe6df9b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py @@ -0,0 +1,387 @@ +"""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, ConfigurationFileCouldNotBeLoaded, +) +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 ( # noqa: F401 + 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: + # See https://github.com/pypa/pip/issues/4963 + raise ConfigurationFileCouldNotBeLoaded( + reason="contains invalid {} characters".format( + locale.getpreferredencoding(False) + ), + fname=fname, + ) + except configparser.Error as error: + # See https://github.com/pypa/pip/issues/4893 + raise ConfigurationFileCouldNotBeLoaded(error=error) + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py new file mode 100644 index 0000000..2bbe176 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py @@ -0,0 +1,971 @@ +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.urllib3.util import IS_PYOPENSSL + +import pip +from pip._internal.exceptions import HashMismatch, InstallationError +from pip._internal.locations import write_delete_marker_file +from pip._internal.models.index 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, + split_auth_from_netloc, splitext, unpack_file, +) +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 DownloadProgressProvider +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Dict, IO, Text, Union + ) + from pip._internal.models.link import Link # noqa: F401 + from pip._internal.utils.hashes import Hashes # noqa: F401 + from pip._internal.vcs import AuthInfo # noqa: F401 + +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): + # type: (bool) -> None + self.prompting = prompting + self.passwords = {} # type: Dict[str, AuthInfo] + + def __call__(self, req): + parsed = urllib_parse.urlparse(req.url) + + # Split the credentials from the netloc. + netloc, url_user_password = split_auth_from_netloc(parsed.netloc) + + # 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)) + + # Use the credentials embedded in the url if we have none stored + if username is None: + username, password = url_user_password + + # 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) + req.register_hook("response", self.warn_on_401) + + # Send our new request + new_resp = resp.connection.send(req, **kwargs) + new_resp.history.append(resp) + + return new_resp + + def warn_on_401(self, resp, **kwargs): + # warn user that they provided incorrect credentials + if resp.status_code == 401: + logger.warning('401 Error, Credentials not correct for %s', + resp.request.url) + + +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 # type: Optional[int] + + 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): + # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] + """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): + # type: (Union[str, Text]) -> bool + """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): + # type: (str) -> str + """ + 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): + # type: (Union[str, Text]) -> str + """ + 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): + # type: (str) -> bool + """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): + # type: (Link) -> bool + return bool(_get_used_vcs_backend(link)) + + +def is_file_url(link): + # type: (Link) -> bool + return link.url.lower().startswith('file:') + + +def is_dir_url(link): + # type: (Link) -> bool + """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, # type: Response + link, # type: Link + content_file, # type: IO + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> None + 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, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + 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, # type: Link + location, # type: str + download_dir=None, # type: Optional[str] + hashes=None # type: Optional[Hashes] +): + # type: (...) -> 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, # type: Optional[Link] + location, # type: Optional[str] + download_dir=None, # type: Optional[str] + only_download=False, # type: bool + session=None, # type: Optional[PipSession] + hashes=None, # type: Optional[Hashes] + progress_bar="on" # type: str +): + # type: (...) -> None + """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, # type: Link + session, # type: PipSession + temp_dir, # type: str + hashes, # type: Hashes + progress_bar # type: str +): + # type: (...) -> Tuple[str, str] + """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): + # type: (Link, str, Hashes) -> Optional[str] + """ 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py new file mode 100644 index 0000000..38ceeea --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py @@ -0,0 +1,274 @@ +"""Exceptions used throughout package""" +from __future__ import absolute_import + +from itertools import chain, groupby, repeat + +from pip._vendor.six import iteritems + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + + +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 # type: Optional[InstallRequirement] + 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.""" + + +class ConfigurationFileCouldNotBeLoaded(ConfigurationError): + """When there are errors while loading a configuration file + """ + + def __init__(self, reason="could not be loaded", fname=None, error=None): + super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) + self.reason = reason + self.fname = fname + self.error = error + + def __str__(self): + if self.fname is not None: + message_part = " in {}.".format(self.fname) + else: + assert self.error is not None + message_part = ".\n{}\n".format(self.error.message) + return "Configuration file {}{}".format(self.reason, message_part) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py new file mode 100644 index 0000000..9eda3a3 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py @@ -0,0 +1,990 @@ +"""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 +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 RetryError, 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.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.candidate import InstallationCandidate +from pip._internal.models.format_control import FormatControl +from pip._internal.models.index import PyPI +from pip._internal.models.link import Link +from pip._internal.pep425tags import get_supported +from pip._internal.utils.compat import ipaddress +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, + redact_password_from_url, +) +from pip._internal.utils.packaging import check_requires_python +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from logging import Logger # noqa: F401 + from typing import ( # noqa: F401 + Tuple, Optional, Any, List, Union, Callable, Set, Sequence, + Iterable, MutableMapping + ) + from pip._vendor.packaging.version import _BaseVersion # noqa: F401 + from pip._vendor.requests import Response # noqa: F401 + from pip._internal.req import InstallRequirement # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + SecureOrigin = Tuple[str, str, Optional[str]] + BuildTag = Tuple[Any, ...] # either emply tuple or Tuple[int, str] + CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] + +__all__ = ['FormatControl', '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", "*", "*"), +] # type: List[SecureOrigin] + + +logger = logging.getLogger(__name__) + + +def _match_vcs_scheme(url): + # type: (str) -> Optional[str] + """Look for VCS schemes in the URL. + + Returns the matched VCS scheme, or None if there's no match. + """ + from pip._internal.vcs import VcsSupport + for scheme in VcsSupport.schemes: + if url.lower().startswith(scheme) and url[len(scheme)] in '+:': + return scheme + return None + + +def _is_url_like_archive(url): + # type: (str) -> bool + """Return whether the URL looks like an archive. + """ + filename = Link(url).filename + for bad_ext in ARCHIVE_EXTENSIONS: + if filename.endswith(bad_ext): + return True + return False + + +class _NotHTML(Exception): + def __init__(self, content_type, request_desc): + # type: (str, str) -> None + super(_NotHTML, self).__init__(content_type, request_desc) + self.content_type = content_type + self.request_desc = request_desc + + +def _ensure_html_header(response): + # type: (Response) -> None + """Check the Content-Type header to ensure the response contains HTML. + + Raises `_NotHTML` if the content type is not text/html. + """ + content_type = response.headers.get("Content-Type", "") + if not content_type.lower().startswith("text/html"): + raise _NotHTML(content_type, response.request.method) + + +class _NotHTTP(Exception): + pass + + +def _ensure_html_response(url, session): + # type: (str, PipSession) -> None + """Send a HEAD request to the URL, and ensure the response contains HTML. + + Raises `_NotHTTP` if the URL is not available for a HEAD request, or + `_NotHTML` if the content type is not text/html. + """ + scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) + if scheme not in {'http', 'https'}: + raise _NotHTTP() + + resp = session.head(url, allow_redirects=True) + resp.raise_for_status() + + _ensure_html_header(resp) + + +def _get_html_response(url, session): + # type: (str, PipSession) -> Response + """Access an HTML page with GET, and return the response. + + This consists of three parts: + + 1. If the URL looks suspiciously like an archive, send a HEAD first to + check the Content-Type is HTML, to avoid downloading a large file. + Raise `_NotHTTP` if the content type cannot be determined, or + `_NotHTML` if it is not HTML. + 2. Actually perform the request. Raise HTTP exceptions on network failures. + 3. Check the Content-Type header to make sure we got HTML, and raise + `_NotHTML` otherwise. + """ + if _is_url_like_archive(url): + _ensure_html_response(url, session=session) + + logger.debug('Getting page %s', url) + + resp = session.get( + url, + headers={ + "Accept": "text/html", + # We don't want to blindly returned cached data for + # /simple/, because authors generally expecting that + # twine upload && pip install will function, but if + # they've done a pip install in the last ~10 minutes + # it won't. Thus by setting this to zero we will not + # blindly use any cached data, however the benefit of + # using max-age=0 instead of no-cache, is that we will + # still support conditional requests, so we will still + # minimize traffic sent in cases where the page hasn't + # changed at all, we will just always incur the round + # trip for the conditional GET now instead of only + # once per 10 minutes. + # For more information, please see pypa/pip#5670. + "Cache-Control": "max-age=0", + }, + ) + 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. + _ensure_html_header(resp) + + return resp + + +def _handle_get_page_fail( + link, # type: Link + reason, # type: Union[str, Exception] + meth=None # type: Optional[Callable[..., None]] +): + # type: (...) -> None + if meth is None: + meth = logger.debug + meth("Could not fetch URL %s: %s - skipping", link, reason) + + +def _get_html_page(link, session=None): + # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] + if session is None: + raise TypeError( + "_get_html_page() missing 1 required keyword argument: 'session'" + ) + + url = link.url.split('#', 1)[0] + + # Check for VCS schemes that do not support lookup as web pages. + vcs_scheme = _match_vcs_scheme(url) + if vcs_scheme: + logger.debug('Cannot look at %s URL %s', vcs_scheme, link) + return None + + # Tack index.html onto file:// URLs that point to directories + scheme, _, path, _, _, _ = 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) + + try: + resp = _get_html_response(url, session=session) + except _NotHTTP as exc: + logger.debug( + 'Skipping page %s because it looks like an archive, and cannot ' + 'be checked by HEAD.', link, + ) + except _NotHTML as exc: + logger.debug( + 'Skipping page %s because the %s request got Content-Type: %s', + link, exc.request_desc, exc.content_type, + ) + except requests.HTTPError as exc: + _handle_get_page_fail(link, exc) + except RetryError as exc: + _handle_get_page_fail(link, exc) + except SSLError as exc: + reason = "There was a problem confirming the ssl certificate: " + reason += str(exc) + _handle_get_page_fail(link, reason, meth=logger.info) + except requests.ConnectionError as exc: + _handle_get_page_fail(link, "connection error: %s" % exc) + except requests.Timeout: + _handle_get_page_fail(link, "timed out") + else: + return HTMLPage(resp.content, resp.url, resp.headers) + return None + + +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, # type: List[str] + index_urls, # type: List[str] + allow_all_prereleases=False, # type: bool + trusted_hosts=None, # type: Optional[Iterable[str]] + session=None, # type: Optional[PipSession] + format_control=None, # type: Optional[FormatControl] + platform=None, # type: Optional[str] + versions=None, # type: Optional[List[str]] + abi=None, # type: Optional[str] + implementation=None, # type: Optional[str] + prefer_binary=False # type: bool + ): + # type: (...) -> 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 = [] # type: List[str] + 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 + + # These are boring links that have already been logged somehow: + self.logged_links = set() # type: Set[Link] + + 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 []) + ] # type: List[SecureOrigin] + + # Do we want to allow _all_ pre-releases? + self.allow_all_prereleases = allow_all_prereleases + + # 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, + ) + + # Do we prefer old, but valid, binary dist over new source dist + self.prefer_binary = prefer_binary + + # 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): + # type: () -> str + lines = [] + if self.index_urls and self.index_urls != [PyPI.simple_url]: + lines.append( + "Looking in indexes: {}".format(", ".join( + redact_password_from_url(url) for url in self.index_urls)) + ) + if self.find_links: + lines.append( + "Looking in links: {}".format(", ".join(self.find_links)) + ) + return "\n".join(lines) + + @staticmethod + def _sort_locations(locations, expand_dir=False): + # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] + """ + 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) + else: + logger.warning( + "Path '{0}' is ignored: " + "it is a directory.".format(path), + ) + 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): + # type: (InstallationCandidate) -> CandidateSortingKey + """ + 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 + If prefer_binary was set, then all wheels are sorted above sources. + 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() # type: BuildTag + binary_preference = 0 + 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 + ) + if self.prefer_binary: + binary_preference = 1 + 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 (binary_preference, candidate.version, build_tag, pri) + + def _validate_secure_origin(self, logger, location): + # type: (Logger, Link) -> bool + # 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) + # setting secure_origin[1] to proper Union[bytes, str] + # creates problems in other places + else secure_origin[1].decode("utf8") # type: ignore + ) + 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): + # type: (str) -> List[str] + """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): + # type: (str) -> List[Optional[InstallationCandidate]] + """Find all available InstallationCandidate for project_name + + This checks index_urls and find_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, + ) + + file_locations = (Link(url) for url in itertools.chain( + index_file_loc, fl_file_loc, + )) + + # We trust every url that the user has given us whether it was given + # via --index-url or --find-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), + ) + 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 = self.format_control.get_allowed_formats(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.iter_links(), search) + ) + + 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 + + def find_requirement(self, req, upgrade): + # type: (InstallRequirement, bool) -> Optional[Link] + """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): + # type: (Iterable[Link], str) -> Iterable[HTMLPage] + """ + Yields (page, page_url) from the given locations, skipping + locations that have errors. + """ + seen = set() # type: Set[Link] + for location in locations: + if location in seen: + continue + seen.add(location) + + page = _get_html_page(location, session=self.session) + if page is None: + continue + + yield page + + _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') + + def _sort_links(self, links): + # type: (Iterable[Link]) -> List[Link] + """ + Returns elements of links in order, non-egg links first, egg links + second, while eliminating duplicates + """ + eggs, no_eggs = [], [] + seen = set() # type: Set[Link] + 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, # type: Iterable[Link] + search # type: Search + ): + # type: (...) -> List[Optional[InstallationCandidate]] + 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): + # type: (Link, str) -> None + 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): + # type: (Link, Search) -> Optional[InstallationCandidate] + """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 None + if ext not in SUPPORTED_EXTENSIONS: + self._log_skipped_link( + link, 'unsupported archive format: %s' % ext, + ) + return None + if "binary" not in search.formats and ext == WHEEL_EXTENSION: + self._log_skipped_link( + link, 'No binaries permitted for %s' % search.supplied, + ) + return None + if "macosx10" in link.path and ext == '.zip': + self._log_skipped_link(link, 'macosx10 one') + return None + if ext == WHEEL_EXTENSION: + try: + wheel = Wheel(link.filename) + except InvalidWheelFilename: + self._log_skipped_link(link, 'invalid wheel filename') + return None + if canonicalize_name(wheel.name) != search.canonical: + self._log_skipped_link( + link, 'wrong project name (not %s)' % search.supplied) + return None + + if not wheel.supported(self.valid_tags): + self._log_skipped_link( + link, 'it is not compatible with this Python') + return None + + 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_EXTENSION: + self._log_skipped_link( + link, 'No sources permitted for %s' % search.supplied, + ) + return None + + if not version: + version = _egg_info_matches(egg_info, search.canonical) + if not version: + self._log_skipped_link( + link, 'Missing project version for %s' % search.supplied) + return None + + 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 None + 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 None + logger.debug('Found link %s, version: %s', link, version) + + return InstallationCandidate(search.supplied, version, link) + + +def _find_name_version_sep(egg_info, canonical_name): + # type: (str, str) -> int + """Find the separator's index based on the package's canonical name. + + `egg_info` must be an egg info string for the given package, and + `canonical_name` must be the package's canonical name. + + This function is needed since the canonicalized name does not necessarily + have the same length as the egg info's name part. An example:: + + >>> egg_info = 'foo__bar-1.0' + >>> canonical_name = 'foo-bar' + >>> _find_name_version_sep(egg_info, canonical_name) + 8 + """ + # Project name and version must be separated by one single dash. Find all + # occurrences of dashes; if the string in front of it matches the canonical + # name, this is the one separating the name and version parts. + for i, c in enumerate(egg_info): + if c != "-": + continue + if canonicalize_name(egg_info[:i]) == canonical_name: + return i + raise ValueError("{} does not match {}".format(egg_info, canonical_name)) + + +def _egg_info_matches(egg_info, canonical_name): + # type: (str, str) -> Optional[str] + """Pull the version part out of a string. + + :param egg_info: The string to parse. E.g. foo-2.1 + :param canonical_name: The canonicalized name of the package this + belongs to. + """ + try: + version_start = _find_name_version_sep(egg_info, canonical_name) + 1 + except ValueError: + return None + version = egg_info[version_start:] + if not version: + return None + return version + + +def _determine_base_url(document, page_url): + """Determine the HTML document's base URL. + + This looks for a ```` tag in the HTML document. If present, its href + attribute denotes the base URL of anchor tags in the document. If there is + no such tag (or if it does not have a valid href attribute), the HTML + file's URL is used as the base URL. + + :param document: An HTML document representation. The current + implementation expects the result of ``html5lib.parse()``. + :param page_url: The URL of the HTML document. + """ + for base in document.findall(".//base"): + href = base.get("href") + if href is not None: + return href + return page_url + + +def _get_encoding_from_headers(headers): + """Determine if we have any encoding information in our headers. + """ + if headers and "Content-Type" in headers: + content_type, params = cgi.parse_header(headers["Content-Type"]) + if "charset" in params: + return params['charset'] + return None + + +_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) + + +def _clean_link(url): + # type: (str) -> str + """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 _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) + + +class HTMLPage(object): + """Represents one page, along with its URL""" + + def __init__(self, content, url, headers=None): + # type: (bytes, str, MutableMapping[str, str]) -> None + self.content = content + self.url = url + self.headers = headers + + def __str__(self): + return redact_password_from_url(self.url) + + def iter_links(self): + # type: () -> Iterable[Link] + """Yields all links in the page""" + document = html5lib.parse( + self.content, + transport_encoding=_get_encoding_from_headers(self.headers), + namespaceHTMLElements=False, + ) + base_url = _determine_base_url(document, self.url) + for anchor in document.findall(".//a"): + if anchor.get("href"): + href = anchor.get("href") + url = _clean_link(urllib_parse.urljoin(base_url, href)) + pyrequire = anchor.get('data-requires-python') + pyrequire = unescape(pyrequire) if pyrequire else None + yield Link(url, self.url, requires_python=pyrequire) + + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py new file mode 100644 index 0000000..c6e2a3e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py @@ -0,0 +1,211 @@ +"""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 # type: ignore + +from pip._internal.utils import appdirs +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Union, Dict, List, Optional # noqa: F401 + + +# 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): + # type: (str) -> None + """ + 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(): + # type: () -> bool + """ + 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(): + # type: () -> bool + """ + 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 + else: + return False + + +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") # type: Optional[str] + +# 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): + # type:(str, bool, str, str, bool, str) -> dict + """ + 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} # type: Dict[str, Union[str, List[str]]] + dist_args.update(extra_dist_args) + + d = Distribution(dist_args) + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + d.parse_config_files() + # NOTE: Ignoring type since mypy can't find attributes on 'Command' + i = d.get_command_obj('install', create=True) # type: Any + assert i is not None + # 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 + + # Ignoring, typeshed issue reported python/typeshed/issues/2567 + if 'install_lib' in d.get_option_dict('install'): # type: ignore + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py new file mode 100644 index 0000000..7855226 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py @@ -0,0 +1,2 @@ +"""A package that contains models that represent entities. +""" diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py new file mode 100644 index 0000000..4475458 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py @@ -0,0 +1,31 @@ +from pip._vendor.packaging.version import parse as parse_version + +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from pip._vendor.packaging.version import _BaseVersion # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + from typing import Any, Union # noqa: F401 + + +class InstallationCandidate(KeyBasedCompareMixin): + """Represents a potential "candidate" for installation. + """ + + def __init__(self, project, version, location): + # type: (Any, str, Link) -> None + self.project = project + self.version = parse_version(version) # type: _BaseVersion + self.location = location + + super(InstallationCandidate, self).__init__( + key=(self.project, self.version, self.location), + defining_class=InstallationCandidate + ) + + def __repr__(self): + # type: () -> str + return "".format( + self.project, self.version, self.location, + ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py new file mode 100644 index 0000000..971a391 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py @@ -0,0 +1,73 @@ +from pip._vendor.packaging.utils import canonicalize_name + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Set, FrozenSet # noqa: F401 + + +class FormatControl(object): + """Helper for managing formats from which a package can be installed. + """ + + def __init__(self, no_binary=None, only_binary=None): + # type: (Optional[Set], Optional[Set]) -> None + if no_binary is None: + no_binary = set() + if only_binary is None: + only_binary = set() + + self.no_binary = no_binary + self.only_binary = only_binary + + def __eq__(self, other): + return self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not self.__eq__(other) + + def __repr__(self): + return "{}({}, {})".format( + self.__class__.__name__, + self.no_binary, + self.only_binary + ) + + @staticmethod + def handle_mutual_excludes(value, target, other): + # type: (str, Optional[Set], Optional[Set]) -> None + new = value.split(',') + while ':all:' in new: + other.clear() + target.clear() + target.add(':all:') + del new[:new.index(':all:') + 1] + # Without a none, we want to discard everything as :all: covers it + if ':none:' not in new: + return + for name in new: + if name == ':none:': + target.clear() + continue + name = canonicalize_name(name) + other.discard(name) + target.add(name) + + def get_allowed_formats(self, canonical_name): + # type: (str) -> FrozenSet + result = {"binary", "source"} + if canonical_name in self.only_binary: + result.discard('source') + elif canonical_name in self.no_binary: + result.discard('binary') + elif ':all:' in self.only_binary: + result.discard('source') + elif ':all:' in self.no_binary: + result.discard('binary') + return frozenset(result) + + def disallow_binaries(self): + # type: () -> None + self.handle_mutual_excludes( + ':all:', self.no_binary, self.only_binary, + ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py new file mode 100644 index 0000000..ead1efb --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py @@ -0,0 +1,31 @@ +from pip._vendor.six.moves.urllib import parse as urllib_parse + + +class PackageIndex(object): + """Represents a Package Index and provides easier access to endpoints + """ + + def __init__(self, url, file_storage_domain): + # type: (str, str) -> None + super(PackageIndex, self).__init__() + self.url = url + self.netloc = urllib_parse.urlsplit(url).netloc + self.simple_url = self._url_for_path('simple') + self.pypi_url = self._url_for_path('pypi') + + # This is part of a temporary hack used to block installs of PyPI + # packages which depend on external urls only necessary until PyPI can + # block such packages themselves + self.file_storage_domain = file_storage_domain + + def _url_for_path(self, path): + # type: (str) -> str + return urllib_parse.urljoin(self.url, path) + + +PyPI = PackageIndex( + 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' +) +TestPyPI = PackageIndex( + 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' +) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py new file mode 100644 index 0000000..ad2f93e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py @@ -0,0 +1,163 @@ +import posixpath +import re + +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 ( + WHEEL_EXTENSION, redact_password_from_url, splitext, +) +from pip._internal.utils.models import KeyBasedCompareMixin +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple, Union, Text # noqa: F401 + from pip._internal.index import HTMLPage # noqa: F401 + + +class Link(KeyBasedCompareMixin): + """Represents a parsed link from a Package Index's simple URL + """ + + def __init__(self, url, comes_from=None, requires_python=None): + # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None + """ + 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 + + super(Link, self).__init__( + key=(self.url), + defining_class=Link + ) + + 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' % (redact_password_from_url(self.url), + self.comes_from, rp) + else: + return redact_password_from_url(str(self.url)) + + def __repr__(self): + return '' % self + + @property + def filename(self): + # type: () -> str + _, 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): + # type: () -> str + return urllib_parse.urlsplit(self.url)[0] + + @property + def netloc(self): + # type: () -> str + return urllib_parse.urlsplit(self.url)[1] + + @property + def path(self): + # type: () -> str + return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) + + def splitext(self): + # type: () -> Tuple[str, str] + return splitext(posixpath.basename(self.path.rstrip('/'))) + + @property + def ext(self): + # type: () -> str + return self.splitext()[1] + + @property + def url_without_fragment(self): + # type: () -> str + 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): + # type: () -> Optional[str] + 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): + # type: () -> Optional[str] + 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): + # type: () -> Optional[str] + match = self._hash_re.search(self.url) + if match: + return match.group(2) + return None + + @property + def hash_name(self): + # type: () -> Optional[str] + match = self._hash_re.search(self.url) + if match: + return match.group(1) + return None + + @property + def show_url(self): + # type: () -> Optional[str] + return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) + + @property + def is_wheel(self): + # type: () -> bool + return self.ext == WHEEL_EXTENSION + + @property + def is_artifact(self): + # type: () -> bool + """ + 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py new file mode 100644 index 0000000..0b56eda --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py @@ -0,0 +1,155 @@ +"""Validation of dependencies of packages +""" + +import logging +from collections import namedtuple + +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.operations.prepare import make_abstract_dist +from pip._internal.utils.misc import get_installed_distributions +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +logger = logging.getLogger(__name__) + +if MYPY_CHECK_RUNNING: + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from typing import ( # noqa: F401 + Any, Callable, Dict, Optional, Set, Tuple, List + ) + + # Shorthands + PackageSet = Dict[str, 'PackageDetails'] + Missing = Tuple[str, Any] + Conflicting = Tuple[str, str, Any] + + MissingDict = Dict[str, List[Missing]] + ConflictingDict = Dict[str, List[Conflicting]] + CheckResult = Tuple[MissingDict, ConflictingDict] + +PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) + + +def create_package_set_from_installed(**kwargs): + # type: (**Any) -> Tuple[PackageSet, bool] + """Converts a list of distributions into a PackageSet. + """ + # Default to using all packages installed on the system + if kwargs == {}: + kwargs = {"local_only": False, "skip": ()} + + package_set = {} + problems = False + for dist in get_installed_distributions(**kwargs): + name = canonicalize_name(dist.project_name) + try: + package_set[name] = PackageDetails(dist.version, dist.requires()) + except RequirementParseError as e: + # Don't crash on broken metadata + logging.warning("Error parsing requirements for %s: %s", name, e) + problems = True + return package_set, problems + + +def check_package_set(package_set, should_ignore=None): + # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult + """Check if a package set is consistent + + If should_ignore is passed, it should be a callable that takes a + package name and returns a boolean. + """ + if should_ignore is None: + def should_ignore(name): + return False + + 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] + + if should_ignore(package_name): + continue + + 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)) + + if missing_deps: + missing[package_name] = sorted(missing_deps, key=str) + if conflicting_deps: + conflicting[package_name] = sorted(conflicting_deps, key=str) + + 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 + package_set, _ = create_package_set_from_installed() + # Install packages + would_be_installed = _simulate_installation_of(to_install, package_set) + + # Only warn about directly-dependent packages; create a whitelist of them + whitelist = _create_whitelist(would_be_installed, package_set) + + return ( + package_set, + check_package_set( + package_set, should_ignore=lambda name: name not in whitelist + ) + ) + + +def _simulate_installation_of(to_install, package_set): + # type: (List[InstallRequirement], PackageSet) -> Set[str] + """Computes the version of packages after installing to_install. + """ + + # Keep track of packages that were installed + installed = set() + + # Modify it as installing requirement_set would (assuming no errors) + for inst_req in to_install: + dist = make_abstract_dist(inst_req).dist() + name = canonicalize_name(dist.key) + package_set[name] = PackageDetails(dist.version, dist.requires()) + + installed.add(name) + + return installed + + +def _create_whitelist(would_be_installed, package_set): + # type: (Set[str], PackageSet) -> Set[str] + packages_affected = set(would_be_installed) + + for package_name in package_set: + if package_name in packages_affected: + continue + + for req in package_set[package_name].requires: + if canonicalize_name(req.name) in packages_affected: + packages_affected.add(package_name) + break + + return packages_affected diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py new file mode 100644 index 0000000..388bb73 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py @@ -0,0 +1,247 @@ +from __future__ import absolute_import + +import collections +import logging +import os +import re + +from pip._vendor import six +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.pkg_resources import RequirementParseError + +from pip._internal.exceptions import BadCommand, InstallationError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.req.req_file import COMMENT_RE +from pip._internal.utils.misc import ( + dist_is_editable, get_installed_distributions, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union + ) + from pip._internal.cache import WheelCache # noqa: F401 + from pip._vendor.pkg_resources import ( # noqa: F401 + Distribution, Requirement + ) + + RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] + + +logger = logging.getLogger(__name__) + + +def freeze( + requirement=None, # type: Optional[List[str]] + find_links=None, # type: Optional[List[str]] + local_only=None, # type: Optional[bool] + user_only=None, # type: Optional[bool] + skip_regex=None, # type: Optional[str] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + exclude_editable=False, # type: bool + skip=() # type: Container[str] +): + # type: (...) -> Iterator[str] + find_links = find_links or [] + skip_match = None + + if skip_regex: + skip_match = re.compile(skip_regex).search + + for link in find_links: + yield '-f %s' % link + installations = {} # type: Dict[str, FrozenRequirement] + for dist in get_installed_distributions(local_only=local_only, + skip=(), + user_only=user_only): + try: + req = FrozenRequirement.from_dist(dist) + 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() # type: Set[str] + # 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) # type: Dict[str, List[str]] + 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 = install_req_from_editable( + line, + isolated=isolated, + wheel_cache=wheel_cache, + ) + else: + line_req = install_req_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 " + "package %r is not installed", + req_file_path, + COMMENT_RE.sub('', line).strip(), line_req.name + ) + 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() + + +def get_requirement_info(dist): + # type: (Distribution) -> RequirementInfo + """ + Compute and return values (req, editable, comments) for use in + FrozenRequirement.from_dist(). + """ + if not dist_is_editable(dist): + return (None, False, []) + + location = os.path.normcase(os.path.abspath(dist.location)) + + from pip._internal.vcs import vcs, RemoteNotFoundError + vc_type = vcs.get_backend_type(location) + + if not vc_type: + req = dist.as_requirement() + logger.debug( + 'No VCS found for editable requirement {!r} in: {!r}', req, + location, + ) + comments = [ + '# Editable install with no version control ({})'.format(req) + ] + return (location, True, comments) + + try: + req = vc_type.get_src_requirement(location, dist.project_name) + except RemoteNotFoundError: + req = dist.as_requirement() + comments = [ + '# Editable {} install with no remote ({})'.format( + vc_type.__name__, req, + ) + ] + return (location, True, comments) + + except BadCommand: + logger.warning( + 'cannot determine version of editable source in %s ' + '(%s command not found in path)', + location, + vc_type.name, + ) + return (None, True, []) + + except InstallationError as exc: + logger.warning( + "Error when trying to get requirement for VCS system %s, " + "falling back to uneditable format", exc + ) + else: + if req is not None: + return (req, True, []) + + logger.warning( + 'Could not determine repository location of %s', location + ) + comments = ['## !! Could not determine repository location'] + + return (None, False, comments) + + +class FrozenRequirement(object): + def __init__(self, name, req, editable, comments=()): + # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None + self.name = name + self.req = req + self.editable = editable + self.comments = comments + + @classmethod + def from_dist(cls, dist): + # type: (Distribution) -> FrozenRequirement + req, editable, comments = get_requirement_info(dist) + if req is None: + req = dist.as_requirement() + + return cls(dist.project_name, req, editable, comments=comments) + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py new file mode 100644 index 0000000..4f31dd5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py @@ -0,0 +1,413 @@ +"""Prepares a distribution for installation +""" + +import logging +import os + +from pip._vendor import pkg_resources, requests + +from pip._internal.build_env import BuildEnvironment +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.utils.compat import expanduser +from pip._internal.utils.hashes import MissingHashes +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import display_path, normalize_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.req.req_tracker import RequirementTracker # noqa: F401 + +logger = logging.getLogger(__name__) + + +def make_abstract_dist(req): + # type: (InstallRequirement) -> DistAbstraction + """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) + + +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): + # type: (InstallRequirement) -> None + self.req = req # type: InstallRequirement + + def dist(self): + # type: () -> Any + """Return a setuptools Dist object.""" + raise NotImplementedError + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + """Ensure that we can get a Dist for this requirement.""" + raise NotImplementedError + + +class IsWheel(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return list(pkg_resources.find_distributions( + self.req.source_dir))[0] + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + # FIXME:https://github.com/pypa/pip/issues/1112 + pass + + +class IsSDist(DistAbstraction): + + def dist(self): + return self.req.get_dist() + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> None + # Prepare for building. We need to: + # 1. Load pyproject.toml (if it exists) + # 2. Set up the build environment + + self.req.load_pyproject_toml() + should_isolate = self.req.use_pep517 and build_isolation + + def _raise_conflicts(conflicting_with, conflicting_reqs): + raise InstallationError( + "Some build dependencies for %s conflict with %s: %s." % ( + self.req, conflicting_with, ', '.join( + '%s is incompatible with %s' % (installed, wanted) + for installed, wanted in sorted(conflicting)))) + + if should_isolate: + # Isolate in a BuildEnvironment and install the build-time + # requirements. + self.req.build_env = BuildEnvironment() + self.req.build_env.install_requirements( + finder, self.req.pyproject_requires, 'overlay', + "Installing build dependencies" + ) + conflicting, missing = self.req.build_env.check_requirements( + self.req.requirements_to_check + ) + if conflicting: + _raise_conflicts("PEP 517/518 supported requirements", + conflicting) + if missing: + logger.warning( + "Missing build requirements in pyproject.toml for %s.", + self.req, + ) + logger.warning( + "The project does not specify a build backend, and " + "pip cannot fall back to setuptools without %s.", + " and ".join(map(repr, sorted(missing))) + ) + # Install any extra build dependencies that the backend requests. + # This must be done in a second pass, as the pyproject.toml + # dependencies must be installed before we can call the backend. + with self.req.build_env: + # We need to have the env active when calling the hook. + self.req.spin_message = "Getting requirements to build wheel" + reqs = self.req.pep517_backend.get_requires_for_build_wheel() + conflicting, missing = self.req.build_env.check_requirements(reqs) + if conflicting: + _raise_conflicts("the backend dependencies", conflicting) + self.req.build_env.install_requirements( + finder, missing, 'normal', + "Installing backend dependencies" + ) + + self.req.prepare_metadata() + self.req.assert_source_matches_version() + + +class Installed(DistAbstraction): + + def dist(self): + # type: () -> pkg_resources.Distribution + return self.req.satisfied_by + + def prep_for_dist(self, finder, build_isolation): + # type: (PackageFinder, bool) -> Any + pass + + +class RequirementPreparer(object): + """Prepares a Requirement + """ + + def __init__( + self, + build_dir, # type: str + download_dir, # type: Optional[str] + src_dir, # type: str + wheel_download_dir, # type: Optional[str] + progress_bar, # type: str + build_isolation, # type: bool + req_tracker # type: RequirementTracker + ): + # type: (...) -> None + super(RequirementPreparer, self).__init__() + + self.src_dir = src_dir + self.build_dir = build_dir + self.req_tracker = req_tracker + + # 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): + # type: () -> bool + # 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, # type: InstallRequirement + session, # type: PipSession + finder, # type: PackageFinder + upgrade_allowed, # type: bool + require_hashes # type: bool + ): + # type: (...) -> DistAbstraction + """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) + with self.req_tracker.track(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, # type: InstallRequirement + require_hashes, # type: bool + use_user_site, # type: bool + finder # type: PackageFinder + ): + # type: (...) -> DistAbstraction + """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) + with self.req_tracker.track(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): + # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction + """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py new file mode 100644 index 0000000..1e782d1 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py @@ -0,0 +1,381 @@ +"""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 +from pip._internal.utils.compat import get_extension_suffixes +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Tuple, Callable, List, Optional, Union, Dict + ) + + Pep425Tag = Tuple[str, str, str] + +logger = logging.getLogger(__name__) + +_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') + + +def get_config_var(var): + # type: (str) -> Optional[str] + try: + return sysconfig.get_config_var(var) + except IOError as e: # Issue #1074 + warnings.warn("{}".format(e), RuntimeWarning) + return None + + +def get_abbr_impl(): + # type: () -> str + """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(): + # type: () -> str + """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(): + # type: () -> Tuple[int, ...] + """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 + # attrs exist only on pypy + return (sys.version_info[0], + sys.pypy_version_info.major, # type: ignore + sys.pypy_version_info.minor) # type: ignore + else: + return sys.version_info[0], sys.version_info[1] + + +def get_impl_tag(): + # type: () -> str + """ + Returns the Tag for this specific implementation. + """ + return "{}{}".format(get_abbr_impl(), get_impl_ver()) + + +def get_flag(var, fallback, expected=True, warn=True): + # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool + """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(): + # type: () -> Optional[str] + """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(): + # type: () -> bool + return sys.maxsize == 2147483647 + + +def get_platform(): + # type: () -> str + """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(): + # type: () -> bool + # 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 is_manylinux2010_compatible(): + # type: () -> bool + # 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.manylinux2010_compatible) + except (ImportError, AttributeError): + # Fall through to heuristic check below + pass + + # Check glibc version. CentOS 6 uses glibc 2.12. + return pip._internal.utils.glibc.have_compatible_glibc(2, 12) + + +def get_darwin_arches(major, minor, machine): + # type: (int, int, str) -> List[str] + """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): + # type: (int, int, str) -> bool + # 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")), + ]) # type: Dict[str, Tuple[str, ...]] + + 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_all_minor_versions_as_strings(version_info): + # type: (Tuple[int, ...]) -> List[str] + versions = [] + 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,)))) + return versions + + +def get_supported( + versions=None, # type: Optional[List[str]] + noarch=False, # type: bool + platform=None, # type: Optional[str] + impl=None, # type: Optional[str] + abi=None # type: Optional[str] +): + # type: (...) -> List[Pep425Tag] + """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: + version_info = get_impl_version_info() + versions = get_all_minor_versions_as_strings(version_info) + + impl = impl or get_abbr_impl() + + abis = [] # type: List[str] + + abi = abi or get_abi_tag() + if abi: + abis[0:0] = [abi] + + abi3s = set() + for suffix in get_extension_suffixes(): + if suffix.startswith('.abi'): + abi3s.add(suffix.split('.', 2)[1]) + + abis.extend(sorted(list(abi3s))) + + abis.append('none') + + if not noarch: + arch = platform or get_platform() + arch_prefix, arch_sep, arch_suffix = arch.partition('_') + 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 arch_prefix == 'manylinux2010': + # manylinux1 wheels run on most manylinux2010 systems with the + # exception of wheels depending on ncurses. PEP 571 states + # manylinux1 wheels should be considered manylinux2010 wheels: + # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels + arches = [arch, 'manylinux1' + arch_sep + arch_suffix] + elif platform is None: + arches = [] + if is_manylinux2010_compatible(): + arches.append('manylinux2010' + arch_sep + arch_suffix) + if is_manylinux1_compatible(): + arches.append('manylinux1' + arch_sep + arch_suffix) + arches.append(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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py new file mode 100644 index 0000000..8d739a6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py @@ -0,0 +1,171 @@ +from __future__ import absolute_import + +import io +import os +import sys + +from pip._vendor import pytoml, six + +from pip._internal.exceptions import InstallationError +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Tuple, Optional, List # noqa: F401 + + +def _is_list_of_str(obj): + # type: (Any) -> bool + return ( + isinstance(obj, list) and + all(isinstance(item, six.string_types) for item in obj) + ) + + +def make_pyproject_path(setup_py_dir): + # type: (str) -> str + path = os.path.join(setup_py_dir, 'pyproject.toml') + + # Python2 __file__ should not be unicode + if six.PY2 and isinstance(path, six.text_type): + path = path.encode(sys.getfilesystemencoding()) + + return path + + +def load_pyproject_toml( + use_pep517, # type: Optional[bool] + pyproject_toml, # type: str + setup_py, # type: str + req_name # type: str +): + # type: (...) -> Optional[Tuple[List[str], str, List[str]]] + """Load the pyproject.toml file. + + Parameters: + use_pep517 - Has the user requested PEP 517 processing? None + means the user hasn't explicitly specified. + pyproject_toml - Location of the project's pyproject.toml file + setup_py - Location of the project's setup.py file + req_name - The name of the requirement we're processing (for + error reporting) + + Returns: + None if we should use the legacy code path, otherwise a tuple + ( + requirements from pyproject.toml, + name of PEP 517 backend, + requirements we should check are installed after setting + up the build environment + ) + """ + has_pyproject = os.path.isfile(pyproject_toml) + has_setup = os.path.isfile(setup_py) + + if has_pyproject: + with io.open(pyproject_toml, encoding="utf-8") as f: + pp_toml = pytoml.load(f) + build_system = pp_toml.get("build-system") + else: + build_system = None + + # The following cases must use PEP 517 + # We check for use_pep517 being non-None and falsey because that means + # the user explicitly requested --no-use-pep517. The value 0 as + # opposed to False can occur when the value is provided via an + # environment variable or config file option (due to the quirk of + # strtobool() returning an integer in pip's configuration code). + if has_pyproject and not has_setup: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project does not have a setup.py" + ) + use_pep517 = True + elif build_system and "build-backend" in build_system: + if use_pep517 is not None and not use_pep517: + raise InstallationError( + "Disabling PEP 517 processing is invalid: " + "project specifies a build backend of {} " + "in pyproject.toml".format( + build_system["build-backend"] + ) + ) + use_pep517 = True + + # If we haven't worked out whether to use PEP 517 yet, + # and the user hasn't explicitly stated a preference, + # we do so if the project has a pyproject.toml file. + elif use_pep517 is None: + use_pep517 = has_pyproject + + # At this point, we know whether we're going to use PEP 517. + assert use_pep517 is not None + + # If we're using the legacy code path, there is nothing further + # for us to do here. + if not use_pep517: + return None + + if build_system is None: + # Either the user has a pyproject.toml with no build-system + # section, or the user has no pyproject.toml, but has opted in + # explicitly via --use-pep517. + # In the absence of any explicit backend specification, we + # assume the setuptools backend that most closely emulates the + # traditional direct setup.py execution, and require wheel and + # a version of setuptools that supports that backend. + + build_system = { + "requires": ["setuptools>=40.8.0", "wheel"], + "build-backend": "setuptools.build_meta:__legacy__", + } + + # If we're using PEP 517, we have build system information (either + # from pyproject.toml, or defaulted by the code above). + # Note that at this point, we do not know if the user has actually + # specified a backend, though. + assert build_system is not None + + # Ensure that the build-system section in pyproject.toml conforms + # to PEP 518. + error_template = ( + "{package} has a pyproject.toml file that does not comply " + "with PEP 518: {reason}" + ) + + # Specifying the build-system table but not the requires key is invalid + if "requires" not in build_system: + raise InstallationError( + error_template.format(package=req_name, reason=( + "it has a 'build-system' table but not " + "'build-system.requires' which is mandatory in the table" + )) + ) + + # Error out if requires is not a list of strings + requires = build_system["requires"] + if not _is_list_of_str(requires): + raise InstallationError(error_template.format( + package=req_name, + reason="'build-system.requires' is not a list of strings.", + )) + + backend = build_system.get("build-backend") + check = [] # type: List[str] + if backend is None: + # If the user didn't specify a backend, we assume they want to use + # the setuptools backend. But we can't be sure they have included + # a version of setuptools which supplies the backend, or wheel + # (which is needed by the backend) in their requirements. So we + # make a note to check that those requirements are present once + # we have set up the environment. + # This is quite a lot of work to check for a very specific case. But + # the problem is, that case is potentially quite common - projects that + # adopted PEP 518 early for the ability to specify requirements to + # execute setup.py, but never considered needing to mention the build + # tools themselves. The original PEP 518 code had a similar check (but + # implemented in a different way). + backend = "setuptools.build_meta:__legacy__" + check = ["setuptools>=40.8.0", "wheel"] + + return (requires, backend, check) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py new file mode 100644 index 0000000..5e4eb92 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py @@ -0,0 +1,77 @@ +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 +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Sequence # noqa: F401 + +__all__ = [ + "RequirementSet", "InstallRequirement", + "parse_requirements", "install_given_reqs", +] + +logger = logging.getLogger(__name__) + + +def install_given_reqs( + to_install, # type: List[InstallRequirement] + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + *args, **kwargs +): + # type: (...) -> List[InstallRequirement] + """ + 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 Exception: + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py new file mode 100644 index 0000000..1eed1dd --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py @@ -0,0 +1,339 @@ +"""Backing implementation for InstallRequirement's various constructors + +The idea here is that these formed a major chunk of InstallRequirement's size +so, moving them and support code dedicated to them outside of that class +helps creates for better understandability for the rest of the code. + +These are meant to be used elsewhere within pip to create instances of +InstallRequirement. +""" + +import logging +import os +import re + +from pip._vendor.packaging.markers import Marker +from pip._vendor.packaging.requirements import InvalidRequirement, Requirement +from pip._vendor.packaging.specifiers import Specifier +from pip._vendor.pkg_resources import RequirementParseError, parse_requirements + +from pip._internal.download import ( + is_archive_file, is_url, path_to_url, url_to_path, +) +from pip._internal.exceptions import InstallationError +from pip._internal.models.index import PyPI, TestPyPI +from pip._internal.models.link import Link +from pip._internal.pyproject import make_pyproject_path +from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils.misc import is_installable_dir +from pip._internal.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.vcs import vcs +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Set, Any, Union, Text, Dict, + ) + from pip._internal.cache import WheelCache # noqa: F401 + + +__all__ = [ + "install_req_from_editable", "install_req_from_line", + "parse_editable" +] + +logger = logging.getLogger(__name__) +operators = Specifier._operators.keys() + + +def _strip_extras(path): + # type: (str) -> Tuple[str, Optional[str]] + 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 + + +def parse_editable(editable_req): + # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] + """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] + """ + + 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')): + msg = ( + 'File "setup.py" not found. Directory cannot be installed ' + 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) + ) + pyproject_path = make_pyproject_path(url_no_extras) + if os.path.isfile(pyproject_path): + msg += ( + '\n(A "pyproject.toml" file was found, but editable ' + 'mode currently requires a setup.py based build.)' + ) + raise InstallationError(msg) + + # 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 package_name, url, None + + +def deduce_helpful_msg(req): + # type: (str) -> str + """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=True) + else: + msg += " File '%s' does not exist." % (req) + return msg + + +# ---- The actual constructors follow ---- + + +def install_req_from_editable( + editable_req, # type: str + comes_from=None, # type: Optional[str] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + 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 InstallRequirement( + req, comes_from, source_dir=source_dir, + editable=True, + link=Link(url), + constraint=constraint, + use_pep517=use_pep517, + isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + extras=extras_override or (), + ) + + +def install_req_from_line( + name, # type: str + comes_from=None, # type: Optional[Union[str, InstallRequirement]] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False # type: bool +): + # type: (...) -> InstallRequirement + """Creates an InstallRequirement from a name, which might be a + requirement, directory containing 'setup.py', filename, or URL. + """ + if is_url(name): + marker_sep = '; ' + else: + marker_sep = ';' + if marker_sep in name: + name, markers_as_string = name.split(marker_sep, 1) + markers_as_string = markers_as_string.strip() + if not markers_as_string: + markers = None + else: + markers = Marker(markers_as_string) + else: + markers = None + name = name.strip() + req_as_string = None + path = os.path.normpath(os.path.abspath(name)) + link = None + extras_as_string = None + + if is_url(name): + link = Link(name) + else: + p, extras_as_string = _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. Neither 'setup.py' " + "nor 'pyproject.toml' 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_as_string = "%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_as_string = link.egg_fragment + + # a requirement specifier + else: + req_as_string = name + + if extras_as_string: + extras = Requirement("placeholder" + extras_as_string.lower()).extras + else: + extras = () + if req_as_string is not None: + try: + req = Requirement(req_as_string) + except InvalidRequirement: + if os.path.sep in req_as_string: + add_msg = "It looks like a path." + add_msg += deduce_helpful_msg(req_as_string) + elif ('=' in req_as_string and + not any(op in req_as_string for op in operators)): + add_msg = "= is not a valid operator. Did you mean == ?" + else: + add_msg = "" + raise InstallationError( + "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) + ) + else: + req = None + + return InstallRequirement( + req, comes_from, link=link, markers=markers, + use_pep517=use_pep517, isolated=isolated, + options=options if options else {}, + wheel_cache=wheel_cache, + constraint=constraint, + extras=extras, + ) + + +def install_req_from_req_string( + req_string, # type: str + comes_from=None, # type: Optional[InstallRequirement] + isolated=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> InstallRequirement + try: + req = Requirement(req_string) + except InvalidRequirement: + raise InstallationError("Invalid requirement: '%s'" % req) + + domains_not_allowed = [ + PyPI.file_storage_domain, + TestPyPI.file_storage_domain, + ] + if req.url and comes_from.link.netloc in domains_not_allowed: + # Explicitly disallow pypi packages that depend on external urls + raise InstallationError( + "Packages installed from PyPI cannot depend on packages " + "which are not also hosted on PyPI.\n" + "%s depends on %s " % (comes_from.name, req) + ) + + return InstallRequirement( + req, comes_from, isolated=isolated, wheel_cache=wheel_cache, + use_pep517=use_pep517 + ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py new file mode 100644 index 0000000..726f2f6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py @@ -0,0 +1,382 @@ +""" +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.cli import cmdoptions +from pip._internal.download import get_file_content +from pip._internal.exceptions import RequirementsFileParseError +from pip._internal.req.constructors import ( + install_req_from_editable, install_req_from_line, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Iterator, Tuple, Optional, List, Callable, Text + ) + from pip._internal.req import InstallRequirement # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + ReqFileLines = Iterator[Tuple[int, Text]] + +__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.trusted_host, + cmdoptions.require_hashes, +] # type: List[Callable[..., optparse.Option]] + +# options to be passed to requirements +SUPPORTED_OPTIONS_REQ = [ + cmdoptions.install_options, + cmdoptions.global_options, + cmdoptions.hash, +] # type: List[Callable[..., optparse.Option]] + +# the 'dest' string values +SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] + + +def parse_requirements( + filename, # type: str + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + constraint=False, # type: bool + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None # type: Optional[bool] +): + # type: (...) -> Iterator[InstallRequirement] + """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 + :param use_pep517: Value of the --use-pep517 option. + """ + 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, + use_pep517=use_pep517, constraint=constraint) + for req in req_iter: + yield req + + +def preprocess(content, options): + # type: (Text, Optional[optparse.Values]) -> ReqFileLines + """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) # type: ReqFileLines + 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, # type: Text + filename, # type: str + line_number, # type: int + finder=None, # type: Optional[PackageFinder] + comes_from=None, # type: Optional[str] + options=None, # type: Optional[optparse.Values] + session=None, # type: Optional[PipSession] + wheel_cache=None, # type: Optional[WheelCache] + use_pep517=None, # type: Optional[bool] + constraint=False # type: bool +): + # type: (...) -> Iterator[InstallRequirement] + """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: + defaults.format_control = finder.format_control + args_str, options_str = break_args_options(line) + # Prior to 2.7.3, shlex cannot deal with unicode entries + if sys.version_info < (2, 7, 3): + # https://github.com/python/mypy/issues/1174 + options_str = options_str.encode('utf8') # type: ignore + # https://github.com/python/mypy/issues/1174 + opts, _ = parser.parse_args( + shlex.split(options_str), defaults) # type: ignore + + # 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 install_req_from_line( + args_str, line_comes_from, constraint=constraint, + use_pep517=use_pep517, + 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 install_req_from_editable( + opts.editables[0], comes_from=line_comes_from, + use_pep517=use_pep517, + 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? + parsed_reqs = parse_requirements( + req_path, finder, comes_from, options, session, + constraint=nested_constraint, wheel_cache=wheel_cache + ) + for req in parsed_reqs: + 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.trusted_hosts: + finder.secure_origins.extend( + ("*", host, "*") for host in opts.trusted_hosts) + + +def break_args_options(line): + # type: (Text) -> Tuple[str, Text] + """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) # type: ignore + + +def build_parser(line): + # type: (Text) -> optparse.OptionParser + """ + 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) + # NOTE: mypy disallows assigning to a method + # https://github.com/python/mypy/issues/2427 + parser.exit = parser_exit # type: ignore + + return parser + + +def join_lines(lines_enum): + # type: (ReqFileLines) -> ReqFileLines + """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 = [] # type: List[Text] + 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): + # type: (ReqFileLines) -> ReqFileLines + """ + 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): + # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines + """ + 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): + # type: (ReqFileLines) -> ReqFileLines + """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py new file mode 100644 index 0000000..a4834b0 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py @@ -0,0 +1,1021 @@ +from __future__ import absolute_import + +import logging +import os +import shutil +import sys +import sysconfig +import zipfile +from distutils.util import change_root + +from pip._vendor import pkg_resources, six +from pip._vendor.packaging.requirements import Requirement +from pip._vendor.packaging.utils import canonicalize_name +from pip._vendor.packaging.version import Version +from pip._vendor.packaging.version import parse as parse_version +from pip._vendor.pep517.wrappers import Pep517HookCaller + +from pip._internal import wheel +from pip._internal.build_env import NoOpBuildEnvironment +from pip._internal.exceptions import InstallationError +from pip._internal.locations import ( + PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, +) +from pip._internal.models.link import Link +from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path +from pip._internal.req.req_uninstall import UninstallPathSet +from pip._internal.utils.compat import native_str +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, redact_password_from_url, rmtree, +) +from pip._internal.utils.packaging import get_metadata +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 +from pip._internal.vcs import vcs +from pip._internal.wheel import move_wheel_files + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Iterable, List, Union, Any, Text, Sequence, Dict + ) + from pip._internal.build_env import BuildEnvironment # noqa: F401 + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._vendor.pkg_resources import Distribution # noqa: F401 + from pip._vendor.packaging.specifiers import SpecifierSet # noqa: F401 + from pip._vendor.packaging.markers import Marker # noqa: F401 + + +logger = logging.getLogger(__name__) + + +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, # type: Optional[Requirement] + comes_from, # type: Optional[Union[str, InstallRequirement]] + source_dir=None, # type: Optional[str] + editable=False, # type: bool + link=None, # type: Optional[Link] + update=True, # type: bool + markers=None, # type: Optional[Marker] + use_pep517=None, # type: Optional[bool] + isolated=False, # type: bool + options=None, # type: Optional[Dict[str, Any]] + wheel_cache=None, # type: Optional[WheelCache] + constraint=False, # type: bool + extras=() # type: Iterable[str] + ): + # type: (...) -> None + 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 None and req and req.url: + # PEP 508 URL requirement + link = Link(req.url) + self.link = self.original_link = link + + 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 None and req: + markers = req.marker + self.markers = markers + + self._egg_info_path = None # type: Optional[str] + # 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 # type: Optional[str] + # True if the editable should be updated: + self.update = update + # Set to True after successful installation + self.install_succeeded = None # type: Optional[bool] + # 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 = NoOpBuildEnvironment() # type: BuildEnvironment + + # For PEP 517, the directory where we request the project metadata + # gets stored. We need this to pass to build_wheel, so the backend + # can ensure that the wheel matches the metadata (see the PEP for + # details). + self.metadata_directory = None # type: Optional[str] + + # The static build requirements (from pyproject.toml) + self.pyproject_requires = None # type: Optional[List[str]] + + # Build requirements that we will check are available + self.requirements_to_check = [] # type: List[str] + + # The PEP 517 backend we should use to build the project + self.pep517_backend = None # type: Optional[Pep517HookCaller] + + # Are we using PEP 517 for this requirement? + # After pyproject.toml has been loaded, the only valid values are True + # and False. Before loading, None is valid (meaning "use the default"). + # Setting an explicit value before loading pyproject.toml is supported, + # but after loading this flag should be treated as read only. + self.use_pep517 = use_pep517 + + def __str__(self): + if self.req: + s = str(self.req) + if self.link: + s += ' from %s' % redact_password_from_url(self.link.url) + elif self.link: + s = redact_password_from_url(self.link.url) + else: + s = '' + 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): + # type: (PackageFinder, bool, bool) -> None + """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) + + # Things that are valid for all kinds of requirements? + @property + def name(self): + # type: () -> Optional[str] + if self.req is None: + return None + return native_str(pkg_resources.safe_name(self.req.name)) + + @property + def specifier(self): + # type: () -> SpecifierSet + return self.req.specifier + + @property + def is_pinned(self): + # type: () -> bool + """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 {'==', '==='}) + + @property + def installed_version(self): + return get_installed_version(self.name) + + def match_markers(self, extras_requested=None): + # type: (Optional[Iterable[str]]) -> bool + 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 + + @property + def has_hash_options(self): + # type: () -> bool + """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): + # type: (bool) -> Hashes + """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 from_path(self): + # type: () -> Optional[str] + """Format a nice indicator to show where this "comes from" + """ + 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): + # type: (str) -> Optional[str] + 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): + # type: () -> None + """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.run_egg_info 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 is not None and + self._ideal_build_dir.path) # type: ignore + 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 + + # Correct the metadata directory, if it exists + if self.metadata_directory: + old_meta = self.metadata_directory + rel = os.path.relpath(old_meta, start=old_location) + new_meta = os.path.join(new_location, rel) + new_meta = os.path.normpath(os.path.abspath(new_meta)) + self.metadata_directory = new_meta + + def remove_temporary_source(self): + # type: () -> None + """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 check_if_exists(self, use_user_site): + # type: (bool) -> bool + """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 + + # Things valid for wheels + @property + def is_wheel(self): + # type: () -> bool + if not self.link: + return False + return self.link.is_wheel + + def move_wheel_files( + self, + wheeldir, # type: str + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + 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, + ) + + # Things valid for sdists + @property + def setup_py_dir(self): + # type: () -> str + return os.path.join( + self.source_dir, + self.link and self.link.subdirectory_fragment or '') + + @property + def setup_py(self): + # type: () -> str + 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): + # type: () -> str + assert self.source_dir, "No source dir for %s" % self + + return make_pyproject_path(self.setup_py_dir) + + def load_pyproject_toml(self): + # type: () -> None + """Load the pyproject.toml file. + + After calling this routine, all of the attributes related to PEP 517 + processing for this requirement have been set. In particular, the + use_pep517 attribute can be used to determine whether we should + follow the PEP 517 or legacy (setup.py) code path. + """ + pep517_data = load_pyproject_toml( + self.use_pep517, + self.pyproject_toml, + self.setup_py, + str(self) + ) + + if pep517_data is None: + self.use_pep517 = False + else: + self.use_pep517 = True + requires, backend, check = pep517_data + self.requirements_to_check = check + self.pyproject_requires = requires + self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) + + # Use a custom function to call subprocesses + self.spin_message = "" + + def runner(cmd, cwd=None, extra_environ=None): + with open_spinner(self.spin_message) as spinner: + call_subprocess( + cmd, + cwd=cwd, + extra_environ=extra_environ, + show_stdout=False, + spinner=spinner + ) + self.spin_message = "" + + self.pep517_backend._subprocess_runner = runner + + def prepare_metadata(self): + # type: () -> None + """Ensure that project metadata is available. + + Under PEP 517, call the backend hook to prepare the metadata. + Under legacy processing, call setup.py egg-info. + """ + assert self.source_dir + + with indent_log(): + if self.use_pep517: + self.prepare_pep517_metadata() + else: + self.run_egg_info() + + if not self.req: + if isinstance(parse_version(self.metadata["Version"]), Version): + op = "==" + else: + op = "===" + self.req = Requirement( + "".join([ + self.metadata["Name"], + op, + self.metadata["Version"], + ]) + ) + self._correct_build_location() + else: + metadata_name = canonicalize_name(self.metadata["Name"]) + if canonicalize_name(self.req.name) != metadata_name: + logger.warning( + 'Generating metadata for package %s ' + 'produced metadata for project name %s. Fix your ' + '#egg=%s fragments.', + self.name, metadata_name, self.name + ) + self.req = Requirement(metadata_name) + + def prepare_pep517_metadata(self): + # type: () -> None + assert self.pep517_backend is not None + + metadata_dir = os.path.join( + self.setup_py_dir, + 'pip-wheel-metadata' + ) + ensure_dir(metadata_dir) + + with self.build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) + + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + + def run_egg_info(self): + # type: () -> None + 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, + ) + 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 = [] # type: List[str] + 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') + + @property + def egg_info_path(self): + # type: () -> str + 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( + "Files/directories not found in %s" % base + ) + # 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 self._egg_info_path + + @property + def metadata(self): + if not hasattr(self, '_metadata'): + self._metadata = get_metadata(self.get_dist()) + + return self._metadata + + def get_dist(self): + # type: () -> Distribution + """Return a pkg_resources.Distribution for this requirement""" + if self.metadata_directory: + base_dir, distinfo = os.path.split(self.metadata_directory) + metadata = pkg_resources.PathMetadata( + base_dir, self.metadata_directory + ) + dist_name = os.path.splitext(distinfo)[0] + typ = pkg_resources.DistInfoDistribution + else: + 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] + # https://github.com/python/mypy/issues/1174 + typ = pkg_resources.Distribution # type: ignore + + return typ( + base_dir, + project_name=dist_name, + metadata=metadata, + ) + + def assert_source_matches_version(self): + # type: () -> None + assert self.source_dir + version = self.metadata['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, + ) + + # For both source distributions and editables + def ensure_has_source_dir(self, parent_dir): + # type: (str) -> str + """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 + + # For editable installations + def install_editable( + self, + install_options, # type: List[str] + global_options=(), # type: Sequence[str] + prefix=None # type: Optional[str] + ): + # type: (...) -> 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 update_editable(self, obtain=True): + # type: (bool) -> None + 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)) + + # Top-level Actions + def uninstall(self, auto_confirm=False, verbose=False, + use_user_site=False): + # type: (bool, bool, bool) -> Optional[UninstallPathSet] + """ + 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 None + dist = self.satisfied_by or self.conflicts_with + + uninstalled_pathset = UninstallPathSet.from_dist(dist) + uninstalled_pathset.remove(auto_confirm, verbose) + return uninstalled_pathset + + def _clean_zip_name(self, name, prefix): # only used by archive. + 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 _get_archive_name(self, path, parentdir, rootdir): + # type: (str, str, str) -> str + path = os.path.join(parentdir, path) + name = self._clean_zip_name(path, rootdir) + return self.name + '/' + name + + # TODO: Investigate if this should be kept in InstallRequirement + # Seems to be used only when VCS + downloads + def archive(self, build_dir): + # type: (str) -> None + assert self.source_dir + create_archive = True + archive_name = '%s-%s.zip' % (self.name, self.metadata["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: + dir_arcname = self._get_archive_name(dirname, + parentdir=dirpath, + rootdir=dir) + zipdir = zipfile.ZipInfo(dir_arcname + '/') + zipdir.external_attr = 0x1ED << 16 # 0o755 + zip.writestr(zipdir, '') + for filename in filenames: + if filename == PIP_DELETE_MARKER_FILENAME: + continue + file_arcname = self._get_archive_name(filename, + parentdir=dirpath, + rootdir=dir) + filename = os.path.join(dirpath, filename) + zip.write(filename, file_arcname) + zip.close() + logger.info('Saved %s', display_path(archive_path)) + + def install( + self, + install_options, # type: List[str] + global_options=None, # type: Optional[Sequence[str]] + root=None, # type: Optional[str] + home=None, # type: Optional[str] + prefix=None, # type: Optional[str] + warn_script_location=True, # type: bool + use_user_site=False, # type: bool + pycompile=True # type: bool + ): + # type: (...) -> None + 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: + # https://github.com/python/mypy/issues/1174 + global_options = global_options + ["--no-user-cfg"] # type: ignore + + 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 get_install_args( + self, + global_options, # type: Sequence[str] + record_filename, # type: str + root, # type: Optional[str] + prefix, # type: Optional[str] + pycompile # type: bool + ): + # type: (...) -> List[str] + 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py new file mode 100644 index 0000000..d1410e9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py @@ -0,0 +1,197 @@ +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.utils.typing import MYPY_CHECK_RUNNING +from pip._internal.wheel import Wheel + +if MYPY_CHECK_RUNNING: + from typing import Optional, List, Tuple, Dict, Iterable # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + + +logger = logging.getLogger(__name__) + + +class RequirementSet(object): + + def __init__(self, require_hashes=False, check_supported_wheels=True): + # type: (bool, bool) -> None + """Create a RequirementSet. + """ + + self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 + self.require_hashes = require_hashes + self.check_supported_wheels = check_supported_wheels + + # Mapping of alias: real_name + self.requirement_aliases = {} # type: Dict[str, str] + self.unnamed_requirements = [] # type: List[InstallRequirement] + self.successfully_downloaded = [] # type: List[InstallRequirement] + self.reqs_to_cleanup = [] # type: List[InstallRequirement] + + 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, # type: InstallRequirement + parent_req_name=None, # type: Optional[str] + extras_requested=None # type: Optional[Iterable[str]] + ): + # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 + """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 the markers do not match, ignore this requirement. + if not install_req.match_markers(extras_requested): + logger.info( + "Ignoring %s: markers '%s' don't match your environment", + name, install_req.markers, + ) + return [], None + + # If the wheel is not supported, raise an error. + # Should check this after filtering out based on environment markers to + # allow specifying different wheels based on the environment/OS, in a + # single requirements file. + if install_req.link and install_req.link.is_wheel: + wheel = Wheel(install_req.link.filename) + if self.check_supported_wheels and 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" + ) + + # Unnamed requirements are scanned again and the requirement won't be + # added as a dependency until after scanning. + if not name: + # url or path requirement w/o an egg fragment + self.unnamed_requirements.append(install_req) + return [install_req], None + + try: + existing_req = self.get_requirement(name) + except KeyError: + existing_req = None + + has_conflicting_requirement = ( + parent_req_name is None and + existing_req and + not existing_req.constraint and + existing_req.extras == install_req.extras and + existing_req.req.specifier != install_req.req.specifier + ) + if has_conflicting_requirement: + raise InstallationError( + "Double requirement given: %s (already in %s, name=%r)" + % (install_req, existing_req, name) + ) + + # When no existing requirement exists, add the requirement as a + # dependency and it will be scanned again after. + if not existing_req: + self.requirements[name] = install_req + # FIXME: what about other normalizations? E.g., _ vs. -? + if name.lower() != name: + self.requirement_aliases[name.lower()] = name + # We'd want to rescan this requirements later + return [install_req], install_req + + # Assume there's no need to scan, and that we've already + # encountered this for scanning. + if install_req.constraint or not existing_req.constraint: + return [], existing_req + + does_not_satisfy_constraint = ( + install_req.link and + not ( + existing_req.link and + install_req.link.path == existing_req.link.path + ) + ) + if does_not_satisfy_constraint: + 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) | set(install_req.extras) + )) + logger.debug( + "Setting %s extras to: %s", + existing_req, existing_req.extras, + ) + # Return the existing requirement for addition to the parent and + # scanning again. + return [existing_req], existing_req + + def has_requirement(self, project_name): + # type: (str) -> bool + 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): + # type: () -> List[InstallRequirement] + return list(req for req in self.requirements.values() if not + req.constraint) or self.unnamed_requirements + + def get_requirement(self, project_name): + # type: (str) -> InstallRequirement + 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): + # type: () -> None + """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py new file mode 100644 index 0000000..82e084a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py @@ -0,0 +1,88 @@ +from __future__ import absolute_import + +import contextlib +import errno +import hashlib +import logging +import os + +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Set, Iterator # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + +logger = logging.getLogger(__name__) + + +class RequirementTracker(object): + + def __init__(self): + # type: () -> None + self._root = os.environ.get('PIP_REQ_TRACKER') + if self._root is None: + self._temp_dir = TempDirectory(delete=False, kind='req-tracker') + self._temp_dir.create() + self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path + logger.debug('Created requirements tracker %r', self._root) + else: + self._temp_dir = None + logger.debug('Re-using requirements tracker %r', self._root) + self._entries = set() # type: Set[InstallRequirement] + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.cleanup() + + def _entry_path(self, link): + # type: (Link) -> str + hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + return os.path.join(self._root, hashed) + + def add(self, req): + # type: (InstallRequirement) -> None + link = req.link + info = str(req) + entry_path = self._entry_path(link) + try: + with open(entry_path) as fp: + # Error, these's already a build in progress. + raise LookupError('%s is already being built: %s' + % (link, fp.read())) + except IOError as e: + if e.errno != errno.ENOENT: + raise + assert req not in self._entries + with open(entry_path, 'w') as fp: + fp.write(info) + self._entries.add(req) + logger.debug('Added %s to build tracker %r', req, self._root) + + def remove(self, req): + # type: (InstallRequirement) -> None + link = req.link + self._entries.remove(req) + os.unlink(self._entry_path(link)) + logger.debug('Removed %s from build tracker %r', req, self._root) + + def cleanup(self): + # type: () -> None + for req in set(self._entries): + self.remove(req) + remove = self._temp_dir is not None + if remove: + self._temp_dir.cleanup() + logger.debug('%s build tracker %r', + 'Removed' if remove else 'Cleaned', + self._root) + + @contextlib.contextmanager + def track(self, req): + # type: (InstallRequirement) -> Iterator[None] + self.add(req) + yield + self.remove(req) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py new file mode 100644 index 0000000..c80959e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py @@ -0,0 +1,596 @@ +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.exceptions import UninstallationError +from pip._internal.locations import bin_py, bin_user +from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache +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, rmtree, +) +from pip._internal.utils.temp_dir import AdjacentTempDirectory, 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-.py[co] + + Yield paths to all the files in RECORD. For each .py file in RECORD, add + the .pyc and .pyo in the same directory. + + UninstallPathSet.add() takes care of the __pycache__ .py[co]. + """ + 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 + path = os.path.join(dn, base + '.pyo') + 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_skip = any( + path.startswith(shortpath.rstrip("*")) and + path[len(shortpath.rstrip("*").rstrip(sep))] == sep + for shortpath in short_paths + ) + if not should_skip: + short_paths.add(path) + return short_paths + + +def compress_for_rename(paths): + """Returns a set containing the paths that need to be renamed. + + This set may include directories when the original sequence of paths + included every file on disk. + """ + case_map = dict((os.path.normcase(p), p) for p in paths) + remaining = set(case_map) + unchecked = sorted(set(os.path.split(p)[0] + for p in case_map.values()), key=len) + wildcards = set() + + def norm_join(*a): + return os.path.normcase(os.path.join(*a)) + + for root in unchecked: + if any(os.path.normcase(root).startswith(w) + for w in wildcards): + # This directory has already been handled. + continue + + all_files = set() + all_subdirs = set() + for dirname, subdirs, files in os.walk(root): + all_subdirs.update(norm_join(root, dirname, d) + for d in subdirs) + all_files.update(norm_join(root, dirname, f) + for f in files) + # If all the files we found are in our remaining set of files to + # remove, then remove them from the latter set and add a wildcard + # for the directory. + if not (all_files - remaining): + remaining.difference_update(all_files) + wildcards.add(root + os.sep) + + return set(map(case_map.__getitem__, remaining)) | wildcards + + +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) + + _normcased_files = set(map(os.path.normcase, files)) + + 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.join(dirpath, fname) + if (os.path.isfile(file_) and + os.path.normcase(file_) not in _normcased_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 StashedUninstallPathSet(object): + """A set of file rename operations to stash files while + tentatively uninstalling them.""" + def __init__(self): + # Mapping from source file root to [Adjacent]TempDirectory + # for files under that directory. + self._save_dirs = {} + # (old path, new path) tuples for each move that may need + # to be undone. + self._moves = [] + + def _get_directory_stash(self, path): + """Stashes a directory. + + Directories are stashed adjacent to their original location if + possible, or else moved/copied into the user's temp dir.""" + + try: + save_dir = AdjacentTempDirectory(path) + save_dir.create() + except OSError: + save_dir = TempDirectory(kind="uninstall") + save_dir.create() + self._save_dirs[os.path.normcase(path)] = save_dir + + return save_dir.path + + def _get_file_stash(self, path): + """Stashes a file. + + If no root has been provided, one will be created for the directory + in the user's temp directory.""" + path = os.path.normcase(path) + head, old_head = os.path.dirname(path), None + save_dir = None + + while head != old_head: + try: + save_dir = self._save_dirs[head] + break + except KeyError: + pass + head, old_head = os.path.dirname(head), head + else: + # Did not find any suitable root + head = os.path.dirname(path) + save_dir = TempDirectory(kind='uninstall') + save_dir.create() + self._save_dirs[head] = save_dir + + relpath = os.path.relpath(path, head) + if relpath and relpath != os.path.curdir: + return os.path.join(save_dir.path, relpath) + return save_dir.path + + def stash(self, path): + """Stashes the directory or file and returns its new location. + """ + if os.path.isdir(path): + new_path = self._get_directory_stash(path) + else: + new_path = self._get_file_stash(path) + + self._moves.append((path, new_path)) + if os.path.isdir(path) and os.path.isdir(new_path): + # If we're moving a directory, we need to + # remove the destination first or else it will be + # moved to inside the existing directory. + # We just created new_path ourselves, so it will + # be removable. + os.rmdir(new_path) + renames(path, new_path) + return new_path + + def commit(self): + """Commits the uninstall by removing stashed files.""" + for _, save_dir in self._save_dirs.items(): + save_dir.cleanup() + self._moves = [] + self._save_dirs = {} + + def rollback(self): + """Undoes the uninstall by moving stashed files back.""" + for p in self._moves: + logging.info("Moving to %s\n from %s", *p) + + for new_path, path in self._moves: + try: + logger.debug('Replacing %s from %s', new_path, path) + if os.path.isfile(new_path): + os.unlink(new_path) + elif os.path.isdir(new_path): + rmtree(new_path) + renames(path, new_path) + except OSError as ex: + logger.error("Failed to restore %s", new_path) + logger.debug("Exception: %s", ex) + + self.commit() + + @property + def can_rollback(self): + return bool(self._moves) + + +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._moved_paths = StashedUninstallPathSet() + + 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 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): + moved = self._moved_paths + + for_rename = compress_for_rename(self.paths) + + for path in sorted(compact(for_rename)): + moved.stash(path) + logger.debug('Removing file or directory %s', 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) + if verbose: + _display('Will actually move:', compress_for_rename(self.paths)) + + return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' + + def rollback(self): + """Rollback the changes previously made by remove().""" + if not self._moved_paths.can_rollback: + 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) + self._moved_paths.rollback() + for pth in self.pth.values(): + pth.rollback() + + def commit(self): + """Remove temporary save dir: rollback will no longer be possible.""" + self._moved_paths.commit() + + @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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py new file mode 100644 index 0000000..33f572f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py @@ -0,0 +1,393 @@ +"""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.constructors import install_req_from_req_string +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 +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, DefaultDict, List, Set # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.index import PackageFinder # noqa: F401 + from pip._internal.req.req_set import RequirementSet # noqa: F401 + from pip._internal.operations.prepare import ( # noqa: F401 + DistAbstraction, RequirementPreparer + ) + from pip._internal.cache import WheelCache # noqa: F401 + +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, # type: RequirementPreparer + session, # type: PipSession + finder, # type: PackageFinder + wheel_cache, # type: Optional[WheelCache] + use_user_site, # type: bool + ignore_dependencies, # type: bool + ignore_installed, # type: bool + ignore_requires_python, # type: bool + force_reinstall, # type: bool + isolated, # type: bool + upgrade_strategy, # type: str + use_pep517=None # type: Optional[bool] + ): + # type: (...) -> None + 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 + + # This is set in resolve + self.require_hashes = None # type: Optional[bool] + + 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.use_pep517 = use_pep517 + + self._discovered_dependencies = \ + defaultdict(list) # type: DefaultDict[str, List] + + def resolve(self, requirement_set): + # type: (RequirementSet) -> None + """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 = [] # type: List[InstallRequirement] + 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): + # type: (InstallRequirement) -> bool + 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): + # type: (InstallRequirement) -> None + """ + 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): + # type: (InstallRequirement) -> Optional[str] + """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 'already satisfied, skipping upgrade' + 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): + # type: (InstallRequirement) -> DistAbstraction + """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, # type: RequirementSet + req_to_install # type: InstallRequirement + ): + # type: (...) -> List[InstallRequirement] + """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() + try: + check_dist_requires_python(dist) + except UnsupportedPythonVersion as err: + if self.ignore_requires_python: + logger.warning(err.args[0]) + else: + raise + + more_reqs = [] # type: List[InstallRequirement] + + def add_req(subreq, extras_requested): + sub_install_req = install_req_from_req_string( + str(subreq), + req_to_install, + isolated=self.isolated, + wheel_cache=self.wheel_cache, + use_pep517=self.use_pep517 + ) + 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): + # type: (RequirementSet) -> List[InstallRequirement] + """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() # type: Set[InstallRequirement] + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py new file mode 100644 index 0000000..9af9fa7 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py @@ -0,0 +1,270 @@ +""" +This code was taken from https://github.com/ActiveState/appdirs and modified +to suit our purposes. +""" +from __future__ import absolute_import + +import os +import sys + +from pip._vendor.six import PY2, text_type + +from pip._internal.utils.compat import WINDOWS, expanduser +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + List, Union + ) + + +def user_cache_dir(appname): + # type: (str) -> str + r""" + Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + + Typical user cache directories are: + macOS: ~/Library/Caches/ + 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): + # type: (str, bool) -> str + 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): + # type: (str, bool) -> str + """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): + # type: (str) -> List[str] + 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): + # type: (str) -> str + """ + 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): + # type: (str) -> str + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py new file mode 100644 index 0000000..2d8b3bf --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py @@ -0,0 +1,264 @@ +"""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 + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Tuple, Text # noqa: F401 + +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 # type: ignore + ipaddress.ip_network = ipaddress.IPNetwork # type: ignore + + +__all__ = [ + "ipaddress", "uses_pycache", "console_to_str", "native_str", + "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", + "get_extension_suffixes", +] + + +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): + # type: (bytes) -> Text + """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: + decoded_data = data.decode(encoding) + except UnicodeDecodeError: + logger.warning( + "Subprocess output does not appear to be encoded as %s", + encoding, + ) + decoded_data = 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: + output_encoded = decoded_data.encode( + output_encoding, + errors="backslashreplace" + ) + decoded_data = output_encoded.decode(output_encoding) + + return decoded_data + + +if sys.version_info >= (3,): + def native_str(s, replace=False): + # type: (str, bool) -> str + if isinstance(s, bytes): + return s.decode('utf-8', 'replace' if replace else 'strict') + return s + +else: + def native_str(s, replace=False): + # type: (str, bool) -> str + # 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): + # type: (str) -> int + """ + 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 + + +if sys.version_info >= (3, 4): + from importlib.machinery import EXTENSION_SUFFIXES + + def get_extension_suffixes(): + return EXTENSION_SUFFIXES +else: + from imp import get_suffixes + + def get_extension_suffixes(): + return [suffix[0] for suffix in get_suffixes()] + + +def expanduser(path): + # type: (str) -> str + """ + Expand ~ and ~user constructions. + + Includes a workaround for https://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): + # type: (str, str) -> bool + """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(): + # type: () -> Tuple[int, int] + """ + 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()) # type: ignore +else: + def get_terminal_size(): + # type: () -> Tuple[int, int] + """ + 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 Exception: + 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 Exception: + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py new file mode 100644 index 0000000..0beaf74 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py @@ -0,0 +1,90 @@ +""" +A module that implements tooling to enable easy warnings about deprecations. +""" +from __future__ import absolute_import + +import logging +import warnings + +from pip._vendor.packaging.version import parse + +from pip import __version__ as current_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Any, Optional # noqa: F401 + + +class PipDeprecationWarning(Warning): + pass + + +_original_showwarning = None # type: Any + + +# Warnings <-> Logging Integration +def _showwarning(message, category, filename, lineno, file=None, line=None): + if file is not None: + if _original_showwarning is not None: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + elif 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") + logger.warning(message) + else: + _original_showwarning( + message, category, filename, lineno, file, line, + ) + + +def install_warning_logger(): + # type: () -> None + # Enable our Deprecation Warnings + warnings.simplefilter("default", PipDeprecationWarning, append=True) + + global _original_showwarning + + if _original_showwarning is None: + _original_showwarning = warnings.showwarning + warnings.showwarning = _showwarning + + +def deprecated(reason, replacement, gone_in, issue=None): + # type: (str, Optional[str], Optional[str], Optional[int]) -> None + """Helper to deprecate existing functionality. + + reason: + Textual reason shown to the user about why this functionality has + been deprecated. + replacement: + Textual suggestion shown to the user about what alternative + functionality they can use. + gone_in: + The version of pip does this functionality should get removed in. + Raises errors if pip's current version is greater than or equal to + this. + issue: + Issue number on the tracker that would serve as a useful place for + users to find related discussion and provide feedback. + + Always pass replacement, gone_in and issue as keyword arguments for clarity + at the call site. + """ + + # Construct a nice message. + # This is purposely eagerly formatted as we want it to appear as if someone + # typed this entire message out. + message = "DEPRECATION: " + reason + if replacement is not None: + message += " A possible replacement is {}.".format(replacement) + if issue is not None: + url = "https://github.com/pypa/pip/issues/" + str(issue) + message += " You can find discussion regarding this at {}.".format(url) + + # Raise as an error if it has to be removed. + if gone_in is not None and parse(current_version) >= parse(gone_in): + raise PipDeprecationWarning(message) + warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py new file mode 100644 index 0000000..d36defa --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py @@ -0,0 +1,39 @@ +import codecs +import locale +import re +import sys + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import List, Tuple, Text # noqa: F401 + +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'), +] # type: List[Tuple[bytes, Text]] + +ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') + + +def auto_decode(data): + # type: (bytes) -> Text + """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py new file mode 100644 index 0000000..1e6b033 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py @@ -0,0 +1,30 @@ +import os +import os.path + +from pip._internal.utils.compat import get_path_uid + + +def check_path_owner(path): + # type: (str) -> bool + # 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) + return False # assume we don't own the path diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py new file mode 100644 index 0000000..8a51f69 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py @@ -0,0 +1,93 @@ +from __future__ import absolute_import + +import ctypes +import re +import warnings + +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional, Tuple # noqa: F401 + + +def glibc_version_string(): + # type: () -> Optional[str] + "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): + # type: (str, int, int) -> bool + # 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): + # type: (int, int) -> bool + version_str = glibc_version_string() # type: Optional[str] + 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(): + # type: () -> Tuple[str, str] + """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py new file mode 100644 index 0000000..c6df7a1 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py @@ -0,0 +1,115 @@ +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 +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Dict, List, BinaryIO, NoReturn, Iterator + ) + from pip._vendor.six import PY3 + if PY3: + from hashlib import _Hash # noqa: F401 + else: + from hashlib import _hash as _Hash # noqa: F401 + + +# 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): + # type: (Dict[str, List[str]]) -> 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): + # type: (Iterator[bytes]) -> None + """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): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMismatch(self._allowed, gots) + + def check_against_file(self, file): + # type: (BinaryIO) -> None + """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): + # type: (str) -> None + with open(path, 'rb') as file: + return self.check_against_file(file) + + def __nonzero__(self): + # type: () -> bool + """Return whether I know any known-good hashes.""" + return bool(self._allowed) + + def __bool__(self): + # type: () -> bool + 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): + # type: () -> None + """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): + # type: (Dict[str, _Hash]) -> NoReturn + raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py new file mode 100644 index 0000000..579d696 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py @@ -0,0 +1,318 @@ +from __future__ import absolute_import + +import contextlib +import errno +import logging +import logging.handlers +import os +import sys + +from pip._vendor.six import PY2 + +from pip._internal.utils.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 + + +class BrokenStdoutLoggingError(Exception): + """ + Raised if BrokenPipeError occurs for the stdout stream while logging. + """ + pass + + +# BrokenPipeError does not exist in Python 2 and, in addition, manifests +# differently in Windows and non-Windows. +if WINDOWS: + # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: + # https://bugs.python.org/issue19612 + # https://bugs.python.org/issue30418 + if PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and + exc.errno in (errno.EINVAL, errno.EPIPE)) + else: + # In Windows, a broken pipe IOError became OSError in Python 3. + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return ((exc_class is BrokenPipeError) or # noqa: F821 + (exc_class is OSError and + exc.errno in (errno.EINVAL, errno.EPIPE))) +elif PY2: + def _is_broken_pipe_error(exc_class, exc): + """See the docstring for non-Windows Python 3 below.""" + return (exc_class is IOError and exc.errno == errno.EPIPE) +else: + # Then we are in the non-Windows Python 3 case. + def _is_broken_pipe_error(exc_class, exc): + """ + Return whether an exception is a broken pipe error. + + Args: + exc_class: an exception class. + exc: an exception instance. + """ + return (exc_class is BrokenPipeError) # noqa: F821 + + +@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 __init__(self, *args, **kwargs): + """ + A logging.Formatter obeying containing indent_log contexts. + + :param add_timestamp: A bool indicating output lines should be prefixed + with their record's timestamp. + """ + self.add_timestamp = kwargs.pop("add_timestamp", False) + super(IndentingFormatter, self).__init__(*args, **kwargs) + + def format(self, record): + """ + Calls the standard formatter, but will indent all of the log messages + by our current indentation level. + """ + formatted = super(IndentingFormatter, self).format(record) + prefix = '' + if self.add_timestamp: + prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") + prefix += " " * get_indentation() + formatted = "".join([ + prefix + 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 _using_stdout(self): + """ + Return whether the handler is using sys.stdout. + """ + if WINDOWS and colorama: + # Then self.stream is an AnsiToWin32 object. + return self.stream.wrapped is sys.stdout + + return self.stream is sys.stdout + + 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 ANSI 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 + + # The logging module says handleError() can be customized. + def handleError(self, record): + exc_class, exc = sys.exc_info()[:2] + # If a broken pipe occurred while calling write() or flush() on the + # stdout stream in logging's Handler.emit(), then raise our special + # exception so we can handle it in main() instead of logging the + # broken pipe error and continuing. + if (exc_class and self._using_stdout() and + _is_broken_pipe_error(exc_class, exc)): + raise BrokenStdoutLoggingError() + + return super(ColorizedStreamHandler, self).handleError(record) + + +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 + + +def setup_logging(verbosity, no_color, user_log_file): + """Configures and sets up all of the logging + + Returns the requested logging level, as its integer value. + """ + + # Determine the level to be logging at. + if verbosity >= 1: + level = "DEBUG" + elif verbosity == -1: + level = "WARNING" + elif verbosity == -2: + level = "ERROR" + elif verbosity <= -3: + level = "CRITICAL" + else: + level = "INFO" + + level_number = getattr(logging, level) + + # The "root" logger should match the "console" level *unless* we also need + # to log to a user log file. + include_user_log = user_log_file is not None + if include_user_log: + additional_log_file = user_log_file + root_level = "DEBUG" + else: + additional_log_file = "/dev/null" + root_level = level + + # Disable any logging besides WARNING unless we have DEBUG level logging + # enabled for vendored libraries. + vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" + + # Shorthands for clarity + log_streams = { + "stdout": "ext://sys.stdout", + "stderr": "ext://sys.stderr", + } + handler_classes = { + "stream": "pip._internal.utils.logging.ColorizedStreamHandler", + "file": "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", + }, + "indent_with_timestamp": { + "()": IndentingFormatter, + "format": "%(message)s", + "add_timestamp": True, + }, + }, + "handlers": { + "console": { + "level": level, + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stdout"], + "filters": ["exclude_warnings"], + "formatter": "indent", + }, + "console_errors": { + "level": "WARNING", + "class": handler_classes["stream"], + "no_color": no_color, + "stream": log_streams["stderr"], + "formatter": "indent", + }, + "user_log": { + "level": "DEBUG", + "class": handler_classes["file"], + "filename": additional_log_file, + "delay": True, + "formatter": "indent_with_timestamp", + }, + }, + "root": { + "level": root_level, + "handlers": ["console", "console_errors"] + ( + ["user_log"] if include_user_log else [] + ), + }, + "loggers": { + "pip._vendor": { + "level": vendored_log_level + } + }, + }) + + return level_number diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py new file mode 100644 index 0000000..84605ee --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py @@ -0,0 +1,1040 @@ +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._vendor.six.moves.urllib import parse as urllib_parse +from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote + +from pip._internal.exceptions import CommandError, InstallationError +from pip._internal.locations import ( + running_under_virtualenv, site_packages, user_site, virtualenv_no_global, + write_delete_marker_file, +) +from pip._internal.utils.compat import ( + WINDOWS, console_to_str, expanduser, stdlib_pkgs, +) +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if PY2: + from io import BytesIO as StringIO +else: + from io import StringIO + +if MYPY_CHECK_RUNNING: + from typing import ( # noqa: F401 + Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, + AnyStr, Container + ) + from pip._vendor.pkg_resources import Distribution # noqa: F401 + from pip._internal.models.link import Link # noqa: F401 + from pip._internal.utils.ui import SpinnerInterface # noqa: F401 + + +__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', 'WHEEL_EXTENSION', + 'get_installed_version', 'remove_auth_from_url'] + + +logger = std_logging.getLogger(__name__) + +WHEEL_EXTENSION = '.whl' +BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') +XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') +ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) +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 ensure_dir(path): + # type: (AnyStr) -> None + """os.path.makedirs without EEXIST.""" + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + +def get_prog(): + # type: () -> str + 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): + # type: (str, bool) -> None + 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): + # type: (Union[str, Text]) -> str + """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'): + # type: (str, str) -> str + """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): + # type: (str, Iterable[str]) -> str + for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): + if action in options: + return action + return ask(message, options) + + +def ask(message, options): + # type: (str, Iterable[str]) -> str + """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): + # type: (float) -> str + 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): + # type: (str) -> bool + """Is path is a directory containing setup.py or pyproject.toml? + """ + if not os.path.isdir(path): + return False + setup_py = os.path.join(path, 'setup.py') + if os.path.isfile(setup_py): + return True + pyproject_toml = os.path.join(path, 'pyproject.toml') + if os.path.isfile(pyproject_toml): + return True + return False + + +def is_svn_page(html): + # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] + """ + 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): + # type: (str) -> Text + 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): + # type: (Union[str, Text]) -> List[Union[str, Text]] + 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): + # type: (Iterable[Union[str, Text]]) -> bool + """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): + # type: (str, bool) -> str + """ + 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): + # type: (str) -> Tuple[str, str] + """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): + # type: (str, str) -> None + """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): + # type: (str) -> bool + """ + 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): + # type: (Distribution) -> bool + """ + 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): + # type: (Distribution) -> bool + """ + 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): + # type: (Distribution) -> bool + """ + 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): + # type: (Distribution) -> bool + """ + Return True if given Distribution is 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): + # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] + """ + 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 + + # because of pkg_resources vendoring, mypy cannot find stub in typeshed + return [d for d in pkg_resources.working_set # type: ignore + 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): + # type: (Distribution) -> Optional[str] + """ + 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 + return None + + +def dist_location(dist): + # type: (Distribution) -> str + """ + 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): + # type: (str, str, bool) -> None + """ + 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 + 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) + # Don't use read() to avoid allocating an arbitrarily large + # chunk of memory for the file's content + fp = zip.open(name) + try: + with open(fn, 'wb') as destfp: + shutil.copyfileobj(fp, destfp) + 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): + # type: (str, str) -> None + """ + 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: + leading = has_leading_dir([ + member.name for member in tar.getmembers() + ]) + for member in tar.getmembers(): + fn = member.name + if leading: + # https://github.com/python/mypy/issues/1174 + fn = split_leading_dir(fn)[1] # type: ignore + path = os.path.join(location, fn) + if member.isdir(): + ensure_dir(path) + elif member.issym(): + try: + # https://github.com/python/typeshed/issues/2673 + tar._extract_member(member, path) # type: ignore + 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) + # https://github.com/python/typeshed/issues/2673 + tar.utime(member, path) # type: ignore + # 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, # type: str + location, # type: str + content_type, # type: Optional[str] + link # type: Optional[Link] +): + # type: (...) -> None + 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, # type: List[str] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + unset_environ=None, # type: Optional[Iterable[str]] + spinner=None # type: Optional[SpinnerInterface] +): + # type: (...) -> Optional[Text] + """ + Args: + extra_ok_returncodes: an iterable of integer return codes that are + acceptable, in addition to 0. Defaults to None, which means []. + unset_environ: an iterable of environment variable names to unset + prior to calling subprocess.Popen(). + """ + if extra_ok_returncodes is None: + extra_ok_returncodes = [] + 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 and proc.returncode not in extra_ok_returncodes: + 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) + return None + + +def read_text_file(filename): + # type: (str) -> str + """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: + # https://github.com/python/mypy/issues/1174 + data = data.decode(enc) # type: ignore + except UnicodeDecodeError: + continue + break + + assert not isinstance(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') + + +def captured_stderr(): + """ + See captured_stdout(). + """ + return captured_output('stderr') + + +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, working_set=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) + + if working_set is None: + # We want to avoid having this cached, so we need to construct a new + # working set each time. + working_set = pkg_resources.WorkingSet() + + # 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) + + +def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): + """ + Return the URL for a VCS requirement. + + Args: + repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). + project_name: the (unescaped) project name. + """ + egg_project_name = pkg_resources.to_filename(project_name) + req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) + if subdir: + req += '&subdirectory={}'.format(subdir) + + return req + + +def split_auth_from_netloc(netloc): + """ + Parse out and remove the auth information from a netloc. + + Returns: (netloc, (username, password)). + """ + if '@' not in netloc: + return netloc, (None, None) + + # Split from the right because that's how urllib.parse.urlsplit() + # behaves if more than one @ is present (which can be checked using + # the password attribute of urlsplit()'s return value). + auth, netloc = netloc.rsplit('@', 1) + if ':' in auth: + # Split from the left because that's how urllib.parse.urlsplit() + # behaves if more than one : is present (which again can be checked + # using the password attribute of the return value) + user_pass = auth.split(':', 1) + else: + user_pass = auth, None + + user_pass = tuple( + None if x is None else urllib_unquote(x) for x in user_pass + ) + + return netloc, user_pass + + +def redact_netloc(netloc): + # type: (str) -> str + """ + Replace the password in a netloc with "****", if it exists. + + For example, "user:pass@example.com" returns "user:****@example.com". + """ + netloc, (user, password) = split_auth_from_netloc(netloc) + if user is None: + return netloc + password = '' if password is None else ':****' + return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), + password=password, + netloc=netloc) + + +def _transform_url(url, transform_netloc): + purl = urllib_parse.urlsplit(url) + netloc = transform_netloc(purl.netloc) + # stripped url + url_pieces = ( + purl.scheme, netloc, purl.path, purl.query, purl.fragment + ) + surl = urllib_parse.urlunsplit(url_pieces) + return surl + + +def _get_netloc(netloc): + return split_auth_from_netloc(netloc)[0] + + +def remove_auth_from_url(url): + # type: (str) -> str + # 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. + return _transform_url(url, _get_netloc) + + +def redact_password_from_url(url): + # type: (str) -> str + """Replace the password in a given url with ****.""" + return _transform_url(url, redact_netloc) + + +def protect_pip_from_modification_on_windows(modifying_pip): + """Protection of pip.exe from modification on Windows + + On Windows, any operation modifying pip should be run as: + python -m pip ... + """ + pip_names = [ + "pip.exe", + "pip{}.exe".format(sys.version_info[0]), + "pip{}.{}.exe".format(*sys.version_info[:2]) + ] + + # See https://github.com/pypa/pip/issues/1299 for more discussion + should_show_use_python_msg = ( + modifying_pip and + WINDOWS and + os.path.basename(sys.argv[0]) in pip_names + ) + + 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)) + ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py new file mode 100644 index 0000000..d5cb80a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py @@ -0,0 +1,40 @@ +"""Utilities for defining models +""" + +import operator + + +class KeyBasedCompareMixin(object): + """Provides comparision capabilities that is based on a key + """ + + def __init__(self, key, defining_class): + self._compare_key = key + self._defining_class = defining_class + + def __hash__(self): + return hash(self._compare_key) + + def __lt__(self, other): + return self._compare(other, operator.__lt__) + + def __le__(self, other): + return self._compare(other, operator.__le__) + + def __gt__(self, other): + return self._compare(other, operator.__gt__) + + def __ge__(self, other): + return self._compare(other, operator.__ge__) + + def __eq__(self, other): + return self._compare(other, operator.__eq__) + + def __ne__(self, other): + return self._compare(other, operator.__ne__) + + def _compare(self, other, method): + if not isinstance(other, self._defining_class): + return NotImplemented + + return method(self._compare_key, other._compare_key) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py new file mode 100644 index 0000000..37c47a4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py @@ -0,0 +1,164 @@ +from __future__ import absolute_import + +import datetime +import json +import logging +import os.path +import sys + +from pip._vendor import lockfile, pkg_resources +from pip._vendor.packaging import version as packaging_version + +from pip._internal.index import PackageFinder +from pip._internal.utils.compat import WINDOWS +from pip._internal.utils.filesystem import check_path_owner +from pip._internal.utils.misc import ensure_dir, get_installed_version +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + import optparse # noqa: F401 + from typing import Any, Dict # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + + +SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" + + +logger = logging.getLogger(__name__) + + +class SelfCheckState(object): + def __init__(self, cache_dir): + # type: (str) -> None + self.state = {} # type: Dict[str, Any] + self.statefile_path = None + + # Try to load the existing state + if cache_dir: + self.statefile_path = os.path.join(cache_dir, "selfcheck.json") + try: + with open(self.statefile_path) as statefile: + self.state = json.load(statefile)[sys.prefix] + except (IOError, ValueError, KeyError): + # Explicitly suppressing exceptions, since we don't want to + # error out if the cache file is invalid. + pass + + def save(self, pypi_version, current_time): + # type: (str, datetime.datetime) -> None + # If we do not have a path to cache in, don't bother saving. + if not self.statefile_path: + return + + # 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 was_installed_by_pip(pkg): + # type: (str) -> bool + """Checks whether pkg was installed by pip + + This is used not to display the upgrade message when pip is in fact + installed by system package manager, such as dnf on Fedora. + """ + try: + dist = pkg_resources.get_distribution(pkg) + return (dist.has_metadata('INSTALLER') and + 'pip' in dist.get_metadata_lines('INSTALLER')) + except pkg_resources.DistributionNotFound: + return False + + +def pip_version_check(session, options): + # type: (PipSession, optparse.Values) -> None + """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 = SelfCheckState(cache_dir=options.cache_dir) + + 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, + 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 and + was_installed_by_pip('pip')): + # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py new file mode 100644 index 0000000..7aaf7b5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py @@ -0,0 +1,85 @@ +from __future__ import absolute_import + +import logging +import sys +from email.parser import FeedParser + +from pip._vendor import pkg_resources +from pip._vendor.packaging import specifiers, version + +from pip._internal import exceptions +from pip._internal.utils.misc import display_path +from pip._internal.utils.typing import MYPY_CHECK_RUNNING + +if MYPY_CHECK_RUNNING: + from typing import Optional # noqa: F401 + from email.message import Message # noqa: F401 + from pip._vendor.pkg_resources import Distribution # noqa: F401 + + +logger = logging.getLogger(__name__) + + +def check_requires_python(requires_python): + # type: (Optional[str]) -> bool + """ + 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): + # type: (Distribution) -> Message + if (isinstance(dist, pkg_resources.DistInfoDistribution) and + dist.has_metadata('METADATA')): + metadata = dist.get_metadata('METADATA') + elif dist.has_metadata('PKG-INFO'): + metadata = dist.get_metadata('PKG-INFO') + else: + logger.warning("No metadata found in %s", display_path(dist.location)) + metadata = '' + + feed_parser = FeedParser() + feed_parser.feed(metadata) + return feed_parser.close() + + +def check_dist_requires_python(dist): + pkg_info_dict = get_metadata(dist) + 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): + # type: (Distribution) -> str + if dist.has_metadata('INSTALLER'): + for line in dist.get_metadata_lines('INSTALLER'): + if line.strip(): + return line.strip() + return '' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py new file mode 100644 index 0000000..03973e9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py new file mode 100644 index 0000000..2c81ad5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py @@ -0,0 +1,155 @@ +from __future__ import absolute_import + +import errno +import itertools +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 its 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 + + +class AdjacentTempDirectory(TempDirectory): + """Helper class that creates a temporary directory adjacent to a real one. + + Attributes: + original + The original directory to create a temp directory for. + path + After calling create() or entering, contains the full + path to the temporary directory. + delete + Whether the directory should be deleted when exiting + (when used as a contextmanager) + + """ + # The characters that may be used to name the temp directory + # We always prepend a ~ and then rotate through these until + # a usable name is found. + # pkg_resources raises a different error for .dist-info folder + # with leading '-' and invalid metadata + LEADING_CHARS = "-~.=%0123456789" + + def __init__(self, original, delete=None): + super(AdjacentTempDirectory, self).__init__(delete=delete) + self.original = original.rstrip('/\\') + + @classmethod + def _generate_names(cls, name): + """Generates a series of temporary names. + + The algorithm replaces the leading characters in the name + with ones that are valid filesystem characters, but are not + valid package names (for both Python and pip definitions of + package). + """ + for i in range(1, len(name)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i - 1): + new_name = '~' + ''.join(candidate) + name[i:] + if new_name != name: + yield new_name + + # If we make it this far, we will have to make a longer name + for i in range(len(cls.LEADING_CHARS)): + for candidate in itertools.combinations_with_replacement( + cls.LEADING_CHARS, i): + new_name = '~' + ''.join(candidate) + name + if new_name != name: + yield new_name + + def create(self): + root, name = os.path.split(self.original) + for candidate in self._generate_names(name): + path = os.path.join(root, candidate) + try: + os.mkdir(path) + except OSError as ex: + # Continue if the name exists already + if ex.errno != errno.EEXIST: + raise + else: + self.path = os.path.realpath(path) + break + + if not self.path: + # Final fallback on the default behavior. + self.path = os.path.realpath( + tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) + ) + logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py new file mode 100644 index 0000000..e085cdf --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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._internal.utils.typing import MYPY_CHECK_RUNNING + + if MYPY_CHECK_RUNNING: + from typing import ... # noqa: F401 + +Ref: https://github.com/python/mypy/issues/3216 +""" + +MYPY_CHECK_RUNNING = False diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py new file mode 100644 index 0000000..433675d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py @@ -0,0 +1,441 @@ +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.utils.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, Iterator, IO # noqa: F401 + +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): + 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): + # type: (IO) -> Iterator[None] + # 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): + # type: (float) -> None + self._min_update_interval_seconds = min_update_interval_seconds + self._last_update = 0 # type: float + + def ready(self): + # type: () -> bool + now = time.time() + delta = now - self._last_update + return delta >= self._min_update_interval_seconds + + def reset(self): + # type: () -> None + self._last_update = time.time() + + +class SpinnerInterface(object): + def spin(self): + # type: () -> None + raise NotImplementedError() + + def finish(self, final_status): + # type: (str) -> None + raise NotImplementedError() + + +class InteractiveSpinner(SpinnerInterface): + 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): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._write(next(self._spin_cycle)) + + def finish(self, final_status): + # type: (str) -> None + 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(SpinnerInterface): + def __init__(self, message, min_update_interval_seconds=60): + # type: (str, float) -> None + 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): + # type: () -> None + if self._finished: + return + if not self._rate_limiter.ready(): + return + self._update("still running...") + + def finish(self, final_status): + # type: (str) -> None + if self._finished: + return + self._update("finished with status '%s'" % (final_status,)) + self._finished = True + + +@contextlib.contextmanager +def open_spinner(message): + # type: (str) -> Iterator[SpinnerInterface] + # 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) # type: SpinnerInterface + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py new file mode 100644 index 0000000..9cba764 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py @@ -0,0 +1,534 @@ +"""Handles all VCS (version control) support""" +from __future__ import absolute_import + +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 ( # noqa: F401 + Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type + ) + from pip._internal.utils.ui import SpinnerInterface # noqa: F401 + + AuthInfo = Tuple[Optional[str], Optional[str]] + +__all__ = ['vcs'] + + +logger = logging.getLogger(__name__) + + +class RemoteNotFoundError(Exception): + pass + + +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): + # type: (VersionControl, Optional[str], Optional[List[str]]) -> 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): + # type: () -> Optional[str] + if self.rev is None: + return self.vcs.default_arg_rev + + return self.rev + + def to_args(self): + # type: () -> List[str] + """ + Return the VCS-specific command arguments. + """ + args = [] # type: List[str] + 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): + # type: () -> str + if not self.rev: + return '' + + return ' (to revision {})'.format(self.rev) + + def make_new(self, rev): + # type: (str) -> RevOptions + """ + 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, Type[VersionControl]] + schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] + + def __init__(self): + # type: () -> None + # 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): + # type: () -> List[Type[VersionControl]] + return list(self._registry.values()) + + @property + def dirnames(self): + # type: () -> List[str] + return [backend.dirname for backend in self.backends] + + @property + def all_schemes(self): + # type: () -> List[str] + schemes = [] # type: List[str] + for backend in self.backends: + schemes.extend(backend.schemes) + return schemes + + def register(self, cls): + # type: (Type[VersionControl]) -> None + 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): + # type: (Optional[Type[VersionControl]], Optional[str]) -> 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_type(self, location): + # type: (str) -> Optional[Type[VersionControl]] + """ + Return the type of the version control backend if found at given + location, e.g. vcs.get_backend_type('/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 + return None + + def get_backend(self, name): + # type: (str) -> Optional[Type[VersionControl]] + name = name.lower() + if name in self._registry: + return self._registry[name] + return None + + +vcs = VcsSupport() + + +class VersionControl(object): + name = '' + dirname = '' + repo_name = '' + # 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): + # type: (Optional[str], Optional[List[str]]) -> RevOptions + """ + 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) + + @classmethod + def _is_local_repository(cls, repo): + # type: (str) -> bool + """ + 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 bool(drive) + + 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_netloc_and_auth(self, netloc, scheme): + """ + Parse the repository URL's netloc, and return the new netloc to use + along with auth information. + + Args: + netloc: the original repository URL netloc. + scheme: the repository URL's scheme without the vcs prefix. + + This is mainly for the Subversion class to override, so that auth + information can be provided via the --username and --password options + instead of through the URL. For other subclasses like Git without + such an option, auth information must stay in the URL. + + Returns: (netloc, (username, password)). + """ + return netloc, (None, None) + + def get_url_rev_and_auth(self, url): + # type: (str) -> Tuple[str, Optional[str], AuthInfo] + """ + Parse the repository URL to use, and return the URL, revision, + and auth info to use. + + Returns: (url, rev, (username, password)). + """ + scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) + if '+' not in scheme: + raise ValueError( + "Sorry, {!r} is a malformed VCS url. " + "The format is <vcs>+<protocol>://<url>, " + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + ) + # Remove the vcs prefix. + scheme = scheme.split('+', 1)[1] + netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) + rev = None + if '@' in path: + path, rev = path.rsplit('@', 1) + url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) + return url, rev, user_pass + + def make_rev_args(self, username, password): + """ + Return the RevOptions "extra arguments" to use in obtain(). + """ + return [] + + def get_url_rev_options(self, url): + # type: (str) -> Tuple[str, RevOptions] + """ + Return the URL and RevOptions object to use in obtain() and in + some cases export(), as a tuple (url, rev_options). + """ + url, rev, user_pass = self.get_url_rev_and_auth(url) + username, password = user_pass + extra_args = self.make_rev_args(username, password) + rev_options = self.make_rev_options(rev, extra_args=extra_args) + + return url, rev_options + + def normalize_url(self, url): + # type: (str) -> str + """ + 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): + # type: (str, str) -> bool + """ + Compare two repo URLs for identity, ignoring incidental differences. + """ + return (self.normalize_url(url1) == self.normalize_url(url2)) + + def fetch_new(self, dest, url, rev_options): + """ + Fetch a revision from a repository, in the case that this is the + first fetch from the repository. + + Args: + dest: the directory to fetch the repository to. + rev_options: a RevOptions object. + """ + 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, url, 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 obtain(self, dest): + # type: (str) -> None + """ + Install or update in editable mode the package represented by this + VersionControl object. + + Args: + dest: the repository directory in which to install or update. + """ + url, rev_options = self.get_url_rev_options(self.url) + + if not os.path.exists(dest): + self.fetch_new(dest, url, rev_options) + return + + rev_display = rev_options.to_display() + if self.is_repository_directory(dest): + existing_url = self.get_remote_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, url, rev_options) + else: + logger.info('Skipping because already up-to-date.') + return + + 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, + ) + # https://github.com/python/mypy/issues/1174 + prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore + ('i', 'w', 'b')) + + 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 == 'a': + sys.exit(-1) + + if response == 'w': + logger.warning('Deleting %s', display_path(dest)) + rmtree(dest) + self.fetch_new(dest, url, rev_options) + return + + if response == 'b': + dest_dir = backup_dir(dest) + logger.warning( + 'Backing up %s to %s', display_path(dest), dest_dir, + ) + shutil.move(dest, dest_dir) + self.fetch_new(dest, url, rev_options) + return + + # Do nothing if the response is "i". + 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) + + def unpack(self, location): + # type: (str) -> None + """ + Clean up current location and download the url repository + (and vcs infos) into location + """ + if os.path.exists(location): + rmtree(location) + self.obtain(location) + + @classmethod + def get_src_requirement(cls, location, project_name): + """ + 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 + + @classmethod + def get_remote_url(cls, location): + """ + Return the url used at location + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + raise NotImplementedError + + @classmethod + def get_revision(cls, location): + """ + Return the current commit id of the files at the given location. + """ + raise NotImplementedError + + @classmethod + def run_command( + cls, + cmd, # type: List[str] + show_stdout=True, # type: bool + cwd=None, # type: Optional[str] + on_returncode='raise', # type: str + extra_ok_returncodes=None, # type: Optional[Iterable[int]] + command_desc=None, # type: Optional[str] + extra_environ=None, # type: Optional[Mapping[str, Any]] + spinner=None # type: Optional[SpinnerInterface] + ): + # type: (...) -> Optional[Text] + """ + 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 = [cls.name] + cmd + try: + return call_subprocess(cmd, show_stdout, cwd, + on_returncode=on_returncode, + extra_ok_returncodes=extra_ok_returncodes, + command_desc=command_desc, + extra_environ=extra_environ, + unset_environ=cls.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?' % (cls.name, cls.name)) + else: + raise # re-raise exception if a different error occurred + + @classmethod + def is_repository_directory(cls, path): + # type: (str) -> bool + """ + Return whether a directory path is a repository directory. + """ + logger.debug('Checking in %s for %s (%s)...', + path, cls.dirname, cls.name) + return os.path.exists(os.path.join(path, cls.dirname)) + + @classmethod + def controls_location(cls, location): + # type: (str) -> bool + """ + Check if a location is controlled by the vcs. + It is meant to be overridden to implement smarter detection + mechanisms for specific vcs. + + This can do more than is_repository_directory() alone. For example, + the Git override checks that Git is actually available. + """ + return cls.is_repository_directory(location) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py new file mode 100644 index 0000000..4c6ac79 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py @@ -0,0 +1,114 @@ +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, make_vcs_requirement_url, 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 fetch_new(self, 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 switch(self, dest, url, rev_options): + self.run_command(['switch', url], cwd=dest) + + def update(self, dest, url, rev_options): + cmd_args = ['pull', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it + url, rev, user_pass = super(Bazaar, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'bzr+' + url + return url, rev, user_pass + + @classmethod + def get_remote_url(cls, location): + urls = cls.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 cls._is_local_repository(repo): + return path_to_url(repo) + return repo + return None + + @classmethod + def get_revision(cls, location): + revision = cls.run_command( + ['revno'], show_stdout=False, cwd=location, + ) + return revision.splitlines()[-1] + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo: + return None + if not repo.lower().startswith('bzr:'): + repo = 'bzr+' + repo + current_rev = cls.get_revision(location) + return make_vcs_requirement_url(repo, current_rev, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py new file mode 100644 index 0000000..dd2bd61 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py @@ -0,0 +1,369 @@ +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.exceptions import BadCommand +from pip._internal.utils.compat import samefile +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, redact_password_from_url, +) +from pip._internal.utils.temp_dir import TempDirectory +from pip._internal.vcs import RemoteNotFoundError, 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 https://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 get_current_branch(self, location): + """ + Return the current branch, or None if HEAD isn't at a branch + (e.g. detached HEAD). + """ + # git-symbolic-ref exits with empty stdout if "HEAD" is a detached + # HEAD rather than a symbolic ref. In addition, the -q causes the + # command to exit with status code 1 instead of 128 in this case + # and to suppress the message to stderr. + args = ['symbolic-ref', '-q', 'HEAD'] + output = self.run_command( + args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + ref = output.strip() + + if ref.startswith('refs/heads/'): + return ref[len('refs/heads/'):] + + return None + + 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 (sha_or_none, is_branch), where sha_or_none is a commit hash + if the revision names a remote branch or tag, otherwise 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) + + sha = refs.get(branch_ref) + if sha is not None: + return (sha, True) + + sha = refs.get(tag_ref) + + return (sha, False) + + def resolve_revision(self, dest, url, rev_options): + """ + Resolve a revision to a new RevOptions object with the SHA1 of the + branch, tag, or ref if found. + + Args: + rev_options: a RevOptions object. + """ + rev = rev_options.arg_rev + sha, is_branch = self.get_revision_sha(dest, rev) + + if sha is not None: + rev_options = rev_options.make_new(sha) + rev_options.branch_name = rev if is_branch else None + + return rev_options + + # 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, + ) + + if not rev.startswith('refs/'): + return rev_options + + # If it looks like a ref, we have to fetch it explicitly. + self.run_command( + ['fetch', '-q', url] + rev_options.to_args(), + cwd=dest, + ) + # Change the revision to the SHA of the ref we fetched + sha = self.get_revision(dest, rev='FETCH_HEAD') + rev_options = rev_options.make_new(sha) + + 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 fetch_new(self, dest, url, rev_options): + rev_display = rev_options.to_display() + logger.info( + 'Cloning %s%s to %s', redact_password_from_url(url), + rev_display, display_path(dest), + ) + self.run_command(['clone', '-q', url, dest]) + + if rev_options.rev: + # Then a specific revision was requested. + rev_options = self.resolve_revision(dest, url, rev_options) + branch_name = getattr(rev_options, 'branch_name', None) + if branch_name is None: + # 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): + cmd_args = ['checkout', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + elif self.get_current_branch(dest) != branch_name: + # Then a specific branch was requested, and that branch + # is not yet checked out. + track_branch = 'origin/{}'.format(branch_name) + cmd_args = [ + 'checkout', '-b', branch_name, '--track', track_branch, + ] + self.run_command(cmd_args, cwd=dest) + + #: repo may contain submodules + self.update_submodules(dest) + + 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, url, 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.resolve_revision(dest, url, rev_options) + cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + #: update submodules + self.update_submodules(dest) + + @classmethod + def get_remote_url(cls, location): + """ + Return URL of the first remote encountered. + + Raises RemoteNotFoundError if the repository does not have a remote + url configured. + """ + # We need to pass 1 for extra_ok_returncodes since the command + # exits with return code 1 if there are no matching lines. + stdout = cls.run_command( + ['config', '--get-regexp', r'remote\..*\.url'], + extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, + ) + remotes = stdout.splitlines() + try: + found_remote = remotes[0] + except IndexError: + raise RemoteNotFoundError + + for remote in remotes: + if remote.startswith('remote.origin.url '): + found_remote = remote + break + url = found_remote.split(' ')[1] + return url.strip() + + @classmethod + def get_revision(cls, location, rev=None): + if rev is None: + rev = 'HEAD' + current_rev = cls.run_command( + ['rev-parse', rev], show_stdout=False, cwd=location, + ) + return current_rev.strip() + + @classmethod + def _get_subdirectory(cls, location): + """Return the relative path of setup.py to the git repo root.""" + # find the repo root + git_dir = cls.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) + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo.lower().startswith('git:'): + repo = 'git+' + repo + current_rev = cls.get_revision(location) + subdir = cls._get_subdirectory(location) + req = make_vcs_requirement_url(repo, current_rev, project_name, + subdir=subdir) + + return req + + def get_url_rev_and_auth(self, url): + """ + Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. + That's required because although they use SSH they sometimes don'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 url: + assert 'file:' not in url + url = url.replace('git+', 'git+ssh://') + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + url = url.replace('ssh://', '') + else: + url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) + + return url, rev, user_pass + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py new file mode 100644 index 0000000..26e75de --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py @@ -0,0 +1,103 @@ +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, make_vcs_requirement_url +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 fetch_new(self, 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 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, url, rev_options): + self.run_command(['pull', '-q'], cwd=dest) + cmd_args = ['update', '-q'] + rev_options.to_args() + self.run_command(cmd_args, cwd=dest) + + @classmethod + def get_remote_url(cls, location): + url = cls.run_command( + ['showconfig', 'paths.default'], + show_stdout=False, cwd=location).strip() + if cls._is_local_repository(url): + url = path_to_url(url) + return url.strip() + + @classmethod + def get_revision(cls, location): + current_revision = cls.run_command( + ['parents', '--template={rev}'], + show_stdout=False, cwd=location).strip() + return current_revision + + @classmethod + def get_revision_hash(cls, location): + current_rev_hash = cls.run_command( + ['parents', '--template={node}'], + show_stdout=False, cwd=location).strip() + return current_rev_hash + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if not repo.lower().startswith('hg:'): + repo = 'hg+' + repo + current_rev_hash = cls.get_revision_hash(location) + return make_vcs_requirement_url(repo, current_rev_hash, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py new file mode 100644 index 0000000..42ac5ac --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py @@ -0,0 +1,200 @@ +from __future__ import absolute_import + +import logging +import os +import re + +from pip._internal.utils.logging import indent_log +from pip._internal.utils.misc import ( + display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, +) +from pip._internal.vcs import VersionControl, vcs + +_svn_xml_url_re = re.compile('url="([^"]+)"') +_svn_rev_re = re.compile(r'committed-rev="(\d+)"') +_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 export(self, location): + """Export the svn repository at the url to the destination location""" + url, rev_options = self.get_url_rev_options(self.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 fetch_new(self, 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 switch(self, dest, url, rev_options): + cmd_args = ['switch'] + rev_options.to_args() + [url, dest] + self.run_command(cmd_args) + + def update(self, dest, url, rev_options): + cmd_args = ['update'] + rev_options.to_args() + [dest] + self.run_command(cmd_args) + + @classmethod + def get_revision(cls, 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 cls.dirname not in dirs: + dirs[:] = [] + continue # no sense walking uncontrolled subdirs + dirs.remove(cls.dirname) + entries_fn = os.path.join(base, cls.dirname, 'entries') + if not os.path.exists(entries_fn): + # FIXME: should we warn? + continue + + dirurl, localrev = cls._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_netloc_and_auth(self, netloc, scheme): + """ + This override allows the auth information to be passed to svn via the + --username and --password options instead of via the URL. + """ + if scheme == 'ssh': + # The --username and --password options can't be used for + # svn+ssh URLs, so keep the auth information in the URL. + return super(Subversion, self).get_netloc_and_auth( + netloc, scheme) + + return split_auth_from_netloc(netloc) + + def get_url_rev_and_auth(self, url): + # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it + url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) + if url.startswith('ssh://'): + url = 'svn+' + url + return url, rev, user_pass + + def make_rev_args(self, username, password): + extra_args = [] + if username: + extra_args += ['--username', username] + if password: + extra_args += ['--password', password] + + return extra_args + + @classmethod + def get_remote_url(cls, 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 cls._get_svn_url_rev(location)[0] + + @classmethod + def _get_svn_url_rev(cls, location): + from pip._internal.exceptions import InstallationError + + entries_path = os.path.join(location, cls.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 = cls.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 + + @classmethod + def get_src_requirement(cls, location, project_name): + repo = cls.get_remote_url(location) + if repo is None: + return None + repo = 'svn+' + repo + rev = cls.get_revision(location) + return make_vcs_requirement_url(repo, rev, project_name) + + def is_commit_id_equal(self, dest, name): + """Always assume the versions don't match""" + return False + + +vcs.register(Subversion) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py new file mode 100644 index 0000000..67bcc7f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py @@ -0,0 +1,1095 @@ +""" +Support for installing and building the "wheel" binary package format. +""" +from __future__ import absolute_import + +import collections +import compileall +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.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.models.link import Link +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 ( # noqa: F401 + Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, + Union, Iterable + ) + from pip._vendor.packaging.requirements import Requirement # noqa: F401 + from pip._internal.req.req_install import InstallRequirement # noqa: F401 + from pip._internal.download import PipSession # noqa: F401 + from pip._internal.index import FormatControl, PackageFinder # noqa: F401 + from pip._internal.operations.prepare import ( # noqa: F401 + RequirementPreparer + ) + from pip._internal.cache import WheelCache # noqa: F401 + from pip._internal.pep425tags import Pep425Tag # noqa: F401 + + InstalledCSVRow = Tuple[str, ...] + + +VERSION_COMPATIBLE = (1, 0) + + +logger = logging.getLogger(__name__) + + +def normpath(src, p): + return os.path.relpath(src, p).replace(os.path.sep, '/') + + +def rehash(path, blocksize=1 << 20): + # type: (str, int) -> Tuple[str, str] + """Return (hash, length) for path using hashlib.sha256()""" + h = hashlib.sha256() + 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('=') + # unicode/str python2 issues + return (digest, str(length)) # type: ignore + + +def open_for_csv(name, mode): + # type: (str, Text) -> IO + if sys.version_info[0] < 3: + nl = {} # type: Dict[str, Any] + bin = 'b' + else: + nl = {'newline': ''} # type: Dict[str, Any] + bin = '' + return open(name, mode + bin, **nl) + + +def replace_python_tag(wheelname, new_tag): + # type: (str, str) -> str + """Replace the Python tag in a wheel file name with a new value. + """ + parts = wheelname.split('-') + parts[-3] = new_tag + return '-'.join(parts) + + +def fix_script(path): + # type: (str) -> Optional[bool] + """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 + return None + + +dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) + \.dist-info$""", re.VERBOSE) + + +def root_is_purelib(name, wheeldir): + # type: (str, str) -> bool + """ + 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): + # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] + 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: (Sequence[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).rstrip(os.sep) for i in + os.environ.get("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 sorted_outrows(outrows): + # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] + """ + Return the given rows of a RECORD file in sorted order. + + Each row is a 3-tuple (path, hash, size) and corresponds to a record of + a RECORD file (see PEP 376 and PEP 427 for details). For the rows + passed to this function, the size can be an integer as an int or string, + or the empty string. + """ + # Normally, there should only be one row per path, in which case the + # second and third elements don't come into play when sorting. + # However, in cases in the wild where a path might happen to occur twice, + # we don't want the sort operation to trigger an error (but still want + # determinism). Since the third element can be an int or string, we + # coerce each element to a string to avoid a TypeError in this case. + # For additional background, see-- + # https://github.com/pypa/pip/issues/5868 + return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) + + +def get_csv_rows_for_installed( + old_csv_rows, # type: Iterable[List[str]] + installed, # type: Dict[str, str] + changed, # type: set + generated, # type: List[str] + lib_dir, # type: str +): + # type: (...) -> List[InstalledCSVRow] + """ + :param installed: A map from archive RECORD path to installation RECORD + path. + """ + installed_rows = [] # type: List[InstalledCSVRow] + for row in old_csv_rows: + if len(row) > 3: + logger.warning( + 'RECORD line has more than three elements: {}'.format(row) + ) + # Make a copy because we are mutating the row. + row = list(row) + old_path = row[0] + new_path = installed.pop(old_path, old_path) + row[0] = new_path + if new_path in changed: + digest, length = rehash(new_path) + row[1] = digest + row[2] = length + installed_rows.append(tuple(row)) + for f in generated: + digest, length = rehash(f) + installed_rows.append((normpath(f, lib_dir), digest, str(length))) + for f in installed: + installed_rows.append((installed[f], '', '')) + return installed_rows + + +def move_wheel_files( + name, # type: str + req, # type: Requirement + wheeldir, # type: str + user=False, # type: bool + home=None, # type: Optional[str] + root=None, # type: Optional[str] + pycompile=True, # type: bool + scheme=None, # type: Optional[Mapping[str, str]] + isolated=False, # type: bool + prefix=None, # type: Optional[str] + warn_script_location=True # type: bool +): + # type: (...) -> None + """Install a wheel""" + # TODO: Investigate and break this up. + # TODO: Look into moving this into a dedicated class for representing an + # installation. + + 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 = [] # type: List[str] + 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 = {} # type: Dict[str, str] + changed = set() + generated = [] # type: List[str] + + # 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 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) + + # copyfile (called below) truncates the destination if it + # exists and then writes the new contents. This is fine in most + # cases, but can cause a segfault if pip has loaded a shared + # object (e.g. from pyopenssl through its vendored urllib3) + # Since the shared object is mmap'd an attempt to call a + # symbol in it will then cause a segfault. Unlinking the file + # allows writing of new contents while allowing the process to + # continue to use the old copy. + if os.path.exists(destfile): + os.unlink(destfile) + + # 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, + } + # ignore type, because mypy disallows assigning to a method, + # see https://github.com/python/mypy/issues/2427 + maker._get_script_text = _get_script_text # type: ignore + 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.warning(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) + outrows = get_csv_rows_for_installed( + reader, installed=installed, changed=changed, + generated=generated, lib_dir=lib_dir, + ) + writer = csv.writer(record_out) + # Sort to simplify testing. + for row in sorted_outrows(outrows): + writer.writerow(row) + shutil.move(temp_record, record) + + +def wheel_version(source_dir): + # type: (Optional[str]) -> Optional[Tuple[int, ...]] + """ + Return the Wheel-Version of an extracted wheel, if possible. + + Otherwise, return None 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 Exception: + return None + + +def check_compatibility(version, name): + # type: (Optional[Tuple[int, ...]], str) -> None + """ + 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 class into the models sub-package + # 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): + # type: (str) -> None + """ + :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): + # type: (Optional[List[Pep425Tag]]) -> Optional[int] + """ + 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): + # type: (Optional[List[Pep425Tag]]) -> bool + """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)) + + +def _contains_egg_info( + s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): + """Determine whether the string looks like an egg_info. + + :param s: The string to parse. E.g. foo-2.1 + """ + return bool(_egg_info_re.search(s)) + + +def should_use_ephemeral_cache( + req, # type: InstallRequirement + format_control, # type: FormatControl + autobuilding, # type: bool + cache_available # type: bool +): + # type: (...) -> Optional[bool] + """ + Return whether to build an InstallRequirement object using the + ephemeral cache. + + :param cache_available: whether a cache directory is available for the + autobuilding=True case. + + :return: True or False to build the requirement with ephem_cache=True + or False, respectively; or None not to build the requirement. + """ + if req.constraint: + return None + if req.is_wheel: + if not autobuilding: + logger.info( + 'Skipping %s, due to already being wheel.', req.name, + ) + return None + if not autobuilding: + return False + + if req.editable or not req.source_dir: + return None + + if req.link and not req.link.is_artifact: + # VCS checkout. Build wheel just for this run. + return True + + if "binary" not in format_control.get_allowed_formats( + canonicalize_name(req.name)): + logger.info( + "Skipping bdist_wheel for %s, due to binaries " + "being disabled for it.", req.name, + ) + return None + + link = req.link + base, ext = link.splitext() + if cache_available and _contains_egg_info(base): + return False + + # Otherwise, build the wheel just for this run using the ephemeral + # cache since we are either in the case of e.g. a local directory, or + # no cache directory is available to use. + return True + + +def format_command( + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> str + """ + Format command information for logging. + """ + text = 'Command arguments: {}\n'.format(command_args) + + if not command_output: + text += 'Command output: None' + elif logger.getEffectiveLevel() > logging.DEBUG: + text += 'Command output: [use --verbose to show]' + else: + if not command_output.endswith('\n'): + command_output += '\n' + text += ( + 'Command output:\n{}' + '-----------------------------------------' + ).format(command_output) + + return text + + +def get_legacy_build_wheel_path( + names, # type: List[str] + temp_dir, # type: str + req, # type: InstallRequirement + command_args, # type: List[str] + command_output, # type: str +): + # type: (...) -> Optional[str] + """ + Return the path to the wheel in the temporary build directory. + """ + # Sort for determinism. + names = sorted(names) + if not names: + msg = ( + 'Legacy build of wheel for {!r} created no files.\n' + ).format(req.name) + msg += format_command(command_args, command_output) + logger.warning(msg) + return None + + if len(names) > 1: + msg = ( + 'Legacy build of wheel for {!r} created more than one file.\n' + 'Filenames (choosing first): {}\n' + ).format(req.name, names) + msg += format_command(command_args, command_output) + logger.warning(msg) + + return os.path.join(temp_dir, names[0]) + + +class WheelBuilder(object): + """Build wheels from a RequirementSet.""" + + def __init__( + self, + finder, # type: PackageFinder + preparer, # type: RequirementPreparer + wheel_cache, # type: WheelCache + build_options=None, # type: Optional[List[str]] + global_options=None, # type: Optional[List[str]] + no_clean=False # type: bool + ): + # type: (...) -> None + 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 req.use_pep517: + builder = self._build_one_pep517 + else: + builder = self._build_one_legacy + wheel_path = builder(req, temp_dir.path, python_tag=python_tag) + if wheel_path is not None: + wheel_name = os.path.basename(wheel_path) + dest_path = os.path.join(output_dir, wheel_name) + try: + shutil.move(wheel_path, dest_path) + logger.info('Stored in directory: %s', output_dir) + return dest_path + except Exception: + 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_pep517(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the PEP 517 build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + assert req.metadata_directory is not None + try: + req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) + logger.debug('Destination directory: %s', tempd) + wheel_name = req.pep517_backend.build_wheel( + tempd, + metadata_directory=req.metadata_directory + ) + if python_tag: + # General PEP 517 backends don't necessarily support + # a "--python-tag" option, so we rename the wheel + # file directly. + new_name = replace_python_tag(wheel_name, python_tag) + os.rename( + os.path.join(tempd, wheel_name), + os.path.join(tempd, new_name) + ) + # Reassign to simplify the return at the end of function + wheel_name = new_name + except Exception: + logger.error('Failed building wheel for %s', req.name) + return None + return os.path.join(tempd, wheel_name) + + def _build_one_legacy(self, req, tempd, python_tag=None): + """Build one InstallRequirement using the "legacy" build process. + + Returns path to wheel if successfully built. Otherwise, returns None. + """ + base_args = self._base_setup_args(req) + + spin_message = 'Building wheel for %s (setup.py)' % (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: + output = call_subprocess(wheel_args, cwd=req.setup_py_dir, + show_stdout=False, spinner=spinner) + except Exception: + spinner.finish("error") + logger.error('Failed building wheel for %s', req.name) + return None + names = os.listdir(tempd) + wheel_path = get_legacy_build_wheel_path( + names=names, + temp_dir=tempd, + req=req, + command_args=wheel_args, + command_output=output, + ) + return wheel_path + + 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 Exception: + logger.error('Failed cleaning build dir for %s', req.name) + return False + + def build( + self, + requirements, # type: Iterable[InstallRequirement] + session, # type: PipSession + autobuilding=False # type: bool + ): + # type: (...) -> List[InstallRequirement] + """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. + """ + buildset = [] + format_control = self.finder.format_control + # Whether a cache directory is available for autobuilding=True. + cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) + + for req in requirements: + ephem_cache = should_use_ephemeral_cache( + req, format_control=format_control, autobuilding=autobuilding, + cache_available=cache_available, + ) + if ephem_cache is None: + continue + + buildset.append((req, ephem_cache)) + + if not buildset: + return [] + + # Is any wheel build not using the ephemeral cache? + if any(not ephem_cache for _, ephem_cache in buildset): + have_directory_for_build = self._wheel_dir or ( + autobuilding and self.wheel_cache.cache_dir + ) + assert have_directory_for_build + + # TODO by @pradyunsg + # Should break up this method into 2 separate methods. + + # 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 = 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 a list of requirements that failed to build + return build_failure diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py new file mode 100644 index 0000000..b919b54 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py @@ -0,0 +1,111 @@ +""" +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("pep517") + 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") + vendored("urllib3") diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py new file mode 100644 index 0000000..2bd3911 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py new file mode 100644 index 0000000..8fdee66 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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.5" + +from .wrapper import CacheControl +from .adapter import CacheControlAdapter +from .controller import CacheController diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py new file mode 100644 index 0000000..f1e0ad9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py @@ -0,0 +1,57 @@ +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py new file mode 100644 index 0000000..780eb28 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py @@ -0,0 +1,133 @@ +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 = {"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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py new file mode 100644 index 0000000..94e0773 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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 NotImplementedError() + + def set(self, key, value): + raise NotImplementedError() + + def delete(self, key): + raise NotImplementedError() + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py new file mode 100644 index 0000000..0e1658f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py new file mode 100644 index 0000000..1ba0080 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py @@ -0,0 +1,146 @@ +import hashlib +import os +from textwrap import dedent + +from ..cache import BaseCache +from ..controller import CacheController + +try: + FileNotFoundError +except NameError: + # py2.X + FileNotFoundError = (IOError, 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) + try: + with open(name, "rb") as fh: + return fh.read() + + except FileNotFoundError: + return None + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py new file mode 100644 index 0000000..ed705ce --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -0,0 +1,33 @@ +from __future__ import division + +from datetime import datetime +from pip._vendor.cachecontrol.cache import BaseCache + + +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, int(expires.total_seconds()), 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py new file mode 100644 index 0000000..33b5aed --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py new file mode 100644 index 0000000..1b2b943 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py @@ -0,0 +1,367 @@ +""" +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(","): + if not cc_directive.strip(): + continue + + 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 no_store: + return + + # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py new file mode 100644 index 0000000..30ed4c5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py @@ -0,0 +1,80 @@ +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py new file mode 100644 index 0000000..6c0e979 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py @@ -0,0 +1,135 @@ +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 = { + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py new file mode 100644 index 0000000..ec43ff2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py @@ -0,0 +1,186 @@ +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 = text_type(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{}".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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py new file mode 100644 index 0000000..265bfc8 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py @@ -0,0 +1,29 @@ +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py new file mode 100644 index 0000000..ef71f3a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py @@ -0,0 +1,3 @@ +from .core import where + +__version__ = "2018.11.29" diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py new file mode 100644 index 0000000..ae2aff5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py @@ -0,0 +1,2 @@ +from pip._vendor.certifi import where +print(where()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem new file mode 100644 index 0000000..db68797 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem @@ -0,0 +1,4512 @@ + +# 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=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----- +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 +-----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=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=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----- +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 +-----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----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 +# Label: "GlobalSign Root CA - R6" +# Serial: 1417766617973444989252670301619537 +# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae +# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 +# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg +MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh +bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx +MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET +MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI +xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k +ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD +aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw +LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw +1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX +k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 +SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h +bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n +WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY +rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce +MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu +bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt +Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 +55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj +vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf +cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz +oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp +nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs +pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v +JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R +8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 +5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed +# Label: "OISTE WISeKey Global Root GC CA" +# Serial: 44084345621038548146064804565436152554 +# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 +# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 +# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw +CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 +bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg +Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ +BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu +ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS +b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni +eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W +p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T +rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV +57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg +Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R1 O=Google Trust Services LLC +# Subject: CN=GTS Root R1 O=Google Trust Services LLC +# Label: "GTS Root R1" +# Serial: 146587175971765017618439757810265552097 +# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 +# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 +# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX +mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 +zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P +fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc +vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 +Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp +zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO +Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW +k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ +DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF +lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW +Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 +d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z +XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR +gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 +d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv +J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg +DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM ++SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy +F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 +SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws +E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R2 O=Google Trust Services LLC +# Subject: CN=GTS Root R2 O=Google Trust Services LLC +# Label: "GTS Root R2" +# Serial: 146587176055767053814479386953112547951 +# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b +# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d +# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH +MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM +QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy +MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl +cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg +GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu +XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd +re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu +PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 +mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K +8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj +x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR +nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 +kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok +twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp +8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT +vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT +z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA +pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb +pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB +R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R +RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk +0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC +5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF +izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn +yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R3 O=Google Trust Services LLC +# Subject: CN=GTS Root R3 O=Google Trust Services LLC +# Label: "GTS Root R3" +# Serial: 146587176140553309517047991083707763997 +# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 +# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 +# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 +-----BEGIN CERTIFICATE----- +MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A +DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk +fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA +njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd +-----END CERTIFICATE----- + +# Issuer: CN=GTS Root R4 O=Google Trust Services LLC +# Subject: CN=GTS Root R4 O=Google Trust Services LLC +# Label: "GTS Root R4" +# Serial: 146587176229350439916519468929765261721 +# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 +# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb +# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd +-----BEGIN CERTIFICATE----- +MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw +CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU +MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw +MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp +Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l +xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 +CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx +sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Global G2 Root O=UniTrust +# Subject: CN=UCA Global G2 Root O=UniTrust +# Label: "UCA Global G2 Root" +# Serial: 124779693093741543919145257850076631279 +# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 +# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a +# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH +bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x +CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds +b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr +b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 +kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm +VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R +VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc +C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj +tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY +D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv +j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl +NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 +iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP +O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV +ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj +L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl +1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU +b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV +PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj +y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb +EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg +DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI ++Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy +YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX +UB+K+wb1whnw0A== +-----END CERTIFICATE----- + +# Issuer: CN=UCA Extended Validation Root O=UniTrust +# Subject: CN=UCA Extended Validation Root O=UniTrust +# Label: "UCA Extended Validation Root" +# Serial: 106100277556486529736699587978573607008 +# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 +# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a +# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH +MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF +eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx +MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV +BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog +D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS +sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop +O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk +sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi +c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj +VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz +KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ +TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G +sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs +1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD +fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN +l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ +VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 +c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp +4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s +t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj +2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO +vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C +xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx +cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM +fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax +-----END CERTIFICATE----- + +# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 +# Label: "Certigna Root CA" +# Serial: 269714418870597844693661054334862075617 +# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 +# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 +# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw +WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw +MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x +MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD +VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX +BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO +ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M +CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu +I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm +TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh +C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf +ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz +IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT +Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k +JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 +hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB +GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov +L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo +dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr +aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq +hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L +6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG +HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 +0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB +lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi +o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 +gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v +faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 +Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh +jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw +3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py new file mode 100644 index 0000000..2d02ea4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +certifi.py +~~~~~~~~~~ + +This module returns the installation location of cacert.pem. +""" +import os + + +def where(): + f = os.path.dirname(__file__) + + return os.path.join(f, 'cacert.pem') + + +if __name__ == '__main__': + print(where()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py new file mode 100644 index 0000000..0f9f820 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py new file mode 100644 index 0000000..38f3251 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py new file mode 100644 index 0000000..98f9970 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py new file mode 100644 index 0000000..c0395f4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py new file mode 100644 index 0000000..8b3738e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py new file mode 100644 index 0000000..eac4e59 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py @@ -0,0 +1 @@ + diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py new file mode 100644 index 0000000..c61136b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py new file mode 100644 index 0000000..68fba44 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py new file mode 100644 index 0000000..ddd7468 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py new file mode 100644 index 0000000..efd793a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py new file mode 100644 index 0000000..0451207 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py new file mode 100644 index 0000000..c70493f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py new file mode 100644 index 0000000..0069523 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py new file mode 100644 index 0000000..20ce8f7 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py new file mode 100644 index 0000000..b68078c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py new file mode 100644 index 0000000..345a060 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py new file mode 100644 index 0000000..ed7a995 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py new file mode 100644 index 0000000..35669cc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py new file mode 100644 index 0000000..697837b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py new file mode 100644 index 0000000..8446d2d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py new file mode 100644 index 0000000..b0e1bf4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py new file mode 100644 index 0000000..83fc082 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py new file mode 100644 index 0000000..20044e4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py new file mode 100644 index 0000000..2aa4fb2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py new file mode 100644 index 0000000..e5f9a1f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py new file mode 100644 index 0000000..5332221 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py new file mode 100644 index 0000000..58f4c87 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py new file mode 100644 index 0000000..bb7c095 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py new file mode 100644 index 0000000..15f94c2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py new file mode 100644 index 0000000..a427a45 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py new file mode 100644 index 0000000..7d1e8c2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py new file mode 100644 index 0000000..6256ecf --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py new file mode 100644 index 0000000..530abe7 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py new file mode 100644 index 0000000..8360d0f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py new file mode 100644 index 0000000..0adb51d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py new file mode 100644 index 0000000..98e95dc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py new file mode 100644 index 0000000..9e29623 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py new file mode 100644 index 0000000..7b4e92d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py new file mode 100644 index 0000000..6c3196c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py new file mode 100644 index 0000000..bb2a34a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py new file mode 100644 index 0000000..2a3bf47 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py @@ -0,0 +1,6 @@ +# 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.4.1' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py new file mode 100644 index 0000000..7877658 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py new file mode 100644 index 0000000..359c92b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py @@ -0,0 +1,257 @@ +# 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() + + +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 __enter__(self, *args, **kwargs): + # special method lookup bypasses __getattr__/__getattribute__, see + # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit + # thus, contextlib magic methods are not proxied via __getattr__ + return self.__wrapped.__enter__(*args, **kwargs) + + def __exit__(self, *args, **kwargs): + return self.__wrapped.__exit__(*args, **kwargs) + + def write(self, text): + self.__convertor.write(text) + + def isatty(self): + stream = self.__wrapped + if 'PYCHARM_HOSTED' in os.environ: + if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): + return True + try: + stream_isatty = stream.isatty + except AttributeError: + return False + else: + return stream_isatty() + + @property + def closed(self): + stream = self.__wrapped + try: + return stream.closed + except AttributeError: + return True + + +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 self.stream.closed and not self.stream.isatty()) + self.strip = strip + + # should we should convert ANSI sequences into win32 calls? + if convert is None: + convert = conversion_supported and not self.stream.closed and self.stream.isatty() + 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 self.stream.closed: + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py new file mode 100644 index 0000000..430d066 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py @@ -0,0 +1,80 @@ +# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py new file mode 100644 index 0000000..c2d8360 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py @@ -0,0 +1,152 @@ +# 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 + + 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 + (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) + + def GetConsoleScreenBufferInfo(stream_id=STDOUT): + handle = _GetStdHandle(stream_id) + csbi = CONSOLE_SCREEN_BUFFER_INFO() + success = _GetConsoleScreenBufferInfo( + handle, byref(csbi)) + return csbi + + def SetConsoleTextAttribute(stream_id, attrs): + handle = _GetStdHandle(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 = _GetStdHandle(stream_id) + return _SetConsoleCursorPosition(handle, adjusted_position) + + def FillConsoleOutputCharacter(stream_id, char, length, start): + handle = _GetStdHandle(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 = _GetStdHandle(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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py new file mode 100644 index 0000000..0fdb4ec --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py @@ -0,0 +1,169 @@ +# 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) + self._light = 0 + + 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 + elif 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 + else: + # invalid mode + return + # 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 + elif 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 + else: + # invalid mode + return + # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py new file mode 100644 index 0000000..a786b4d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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.8' + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py new file mode 100644 index 0000000..f7dbf4c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py new file mode 100644 index 0000000..cfb318d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py new file mode 100644 index 0000000..159e49e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg new file mode 100644 index 0000000..1746bd0 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py new file mode 100644 index 0000000..1df3aba --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py new file mode 100644 index 0000000..d66d856 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py new file mode 100644 index 0000000..ff328c8 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py new file mode 100644 index 0000000..b13cdac --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py @@ -0,0 +1,1339 @@ +# -*- 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, + LEGACY_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, + LEGACY_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py new file mode 100644 index 0000000..2406be2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py new file mode 100644 index 0000000..5c655c3 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py @@ -0,0 +1,1295 @@ +# -*- 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 not is_compatible(wheel, self.wheel_tags): + logger.debug('Wheel not compatible: %s', path) + else: + 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() + self.platform_check = False # See issue #112 + + 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.platform_check and 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py new file mode 100644 index 0000000..ca0fe44 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py new file mode 100644 index 0000000..ee1f3e2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py new file mode 100644 index 0000000..77eed7f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py @@ -0,0 +1,1094 @@ +# -*- 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') + +# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include +# it in the tuple literal below to allow it (for now) +_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') + +_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' +LEGACY_METADATA_FILENAME = 'METADATA' + + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py new file mode 100644 index 0000000..1884016 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py new file mode 100644 index 0000000..8e22cb9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py @@ -0,0 +1,417 @@ +# -*- 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 shebang.endswith(linesep): + shebang += linesep + if not use_launcher: + script_bytes = shebang + 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 + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe new file mode 100644 index 0000000000000000000000000000000000000000..a09d926872d84ae22a617dfe9ebb560d420b37de GIT binary patch literal 92672 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 literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe new file mode 100644 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py new file mode 100644 index 0000000..9d4bfd3 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py @@ -0,0 +1,1756 @@ +# +# 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: + if os.path.exists(path): + os.remove(path) + with open(path, 'wb') as f: + f.write(data) + self.record_as_written(path) + + def write_text_file(self, path, data, encoding): + self.write_binary_file(path, data.encode(encoding)) + + 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, hashed_invalidation=False): + 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):] + compile_kwargs = {} + if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): + compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py new file mode 100644 index 0000000..3eebe18 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe new file mode 100644 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c41bd0a011fd760ce20ba795d9e535e0d2c39876 GIT binary patch literal 99328 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 B=L-M; literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py new file mode 100644 index 0000000..b04bfae --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py @@ -0,0 +1,988 @@ +# -*- 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. If kwarg ``bytecode_hashed_invalidation`` is True, written + bytecode will try to use file-hash based invalidation (PEP-552) on + supported interpreter versions (CPython 2.7+). + + 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) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', 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, + hashed_invalidation=bc_hashed_invalidation) + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py new file mode 100644 index 0000000..aa4defc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py @@ -0,0 +1,1197 @@ +# Copyright 2015,2016,2017 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 OS 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 OS 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 OS 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 OS distributions. + """ + return _distro.linux_distribution(full_distribution_name) + + +def id(): + """ + Return the distro ID of the current distribution, as a + machine-readable string. + + For a number of OS 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 + "openbsd" OpenBSD + "netbsd" NetBSD + "freebsd" FreeBSD + ============== ========================================= + + 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS + 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 OS 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 OS 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 OS distribution. + + See `distro release file`_ for details about these information items. + """ + return _distro.distro_release_info() + + +def uname_info(): + """ + Return a dictionary containing key-value pairs for the information items + from the distro release file data source of the current OS distribution. + """ + return _distro.uname_info() + + +def os_release_attr(attribute): + """ + Return a single named information item from the os-release file data source + of the current OS 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 OS 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 OS 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) + + +def uname_attr(attribute): + """ + Return a single named information item from the distro release file + data source of the current OS 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. + """ + return _distro.uname_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 OS 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 OS 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='', + include_uname=True): + """ + 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. + + * ``include_name`` (bool): Controls whether uname command output is + included as a data source. If the uname command is not available in + the program execution path the data source for the uname command 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. + + * ``include_uname`` (bool): The result of the ``include_uname`` + parameter. This controls whether the uname 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 + self.include_uname = include_uname + + 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}, " \ + "include_uname={self.include_uname!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}, " \ + "_uname_info={self._uname_info!r})".format( + self=self) + + def linux_distribution(self, full_distribution_name=True): + """ + Return information about the OS 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 OS 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) + + distro_id = self.uname_attr('id') + if distro_id: + return normalize(distro_id, NORMALIZED_DISTRO_ID) + + return '' + + def name(self, pretty=False): + """ + Return the name of the OS 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') \ + or self.uname_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') \ + or self.uname_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 OS 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', ''), + self.uname_attr('release') + ] + 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 OS 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 current 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 current 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 OS distribution. + + For details, see :func:`distro.like`. + """ + return self.os_release_attr('id_like') or '' + + def codename(self): + """ + Return the codename of the OS 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 OS + 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 OS 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 OS + 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 OS + distribution. + + For details, see :func:`distro.distro_release_info`. + """ + return self._distro_release_info + + def uname_info(self): + """ + Return a dictionary containing key-value pairs for the information + items from the uname command data source of the OS distribution. + + For details, see :func:`distro.uname_info`. + """ + + def os_release_attr(self, attribute): + """ + Return a single named information item from the os-release file data + source of the OS 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 OS 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 OS distribution. + + For details, see :func:`distro.distro_release_attr`. + """ + return self._distro_release_info.get(attribute, '') + + def uname_attr(self, attribute): + """ + Return a single named information item from the uname command + output data source of the OS distribution. + + For details, see :func:`distro.uname_release_attr`. + """ + return self._uname_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 _uname_info(self): + with open(os.devnull, 'w') as devnull: + try: + cmd = ('uname', '-rs') + stdout = subprocess.check_output(cmd, stderr=devnull) + except OSError: + return {} + content = stdout.decode(sys.getfilesystemencoding()).splitlines() + return self._parse_uname_content(content) + + @staticmethod + def _parse_uname_content(lines): + props = {} + match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) + if match: + name, version = match.groups() + + # This is to prevent the Linux kernel version from + # appearing as the 'best' version on otherwise + # identifiable distributions. + if name == 'Linux': + return {} + props['id'] = name.lower() + props['name'] = name + props['release'] = version + 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="OS 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py new file mode 100644 index 0000000..0491234 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py new file mode 100644 index 0000000..4c77717 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py new file mode 100644 index 0000000..a65e55f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py new file mode 100644 index 0000000..178f6e7 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py new file mode 100644 index 0000000..a5ba4bf --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py new file mode 100644 index 0000000..a1158bb --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py new file mode 100644 index 0000000..e2e5f86 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py new file mode 100644 index 0000000..c178b21 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py new file mode 100644 index 0000000..0703afb --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py new file mode 100644 index 0000000..1ff8041 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py new file mode 100644 index 0000000..5ba926e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py new file mode 100644 index 0000000..c7dbaed --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py new file mode 100644 index 0000000..aefb5c8 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py new file mode 100644 index 0000000..fcc07ee --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py new file mode 100644 index 0000000..4a86501 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py new file mode 100644 index 0000000..af8e77b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py new file mode 100644 index 0000000..0d12584 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py new file mode 100644 index 0000000..ae41a13 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py new file mode 100644 index 0000000..53f4d44 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py new file mode 100644 index 0000000..7ef5959 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py new file mode 100644 index 0000000..61d5fb6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py new file mode 100644 index 0000000..f4ccea5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py new file mode 100644 index 0000000..d44447e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py new file mode 100644 index 0000000..73973db --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py new file mode 100644 index 0000000..dcfac22 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py new file mode 100644 index 0000000..0dedf44 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py new file mode 100644 index 0000000..ca12a99 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py new file mode 100644 index 0000000..9bec207 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py new file mode 100644 index 0000000..80c474c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py new file mode 100644 index 0000000..b0c89b0 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py new file mode 100644 index 0000000..95fc0c1 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py new file mode 100644 index 0000000..e81ddf3 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py new file mode 100644 index 0000000..7483be2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py new file mode 100644 index 0000000..847bf93 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py @@ -0,0 +1,2 @@ +from .package_data import __version__ +from .core import * diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py new file mode 100644 index 0000000..98c65ea --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py new file mode 100644 index 0000000..4d47f33 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py new file mode 100644 index 0000000..104624a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py @@ -0,0 +1,396 @@ +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): + v = unicodedata.combining(unichr(cp)) + if v == 0: + if not unicodedata.name(unichr(cp)): + raise ValueError("Unknown character in unicodedata") + return v + +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 + 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']): + try: + 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))) + except ValueError: + raise IDNAError('Unknown codepoint adjacent to joiner {0} 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') + ulabel(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 not std3_rules and replacement is None)): + output += char + elif replacement is not None and (status == "M" or + (status == "3" and not 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) + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if labels[-1] == '': + del labels[-1] + trailing_dot = True + for label in labels: + s = alabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty 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'.') + if not labels or labels == ['']: + raise IDNAError('Empty domain') + if not labels[-1]: + del labels[-1] + trailing_dot = True + for label in labels: + s = ulabel(label) + if s: + result.append(s) + else: + raise IDNAError('Empty label') + if trailing_dot: + result.append(u'') + return u'.'.join(result) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py new file mode 100644 index 0000000..a80c959 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py @@ -0,0 +1,1979 @@ +# This file is automatically generated by tools/idna-data + +__version__ = "11.0.0" +scripts = { + 'Greek': ( + 0x37000000374, + 0x37500000378, + 0x37a0000037e, + 0x37f00000380, + 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, + 0xab650000ab66, + 0x101400001018f, + 0x101a0000101a1, + 0x1d2000001d246, + ), + 'Han': ( + 0x2e8000002e9a, + 0x2e9b00002ef4, + 0x2f0000002fd6, + 0x300500003006, + 0x300700003008, + 0x30210000302a, + 0x30380000303c, + 0x340000004db6, + 0x4e0000009ff0, + 0xf9000000fa6e, + 0xfa700000fada, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + 0x2f8000002fa1e, + ), + 'Hebrew': ( + 0x591000005c8, + 0x5d0000005eb, + 0x5ef000005f5, + 0xfb1d0000fb37, + 0xfb380000fb3d, + 0xfb3e0000fb3f, + 0xfb400000fb42, + 0xfb430000fb45, + 0xfb460000fb50, + ), + 'Hiragana': ( + 0x304100003097, + 0x309d000030a0, + 0x1b0010001b11f, + 0x1f2000001f201, + ), + 'Katakana': ( + 0x30a1000030fb, + 0x30fd00003100, + 0x31f000003200, + 0x32d0000032ff, + 0x330000003358, + 0xff660000ff70, + 0xff710000ff9e, + 0x1b0000001b001, + ), +} +joining_types = { + 0x600: 85, + 0x601: 85, + 0x602: 85, + 0x603: 85, + 0x604: 85, + 0x605: 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, + 0x70f: 84, + 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: 82, + 0x848: 68, + 0x849: 82, + 0x84a: 68, + 0x84b: 68, + 0x84c: 68, + 0x84d: 68, + 0x84e: 68, + 0x84f: 68, + 0x850: 68, + 0x851: 68, + 0x852: 68, + 0x853: 68, + 0x854: 82, + 0x855: 68, + 0x856: 85, + 0x857: 85, + 0x858: 85, + 0x860: 68, + 0x861: 85, + 0x862: 68, + 0x863: 68, + 0x864: 68, + 0x865: 68, + 0x866: 85, + 0x867: 82, + 0x868: 68, + 0x869: 82, + 0x86a: 82, + 0x8a0: 68, + 0x8a1: 68, + 0x8a2: 68, + 0x8a3: 68, + 0x8a4: 68, + 0x8a5: 68, + 0x8a6: 68, + 0x8a7: 68, + 0x8a8: 68, + 0x8a9: 68, + 0x8aa: 82, + 0x8ab: 82, + 0x8ac: 82, + 0x8ad: 85, + 0x8ae: 82, + 0x8af: 68, + 0x8b0: 68, + 0x8b1: 82, + 0x8b2: 82, + 0x8b3: 68, + 0x8b4: 68, + 0x8b6: 68, + 0x8b7: 68, + 0x8b8: 68, + 0x8b9: 82, + 0x8ba: 68, + 0x8bb: 68, + 0x8bc: 68, + 0x8bd: 68, + 0x8e2: 85, + 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, + 0x1878: 68, + 0x1880: 85, + 0x1881: 85, + 0x1882: 85, + 0x1883: 85, + 0x1884: 85, + 0x1885: 84, + 0x1886: 84, + 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, + 0x202f: 85, + 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, + 0x10ac0: 68, + 0x10ac1: 68, + 0x10ac2: 68, + 0x10ac3: 68, + 0x10ac4: 68, + 0x10ac5: 82, + 0x10ac6: 85, + 0x10ac7: 82, + 0x10ac8: 85, + 0x10ac9: 82, + 0x10aca: 82, + 0x10acb: 85, + 0x10acc: 85, + 0x10acd: 76, + 0x10ace: 82, + 0x10acf: 82, + 0x10ad0: 82, + 0x10ad1: 82, + 0x10ad2: 82, + 0x10ad3: 68, + 0x10ad4: 68, + 0x10ad5: 68, + 0x10ad6: 68, + 0x10ad7: 76, + 0x10ad8: 68, + 0x10ad9: 68, + 0x10ada: 68, + 0x10adb: 68, + 0x10adc: 68, + 0x10add: 82, + 0x10ade: 68, + 0x10adf: 68, + 0x10ae0: 68, + 0x10ae1: 82, + 0x10ae2: 85, + 0x10ae3: 85, + 0x10ae4: 82, + 0x10aeb: 68, + 0x10aec: 68, + 0x10aed: 68, + 0x10aee: 68, + 0x10aef: 82, + 0x10b80: 68, + 0x10b81: 82, + 0x10b82: 68, + 0x10b83: 82, + 0x10b84: 82, + 0x10b85: 82, + 0x10b86: 68, + 0x10b87: 68, + 0x10b88: 68, + 0x10b89: 82, + 0x10b8a: 68, + 0x10b8b: 68, + 0x10b8c: 82, + 0x10b8d: 68, + 0x10b8e: 82, + 0x10b8f: 82, + 0x10b90: 68, + 0x10b91: 82, + 0x10ba9: 82, + 0x10baa: 82, + 0x10bab: 82, + 0x10bac: 82, + 0x10bad: 68, + 0x10bae: 68, + 0x10baf: 85, + 0x10d00: 76, + 0x10d01: 68, + 0x10d02: 68, + 0x10d03: 68, + 0x10d04: 68, + 0x10d05: 68, + 0x10d06: 68, + 0x10d07: 68, + 0x10d08: 68, + 0x10d09: 68, + 0x10d0a: 68, + 0x10d0b: 68, + 0x10d0c: 68, + 0x10d0d: 68, + 0x10d0e: 68, + 0x10d0f: 68, + 0x10d10: 68, + 0x10d11: 68, + 0x10d12: 68, + 0x10d13: 68, + 0x10d14: 68, + 0x10d15: 68, + 0x10d16: 68, + 0x10d17: 68, + 0x10d18: 68, + 0x10d19: 68, + 0x10d1a: 68, + 0x10d1b: 68, + 0x10d1c: 68, + 0x10d1d: 68, + 0x10d1e: 68, + 0x10d1f: 68, + 0x10d20: 68, + 0x10d21: 68, + 0x10d22: 82, + 0x10d23: 68, + 0x10f30: 68, + 0x10f31: 68, + 0x10f32: 68, + 0x10f33: 82, + 0x10f34: 68, + 0x10f35: 68, + 0x10f36: 68, + 0x10f37: 68, + 0x10f38: 68, + 0x10f39: 68, + 0x10f3a: 68, + 0x10f3b: 68, + 0x10f3c: 68, + 0x10f3d: 68, + 0x10f3e: 68, + 0x10f3f: 68, + 0x10f40: 68, + 0x10f41: 68, + 0x10f42: 68, + 0x10f43: 68, + 0x10f44: 68, + 0x10f45: 85, + 0x10f51: 68, + 0x10f52: 68, + 0x10f53: 68, + 0x10f54: 82, + 0x110bd: 85, + 0x110cd: 85, + 0x1e900: 68, + 0x1e901: 68, + 0x1e902: 68, + 0x1e903: 68, + 0x1e904: 68, + 0x1e905: 68, + 0x1e906: 68, + 0x1e907: 68, + 0x1e908: 68, + 0x1e909: 68, + 0x1e90a: 68, + 0x1e90b: 68, + 0x1e90c: 68, + 0x1e90d: 68, + 0x1e90e: 68, + 0x1e90f: 68, + 0x1e910: 68, + 0x1e911: 68, + 0x1e912: 68, + 0x1e913: 68, + 0x1e914: 68, + 0x1e915: 68, + 0x1e916: 68, + 0x1e917: 68, + 0x1e918: 68, + 0x1e919: 68, + 0x1e91a: 68, + 0x1e91b: 68, + 0x1e91c: 68, + 0x1e91d: 68, + 0x1e91e: 68, + 0x1e91f: 68, + 0x1e920: 68, + 0x1e921: 68, + 0x1e922: 68, + 0x1e923: 68, + 0x1e924: 68, + 0x1e925: 68, + 0x1e926: 68, + 0x1e927: 68, + 0x1e928: 68, + 0x1e929: 68, + 0x1e92a: 68, + 0x1e92b: 68, + 0x1e92c: 68, + 0x1e92d: 68, + 0x1e92e: 68, + 0x1e92f: 68, + 0x1e930: 68, + 0x1e931: 68, + 0x1e932: 68, + 0x1e933: 68, + 0x1e934: 68, + 0x1e935: 68, + 0x1e936: 68, + 0x1e937: 68, + 0x1e938: 68, + 0x1e939: 68, + 0x1e93a: 68, + 0x1e93b: 68, + 0x1e93c: 68, + 0x1e93d: 68, + 0x1e93e: 68, + 0x1e93f: 68, + 0x1e940: 68, + 0x1e941: 68, + 0x1e942: 68, + 0x1e943: 68, +} +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, + 0x5290000052a, + 0x52b0000052c, + 0x52d0000052e, + 0x52f00000530, + 0x5590000055a, + 0x56000000587, + 0x58800000589, + 0x591000005be, + 0x5bf000005c0, + 0x5c1000005c3, + 0x5c4000005c6, + 0x5c7000005c8, + 0x5d0000005eb, + 0x5ef000005f3, + 0x6100000061b, + 0x62000000640, + 0x64100000660, + 0x66e00000675, + 0x679000006d4, + 0x6d5000006dd, + 0x6df000006e9, + 0x6ea000006f0, + 0x6fa00000700, + 0x7100000074b, + 0x74d000007b2, + 0x7c0000007f6, + 0x7fd000007fe, + 0x8000000082e, + 0x8400000085c, + 0x8600000086b, + 0x8a0000008b5, + 0x8b6000008be, + 0x8d3000008e2, + 0x8e300000958, + 0x96000000964, + 0x96600000970, + 0x97100000984, + 0x9850000098d, + 0x98f00000991, + 0x993000009a9, + 0x9aa000009b1, + 0x9b2000009b3, + 0x9b6000009ba, + 0x9bc000009c5, + 0x9c7000009c9, + 0x9cb000009cf, + 0x9d7000009d8, + 0x9e0000009e4, + 0x9e6000009f2, + 0x9fc000009fd, + 0x9fe000009ff, + 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, + 0xaf900000b00, + 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, + 0xc0000000c0d, + 0xc0e00000c11, + 0xc1200000c29, + 0xc2a00000c3a, + 0xc3d00000c45, + 0xc4600000c49, + 0xc4a00000c4e, + 0xc5500000c57, + 0xc5800000c5b, + 0xc6000000c64, + 0xc6600000c70, + 0xc8000000c84, + 0xc8500000c8d, + 0xc8e00000c91, + 0xc9200000ca9, + 0xcaa00000cb4, + 0xcb500000cba, + 0xcbc00000cc5, + 0xcc600000cc9, + 0xcca00000cce, + 0xcd500000cd7, + 0xcde00000cdf, + 0xce000000ce4, + 0xce600000cf0, + 0xcf100000cf3, + 0xd0000000d04, + 0xd0500000d0d, + 0xd0e00000d11, + 0xd1200000d45, + 0xd4600000d49, + 0xd4a00000d4f, + 0xd5400000d58, + 0xd5f00000d64, + 0xd6600000d70, + 0xd7a00000d80, + 0xd8200000d84, + 0xd8500000d97, + 0xd9a00000db2, + 0xdb300000dbc, + 0xdbd00000dbe, + 0xdc000000dc7, + 0xdca00000dcb, + 0xdcf00000dd5, + 0xdd600000dd7, + 0xdd800000de0, + 0xde600000df0, + 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, + 0x13a0000013f6, + 0x14010000166d, + 0x166f00001680, + 0x16810000169b, + 0x16a0000016eb, + 0x16f1000016f9, + 0x17000000170d, + 0x170e00001715, + 0x172000001735, + 0x174000001754, + 0x17600000176d, + 0x176e00001771, + 0x177200001774, + 0x1780000017b4, + 0x17b6000017d4, + 0x17d7000017d8, + 0x17dc000017de, + 0x17e0000017ea, + 0x18100000181a, + 0x182000001879, + 0x1880000018ab, + 0x18b0000018f6, + 0x19000000191f, + 0x19200000192c, + 0x19300000193c, + 0x19460000196e, + 0x197000001975, + 0x1980000019ac, + 0x19b0000019ca, + 0x19d0000019da, + 0x1a0000001a1c, + 0x1a2000001a5f, + 0x1a6000001a7d, + 0x1a7f00001a8a, + 0x1a9000001a9a, + 0x1aa700001aa8, + 0x1ab000001abe, + 0x1b0000001b4c, + 0x1b5000001b5a, + 0x1b6b00001b74, + 0x1b8000001bf4, + 0x1c0000001c38, + 0x1c4000001c4a, + 0x1c4d00001c7e, + 0x1cd000001cd3, + 0x1cd400001cfa, + 0x1d0000001d2c, + 0x1d2f00001d30, + 0x1d3b00001d3c, + 0x1d4e00001d4f, + 0x1d6b00001d78, + 0x1d7900001d9b, + 0x1dc000001dfa, + 0x1dfb00001e00, + 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, + 0x310500003130, + 0x31a0000031bb, + 0x31f000003200, + 0x340000004db6, + 0x4e0000009ff0, + 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, + 0xa6990000a69a, + 0xa69b0000a69c, + 0xa69e0000a6e6, + 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, + 0xa78e0000a790, + 0xa7910000a792, + 0xa7930000a796, + 0xa7970000a798, + 0xa7990000a79a, + 0xa79b0000a79c, + 0xa79d0000a79e, + 0xa79f0000a7a0, + 0xa7a10000a7a2, + 0xa7a30000a7a4, + 0xa7a50000a7a6, + 0xa7a70000a7a8, + 0xa7a90000a7aa, + 0xa7af0000a7b0, + 0xa7b50000a7b6, + 0xa7b70000a7b8, + 0xa7b90000a7ba, + 0xa7f70000a7f8, + 0xa7fa0000a828, + 0xa8400000a874, + 0xa8800000a8c6, + 0xa8d00000a8da, + 0xa8e00000a8f8, + 0xa8fb0000a8fc, + 0xa8fd0000a92e, + 0xa9300000a954, + 0xa9800000a9c1, + 0xa9cf0000a9da, + 0xa9e00000a9ff, + 0xaa000000aa37, + 0xaa400000aa4e, + 0xaa500000aa5a, + 0xaa600000aa77, + 0xaa7a0000aac3, + 0xaadb0000aade, + 0xaae00000aaf0, + 0xaaf20000aaf7, + 0xab010000ab07, + 0xab090000ab0f, + 0xab110000ab17, + 0xab200000ab27, + 0xab280000ab2f, + 0xab300000ab5b, + 0xab600000ab66, + 0xabc00000abeb, + 0xabec0000abee, + 0xabf00000abfa, + 0xac000000d7a4, + 0xfa0e0000fa10, + 0xfa110000fa12, + 0xfa130000fa15, + 0xfa1f0000fa20, + 0xfa210000fa22, + 0xfa230000fa25, + 0xfa270000fa2a, + 0xfb1e0000fb1f, + 0xfe200000fe30, + 0xfe730000fe74, + 0x100000001000c, + 0x1000d00010027, + 0x100280001003b, + 0x1003c0001003e, + 0x1003f0001004e, + 0x100500001005e, + 0x10080000100fb, + 0x101fd000101fe, + 0x102800001029d, + 0x102a0000102d1, + 0x102e0000102e1, + 0x1030000010320, + 0x1032d00010341, + 0x103420001034a, + 0x103500001037b, + 0x103800001039e, + 0x103a0000103c4, + 0x103c8000103d0, + 0x104280001049e, + 0x104a0000104aa, + 0x104d8000104fc, + 0x1050000010528, + 0x1053000010564, + 0x1060000010737, + 0x1074000010756, + 0x1076000010768, + 0x1080000010806, + 0x1080800010809, + 0x1080a00010836, + 0x1083700010839, + 0x1083c0001083d, + 0x1083f00010856, + 0x1086000010877, + 0x108800001089f, + 0x108e0000108f3, + 0x108f4000108f6, + 0x1090000010916, + 0x109200001093a, + 0x10980000109b8, + 0x109be000109c0, + 0x10a0000010a04, + 0x10a0500010a07, + 0x10a0c00010a14, + 0x10a1500010a18, + 0x10a1900010a36, + 0x10a3800010a3b, + 0x10a3f00010a40, + 0x10a6000010a7d, + 0x10a8000010a9d, + 0x10ac000010ac8, + 0x10ac900010ae7, + 0x10b0000010b36, + 0x10b4000010b56, + 0x10b6000010b73, + 0x10b8000010b92, + 0x10c0000010c49, + 0x10cc000010cf3, + 0x10d0000010d28, + 0x10d3000010d3a, + 0x10f0000010f1d, + 0x10f2700010f28, + 0x10f3000010f51, + 0x1100000011047, + 0x1106600011070, + 0x1107f000110bb, + 0x110d0000110e9, + 0x110f0000110fa, + 0x1110000011135, + 0x1113600011140, + 0x1114400011147, + 0x1115000011174, + 0x1117600011177, + 0x11180000111c5, + 0x111c9000111cd, + 0x111d0000111db, + 0x111dc000111dd, + 0x1120000011212, + 0x1121300011238, + 0x1123e0001123f, + 0x1128000011287, + 0x1128800011289, + 0x1128a0001128e, + 0x1128f0001129e, + 0x1129f000112a9, + 0x112b0000112eb, + 0x112f0000112fa, + 0x1130000011304, + 0x113050001130d, + 0x1130f00011311, + 0x1131300011329, + 0x1132a00011331, + 0x1133200011334, + 0x113350001133a, + 0x1133b00011345, + 0x1134700011349, + 0x1134b0001134e, + 0x1135000011351, + 0x1135700011358, + 0x1135d00011364, + 0x113660001136d, + 0x1137000011375, + 0x114000001144b, + 0x114500001145a, + 0x1145e0001145f, + 0x11480000114c6, + 0x114c7000114c8, + 0x114d0000114da, + 0x11580000115b6, + 0x115b8000115c1, + 0x115d8000115de, + 0x1160000011641, + 0x1164400011645, + 0x116500001165a, + 0x11680000116b8, + 0x116c0000116ca, + 0x117000001171b, + 0x1171d0001172c, + 0x117300001173a, + 0x118000001183b, + 0x118c0000118ea, + 0x118ff00011900, + 0x11a0000011a3f, + 0x11a4700011a48, + 0x11a5000011a84, + 0x11a8600011a9a, + 0x11a9d00011a9e, + 0x11ac000011af9, + 0x11c0000011c09, + 0x11c0a00011c37, + 0x11c3800011c41, + 0x11c5000011c5a, + 0x11c7200011c90, + 0x11c9200011ca8, + 0x11ca900011cb7, + 0x11d0000011d07, + 0x11d0800011d0a, + 0x11d0b00011d37, + 0x11d3a00011d3b, + 0x11d3c00011d3e, + 0x11d3f00011d48, + 0x11d5000011d5a, + 0x11d6000011d66, + 0x11d6700011d69, + 0x11d6a00011d8f, + 0x11d9000011d92, + 0x11d9300011d99, + 0x11da000011daa, + 0x11ee000011ef7, + 0x120000001239a, + 0x1248000012544, + 0x130000001342f, + 0x1440000014647, + 0x1680000016a39, + 0x16a4000016a5f, + 0x16a6000016a6a, + 0x16ad000016aee, + 0x16af000016af5, + 0x16b0000016b37, + 0x16b4000016b44, + 0x16b5000016b5a, + 0x16b6300016b78, + 0x16b7d00016b90, + 0x16e6000016e80, + 0x16f0000016f45, + 0x16f5000016f7f, + 0x16f8f00016fa0, + 0x16fe000016fe2, + 0x17000000187f2, + 0x1880000018af3, + 0x1b0000001b11f, + 0x1b1700001b2fc, + 0x1bc000001bc6b, + 0x1bc700001bc7d, + 0x1bc800001bc89, + 0x1bc900001bc9a, + 0x1bc9d0001bc9f, + 0x1da000001da37, + 0x1da3b0001da6d, + 0x1da750001da76, + 0x1da840001da85, + 0x1da9b0001daa0, + 0x1daa10001dab0, + 0x1e0000001e007, + 0x1e0080001e019, + 0x1e01b0001e022, + 0x1e0230001e025, + 0x1e0260001e02b, + 0x1e8000001e8c5, + 0x1e8d00001e8d7, + 0x1e9220001e94b, + 0x1e9500001e95a, + 0x200000002a6d7, + 0x2a7000002b735, + 0x2b7400002b81e, + 0x2b8200002cea2, + 0x2ceb00002ebe1, + ), + 'CONTEXTJ': ( + 0x200c0000200e, + ), + 'CONTEXTO': ( + 0xb7000000b8, + 0x37500000376, + 0x5f3000005f5, + 0x6600000066a, + 0x6f0000006fa, + 0x30fb000030fc, + ), +} diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py new file mode 100644 index 0000000..fa8a735 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py new file mode 100644 index 0000000..257e898 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py @@ -0,0 +1,2 @@ +__version__ = '2.8' + diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py new file mode 100644 index 0000000..a68ed4c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py @@ -0,0 +1,8205 @@ +# This file is automatically generated by tools/idna-data +# vim: set fileencoding=utf-8 : + +"""IDNA Mapping Table from UTS46.""" + + +__version__ = "11.0.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, 'M', u'ϳ'), + (0x380, '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'ђ'), + ] + +def _seg_7(): + return [ + (0x403, 'M', u'ѓ'), + (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'), + ] + +def _seg_8(): + return [ + (0x49E, 'M', u'ҟ'), + (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'ԃ'), + ] + +def _seg_9(): + return [ + (0x503, 'V'), + (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, 'M', u'ԩ'), + (0x529, 'V'), + (0x52A, 'M', u'ԫ'), + (0x52B, 'V'), + (0x52C, 'M', u'ԭ'), + (0x52D, 'V'), + (0x52E, 'M', u'ԯ'), + (0x52F, 'V'), + (0x530, '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'), + (0x587, 'M', u'եւ'), + (0x588, 'V'), + (0x58B, 'X'), + (0x58D, 'V'), + (0x590, 'X'), + (0x591, 'V'), + (0x5C8, 'X'), + (0x5D0, 'V'), + (0x5EB, 'X'), + (0x5EF, 'V'), + (0x5F5, 'X'), + (0x606, 'V'), + (0x61C, 'X'), + (0x61E, 'V'), + ] + +def _seg_10(): + return [ + (0x675, 'M', u'اٴ'), + (0x676, 'M', u'وٴ'), + (0x677, 'M', u'ۇٴ'), + (0x678, 'M', u'يٴ'), + (0x679, 'V'), + (0x6DD, 'X'), + (0x6DE, 'V'), + (0x70E, 'X'), + (0x710, 'V'), + (0x74B, 'X'), + (0x74D, 'V'), + (0x7B2, 'X'), + (0x7C0, 'V'), + (0x7FB, 'X'), + (0x7FD, 'V'), + (0x82E, 'X'), + (0x830, 'V'), + (0x83F, 'X'), + (0x840, 'V'), + (0x85C, 'X'), + (0x85E, 'V'), + (0x85F, 'X'), + (0x860, 'V'), + (0x86B, 'X'), + (0x8A0, 'V'), + (0x8B5, 'X'), + (0x8B6, 'V'), + (0x8BE, 'X'), + (0x8D3, 'V'), + (0x8E2, 'X'), + (0x8E3, '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'), + (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'), + (0x9FF, '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'ਜ਼'), + ] + +def _seg_11(): + return [ + (0xA5C, 'V'), + (0xA5D, 'X'), + (0xA5E, 'M', u'ਫ਼'), + (0xA5F, 'X'), + (0xA66, 'V'), + (0xA77, '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'), + (0xAF9, 'V'), + (0xB00, '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'), + (0xC00, 'V'), + (0xC0D, 'X'), + (0xC0E, 'V'), + (0xC11, 'X'), + (0xC12, 'V'), + ] + +def _seg_12(): + return [ + (0xC29, 'X'), + (0xC2A, 'V'), + (0xC3A, 'X'), + (0xC3D, 'V'), + (0xC45, 'X'), + (0xC46, 'V'), + (0xC49, 'X'), + (0xC4A, 'V'), + (0xC4E, 'X'), + (0xC55, 'V'), + (0xC57, 'X'), + (0xC58, 'V'), + (0xC5B, 'X'), + (0xC60, 'V'), + (0xC64, 'X'), + (0xC66, 'V'), + (0xC70, 'X'), + (0xC78, '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'), + (0xD00, 'V'), + (0xD04, 'X'), + (0xD05, 'V'), + (0xD0D, 'X'), + (0xD0E, 'V'), + (0xD11, 'X'), + (0xD12, 'V'), + (0xD45, 'X'), + (0xD46, 'V'), + (0xD49, 'X'), + (0xD4A, 'V'), + (0xD50, 'X'), + (0xD54, 'V'), + (0xD64, 'X'), + (0xD66, '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'), + (0xDE6, 'V'), + (0xDF0, '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'), + (0xE89, 'X'), + (0xE8A, 'V'), + (0xE8B, 'X'), + (0xE8D, 'V'), + (0xE8E, 'X'), + (0xE94, 'V'), + ] + +def _seg_13(): + return [ + (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'), + (0x1259, 'X'), + (0x125A, 'V'), + (0x125E, 'X'), + (0x1260, 'V'), + (0x1289, 'X'), + (0x128A, 'V'), + ] + +def _seg_14(): + return [ + (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'), + (0x13F6, 'X'), + (0x13F8, 'M', u'Ᏸ'), + (0x13F9, 'M', u'Ᏹ'), + (0x13FA, 'M', u'Ᏺ'), + (0x13FB, 'M', u'Ᏻ'), + (0x13FC, 'M', u'Ᏼ'), + (0x13FD, 'M', u'Ᏽ'), + (0x13FE, 'X'), + (0x1400, 'V'), + (0x1680, 'X'), + (0x1681, 'V'), + (0x169D, 'X'), + (0x16A0, 'V'), + (0x16F9, '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'), + (0x1879, 'X'), + (0x1880, 'V'), + (0x18AB, 'X'), + (0x18B0, 'V'), + (0x18F6, 'X'), + (0x1900, 'V'), + (0x191F, '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'), + ] + +def _seg_15(): + return [ + (0x1A9A, 'X'), + (0x1AA0, 'V'), + (0x1AAE, 'X'), + (0x1AB0, 'V'), + (0x1ABF, 'X'), + (0x1B00, 'V'), + (0x1B4C, 'X'), + (0x1B50, 'V'), + (0x1B7D, 'X'), + (0x1B80, 'V'), + (0x1BF4, 'X'), + (0x1BFC, 'V'), + (0x1C38, 'X'), + (0x1C3B, 'V'), + (0x1C4A, 'X'), + (0x1C4D, 'V'), + (0x1C80, 'M', u'в'), + (0x1C81, 'M', u'д'), + (0x1C82, 'M', u'о'), + (0x1C83, 'M', u'с'), + (0x1C84, 'M', u'т'), + (0x1C86, 'M', u'ъ'), + (0x1C87, 'M', u'ѣ'), + (0x1C88, 'M', u'ꙋ'), + (0x1C89, 'X'), + (0x1CC0, 'V'), + (0x1CC8, 'X'), + (0x1CD0, 'V'), + (0x1CFA, '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'ð'), + ] + +def _seg_16(): + return [ + (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'ɭ'), + (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'), + (0x1DFA, 'X'), + (0x1DFB, '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'), + ] + +def _seg_17(): + return [ + (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'ṋ'), + (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'ẩ'), + ] + +def _seg_18(): + return [ + (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'), + (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'ἒ'), + ] + +def _seg_19(): + return [ + (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'ἥ'), + (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'ὣι'), + ] + +def _seg_20(): + return [ + (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'ὦι'), + (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'‵‵‵'), + ] + +def _seg_21(): + return [ + (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'), + (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'), + (0x20C0, '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'), + ] + +def _seg_22(): + return [ + (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'א'), + (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, 'V'), + (0x218C, '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'), + (0x2427, 'X'), + (0x2440, 'V'), + (0x244B, 'X'), + (0x2460, 'M', u'1'), + (0x2461, 'M', u'2'), + ] + +def _seg_23(): + return [ + (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'), + (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'), + ] + +def _seg_24(): + return [ + (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'), + (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'), + (0x2A0C, 'M', u'∫∫∫∫'), + (0x2A0D, 'V'), + (0x2A74, '3', u'::='), + (0x2A75, '3', u'=='), + (0x2A76, '3', u'==='), + (0x2A77, 'V'), + (0x2ADC, 'M', u'⫝̸'), + (0x2ADD, 'V'), + (0x2B74, 'X'), + (0x2B76, 'V'), + (0x2B96, 'X'), + (0x2B98, 'V'), + (0x2BC9, 'X'), + (0x2BCA, 'V'), + (0x2BFF, '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'ɒ'), + ] + +def _seg_25(): + return [ + (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'ⲃ'), + (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'ⳛ'), + ] + +def _seg_26(): + return [ + (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'ⳮ'), + (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'), + (0x2E4F, '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'山'), + ] + +def _seg_27(): + return [ + (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'彐'), + (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'襾'), + ] + +def _seg_28(): + return [ + (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'身'), + (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'), + (0x3130, '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'ᄄ'), + ] + +def _seg_29(): + return [ + (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'ᄡ'), + (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'天'), + ] + +def _seg_30(): + return [ + (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'(ᄆ)'), + (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'ᄅ'), + ] + +def _seg_31(): + return [ + (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'나'), + (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月'), + ] + +def _seg_32(): + return [ + (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'エ'), + (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'パーセント'), + ] + +def _seg_33(): + return [ + (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'ペソ'), + (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'), + ] + +def _seg_34(): + return [ + (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'), + (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日'), + ] + +def _seg_35(): + return [ + (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'), + (0x3400, 'V'), + (0x4DB6, 'X'), + (0x4DC0, 'V'), + (0x9FF0, '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, 'M', u'ꚙ'), + (0xA699, 'V'), + (0xA69A, 'M', u'ꚛ'), + (0xA69B, 'V'), + (0xA69C, 'M', u'ъ'), + (0xA69D, 'M', u'ь'), + (0xA69E, 'V'), + (0xA6F8, 'X'), + ] + +def _seg_36(): + return [ + (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'), + (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'), + (0xA790, 'M', u'ꞑ'), + (0xA791, 'V'), + ] + +def _seg_37(): + return [ + (0xA792, 'M', u'ꞓ'), + (0xA793, 'V'), + (0xA796, 'M', u'ꞗ'), + (0xA797, 'V'), + (0xA798, 'M', u'ꞙ'), + (0xA799, 'V'), + (0xA79A, 'M', u'ꞛ'), + (0xA79B, 'V'), + (0xA79C, 'M', u'ꞝ'), + (0xA79D, 'V'), + (0xA79E, 'M', u'ꞟ'), + (0xA79F, 'V'), + (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, 'M', u'ɜ'), + (0xA7AC, 'M', u'ɡ'), + (0xA7AD, 'M', u'ɬ'), + (0xA7AE, 'M', u'ɪ'), + (0xA7AF, 'V'), + (0xA7B0, 'M', u'ʞ'), + (0xA7B1, 'M', u'ʇ'), + (0xA7B2, 'M', u'ʝ'), + (0xA7B3, 'M', u'ꭓ'), + (0xA7B4, 'M', u'ꞵ'), + (0xA7B5, 'V'), + (0xA7B6, 'M', u'ꞷ'), + (0xA7B7, 'V'), + (0xA7B8, 'X'), + (0xA7B9, 'V'), + (0xA7BA, 'X'), + (0xA7F7, 'V'), + (0xA7F8, 'M', u'ħ'), + (0xA7F9, 'M', u'œ'), + (0xA7FA, 'V'), + (0xA82C, 'X'), + (0xA830, 'V'), + (0xA83A, 'X'), + (0xA840, 'V'), + (0xA878, 'X'), + (0xA880, 'V'), + (0xA8C6, 'X'), + (0xA8CE, 'V'), + (0xA8DA, 'X'), + (0xA8E0, 'V'), + (0xA954, 'X'), + (0xA95F, 'V'), + (0xA97D, 'X'), + (0xA980, 'V'), + (0xA9CE, 'X'), + (0xA9CF, 'V'), + (0xA9DA, 'X'), + (0xA9DE, 'V'), + (0xA9FF, 'X'), + (0xAA00, 'V'), + (0xAA37, 'X'), + (0xAA40, 'V'), + (0xAA4E, 'X'), + (0xAA50, 'V'), + (0xAA5A, 'X'), + (0xAA5C, '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'), + (0xAB30, 'V'), + (0xAB5C, 'M', u'ꜧ'), + (0xAB5D, 'M', u'ꬷ'), + (0xAB5E, 'M', u'ɫ'), + (0xAB5F, 'M', u'ꭒ'), + (0xAB60, 'V'), + (0xAB66, 'X'), + (0xAB70, 'M', u'Ꭰ'), + (0xAB71, 'M', u'Ꭱ'), + (0xAB72, 'M', u'Ꭲ'), + (0xAB73, 'M', u'Ꭳ'), + (0xAB74, 'M', u'Ꭴ'), + (0xAB75, 'M', u'Ꭵ'), + (0xAB76, 'M', u'Ꭶ'), + (0xAB77, 'M', u'Ꭷ'), + (0xAB78, 'M', u'Ꭸ'), + (0xAB79, 'M', u'Ꭹ'), + (0xAB7A, 'M', u'Ꭺ'), + ] + +def _seg_38(): + return [ + (0xAB7B, 'M', u'Ꭻ'), + (0xAB7C, 'M', u'Ꭼ'), + (0xAB7D, 'M', u'Ꭽ'), + (0xAB7E, 'M', u'Ꭾ'), + (0xAB7F, 'M', u'Ꭿ'), + (0xAB80, 'M', u'Ꮀ'), + (0xAB81, 'M', u'Ꮁ'), + (0xAB82, 'M', u'Ꮂ'), + (0xAB83, 'M', u'Ꮃ'), + (0xAB84, 'M', u'Ꮄ'), + (0xAB85, 'M', u'Ꮅ'), + (0xAB86, 'M', u'Ꮆ'), + (0xAB87, 'M', u'Ꮇ'), + (0xAB88, 'M', u'Ꮈ'), + (0xAB89, 'M', u'Ꮉ'), + (0xAB8A, 'M', u'Ꮊ'), + (0xAB8B, 'M', u'Ꮋ'), + (0xAB8C, 'M', u'Ꮌ'), + (0xAB8D, 'M', u'Ꮍ'), + (0xAB8E, 'M', u'Ꮎ'), + (0xAB8F, 'M', u'Ꮏ'), + (0xAB90, 'M', u'Ꮐ'), + (0xAB91, 'M', u'Ꮑ'), + (0xAB92, 'M', u'Ꮒ'), + (0xAB93, 'M', u'Ꮓ'), + (0xAB94, 'M', u'Ꮔ'), + (0xAB95, 'M', u'Ꮕ'), + (0xAB96, 'M', u'Ꮖ'), + (0xAB97, 'M', u'Ꮗ'), + (0xAB98, 'M', u'Ꮘ'), + (0xAB99, 'M', u'Ꮙ'), + (0xAB9A, 'M', u'Ꮚ'), + (0xAB9B, 'M', u'Ꮛ'), + (0xAB9C, 'M', u'Ꮜ'), + (0xAB9D, 'M', u'Ꮝ'), + (0xAB9E, 'M', u'Ꮞ'), + (0xAB9F, 'M', u'Ꮟ'), + (0xABA0, 'M', u'Ꮠ'), + (0xABA1, 'M', u'Ꮡ'), + (0xABA2, 'M', u'Ꮢ'), + (0xABA3, 'M', u'Ꮣ'), + (0xABA4, 'M', u'Ꮤ'), + (0xABA5, 'M', u'Ꮥ'), + (0xABA6, 'M', u'Ꮦ'), + (0xABA7, 'M', u'Ꮧ'), + (0xABA8, 'M', u'Ꮨ'), + (0xABA9, 'M', u'Ꮩ'), + (0xABAA, 'M', u'Ꮪ'), + (0xABAB, 'M', u'Ꮫ'), + (0xABAC, 'M', u'Ꮬ'), + (0xABAD, 'M', u'Ꮭ'), + (0xABAE, 'M', u'Ꮮ'), + (0xABAF, 'M', u'Ꮯ'), + (0xABB0, 'M', u'Ꮰ'), + (0xABB1, 'M', u'Ꮱ'), + (0xABB2, 'M', u'Ꮲ'), + (0xABB3, 'M', u'Ꮳ'), + (0xABB4, 'M', u'Ꮴ'), + (0xABB5, 'M', u'Ꮵ'), + (0xABB6, 'M', u'Ꮶ'), + (0xABB7, 'M', u'Ꮷ'), + (0xABB8, 'M', u'Ꮸ'), + (0xABB9, 'M', u'Ꮹ'), + (0xABBA, 'M', u'Ꮺ'), + (0xABBB, 'M', u'Ꮻ'), + (0xABBC, 'M', u'Ꮼ'), + (0xABBD, 'M', u'Ꮽ'), + (0xABBE, 'M', u'Ꮾ'), + (0xABBF, 'M', u'Ꮿ'), + (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'洛'), + ] + +def _seg_39(): + return [ + (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'來'), + (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'凉'), + ] + +def _seg_40(): + return [ + (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'撚'), + (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'利'), + ] + +def _seg_41(): + return [ + (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'淋'), + (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'渚'), + ] + +def _seg_42(): + return [ + (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'著'), + (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'窱'), + ] + +def _seg_43(): + return [ + (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'醙'), + (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'), + ] + +def _seg_44(): + return [ + (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'ڍ'), + (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'طح'), + ] + +def _seg_45(): + return [ + (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'كي'), + (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'نر'), + ] + +def _seg_46(): + return [ + (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'تح'), + (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'نم'), + ] + +def _seg_47(): + return [ + (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'صي'), + (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'شجي'), + ] + +def _seg_48(): + return [ + (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'محم'), + (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','), + ] + +def _seg_49(): + return [ + (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'), + (0xFE30, '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'》'), + (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'ص'), + ] + +def _seg_50(): + return [ + (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'"'), + (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'), + ] + +def _seg_51(): + return [ + (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'ヲ'), + (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'ᄇ'), + ] + +def _seg_52(): + return [ + (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'ᅪ'), + (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'), + (0x1018F, 'X'), + (0x10190, 'V'), + (0x1019C, 'X'), + (0x101A0, 'V'), + (0x101A1, 'X'), + (0x101D0, 'V'), + (0x101FE, 'X'), + (0x10280, 'V'), + (0x1029D, 'X'), + (0x102A0, 'V'), + (0x102D1, 'X'), + (0x102E0, 'V'), + (0x102FC, 'X'), + (0x10300, 'V'), + (0x10324, 'X'), + (0x1032D, 'V'), + (0x1034B, 'X'), + (0x10350, 'V'), + (0x1037B, 'X'), + (0x10380, 'V'), + (0x1039E, 'X'), + (0x1039F, 'V'), + (0x103C4, 'X'), + (0x103C8, 'V'), + (0x103D6, 'X'), + (0x10400, 'M', u'𐐨'), + (0x10401, 'M', u'𐐩'), + ] + +def _seg_53(): + return [ + (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'𐑅'), + (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'), + (0x104B0, 'M', u'𐓘'), + (0x104B1, 'M', u'𐓙'), + (0x104B2, 'M', u'𐓚'), + (0x104B3, 'M', u'𐓛'), + (0x104B4, 'M', u'𐓜'), + (0x104B5, 'M', u'𐓝'), + (0x104B6, 'M', u'𐓞'), + (0x104B7, 'M', u'𐓟'), + (0x104B8, 'M', u'𐓠'), + (0x104B9, 'M', u'𐓡'), + (0x104BA, 'M', u'𐓢'), + (0x104BB, 'M', u'𐓣'), + (0x104BC, 'M', u'𐓤'), + (0x104BD, 'M', u'𐓥'), + (0x104BE, 'M', u'𐓦'), + (0x104BF, 'M', u'𐓧'), + (0x104C0, 'M', u'𐓨'), + (0x104C1, 'M', u'𐓩'), + (0x104C2, 'M', u'𐓪'), + (0x104C3, 'M', u'𐓫'), + (0x104C4, 'M', u'𐓬'), + (0x104C5, 'M', u'𐓭'), + (0x104C6, 'M', u'𐓮'), + (0x104C7, 'M', u'𐓯'), + (0x104C8, 'M', u'𐓰'), + (0x104C9, 'M', u'𐓱'), + (0x104CA, 'M', u'𐓲'), + (0x104CB, 'M', u'𐓳'), + (0x104CC, 'M', u'𐓴'), + (0x104CD, 'M', u'𐓵'), + (0x104CE, 'M', u'𐓶'), + (0x104CF, 'M', u'𐓷'), + (0x104D0, 'M', u'𐓸'), + (0x104D1, 'M', u'𐓹'), + (0x104D2, 'M', u'𐓺'), + (0x104D3, 'M', u'𐓻'), + (0x104D4, 'X'), + (0x104D8, 'V'), + (0x104FC, 'X'), + (0x10500, 'V'), + (0x10528, 'X'), + (0x10530, 'V'), + (0x10564, 'X'), + (0x1056F, 'V'), + (0x10570, 'X'), + (0x10600, 'V'), + (0x10737, 'X'), + (0x10740, 'V'), + (0x10756, 'X'), + (0x10760, 'V'), + (0x10768, 'X'), + (0x10800, 'V'), + (0x10806, 'X'), + (0x10808, 'V'), + (0x10809, 'X'), + (0x1080A, 'V'), + (0x10836, 'X'), + (0x10837, 'V'), + ] + +def _seg_54(): + return [ + (0x10839, 'X'), + (0x1083C, 'V'), + (0x1083D, 'X'), + (0x1083F, 'V'), + (0x10856, 'X'), + (0x10857, 'V'), + (0x1089F, 'X'), + (0x108A7, 'V'), + (0x108B0, 'X'), + (0x108E0, 'V'), + (0x108F3, 'X'), + (0x108F4, 'V'), + (0x108F6, 'X'), + (0x108FB, 'V'), + (0x1091C, 'X'), + (0x1091F, 'V'), + (0x1093A, 'X'), + (0x1093F, 'V'), + (0x10940, 'X'), + (0x10980, 'V'), + (0x109B8, 'X'), + (0x109BC, 'V'), + (0x109D0, 'X'), + (0x109D2, 'V'), + (0x10A04, 'X'), + (0x10A05, 'V'), + (0x10A07, 'X'), + (0x10A0C, 'V'), + (0x10A14, 'X'), + (0x10A15, 'V'), + (0x10A18, 'X'), + (0x10A19, 'V'), + (0x10A36, 'X'), + (0x10A38, 'V'), + (0x10A3B, 'X'), + (0x10A3F, 'V'), + (0x10A49, 'X'), + (0x10A50, 'V'), + (0x10A59, 'X'), + (0x10A60, 'V'), + (0x10AA0, 'X'), + (0x10AC0, 'V'), + (0x10AE7, 'X'), + (0x10AEB, 'V'), + (0x10AF7, 'X'), + (0x10B00, 'V'), + (0x10B36, 'X'), + (0x10B39, 'V'), + (0x10B56, 'X'), + (0x10B58, 'V'), + (0x10B73, 'X'), + (0x10B78, 'V'), + (0x10B92, 'X'), + (0x10B99, 'V'), + (0x10B9D, 'X'), + (0x10BA9, 'V'), + (0x10BB0, 'X'), + (0x10C00, 'V'), + (0x10C49, 'X'), + (0x10C80, 'M', u'𐳀'), + (0x10C81, 'M', u'𐳁'), + (0x10C82, 'M', u'𐳂'), + (0x10C83, 'M', u'𐳃'), + (0x10C84, 'M', u'𐳄'), + (0x10C85, 'M', u'𐳅'), + (0x10C86, 'M', u'𐳆'), + (0x10C87, 'M', u'𐳇'), + (0x10C88, 'M', u'𐳈'), + (0x10C89, 'M', u'𐳉'), + (0x10C8A, 'M', u'𐳊'), + (0x10C8B, 'M', u'𐳋'), + (0x10C8C, 'M', u'𐳌'), + (0x10C8D, 'M', u'𐳍'), + (0x10C8E, 'M', u'𐳎'), + (0x10C8F, 'M', u'𐳏'), + (0x10C90, 'M', u'𐳐'), + (0x10C91, 'M', u'𐳑'), + (0x10C92, 'M', u'𐳒'), + (0x10C93, 'M', u'𐳓'), + (0x10C94, 'M', u'𐳔'), + (0x10C95, 'M', u'𐳕'), + (0x10C96, 'M', u'𐳖'), + (0x10C97, 'M', u'𐳗'), + (0x10C98, 'M', u'𐳘'), + (0x10C99, 'M', u'𐳙'), + (0x10C9A, 'M', u'𐳚'), + (0x10C9B, 'M', u'𐳛'), + (0x10C9C, 'M', u'𐳜'), + (0x10C9D, 'M', u'𐳝'), + (0x10C9E, 'M', u'𐳞'), + (0x10C9F, 'M', u'𐳟'), + (0x10CA0, 'M', u'𐳠'), + (0x10CA1, 'M', u'𐳡'), + (0x10CA2, 'M', u'𐳢'), + (0x10CA3, 'M', u'𐳣'), + (0x10CA4, 'M', u'𐳤'), + (0x10CA5, 'M', u'𐳥'), + (0x10CA6, 'M', u'𐳦'), + (0x10CA7, 'M', u'𐳧'), + (0x10CA8, 'M', u'𐳨'), + ] + +def _seg_55(): + return [ + (0x10CA9, 'M', u'𐳩'), + (0x10CAA, 'M', u'𐳪'), + (0x10CAB, 'M', u'𐳫'), + (0x10CAC, 'M', u'𐳬'), + (0x10CAD, 'M', u'𐳭'), + (0x10CAE, 'M', u'𐳮'), + (0x10CAF, 'M', u'𐳯'), + (0x10CB0, 'M', u'𐳰'), + (0x10CB1, 'M', u'𐳱'), + (0x10CB2, 'M', u'𐳲'), + (0x10CB3, 'X'), + (0x10CC0, 'V'), + (0x10CF3, 'X'), + (0x10CFA, 'V'), + (0x10D28, 'X'), + (0x10D30, 'V'), + (0x10D3A, 'X'), + (0x10E60, 'V'), + (0x10E7F, 'X'), + (0x10F00, 'V'), + (0x10F28, 'X'), + (0x10F30, 'V'), + (0x10F5A, 'X'), + (0x11000, 'V'), + (0x1104E, 'X'), + (0x11052, 'V'), + (0x11070, 'X'), + (0x1107F, 'V'), + (0x110BD, 'X'), + (0x110BE, 'V'), + (0x110C2, 'X'), + (0x110D0, 'V'), + (0x110E9, 'X'), + (0x110F0, 'V'), + (0x110FA, 'X'), + (0x11100, 'V'), + (0x11135, 'X'), + (0x11136, 'V'), + (0x11147, 'X'), + (0x11150, 'V'), + (0x11177, 'X'), + (0x11180, 'V'), + (0x111CE, 'X'), + (0x111D0, 'V'), + (0x111E0, 'X'), + (0x111E1, 'V'), + (0x111F5, 'X'), + (0x11200, 'V'), + (0x11212, 'X'), + (0x11213, 'V'), + (0x1123F, 'X'), + (0x11280, 'V'), + (0x11287, 'X'), + (0x11288, 'V'), + (0x11289, 'X'), + (0x1128A, 'V'), + (0x1128E, 'X'), + (0x1128F, 'V'), + (0x1129E, 'X'), + (0x1129F, 'V'), + (0x112AA, 'X'), + (0x112B0, 'V'), + (0x112EB, 'X'), + (0x112F0, 'V'), + (0x112FA, 'X'), + (0x11300, 'V'), + (0x11304, 'X'), + (0x11305, 'V'), + (0x1130D, 'X'), + (0x1130F, 'V'), + (0x11311, 'X'), + (0x11313, 'V'), + (0x11329, 'X'), + (0x1132A, 'V'), + (0x11331, 'X'), + (0x11332, 'V'), + (0x11334, 'X'), + (0x11335, 'V'), + (0x1133A, 'X'), + (0x1133B, 'V'), + (0x11345, 'X'), + (0x11347, 'V'), + (0x11349, 'X'), + (0x1134B, 'V'), + (0x1134E, 'X'), + (0x11350, 'V'), + (0x11351, 'X'), + (0x11357, 'V'), + (0x11358, 'X'), + (0x1135D, 'V'), + (0x11364, 'X'), + (0x11366, 'V'), + (0x1136D, 'X'), + (0x11370, 'V'), + (0x11375, 'X'), + (0x11400, 'V'), + (0x1145A, 'X'), + (0x1145B, 'V'), + (0x1145C, 'X'), + (0x1145D, 'V'), + ] + +def _seg_56(): + return [ + (0x1145F, 'X'), + (0x11480, 'V'), + (0x114C8, 'X'), + (0x114D0, 'V'), + (0x114DA, 'X'), + (0x11580, 'V'), + (0x115B6, 'X'), + (0x115B8, 'V'), + (0x115DE, 'X'), + (0x11600, 'V'), + (0x11645, 'X'), + (0x11650, 'V'), + (0x1165A, 'X'), + (0x11660, 'V'), + (0x1166D, 'X'), + (0x11680, 'V'), + (0x116B8, 'X'), + (0x116C0, 'V'), + (0x116CA, 'X'), + (0x11700, 'V'), + (0x1171B, 'X'), + (0x1171D, 'V'), + (0x1172C, 'X'), + (0x11730, 'V'), + (0x11740, 'X'), + (0x11800, 'V'), + (0x1183C, 'X'), + (0x118A0, 'M', u'𑣀'), + (0x118A1, 'M', u'𑣁'), + (0x118A2, 'M', u'𑣂'), + (0x118A3, 'M', u'𑣃'), + (0x118A4, 'M', u'𑣄'), + (0x118A5, 'M', u'𑣅'), + (0x118A6, 'M', u'𑣆'), + (0x118A7, 'M', u'𑣇'), + (0x118A8, 'M', u'𑣈'), + (0x118A9, 'M', u'𑣉'), + (0x118AA, 'M', u'𑣊'), + (0x118AB, 'M', u'𑣋'), + (0x118AC, 'M', u'𑣌'), + (0x118AD, 'M', u'𑣍'), + (0x118AE, 'M', u'𑣎'), + (0x118AF, 'M', u'𑣏'), + (0x118B0, 'M', u'𑣐'), + (0x118B1, 'M', u'𑣑'), + (0x118B2, 'M', u'𑣒'), + (0x118B3, 'M', u'𑣓'), + (0x118B4, 'M', u'𑣔'), + (0x118B5, 'M', u'𑣕'), + (0x118B6, 'M', u'𑣖'), + (0x118B7, 'M', u'𑣗'), + (0x118B8, 'M', u'𑣘'), + (0x118B9, 'M', u'𑣙'), + (0x118BA, 'M', u'𑣚'), + (0x118BB, 'M', u'𑣛'), + (0x118BC, 'M', u'𑣜'), + (0x118BD, 'M', u'𑣝'), + (0x118BE, 'M', u'𑣞'), + (0x118BF, 'M', u'𑣟'), + (0x118C0, 'V'), + (0x118F3, 'X'), + (0x118FF, 'V'), + (0x11900, 'X'), + (0x11A00, 'V'), + (0x11A48, 'X'), + (0x11A50, 'V'), + (0x11A84, 'X'), + (0x11A86, 'V'), + (0x11AA3, 'X'), + (0x11AC0, 'V'), + (0x11AF9, 'X'), + (0x11C00, 'V'), + (0x11C09, 'X'), + (0x11C0A, 'V'), + (0x11C37, 'X'), + (0x11C38, 'V'), + (0x11C46, 'X'), + (0x11C50, 'V'), + (0x11C6D, 'X'), + (0x11C70, 'V'), + (0x11C90, 'X'), + (0x11C92, 'V'), + (0x11CA8, 'X'), + (0x11CA9, 'V'), + (0x11CB7, 'X'), + (0x11D00, 'V'), + (0x11D07, 'X'), + (0x11D08, 'V'), + (0x11D0A, 'X'), + (0x11D0B, 'V'), + (0x11D37, 'X'), + (0x11D3A, 'V'), + (0x11D3B, 'X'), + (0x11D3C, 'V'), + (0x11D3E, 'X'), + (0x11D3F, 'V'), + (0x11D48, 'X'), + (0x11D50, 'V'), + (0x11D5A, 'X'), + (0x11D60, 'V'), + ] + +def _seg_57(): + return [ + (0x11D66, 'X'), + (0x11D67, 'V'), + (0x11D69, 'X'), + (0x11D6A, 'V'), + (0x11D8F, 'X'), + (0x11D90, 'V'), + (0x11D92, 'X'), + (0x11D93, 'V'), + (0x11D99, 'X'), + (0x11DA0, 'V'), + (0x11DAA, 'X'), + (0x11EE0, 'V'), + (0x11EF9, 'X'), + (0x12000, 'V'), + (0x1239A, 'X'), + (0x12400, 'V'), + (0x1246F, 'X'), + (0x12470, 'V'), + (0x12475, 'X'), + (0x12480, 'V'), + (0x12544, 'X'), + (0x13000, 'V'), + (0x1342F, 'X'), + (0x14400, 'V'), + (0x14647, 'X'), + (0x16800, 'V'), + (0x16A39, 'X'), + (0x16A40, 'V'), + (0x16A5F, 'X'), + (0x16A60, 'V'), + (0x16A6A, 'X'), + (0x16A6E, 'V'), + (0x16A70, 'X'), + (0x16AD0, 'V'), + (0x16AEE, 'X'), + (0x16AF0, 'V'), + (0x16AF6, 'X'), + (0x16B00, 'V'), + (0x16B46, 'X'), + (0x16B50, 'V'), + (0x16B5A, 'X'), + (0x16B5B, 'V'), + (0x16B62, 'X'), + (0x16B63, 'V'), + (0x16B78, 'X'), + (0x16B7D, 'V'), + (0x16B90, 'X'), + (0x16E60, 'V'), + (0x16E9B, 'X'), + (0x16F00, 'V'), + (0x16F45, 'X'), + (0x16F50, 'V'), + (0x16F7F, 'X'), + (0x16F8F, 'V'), + (0x16FA0, 'X'), + (0x16FE0, 'V'), + (0x16FE2, 'X'), + (0x17000, 'V'), + (0x187F2, 'X'), + (0x18800, 'V'), + (0x18AF3, 'X'), + (0x1B000, 'V'), + (0x1B11F, 'X'), + (0x1B170, 'V'), + (0x1B2FC, 'X'), + (0x1BC00, 'V'), + (0x1BC6B, 'X'), + (0x1BC70, 'V'), + (0x1BC7D, 'X'), + (0x1BC80, 'V'), + (0x1BC89, 'X'), + (0x1BC90, 'V'), + (0x1BC9A, 'X'), + (0x1BC9C, 'V'), + (0x1BCA0, 'I'), + (0x1BCA4, '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'), + (0x1D1E9, 'X'), + (0x1D200, 'V'), + ] + +def _seg_58(): + return [ + (0x1D246, 'X'), + (0x1D2E0, 'V'), + (0x1D2F4, 'X'), + (0x1D300, 'V'), + (0x1D357, 'X'), + (0x1D360, 'V'), + (0x1D379, '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'), + (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'), + ] + +def _seg_59(): + return [ + (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'), + (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'), + ] + +def _seg_60(): + return [ + (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'), + (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'), + ] + +def _seg_61(): + return [ + (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'), + (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'), + ] + +def _seg_62(): + return [ + (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'), + (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'), + ] + +def _seg_63(): + return [ + (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'), + (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'), + ] + +def _seg_64(): + return [ + (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'), + (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'τ'), + ] + +def _seg_65(): + return [ + (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'ε'), + (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'ζ'), + ] + +def _seg_66(): + return [ + (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'ρ'), + (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'ψ'), + ] + +def _seg_67(): + return [ + (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'), + (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'), + ] + +def _seg_68(): + return [ + (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, 'V'), + (0x1DA8C, 'X'), + (0x1DA9B, 'V'), + (0x1DAA0, 'X'), + (0x1DAA1, 'V'), + (0x1DAB0, 'X'), + (0x1E000, 'V'), + (0x1E007, 'X'), + (0x1E008, 'V'), + (0x1E019, 'X'), + (0x1E01B, 'V'), + (0x1E022, 'X'), + (0x1E023, 'V'), + (0x1E025, 'X'), + (0x1E026, 'V'), + (0x1E02B, 'X'), + (0x1E800, 'V'), + (0x1E8C5, 'X'), + (0x1E8C7, 'V'), + (0x1E8D7, 'X'), + (0x1E900, 'M', u'𞤢'), + (0x1E901, 'M', u'𞤣'), + (0x1E902, 'M', u'𞤤'), + (0x1E903, 'M', u'𞤥'), + (0x1E904, 'M', u'𞤦'), + (0x1E905, 'M', u'𞤧'), + (0x1E906, 'M', u'𞤨'), + (0x1E907, 'M', u'𞤩'), + (0x1E908, 'M', u'𞤪'), + (0x1E909, 'M', u'𞤫'), + (0x1E90A, 'M', u'𞤬'), + (0x1E90B, 'M', u'𞤭'), + (0x1E90C, 'M', u'𞤮'), + (0x1E90D, 'M', u'𞤯'), + (0x1E90E, 'M', u'𞤰'), + (0x1E90F, 'M', u'𞤱'), + (0x1E910, 'M', u'𞤲'), + (0x1E911, 'M', u'𞤳'), + (0x1E912, 'M', u'𞤴'), + (0x1E913, 'M', u'𞤵'), + (0x1E914, 'M', u'𞤶'), + (0x1E915, 'M', u'𞤷'), + (0x1E916, 'M', u'𞤸'), + (0x1E917, 'M', u'𞤹'), + (0x1E918, 'M', u'𞤺'), + (0x1E919, 'M', u'𞤻'), + (0x1E91A, 'M', u'𞤼'), + (0x1E91B, 'M', u'𞤽'), + (0x1E91C, 'M', u'𞤾'), + (0x1E91D, 'M', u'𞤿'), + (0x1E91E, 'M', u'𞥀'), + (0x1E91F, 'M', u'𞥁'), + (0x1E920, 'M', u'𞥂'), + (0x1E921, 'M', u'𞥃'), + (0x1E922, 'V'), + (0x1E94B, 'X'), + (0x1E950, 'V'), + (0x1E95A, 'X'), + (0x1E95E, 'V'), + (0x1E960, 'X'), + (0x1EC71, 'V'), + (0x1ECB5, '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'ش'), + ] + +def _seg_69(): + return [ + (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'ق'), + (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'د'), + ] + +def _seg_70(): + return [ + (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'), + (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'), + (0x1F0C0, 'X'), + (0x1F0C1, 'V'), + (0x1F0D0, 'X'), + (0x1F0D1, 'V'), + (0x1F0F6, '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, 'V'), + (0x1F10D, '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)'), + ] + +def _seg_71(): + return [ + (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, 'V'), + (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'), + (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'), + (0x1F1AD, '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, 'M', u'配'), + ] + +def _seg_72(): + return [ + (0x1F23C, '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'), + (0x1F260, 'V'), + (0x1F266, 'X'), + (0x1F300, 'V'), + (0x1F6D5, 'X'), + (0x1F6E0, 'V'), + (0x1F6ED, 'X'), + (0x1F6F0, 'V'), + (0x1F6FA, 'X'), + (0x1F700, 'V'), + (0x1F774, 'X'), + (0x1F780, 'V'), + (0x1F7D9, 'X'), + (0x1F800, 'V'), + (0x1F80C, 'X'), + (0x1F810, 'V'), + (0x1F848, 'X'), + (0x1F850, 'V'), + (0x1F85A, 'X'), + (0x1F860, 'V'), + (0x1F888, 'X'), + (0x1F890, 'V'), + (0x1F8AE, 'X'), + (0x1F900, 'V'), + (0x1F90C, 'X'), + (0x1F910, 'V'), + (0x1F93F, 'X'), + (0x1F940, 'V'), + (0x1F971, 'X'), + (0x1F973, 'V'), + (0x1F977, 'X'), + (0x1F97A, 'V'), + (0x1F97B, 'X'), + (0x1F97C, 'V'), + (0x1F9A3, 'X'), + (0x1F9B0, 'V'), + (0x1F9BA, 'X'), + (0x1F9C0, 'V'), + (0x1F9C3, 'X'), + (0x1F9D0, 'V'), + (0x1FA00, 'X'), + (0x1FA60, 'V'), + (0x1FA6E, 'X'), + (0x20000, 'V'), + (0x2A6D7, 'X'), + (0x2A700, 'V'), + (0x2B735, 'X'), + (0x2B740, 'V'), + (0x2B81E, 'X'), + (0x2B820, 'V'), + (0x2CEA2, 'X'), + (0x2CEB0, 'V'), + (0x2EBE1, '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'剆'), + ] + +def _seg_73(): + return [ + (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'圗'), + (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'𢆃'), + ] + +def _seg_74(): + return [ + (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'扝'), + (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'次'), + ] + +def _seg_75(): + return [ + (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'災'), + (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'𥛅'), + ] + +def _seg_76(): + return [ + (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'聰'), + (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'蛢'), + ] + +def _seg_77(): + return [ + (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'郱'), + (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'), + ] + +def _seg_78(): + return [ + (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() + + _seg_73() + + _seg_74() + + _seg_75() + + _seg_76() + + _seg_77() + + _seg_78() +) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py new file mode 100644 index 0000000..f2d0766 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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.22' + +# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py new file mode 100644 index 0000000..a6f44a5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py new file mode 100644 index 0000000..2ca9be0 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py new file mode 100644 index 0000000..05a8c96 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py new file mode 100644 index 0000000..069e85b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py new file mode 100644 index 0000000..f997e24 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py new file mode 100644 index 0000000..23b41f5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py new file mode 100644 index 0000000..2afca5a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py new file mode 100644 index 0000000..d28f0de --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py @@ -0,0 +1 @@ +version = (0, 5, 6) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py new file mode 100644 index 0000000..9766881 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py new file mode 100644 index 0000000..9418421 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py new file mode 100644 index 0000000..7481c9e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py @@ -0,0 +1,27 @@ +# 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__ = "19.0" + +__author__ = "Donald Stufft and individual contributors" +__email__ = "donald@stufft.io" + +__license__ = "BSD or Apache License, Version 2.0" +__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py new file mode 100644 index 0000000..a0cf67d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py @@ -0,0 +1,26 @@ +# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py new file mode 100644 index 0000000..25da473 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py @@ -0,0 +1,31 @@ +# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py new file mode 100644 index 0000000..68dcca6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py new file mode 100644 index 0000000..5482476 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py @@ -0,0 +1,296 @@ +# 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") + | L("sys.platform") # PEP-345 + | L("platform.version") # PEP-345 + | L("platform.machine") # PEP-345 + | L("platform.python_implementation") # PEP-345 + | L("python_implementation") # PEP-345 + | L("extra") # undocumented setuptools legacy +) +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py new file mode 100644 index 0000000..dbc5f11 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py @@ -0,0 +1,138 @@ +# 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( + 'Parse error at "{0!r}": {1}'.format( + requirement_string[e.loc : e.loc + 8], e.msg + ) + ) + + self.name = req.name + if req.url: + parsed_url = urlparse.urlparse(req.url) + if parsed_url.scheme == "file": + if urlparse.urlunparse(parsed_url) != req.url: + raise InvalidRequirement("Invalid URL given") + elif not (parsed_url.scheme and parsed_url.netloc) or ( + not parsed_url.scheme and not parsed_url.netloc + ): + raise InvalidRequirement("Invalid URL: {0}".format(req.url)) + 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(" ") + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py new file mode 100644 index 0000000..743576a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py @@ -0,0 +1,749 @@ +# 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 technically 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py new file mode 100644 index 0000000..8841878 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py @@ -0,0 +1,57 @@ +# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py new file mode 100644 index 0000000..95157a1 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py @@ -0,0 +1,420 @@ +# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py new file mode 100644 index 0000000..9c1a098 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py @@ -0,0 +1,4 @@ +"""Wrappers to build Python packages using PEP 517 hooks +""" + +__version__ = '0.5.0' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py new file mode 100644 index 0000000..d6524b6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py @@ -0,0 +1,207 @@ +"""This is invoked in a subprocess to call the build backend hooks. + +It expects: +- Command line args: hook_name, control_dir +- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec +- control_dir/input.json: + - {"kwargs": {...}} + +Results: +- control_dir/output.json + - {"return_val": ...} +""" +from glob import glob +from importlib import import_module +import os +from os.path import join as pjoin +import re +import shutil +import sys + +# This is run as a script, not a module, so it can't do a relative import +import compat + + +class BackendUnavailable(Exception): + """Raised if we cannot import the backend""" + + +def _build_backend(): + """Find and load the build backend""" + ep = os.environ['PEP517_BUILD_BACKEND'] + mod_path, _, obj_path = ep.partition(':') + try: + obj = import_module(mod_path) + except ImportError: + raise BackendUnavailable + if obj_path: + for path_part in obj_path.split('.'): + obj = getattr(obj, path_part) + return obj + + +def get_requires_for_build_wheel(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_wheel + except AttributeError: + return [] + else: + return hook(config_settings) + + +def prepare_metadata_for_build_wheel(metadata_directory, config_settings): + """Invoke optional prepare_metadata_for_build_wheel + + Implements a fallback by building a wheel if the hook isn't defined. + """ + backend = _build_backend() + try: + hook = backend.prepare_metadata_for_build_wheel + except AttributeError: + return _get_wheel_metadata_from_wheel(backend, metadata_directory, + config_settings) + else: + return hook(metadata_directory, config_settings) + + +WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' + + +def _dist_info_files(whl_zip): + """Identify the .dist-info folder inside a wheel ZipFile.""" + res = [] + for path in whl_zip.namelist(): + m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) + if m: + res.append(path) + if res: + return res + raise Exception("No .dist-info folder found in wheel") + + +def _get_wheel_metadata_from_wheel( + backend, metadata_directory, config_settings): + """Build a wheel and extract the metadata from it. + + Fallback for when the build backend does not + define the 'get_wheel_metadata' hook. + """ + from zipfile import ZipFile + whl_basename = backend.build_wheel(metadata_directory, config_settings) + with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): + pass # Touch marker file + + whl_file = os.path.join(metadata_directory, whl_basename) + with ZipFile(whl_file) as zipf: + dist_info = _dist_info_files(zipf) + zipf.extractall(path=metadata_directory, members=dist_info) + return dist_info[0].split('/')[0] + + +def _find_already_built_wheel(metadata_directory): + """Check for a wheel already built during the get_wheel_metadata hook. + """ + if not metadata_directory: + return None + metadata_parent = os.path.dirname(metadata_directory) + if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): + return None + + whl_files = glob(os.path.join(metadata_parent, '*.whl')) + if not whl_files: + print('Found wheel built marker, but no .whl files') + return None + if len(whl_files) > 1: + print('Found multiple .whl files; unspecified behaviour. ' + 'Will call build_wheel.') + return None + + # Exactly one .whl file + return whl_files[0] + + +def build_wheel(wheel_directory, config_settings, metadata_directory=None): + """Invoke the mandatory build_wheel hook. + + If a wheel was already built in the + prepare_metadata_for_build_wheel fallback, this + will copy it rather than rebuilding the wheel. + """ + prebuilt_whl = _find_already_built_wheel(metadata_directory) + if prebuilt_whl: + shutil.copy2(prebuilt_whl, wheel_directory) + return os.path.basename(prebuilt_whl) + + return _build_backend().build_wheel(wheel_directory, config_settings, + metadata_directory) + + +def get_requires_for_build_sdist(config_settings): + """Invoke the optional get_requires_for_build_wheel hook + + Returns [] if the hook is not defined. + """ + backend = _build_backend() + try: + hook = backend.get_requires_for_build_sdist + except AttributeError: + return [] + else: + return hook(config_settings) + + +class _DummyException(Exception): + """Nothing should ever raise this exception""" + + +class GotUnsupportedOperation(Exception): + """For internal use when backend raises UnsupportedOperation""" + + +def build_sdist(sdist_directory, config_settings): + """Invoke the mandatory build_sdist hook.""" + backend = _build_backend() + try: + return backend.build_sdist(sdist_directory, config_settings) + except getattr(backend, 'UnsupportedOperation', _DummyException): + raise GotUnsupportedOperation + + +HOOK_NAMES = { + 'get_requires_for_build_wheel', + 'prepare_metadata_for_build_wheel', + 'build_wheel', + 'get_requires_for_build_sdist', + 'build_sdist', +} + + +def main(): + if len(sys.argv) < 3: + sys.exit("Needs args: hook_name, control_dir") + hook_name = sys.argv[1] + control_dir = sys.argv[2] + if hook_name not in HOOK_NAMES: + sys.exit("Unknown hook: %s" % hook_name) + hook = globals()[hook_name] + + hook_input = compat.read_json(pjoin(control_dir, 'input.json')) + + json_out = {'unsupported': False, 'return_val': None} + try: + json_out['return_val'] = hook(**hook_input['kwargs']) + except BackendUnavailable: + json_out['no_backend'] = True + except GotUnsupportedOperation: + json_out['unsupported'] = True + + compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) + + +if __name__ == '__main__': + main() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py new file mode 100644 index 0000000..ac6c949 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py @@ -0,0 +1,108 @@ +"""Build a project using PEP 517 hooks. +""" +import argparse +import logging +import os +import contextlib +from pip._vendor import pytoml +import shutil +import errno +import tempfile + +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +@contextlib.contextmanager +def tempdir(): + td = tempfile.mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +def _do_build(hooks, env, dist, dest): + get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) + get_requires = getattr(hooks, get_requires_name) + reqs = get_requires({}) + log.info('Got build requires: %s', reqs) + + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + + with tempdir() as td: + log.info('Trying to build %s in %s', dist, td) + build_name = 'build_{dist}'.format(**locals()) + build = getattr(hooks, build_name) + filename = build(td, {}) + source = os.path.join(td, filename) + shutil.move(source, os.path.join(dest, os.path.basename(filename))) + + +def mkdir_p(*args, **kwargs): + """Like `mkdir`, but does not raise an exception if the + directory already exists. + """ + try: + return os.mkdir(*args, **kwargs) + except OSError as exc: + if exc.errno != errno.EEXIST: + raise + + +def build(source_dir, dist, dest=None): + pyproject = os.path.join(source_dir, 'pyproject.toml') + dest = os.path.join(source_dir, dest or 'dist') + mkdir_p(dest) + + with open(pyproject) as f: + pyproject_data = pytoml.load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + _do_build(hooks, env, dist, dest) + + +parser = argparse.ArgumentParser() +parser.add_argument( + 'source_dir', + help="A directory containing pyproject.toml", +) +parser.add_argument( + '--binary', '-b', + action='store_true', + default=False, +) +parser.add_argument( + '--source', '-s', + action='store_true', + default=False, +) +parser.add_argument( + '--out-dir', '-o', + help="Destination in which to save the builds relative to source dir", +) + + +def main(args): + # determine which dists to build + dists = list(filter(None, ( + 'sdist' if args.source or not args.binary else None, + 'wheel' if args.binary or not args.source else None, + ))) + + for dist in dists: + build(args.source_dir, dist, args.out_dir) + + +if __name__ == '__main__': + main(parser.parse_args()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py new file mode 100644 index 0000000..f4cdc6b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py @@ -0,0 +1,202 @@ +"""Check a project and backend by attempting to build using PEP 517 hooks. +""" +import argparse +import logging +import os +from os.path import isfile, join as pjoin +from pip._vendor.pytoml import TomlError, load as toml_load +import shutil +from subprocess import CalledProcessError +import sys +import tarfile +from tempfile import mkdtemp +import zipfile + +from .colorlog import enable_colourful_output +from .envbuild import BuildEnvironment +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def check_build_sdist(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_sdist({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build sdist in %s', td) + try: + try: + filename = hooks.build_sdist(td, {}) + log.info('build_sdist returned %r', filename) + except Exception: + log.info('Failure in build_sdist', exc_info=True) + return False + + if not filename.endswith('.tar.gz'): + log.error( + "Filename %s doesn't have .tar.gz extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if tarfile.is_tarfile(path): + log.info("Output file is a tar file") + else: + log.error("Output file is not a tar file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check_build_wheel(hooks, build_sys_requires): + with BuildEnvironment() as env: + try: + env.pip_install(build_sys_requires) + log.info('Installed static build dependencies') + except CalledProcessError: + log.error('Failed to install static build dependencies') + return False + + try: + reqs = hooks.get_requires_for_build_wheel({}) + log.info('Got build requires: %s', reqs) + except Exception: + log.error('Failure in get_requires_for_build_sdist', exc_info=True) + return False + + try: + env.pip_install(reqs) + log.info('Installed dynamic build dependencies') + except CalledProcessError: + log.error('Failed to install dynamic build dependencies') + return False + + td = mkdtemp() + log.info('Trying to build wheel in %s', td) + try: + try: + filename = hooks.build_wheel(td, {}) + log.info('build_wheel returned %r', filename) + except Exception: + log.info('Failure in build_wheel', exc_info=True) + return False + + if not filename.endswith('.whl'): + log.error("Filename %s doesn't have .whl extension", filename) + return False + + path = pjoin(td, filename) + if isfile(path): + log.info("Output file %s exists", path) + else: + log.error("Output file %s does not exist", path) + return False + + if zipfile.is_zipfile(path): + log.info("Output file is a zip file") + else: + log.error("Output file is not a zip file") + return False + + finally: + shutil.rmtree(td) + + return True + + +def check(source_dir): + pyproject = pjoin(source_dir, 'pyproject.toml') + if isfile(pyproject): + log.info('Found pyproject.toml') + else: + log.error('Missing pyproject.toml') + return False + + try: + with open(pyproject) as f: + pyproject_data = toml_load(f) + # Ensure the mandatory data can be loaded + buildsys = pyproject_data['build-system'] + requires = buildsys['requires'] + backend = buildsys['build-backend'] + log.info('Loaded pyproject.toml') + except (TomlError, KeyError): + log.error("Invalid pyproject.toml", exc_info=True) + return False + + hooks = Pep517HookCaller(source_dir, backend) + + sdist_ok = check_build_sdist(hooks, requires) + wheel_ok = check_build_wheel(hooks, requires) + + if not sdist_ok: + log.warning('Sdist checks failed; scroll up to see') + if not wheel_ok: + log.warning('Wheel checks failed') + + return sdist_ok + + +def main(argv=None): + ap = argparse.ArgumentParser() + ap.add_argument( + 'source_dir', + help="A directory containing pyproject.toml") + args = ap.parse_args(argv) + + enable_colourful_output() + + ok = check(args.source_dir) + + if ok: + print(ansi('Checks passed', 'green')) + else: + print(ansi('Checks failed', 'red')) + sys.exit(1) + + +ansi_codes = { + 'reset': '\x1b[0m', + 'bold': '\x1b[1m', + 'red': '\x1b[31m', + 'green': '\x1b[32m', +} + + +def ansi(s, attr): + if os.name != 'nt' and sys.stdout.isatty(): + return ansi_codes[attr] + str(s) + ansi_codes['reset'] + else: + return str(s) + + +if __name__ == '__main__': + main() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py new file mode 100644 index 0000000..69c8a59 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py @@ -0,0 +1,115 @@ +"""Nicer log formatting with colours. + +Code copied from Tornado, Apache licensed. +""" +# Copyright 2012 Facebook +# +# 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 logging +import sys + +try: + import curses +except ImportError: + curses = None + + +def _stderr_supports_color(): + color = False + if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): + try: + curses.setupterm() + if curses.tigetnum("colors") > 0: + color = True + except Exception: + pass + return color + + +class LogFormatter(logging.Formatter): + """Log formatter with colour support + """ + DEFAULT_COLORS = { + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red + logging.CRITICAL: 1, + } + + def __init__(self, color=True, datefmt=None): + r""" + :arg bool color: Enables color support. + :arg string fmt: Log message format. + It will be applied to the attributes dict of log records. The + text between ``%(color)s`` and ``%(end_color)s`` will be colored + depending on the level if color support is on. + :arg dict colors: color mappings from logging level to terminal color + code + :arg string datefmt: Datetime format. + Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. + .. versionchanged:: 3.2 + Added ``fmt`` and ``datefmt`` arguments. + """ + logging.Formatter.__init__(self, datefmt=datefmt) + self._colors = {} + if color and _stderr_supports_color(): + # The curses module has some str/bytes confusion in + # python3. Until version 3.2.3, most methods return + # bytes, but only accept strings. In addition, we want to + # output these strings with the logging module, which + # works with unicode strings. The explicit calls to + # unicode() below are harmless in python2 but will do the + # right conversion in python 3. + fg_color = (curses.tigetstr("setaf") or + curses.tigetstr("setf") or "") + if (3, 0) < sys.version_info < (3, 2, 3): + fg_color = str(fg_color, "ascii") + + for levelno, code in self.DEFAULT_COLORS.items(): + self._colors[levelno] = str( + curses.tparm(fg_color, code), "ascii") + self._normal = str(curses.tigetstr("sgr0"), "ascii") + + scr = curses.initscr() + self.termwidth = scr.getmaxyx()[1] + curses.endwin() + else: + self._normal = '' + # Default width is usually 80, but too wide is + # worse than too narrow + self.termwidth = 70 + + def formatMessage(self, record): + mlen = len(record.message) + right_text = '{initial}-{name}'.format(initial=record.levelname[0], + name=record.name) + if mlen + len(right_text) < self.termwidth: + space = ' ' * (self.termwidth - (mlen + len(right_text))) + else: + space = ' ' + + if record.levelno in self._colors: + start_color = self._colors[record.levelno] + end_color = self._normal + else: + start_color = end_color = '' + + return record.message + space + start_color + right_text + end_color + + +def enable_colourful_output(level=logging.INFO): + handler = logging.StreamHandler() + handler.setFormatter(LogFormatter()) + logging.root.addHandler(handler) + logging.root.setLevel(level) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py new file mode 100644 index 0000000..01c66fc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py @@ -0,0 +1,23 @@ +"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" +import json +import sys + +if sys.version_info[0] >= 3: + # Python 3 + def write_json(obj, path, **kwargs): + with open(path, 'w', encoding='utf-8') as f: + json.dump(obj, f, **kwargs) + + def read_json(path): + with open(path, 'r', encoding='utf-8') as f: + return json.load(f) + +else: + # Python 2 + def write_json(obj, path, **kwargs): + with open(path, 'wb') as f: + json.dump(obj, f, encoding='utf-8', **kwargs) + + def read_json(path): + with open(path, 'rb') as f: + return json.load(f) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py new file mode 100644 index 0000000..f7ac5f4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py @@ -0,0 +1,158 @@ +"""Build wheels/sdists by installing build deps to a temporary environment. +""" + +import os +import logging +from pip._vendor import pytoml +import shutil +from subprocess import check_call +import sys +from sysconfig import get_paths +from tempfile import mkdtemp + +from .wrappers import Pep517HookCaller + +log = logging.getLogger(__name__) + + +def _load_pyproject(source_dir): + with open(os.path.join(source_dir, 'pyproject.toml')) as f: + pyproject_data = pytoml.load(f) + buildsys = pyproject_data['build-system'] + return buildsys['requires'], buildsys['build-backend'] + + +class BuildEnvironment(object): + """Context manager to install build deps in a simple temporary environment + + Based on code I wrote for pip, which is MIT licensed. + """ + # 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. + + path = None + + def __init__(self, cleanup=True): + self._cleanup = cleanup + + def __enter__(self): + self.path = mkdtemp(prefix='pep517-build-env-') + log.info('Temporary build environment: %s', self.path) + + self.save_path = os.environ.get('PATH', None) + self.save_pythonpath = os.environ.get('PYTHONPATH', 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 + + if install_dirs['purelib'] == install_dirs['platlib']: + lib_dirs = install_dirs['purelib'] + else: + lib_dirs = install_dirs['purelib'] + os.pathsep + \ + install_dirs['platlib'] + if self.save_pythonpath: + os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ + self.save_pythonpath + else: + os.environ['PYTHONPATH'] = lib_dirs + + return self + + def pip_install(self, reqs): + """Install dependencies into this env by calling pip in a subprocess""" + if not reqs: + return + log.info('Calling pip to install %s', reqs) + check_call([ + sys.executable, '-m', 'pip', 'install', '--ignore-installed', + '--prefix', self.path] + list(reqs)) + + def __exit__(self, exc_type, exc_val, exc_tb): + needs_cleanup = ( + self._cleanup and + self.path is not None and + os.path.isdir(self.path) + ) + if needs_cleanup: + shutil.rmtree(self.path) + + if self.save_path is None: + os.environ.pop('PATH', None) + else: + os.environ['PATH'] = self.save_path + + if self.save_pythonpath is None: + os.environ.pop('PYTHONPATH', None) + else: + os.environ['PYTHONPATH'] = self.save_pythonpath + + +def build_wheel(source_dir, wheel_dir, config_settings=None): + """Build a wheel from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str wheel_dir: Target directory to create wheel in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_wheel(config_settings) + env.pip_install(reqs) + return hooks.build_wheel(wheel_dir, config_settings) + + +def build_sdist(source_dir, sdist_dir, config_settings=None): + """Build an sdist from a source directory using PEP 517 hooks. + + :param str source_dir: Source directory containing pyproject.toml + :param str sdist_dir: Target directory to place sdist in + :param dict config_settings: Options to pass to build backend + + This is a blocking function which will run pip in a subprocess to install + build requirements. + """ + if config_settings is None: + config_settings = {} + requires, backend = _load_pyproject(source_dir) + hooks = Pep517HookCaller(source_dir, backend) + + with BuildEnvironment() as env: + env.pip_install(requires) + reqs = hooks.get_requires_for_build_sdist(config_settings) + env.pip_install(reqs) + return hooks.build_sdist(sdist_dir, config_settings) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py new file mode 100644 index 0000000..b14b899 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py @@ -0,0 +1,163 @@ +from contextlib import contextmanager +import os +from os.path import dirname, abspath, join as pjoin +import shutil +from subprocess import check_call +import sys +from tempfile import mkdtemp + +from . import compat + +_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') + + +@contextmanager +def tempdir(): + td = mkdtemp() + try: + yield td + finally: + shutil.rmtree(td) + + +class BackendUnavailable(Exception): + """Will be raised if the backend cannot be imported in the hook process.""" + + +class UnsupportedOperation(Exception): + """May be raised by build_sdist if the backend indicates that it can't.""" + + +def default_subprocess_runner(cmd, cwd=None, extra_environ=None): + """The default method of calling the wrapper subprocess.""" + env = os.environ.copy() + if extra_environ: + env.update(extra_environ) + + check_call(cmd, cwd=cwd, env=env) + + +class Pep517HookCaller(object): + """A wrapper around a source directory to be built with a PEP 517 backend. + + source_dir : The path to the source directory, containing pyproject.toml. + backend : The build backend spec, as per PEP 517, from pyproject.toml. + """ + def __init__(self, source_dir, build_backend): + self.source_dir = abspath(source_dir) + self.build_backend = build_backend + self._subprocess_runner = default_subprocess_runner + + # TODO: Is this over-engineered? Maybe frontends only need to + # set this when creating the wrapper, not on every call. + @contextmanager + def subprocess_runner(self, runner): + prev = self._subprocess_runner + self._subprocess_runner = runner + yield + self._subprocess_runner = prev + + def get_requires_for_build_wheel(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["wheel >= 0.25", "setuptools"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_wheel', { + 'config_settings': config_settings + }) + + def prepare_metadata_for_build_wheel( + self, metadata_directory, config_settings=None): + """Prepare a *.dist-info folder with metadata for this project. + + Returns the name of the newly created folder. + + If the build backend defines a hook with this name, it will be called + in a subprocess. If not, the backend will be asked to build a wheel, + and the dist-info extracted from that. + """ + return self._call_hook('prepare_metadata_for_build_wheel', { + 'metadata_directory': abspath(metadata_directory), + 'config_settings': config_settings, + }) + + def build_wheel( + self, wheel_directory, config_settings=None, + metadata_directory=None): + """Build a wheel from this project. + + Returns the name of the newly created file. + + In general, this will call the 'build_wheel' hook in the backend. + However, if that was previously called by + 'prepare_metadata_for_build_wheel', and the same metadata_directory is + used, the previously built wheel will be copied to wheel_directory. + """ + if metadata_directory is not None: + metadata_directory = abspath(metadata_directory) + return self._call_hook('build_wheel', { + 'wheel_directory': abspath(wheel_directory), + 'config_settings': config_settings, + 'metadata_directory': metadata_directory, + }) + + def get_requires_for_build_sdist(self, config_settings=None): + """Identify packages required for building a wheel + + Returns a list of dependency specifications, e.g.: + ["setuptools >= 26"] + + This does not include requirements specified in pyproject.toml. + It returns the result of calling the equivalently named hook in a + subprocess. + """ + return self._call_hook('get_requires_for_build_sdist', { + 'config_settings': config_settings + }) + + def build_sdist(self, sdist_directory, config_settings=None): + """Build an sdist from this project. + + Returns the name of the newly created file. + + This calls the 'build_sdist' backend hook in a subprocess. + """ + return self._call_hook('build_sdist', { + 'sdist_directory': abspath(sdist_directory), + 'config_settings': config_settings, + }) + + def _call_hook(self, hook_name, kwargs): + # On Python 2, pytoml returns Unicode values (which is correct) but the + # environment passed to check_call needs to contain string values. We + # convert here by encoding using ASCII (the backend can only contain + # letters, digits and _, . and : characters, and will be used as a + # Python identifier, so non-ASCII content is wrong on Python 2 in + # any case). + if sys.version_info[0] == 2: + build_backend = self.build_backend.encode('ASCII') + else: + build_backend = self.build_backend + + with tempdir() as td: + compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), + indent=2) + + # Run the hook in a subprocess + self._subprocess_runner( + [sys.executable, _in_proc_script, hook_name, td], + cwd=self.source_dir, + extra_environ={'PEP517_BUILD_BACKEND': build_backend} + ) + + data = compat.read_json(pjoin(td, 'output.json')) + if data.get('unsupported'): + raise UnsupportedOperation + if data.get('no_backend'): + raise BackendUnavailable + return data['return_val'] diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py new file mode 100644 index 0000000..9c4fd8e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py @@ -0,0 +1,3171 @@ +# 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 + +try: + FileExistsError +except NameError: + FileExistsError = OSError + +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') + + +__metaclass__ = type + + +if (3, 0) < sys.version_info < (3, 4): + raise RuntimeError("Python 3.4 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', + + # Warnings + 'PkgResourcesDeprecationWarning', + + # 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. + """ + from sysconfig 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: + """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). + """ + return ( + entry + for dist in self + for entry in dist.get_entry_map(group).values() + if name is None or name == entry.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: + """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.6'``); + 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_names = 'SourceFileLoader', 'SourcelessFileLoader', + for name in loader_names: + loader_cls = getattr(importlib_machinery, name, 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 + + # capture warnings due to #1111 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + 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))) + + new_path = sorted(orig_path, key=position_in_sys_path) + new_path = [_normalize_cached(p) for p in new_path] + + if isinstance(module.__path__, list): + module.__path__[:] = new_path + else: + module.__path__ = new_path + + +def declare_namespace(packageName): + """Declare that package 'packageName' is a namespace package""" + + _imp.acquire_lock() + try: + if packageName in _namespace_packages: + return + + path = sys.path + parent, _, _ = packageName.rpartition('.') + + if parent: + 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 or None, []).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(os.path.normpath(_cygwin_patch(filename)))) + + +def _cygwin_patch(filename): # pragma: nocover + """ + Contrary to POSIX 2008, on Cygwin, getcwd (3) contains + symlink components. Using + os.path.abspath() works around this limitation. A fix in os.getcwd() + would probably better, in Cygwin even more so, except + that this seems to be by design... + """ + return os.path.abspath(filename) if sys.platform == 'cygwin' else 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 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.", + PkgResourcesDeprecationWarning, + 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: + """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) + + def __dir__(self): + return list( + set(super(Distribution, self).__dir__()) + | set( + attr for attr in self._provider.__dir__() + if not attr.startswith('_') + ) + ) + + if not hasattr(object, '__dir__'): + # python 2.7 not supported + del __dir__ + + @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) + try: + mkdir(dirname, 0o755) + except FileExistsError: + pass + + +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()) + +class PkgResourcesDeprecationWarning(Warning): + """ + Base class for warning about deprecations in ``pkg_resources`` + + This class is not derived from ``DeprecationWarning``, and as such is + visible by default. + """ diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py new file mode 100644 index 0000000..a2d3007 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py @@ -0,0 +1,23 @@ +import os +import errno +import sys + +from pip._vendor import six + + +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 = ( + six.PY2 or + (3, 4) <= sys.version_info < (3, 4, 1) +) +makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py new file mode 100644 index 0000000..a41f65d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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.4' + + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py new file mode 100644 index 0000000..025e61c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py @@ -0,0 +1,94 @@ +# -*- 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 + +import sys + +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): + if sys.platform.startswith('win'): + phases = (u' ', u'▌', u'█') + else: + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py new file mode 100644 index 0000000..6b45a1e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py new file mode 100644 index 0000000..0cde44e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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 and 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 and 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 and 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 and self.file.isatty() and self.hide_cursor: + print(HIDE_CURSOR, end='', file=self.file) + + def clearln(self): + if self.file and self.file.isatty(): + print('\r\x1b[K', end='', file=self.file) + + def writeln(self, line): + if self.file and self.file.isatty(): + self.clearln() + print(line, end='', file=self.file) + self.file.flush() + + def finish(self): + if self.file and 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py new file mode 100644 index 0000000..464c7b2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py new file mode 100644 index 0000000..bea4d9c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py @@ -0,0 +1,6452 @@ +#-*- coding: utf-8 -*- +# module pyparsing.py +# +# Copyright (c) 2003-2019 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 +``"<salutation>, <addressee>!"``), built up using :class:`Word`, +:class:`Literal`, and :class:`And` elements +(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, +and the strings are auto-converted to :class:`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 :class:`ParseResults` object returned from +:class:`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 + + +Getting Started - +----------------- +Visit the classes :class:`ParserElement` and :class:`ParseResults` to +see the base classes that most other pyparsing +classes inherit from. Use the docstrings for examples of how to: + + - construct literal match expressions from :class:`Literal` and + :class:`CaselessLiteral` classes + - construct character word-group expressions using the :class:`Word` + class + - see how to create repetitive expressions using :class:`ZeroOrMore` + and :class:`OneOrMore` classes + - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, + and :class:`'&'<Each>` operators to combine simple expressions into + more complex ones + - associate names with your parsed results using + :class:`ParserElement.setResultsName` + - find some helpful expression short-cuts like :class:`delimitedList` + and :class:`oneOf` + - find more useful common expressions in the :class:`pyparsing_common` + namespace class +""" + +__version__ = "2.3.1" +__versionTime__ = "09 Jan 2019 23:26 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: + # Python 3 + from itertools import filterfalse +except ImportError: + from itertools import ifilterfalse as filterfalse + +try: + from _thread import RLock +except ImportError: + from threading import RLock + +try: + # Python 3 + from collections.abc import Iterable + from collections.abc import MutableMapping +except ImportError: + # Python 2.7 + from collections import Iterable + from collections import MutableMapping + +try: + from collections import OrderedDict as _OrderedDict +except ImportError: + try: + from ordereddict import OrderedDict as _OrderedDict + except ImportError: + _OrderedDict = None + +try: + from types import SimpleNamespace +except ImportError: + class SimpleNamespace: pass + + +#~ 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', +'PrecededBy', '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', 'Char', +'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', 'pyparsing_unicode', 'unicode_set', +] + +system_version = tuple(sys.version_info)[:3] +PY_3 = system_version[0] == 3 +if PY_3: + _MAX_INT = sys.maxsize + basestring = str + unichr = chr + unicode = str + _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 + +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 + + """ + + @staticmethod + def explain(exc, depth=16): + """ + Method to take an exception and translate the Python internal traceback into a list + of the pyparsing expressions that caused the exception to be raised. + + Parameters: + + - exc - exception raised during parsing (need not be a ParseException, in support + of Python exceptions that might be raised in a parse action) + - depth (default=16) - number of levels back in the stack trace to list expression + and function names; if None, the full stack trace names will be listed; if 0, only + the failing input line, marker, and exception string will be shown + + Returns a multi-line string listing the ParserElements and/or function names in the + exception's stack trace. + + Note: the diagnostic output will include string representations of the expressions + that failed to parse. These representations will be more helpful if you use `setName` to + give identifiable names to your expressions. Otherwise they will use the default string + forms, which may be cryptic to read. + + explain() is only supported under Python 3. + """ + import inspect + + if depth is None: + depth = sys.getrecursionlimit() + ret = [] + if isinstance(exc, ParseBaseException): + ret.append(exc.line) + ret.append(' ' * (exc.col - 1) + '^') + ret.append("{0}: {1}".format(type(exc).__name__, exc)) + + if depth > 0: + callers = inspect.getinnerframes(exc.__traceback__, context=depth) + seen = set() + for i, ff in enumerate(callers[-depth:]): + frm = ff.frame + + f_self = frm.f_locals.get('self', None) + if isinstance(f_self, ParserElement): + if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): + continue + if f_self in seen: + continue + seen.add(f_self) + + self_type = type(f_self) + ret.append("{0}.{1} - {2}".format(self_type.__module__, + self_type.__name__, + f_self)) + elif f_self is not None: + self_type = type(f_self) + ret.append("{0}.{1}".format(self_type.__module__, + self_type.__name__)) + else: + code = frm.f_code + if code.co_name in ('wrapper', '<module>'): + continue + + ret.append("{0}".format(code.co_name)) + + depth -= 1 + if not depth: + break + + return '\n'.join(ret) + + +class ParseFatalException(ParseBaseException): + """user-throwable exception thrown when inconsistent parse content + is found; stops all parsing immediately""" + pass + +class ParseSyntaxException(ParseFatalException): + """just like :class:`ParseFatalException`, but thrown internally + when an :class:`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 :class:`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 (``len(results)``) + - by list index (``results[0], results[1]``, etc.) + - by attribute (``results.<resultsName>`` - see :class:`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(ParseResults(toklist.__toklist), 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.""" + + values = _itervalues + """Returns an iterator of all named result values.""" + + items = _iteritems + """Returns an iterator of all named result key-value tuples.""" + + 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= ``last``). + Supports both ``list`` and ``dict`` semantics for ``pop()``. If + passed no argument or an integer argument, it will use ``list`` + semantics and pop tokens from the list of parsed tokens. If passed + a non-integer argument (most likely a string), it will use ``dict`` + semantics and pop the corresponding value from any defined results + names. A second default return value argument is supported, just as in + ``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 ``defaultValue`` or ``None`` if no + ``defaultValue`` is specified. + + Similar to ``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 ``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 :class:`ParseResults` object. + """ + ret = ParseResults( self.__toklist ) + ret.__tokdict = dict(self.__tokdict.items()) + 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 :class:`ParseResults`. Accepts an optional ``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 + `pprint <https://docs.python.org/3/library/pprint.html>`_ module. + Accepts additional positional or keyword args as defined for + `pprint.pprint <https://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())) + +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 + :class:`ParserElement.parseString` for more + information on parsing strings containing ``<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 :class:`ParserElement.parseString` + for more information on parsing strings containing ``<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[:2]] + def extract_tb(tb, limit=0): + frames = traceback.extract_tb(tb, limit=limit) + frame_summary = frames[-1] + return [frame_summary[:2]] + 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 = set(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 :class:`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 ``expr.copy()`` is just ``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 :class:`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, + ``expr("name")`` in place of ``expr.setResultsName("name")`` + - see :class:`__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 ``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 ``fn(s,loc,toks)`` , + ``fn(loc,toks)`` , ``fn(toks)`` , or just ``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 :class:`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= ``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 :class:`parseString for more + information on parsing strings containing ``<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 :class:`setParseAction`. + + See examples in :class:`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 + :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, + functions passed to ``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: + fn = _trim_arity(fn) + def pa(s,l,t): + if not bool(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 + ``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 :class:`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 preloc >= 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: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + 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: + try: + tokens = fn( instring, tokensStart, retTokens ) + except IndexError as parse_action_exc: + exc = ParseException("exception raised in parse action") + exc.__cause__ = parse_action_exc + raise exc + + if tokens is not None and tokens is not retTokens: + 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= ``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 :class:`ParserElement.enablePackrat`. + For best results, call ``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 ``parseAll`` to True (equivalent to ending + the grammar with ``StringEnd()``). + + Note: ``parseString`` implicitly calls ``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 ``loc`` argument to index into the + string being parsed, you can ensure you have a consistent view of the input + string by: + + - calling ``parseWithTabs`` on your grammar before calling ``parseString`` + (see :class:`parseWithTabs`) + - define your parse action using the full ``(s,loc,toks)`` signature, and + reference the input string using the parse action's ``s`` argument + - explictly expand the tabs in your input string before calling + ``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 + ``maxMatches`` argument, to clip scanning after 'n' matches are found. If + ``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 :class:`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 :class:`scanString`, to modify matching text with modified tokens that may + be returned from a parse action. To use ``transformString``, define a grammar and + attach a parse action to it that modifies the returned token list. + Invoking ``transformString()`` on a target string will then scan for matches, + and replace the matched text patterns according to the logic in the parse + action. ``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 :class:`scanString`, simplifying the access to the tokens found + to match the given parse expression. May be called with optional + ``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 ``maxsplit`` argument, to limit the number of splits; + and the optional ``includeSeparators`` argument (default= ``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 :class:`And`. Adding strings to a ParserElement + converts them to :class:`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 :class:`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 :class:`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 :class:`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 ``expr * 3`` in place of + ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer + tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples + may also include ``None`` as in: + - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent + to ``expr*n + ZeroOrMore(expr)`` + (read as "at least n instances of ``expr``") + - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` + (read as "0 to n instances of ``expr``") + - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` + - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` + + Note that ``expr*(None,n)`` does not raise an exception if + more than n exprs exist in the input stream; that is, + ``expr*(None,n)`` does not enforce a maximum number of expr + occurrences. If this behavior is desired, then write + ``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 :class:`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 :class:`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 :class:`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 :class:`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 :class:`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 :class:`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 :class:`NotAny` + """ + return NotAny( self ) + + def __call__(self, name=None): + """ + Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. + + If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be + passed as ``True``. + + If ``name` is omitted, same as calling :class:`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 :class:`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 + :class:`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 ``<TAB>``s to spaces before parsing the input string. + Must be called before ``parseString`` when the input grammar contains elements that + match ``<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 ``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 :class:`setDebugActions`. Prior to attempting + to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` + is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` + message is shown. Also note the use of :class:`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 :class:`Word` expression without calling ``setName`` is ``"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= ``True``) - flag to pass to :class:`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, postParse=None): + """ + 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= ``True``) - flag to pass to :class:`parseString` when running tests + - comment - (default= ``'#'``) - expression for indicating embedded comments in the test + string; pass None to disable comment filtering + - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; + if False, only dump nested list + - printResults - (default= ``True``) prints test output to stdout + - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing + - postParse - (default= ``None``) optional callback for successful parse results; called as + `fn(test_string, parse_results)` and returns a string to be added to the test output + + Returns: a (success, results) tuple, where success indicates that all tests succeeded + (or failed if ``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: + # convert newline marks to actual newlines, and strip leading BOM if present + t = t.replace(r'\n','\n').lstrip('\ufeff') + result = self.parseString(t, parseAll=parseAll) + out.append(result.dump(full=fullDump)) + success = success and not failureTests + if postParse is not None: + try: + pp_value = postParse(t, result) + if pp_value is not None: + out.append(str(pp_value)) + except Exception as e: + out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) + 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 :class:`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 :class:`CaselessLiteral`. + + For keyword matching (force word break before and after the matched string), + use :class:`Keyword` or :class:`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 :class:`Literal`: + + - ``Literal("if")`` will match the leading ``'if'`` in + ``'ifAndOnlyIf'``. + - ``Keyword("if")`` will not; it will only match the leading + ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` + + Accepts two optional constructor arguments in addition to the + keyword string: + + - ``identChars`` is a string of characters that would be valid + identifier characters, defaulting to all alphanumerics + "_" and + "$" + - ``caseless`` allows case-insensitive matching, default is ``False``. + + Example:: + + Keyword("start").parseString("start") # -> ['start'] + Keyword("start").parseString("starting") # -> Exception + + For case-insensitive matching, use :class:`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 :class:`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 :class:`Keyword`. + + Example:: + + OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] + + (Contrast with example for :class:`CaselessLiteral`.) + """ + def __init__( self, matchString, identChars=None ): + super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) + +class CloseMatch(Token): + """A variation on :class:`Literal` which matches "close" matches, + that is, strings with at most 'n' mismatching characters. + :class:`CloseMatch` takes parameters: + + - ``match_string`` - string to be matched + - ``maxMismatches`` - (``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: + + - ``mismatches`` - a list of the positions within the + match_string where mismatches were found + - ``original`` - the original match_string used to compare + against the input string + + If ``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 ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``exact`` are 0, meaning no maximum or exact + length restriction. An optional ``excludeChars`` parameter can + list characters that might be found in the input ``bodyChars`` + string; useful to define a word of all printables except for one or + two characters, for instance. + + :class:`srange` is useful for defining custom character set strings + for defining ``Word`` expressions, using range notation from + regular expression character sets. + + A common mistake is to use :class:`Word` to match a specific literal + string, as in ``Word("Address")``. Remember that :class:`Word` + uses the string argument to define *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 :class:`Literal` or :class:`Keyword`. + + pyparsing includes helper strings for building Words: + + - :class:`alphas` + - :class:`nums` + - :class:`alphanums` + - :class:`hexnums` + - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 + - accented, tilded, umlauted, etc.) + - :class:`punc8bit` (non-alphabetic characters in ASCII range + 128-255 - currency, symbols, superscripts, diacriticals, etc.) + - :class:`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 Char(Word): + """A short-cut class for defining ``Word(characters, exact=1)``, + when defining a match of any single character in a string of + characters. + """ + def __init__(self, charset): + super(Char, self).__init__(charset, exact=1) + self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) + self.re = re.compile( self.reString ) + + +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 stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. + If the given regex contains named groups (defined using ``(?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: https://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?{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, asGroupList=False, asMatch=False): + """The parameters ``pattern`` and ``flags`` are passed + to the ``re.compile()`` function as-is. See the Python + `re module <https://docs.python.org/3/library/re.html>`_ 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 + self.asGroupList = asGroupList + self.asMatch = asMatch + + 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() + if self.asMatch: + ret = result + elif self.asGroupList: + ret = result.groups() + else: + ret = ParseResults(result.group()) + d = result.groupdict() + if d: + for k, v in d.items(): + ret[k] = v + 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 + + def sub(self, repl): + """ + Return Regex with an attached parse action to transform the parsed + result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. + + Example:: + + make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") + print(make_html.transformString("h1:main title:")) + # prints "<h1>main title</h1>" + """ + if self.asGroupList: + warnings.warn("cannot use sub() with Regex(asGroupList=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch and callable(repl): + warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", + SyntaxWarning, stacklevel=2) + raise SyntaxError() + + if self.asMatch: + def pa(tokens): + return tokens[0].expand(repl) + else: + def pa(tokens): + return self.re.sub(repl, tokens[0]) + return self.addParseAction(pa) + +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= ``None`` ) + - escQuote - special quote sequence to escape an embedded quote + string (such as SQL's ``""`` to escape an embedded ``"``) + (default= ``None`` ) + - multiline - boolean indicating whether quotes can span + multiple lines (default= ``False`` ) + - unquoteResults - boolean indicating whether the matched text + should be unquoted (default= ``True`` ) + - endQuoteChar - string of one or more characters defining the + end of the quote delimited string (default= ``None`` => same as + quoteChar) + - convertWhitespaceEscapes - convert escaped whitespace + (``'\t'``, ``'\n'``, etc.) to actual whitespace + (default= ``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 *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 ``min`` is + 1 (a minimum value < 1 is not valid); the default values for + ``max`` and ``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 ``" \\t\\r\\n"``. Also takes optional ``min``, + ``max``, and ``exact`` arguments, as defined for the + :class:`Word` class. + """ + whiteStrs = { + ' ' : '<SP>', + '\t': '<TAB>', + '\n': '<LF>', + '\r': '<CR>', + '\f': '<FF>', + 'u\00A0': '<NBSP>', + 'u\1680': '<OGHAM_SPACE_MARK>', + 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', + 'u\2000': '<EN_QUAD>', + 'u\2001': '<EM_QUAD>', + 'u\2002': '<EN_SPACE>', + 'u\2003': '<EM_SPACE>', + 'u\2004': '<THREE-PER-EM_SPACE>', + 'u\2005': '<FOUR-PER-EM_SPACE>', + 'u\2006': '<SIX-PER-EM_SPACE>', + 'u\2007': '<FIGURE_SPACE>', + 'u\2008': '<PUNCTUATION_SPACE>', + 'u\2009': '<THIN_SPACE>', + 'u\200A': '<HAIR_SPACE>', + 'u\200B': '<ZERO_WIDTH_SPACE>', + 'u\202F': '<NNBSP>', + 'u\205F': '<MMSP>', + 'u\3000': '<IDEOGRAPHIC_SPACE>', + } + 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 + ``wordChars`` (default= ``printables``). To emulate the + ``\b`` behavior of regular expressions, use + ``WordStart(alphanums)``. ``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 ``wordChars`` + (default= ``printables``). To emulate the ``\b`` behavior of + regular expressions, use ``WordEnd(alphanums)``. ``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, 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 ``leaveWhitespace`` defined in base class, and also invokes ``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 :class:`ParseExpression` s to be found in the given order. + Expressions may be separated by whitespace. + May be constructed using the ``'+'`` operator. + May also be constructed using the ``'-'`` 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 streamline(self): + super(And, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + 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 :class:`ParseExpression` is found. If + two expressions match, the expression that matches the longest + string will be used. May be constructed using the ``'^'`` + 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 streamline(self): + super(Or, self).streamline() + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + 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 :class:`ParseExpression` is found. If + two expressions match, the first one listed is the one that will + match. May be constructed using the ``'|'`` 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) + # self.saveAsList = any(e.saveAsList for e in self.exprs) + else: + self.mayReturnEmpty = True + + def streamline(self): + super(MatchFirst, self).streamline() + self.saveAsList = any(e.saveAsList for e in self.exprs) + return self + + 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 :class:`ParseExpression` s to be found, but in + any order. Expressions may be separated by whitespace. + + May be constructed using the ``'&'`` 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 + self.saveAsList = True + + def streamline(self): + super(Each, self).streamline() + self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) + return self + + 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 :class:`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. + ``FollowedBy`` does *not* advance the parsing position within + the input string, it only verifies that the specified parse + expression matches at the current position. ``FollowedBy`` + always returns a null token list. If any results names are defined + in the lookahead expression, those *will* be returned for access by + name. + + 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 ): + _, ret = self.expr._parse(instring, loc, doActions=doActions) + del ret[:] + return loc, ret + + +class PrecededBy(ParseElementEnhance): + """Lookbehind matching of the given parse expression. + ``PrecededBy`` does not advance the parsing position within the + input string, it only verifies that the specified parse expression + matches prior to the current position. ``PrecededBy`` always + returns a null token list, but if a results name is defined on the + given expression, it is returned. + + Parameters: + + - expr - expression that must match prior to the current parse + location + - retreat - (default= ``None``) - (int) maximum number of characters + to lookbehind prior to the current parse location + + If the lookbehind expression is a string, Literal, Keyword, or + a Word or CharsNotIn with a specified exact or maximum length, then + the retreat parameter is not required. Otherwise, retreat must be + specified to give a maximum number of characters to look back from + the current parse position for a lookbehind match. + + Example:: + + # VB-style variable names with type prefixes + int_var = PrecededBy("#") + pyparsing_common.identifier + str_var = PrecededBy("$") + pyparsing_common.identifier + + """ + def __init__(self, expr, retreat=None): + super(PrecededBy, self).__init__(expr) + self.expr = self.expr().leaveWhitespace() + self.mayReturnEmpty = True + self.mayIndexError = False + self.exact = False + if isinstance(expr, str): + retreat = len(expr) + self.exact = True + elif isinstance(expr, (Literal, Keyword)): + retreat = expr.matchLen + self.exact = True + elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: + retreat = expr.maxLen + self.exact = True + elif isinstance(expr, _PositionToken): + retreat = 0 + self.exact = True + self.retreat = retreat + self.errmsg = "not preceded by " + str(expr) + self.skipWhitespace = False + + def parseImpl(self, instring, loc=0, doActions=True): + if self.exact: + if loc < self.retreat: + raise ParseException(instring, loc, self.errmsg) + start = loc - self.retreat + _, ret = self.expr._parse(instring, start) + else: + # retreat specified a maximum lookbehind window, iterate + test_expr = self.expr + StringEnd() + instring_slice = instring[:loc] + last_expr = ParseException(instring, loc, self.errmsg) + for offset in range(1, min(loc, self.retreat+1)): + try: + _, ret = test_expr._parse(instring_slice, loc-offset) + except ParseBaseException as pbe: + last_expr = pbe + else: + break + else: + raise last_expr + # return empty list of tokens, but preserve any defined results names + del ret[:] + return loc, ret + + +class NotAny(ParseElementEnhance): + """Lookahead to disallow matching with the given parse expression. + ``NotAny`` does *not* advance the parsing position within the + input string, it only verifies that the specified parse expression + does *not* match at the current position. Also, ``NotAny`` does + *not* skip over leading whitespace. ``NotAny`` always returns + a null token list. May be constructed using the '~' operator. + + Example:: + + AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) + + # take care not to mistake keywords for identifiers + ident = ~(AND | OR | NOT) + Word(alphas) + boolean_term = Optional(NOT) + ident + + # very crude boolean expression - to support parenthesis groups and + # operation hierarchy, use infixNotation + boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) + + # integers that are followed by "." are actually floats + integer = Word(nums) + ~Char(".") + """ + 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= ``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= ``None``) - expression for a terminating sentinel + (only required if the sentinel would ordinarily match the repetition + expression) + + Example: similar to :class:`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= ``False``) if True, the target expression is also parsed + (the skipped text and target expression are returned as a 2-element list). + - ignore - (default= ``None``) used to define grammars (typically quoted strings and + comments) that might contain false matches to the target expression + - failOn - (default= ``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.saveAsList = 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 ``Forward`` + variable using the '<<' operator. + + Note: take care when assigning to ``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 ``Forward``:: + + fwdExpr << (a | b | c) + + Converting to use the '<<=' operator instead will avoid this problem. + + See :class:`ParseResults.pprint` for an example of a recursive + parser created using ``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 :class:`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 + ``'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 :class:`ZeroOrMore` and :class:`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 = expr.saveAsList + + 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 :class:`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 :class:`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 + ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. + When the parse action completes, the decorator will print + ``"<<"`` 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 ``combine=True`` in the constructor. If + ``combine`` is set to ``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 ``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 ``"1:1"``, but not ``"1:2"``. Because this + matches a previous literal, will also match the leading + ``"1:1"`` in ``"1:10"``. If this is not desired, use + :class:`matchPreviousExpr`. Do *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 ``"1:1"``, but not ``"1:2"``. Because this + matches by expressions, will *not* match the leading ``"1:1"`` + in ``"1:10"``; the expressions are evaluated first, and then + compared, so ``"1"`` is compared with ``"10"``. Do *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 :class:`MatchFirst` for best performance. + + Parameters: + + - strs - a string of space-delimited literals, or a collection of + string literals + - caseless - (default= ``False``) - treat all literals as + caseless + - useRegex - (default= ``True``) - as an optimization, will + generate a Regex object; otherwise, will generate + a :class:`MatchFirst` object (if ``caseless=True``, or if + creating a :class:`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, 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 :class:`Dict`, :class:`ZeroOrMore`, and + :class:`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 :class:`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(OneOrMore(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 ``asString`` argument is passed as + ``False``, then the return value is + a :class:`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 + :class:`originalTextFor` contains expressions with defined + results names, you must set ``asString`` to ``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 ``<TAB>`` characters, you + may want to call :class:`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 | CharsNotIn(r'\]', exact=1) +_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 ``\-`` + or ``\]``) + - an escaped hex character with a leading ``'\x'`` + (``\x21``, which is a ``'!'`` character) (``\0x##`` + is also supported for backwards compatibility) + - an escaped octal character with a leading ``'\0'`` + (``\041``, which is a ``'!'`` character) + - a range of any of the above, separated by a dash (``'a-z'``, + etc.) + - any combination of the above (``'aeiouy'``, + ``'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 + :class:`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 + ``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 :class:`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 :class:`pyparsing_common.upcaseTokens`""" + +downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) +"""(Deprecated) Helper parse action to convert tokens to lower case. +Deprecated in favor of :class:`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="https://github.com/pyparsing/pyparsing/wiki">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 -> https://github.com/pyparsing/pyparsing/wiki + """ + 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 :class:`makeHTMLTags` + """ + return _makeTags( tagStr, True ) + +def withAttribute(*args,**attrDict): + """Helper to create a validating parse action to be used with start + tags created with :class:`makeXMLTags` or + :class:`makeHTMLTags`. Use ``withAttribute`` to qualify + a starting tag with a required attribute value, to avoid false + matches on common tags such as ``<TD>`` or ``<DIV>``. + + Call ``withAttribute`` with a series of attribute names and + values. Specify the list of filter attributes names and values as: + + - keyword arguments, as in ``(align="right")``, or + - as an explicit dict with ``**`` operator, when an attribute + name is also a Python reserved word, as in ``**{"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 ``class`` (with or without a namespace), use + :class:`withClass`. + + To verify that the attribute exists, but without specifying a value, + pass ``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 :class:`withAttribute` when + matching on a div class - made difficult because ``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 = SimpleNamespace() +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 + :class:`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 + ``opAssoc.RIGHT`` and ``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 + ``setParseAction(*fn)`` + (:class:`ParserElement.setParseAction`) + - lpar - expression for matching left-parentheses + (default= ``Suppress('(')``) + - rpar - expression for matching right-parentheses + (default= ``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]]] + """ + # captive version of FollowedBy that does not do parse actions or capture results names + class _FB(FollowedBy): + def parseImpl(self, instring, loc, doActions=True): + self.expr.tryParse(instring, loc) + return loc, [] + + 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 = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) + else: + matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) + elif arity == 3: + matchExpr = _FB(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 = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) + elif arity == 2: + if opExpr is not None: + matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) + else: + matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) + elif arity == 3: + matchExpr = _FB(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 :class:`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= ``"("``); can also be a pyparsing expression + - closer - closing character for a nested list + (default= ``")"``); can also be a pyparsing expression + - content - expression for items within the nested lists + (default= ``None``) + - ignoreExpr - expression for ignoring opening and closing + delimiters (default= :class:`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 ``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 + :class:`Or` or :class:`MatchFirst`. The default is + :class:`quotedString`, but if no expressions are to be ignored, then + pass ``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= ``True``) + + A valid block must contain at least one ``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 ``/* ... */``" + +htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") +"Comment of the form ``<!-- ... -->``" + +restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") +dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") +"Comment of the form ``// ... (to end of line)``" + +cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") +"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" + +javaStyleComment = cppStyleComment +"Same as :class:`cppStyleComment`" + +pythonStyleComment = Regex(r"#.*").setName("Python style comment") +"Comment of the form ``# ... (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 :class:`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 (:class:`integers<integer>`, :class:`reals<real>`, + :class:`scientific notation<sci_real>`) + - common :class:`programming identifiers<identifier>` + - network addresses (:class:`MAC<mac_address>`, + :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) + - ISO8601 :class:`dates<iso8601_date>` and + :class:`datetime<iso8601_datetime>` + - :class:`UUID<uuid>` + - :class:`comma-separated list<comma_separated_list>` + + Parse actions: + + - :class:`convertToInteger` + - :class:`convertToFloat` + - :class:`convertToDate` + - :class:`convertToDatetime` + - :class:`stripHTMLTags` + - :class:`upcaseTokens` + - :class:`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 (``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= ``"%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= ``"%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 (``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 (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" + + uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") + "UUID (``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="https://github.com/pyparsing/pyparsing/wiki">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) + + Prints:: + + 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.""" + + +class _lazyclassproperty(object): + def __init__(self, fn): + self.fn = fn + self.__doc__ = fn.__doc__ + self.__name__ = fn.__name__ + + def __get__(self, obj, cls): + if cls is None: + cls = type(obj) + if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): + cls._intern = {} + attrname = self.fn.__name__ + if attrname not in cls._intern: + cls._intern[attrname] = self.fn(cls) + return cls._intern[attrname] + + +class unicode_set(object): + """ + A set of Unicode characters, for language-specific strings for + ``alphas``, ``nums``, ``alphanums``, and ``printables``. + A unicode_set is defined by a list of ranges in the Unicode character + set, in a class attribute ``_ranges``, such as:: + + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + A unicode set can also be defined using multiple inheritance of other unicode sets:: + + class CJK(Chinese, Japanese, Korean): + pass + """ + _ranges = [] + + @classmethod + def _get_chars_for_ranges(cls): + ret = [] + for cc in cls.__mro__: + if cc is unicode_set: + break + for rr in cc._ranges: + ret.extend(range(rr[0], rr[-1]+1)) + return [unichr(c) for c in sorted(set(ret))] + + @_lazyclassproperty + def printables(cls): + "all non-whitespace characters in this range" + return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphas(cls): + "all alphabetic characters in this range" + return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def nums(cls): + "all numeric digit characters in this range" + return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) + + @_lazyclassproperty + def alphanums(cls): + "all alphanumeric characters in this range" + return cls.alphas + cls.nums + + +class pyparsing_unicode(unicode_set): + """ + A namespace class for defining common language unicode_sets. + """ + _ranges = [(32, sys.maxunicode)] + + class Latin1(unicode_set): + "Unicode set for Latin-1 Unicode Character Range" + _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] + + class LatinA(unicode_set): + "Unicode set for Latin-A Unicode Character Range" + _ranges = [(0x0100, 0x017f),] + + class LatinB(unicode_set): + "Unicode set for Latin-B Unicode Character Range" + _ranges = [(0x0180, 0x024f),] + + class Greek(unicode_set): + "Unicode set for Greek Unicode Character Ranges" + _ranges = [ + (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), + (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), + (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), + ] + + class Cyrillic(unicode_set): + "Unicode set for Cyrillic Unicode Character Range" + _ranges = [(0x0400, 0x04ff)] + + class Chinese(unicode_set): + "Unicode set for Chinese Unicode Character Range" + _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] + + class Japanese(unicode_set): + "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" + _ranges = [ ] + + class Kanji(unicode_set): + "Unicode set for Kanji Unicode Character Range" + _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] + + class Hiragana(unicode_set): + "Unicode set for Hiragana Unicode Character Range" + _ranges = [(0x3040, 0x309f), ] + + class Katakana(unicode_set): + "Unicode set for Katakana Unicode Character Range" + _ranges = [(0x30a0, 0x30ff), ] + + class Korean(unicode_set): + "Unicode set for Korean Unicode Character Range" + _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] + + class CJK(Chinese, Japanese, Korean): + "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" + pass + + class Thai(unicode_set): + "Unicode set for Thai Unicode Character Range" + _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] + + class Arabic(unicode_set): + "Unicode set for Arabic Unicode Character Range" + _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] + + class Hebrew(unicode_set): + "Unicode set for Hebrew Unicode Character Range" + _ranges = [(0x0590, 0x05ff), ] + + class Devanagari(unicode_set): + "Unicode set for Devanagari Unicode Character Range" + _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] + +pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges + + pyparsing_unicode.Japanese.Hiragana._ranges + + pyparsing_unicode.Japanese.Katakana._ranges) + +# define ranges in language character sets +if PY_3: + setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) + setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) + setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) + setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) + setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) + setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) + setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) + setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) + setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) + setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) + setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) + setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) + + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py new file mode 100644 index 0000000..8ed060f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py @@ -0,0 +1,4 @@ +from .core import TomlError +from .parser import load, loads +from .test import translate_to_test +from .writer import dump, dumps \ No newline at end of file diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py new file mode 100644 index 0000000..c182734 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py new file mode 100644 index 0000000..3493aa6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py @@ -0,0 +1,341 @@ +import string, re, sys, datetime +from .core import TomlError +from .utils import rfc3339_re, parse_rfc3339_re + +if sys.version_info[0] == 2: + _chr = unichr +else: + _chr = chr + +def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): + return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) + +def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): + if isinstance(s, bytes): + s = s.decode('utf-8') + + s = s.replace('\r\n', '\n') + + root = object_pairs_hook() + tables = object_pairs_hook() + scope = root + + src = _Source(s, filename=filename) + ast = _p_toml(src, object_pairs_hook=object_pairs_hook) + + def error(msg): + raise TomlError(msg, pos[0], pos[1], filename) + + def process_value(v, object_pairs_hook): + 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, object_pairs_hook=object_pairs_hook) for item in value] + elif kind == 'table': + value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) 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, object_pairs_hook=object_pairs_hook) + 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, object_pairs_hook())) + + scope = object_pairs_hook() + name = value[-1] + if name not in cur: + if is_table_array: + cur[name] = [(scope, object_pairs_hook())] + else: + cur[name] = (scope, object_pairs_hook()) + elif isinstance(cur[name], list): + if not is_table_array: + error('table_type_mismatch') + cur[name].append((scope, object_pairs_hook())) + 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 = object_pairs_hook() + 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(r'[btnfr\"\\]') +_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): + v = int(s.last().group(1), 16) + if 0xd800 <= v < 0xe000: + s.fail() + res.append(_chr(v)) + 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)*))?') + +_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') +_litstr_re = re.compile(r"[^'\000\010\012-\037]*") +_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") +def _p_value(s, object_pairs_hook): + 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(rfc3339_re): + m = s.last() + return 'datetime', m.group(0), parse_rfc3339_re(m), 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, object_pairs_hook=object_pairs_hook)) + 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 = object_pairs_hook() + if not s.consume('}'): + k = _p_key(s) + _p_ws(s) + s.expect('=') + _p_ws(s) + items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) + _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, object_pairs_hook=object_pairs_hook) + _p_ws(s) + s.expect('}') + return 'table', None, items, pos + + s.fail() + +def _p_stmt(s, object_pairs_hook): + 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, object_pairs_hook=object_pairs_hook) + return 'kv', (key, value), pos + +_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') +def _p_toml(s, object_pairs_hook): + stmts = [] + _p_ews(s) + with s: + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + while True: + s.commit() + s.expect_re(_stmtsep_re) + stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) + _p_ews(s) + s.expect_eof() + return stmts diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py new file mode 100644 index 0000000..ec8abfc --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py @@ -0,0 +1,30 @@ +import datetime +from .utils import format_rfc3339 + +try: + _string_types = (str, unicode) + _int_types = (int, long) +except NameError: + _string_types = str + _int_types = int + +def translate_to_test(v): + if isinstance(v, dict): + return { k: translate_to_test(v) for k, v in v.items() } + if isinstance(v, list): + a = [translate_to_test(x) for x in v] + if v and isinstance(v[0], dict): + return a + else: + return {'type': 'array', 'value': a} + if isinstance(v, datetime.datetime): + return {'type': 'datetime', 'value': format_rfc3339(v)} + if isinstance(v, bool): + return {'type': 'bool', 'value': 'true' if v else 'false'} + if isinstance(v, _int_types): + return {'type': 'integer', 'value': str(v)} + if isinstance(v, float): + return {'type': 'float', 'value': '{:.17}'.format(v)} + if isinstance(v, _string_types): + return {'type': 'string', 'value': v} + raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py new file mode 100644 index 0000000..636a680 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py @@ -0,0 +1,67 @@ +import datetime +import re + +rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') + +def parse_rfc3339(v): + m = rfc3339_re.match(v) + if not m or m.group(0) != v: + return None + return parse_rfc3339_re(m) + +def parse_rfc3339_re(m): + 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 + return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) + + +def format_rfc3339(v): + offs = v.utcoffset() + offs = int(offs.total_seconds()) // 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 + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py new file mode 100644 index 0000000..73b5089 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py @@ -0,0 +1,106 @@ +from __future__ import unicode_literals +import io, datetime, math, string, sys + +from .utils import format_rfc3339 + +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) + '"' + + +_key_chars = string.digits + string.ascii_letters + '-_' +def _escape_id(s): + if any(c not in _key_chars for c in s): + return _escape_string(s) + return s + + +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): + return format_rfc3339(v) + elif isinstance(v, list): + return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) + elif isinstance(v, dict): + return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py new file mode 100644 index 0000000..80c4ce1 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py @@ -0,0 +1,133 @@ +# -*- 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('https://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.24 + assert major == 1 + assert minor >= 21 + assert minor <= 24 + + # 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 + + +def _check_cryptography(cryptography_version): + # cryptography < 1.3.4 + try: + cryptography_version = list(map(int, cryptography_version.split('.'))) + except ValueError: + return + + if cryptography_version < [1, 3, 4]: + warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) + warnings.warn(warning, RequestsDependencyWarning) + +# Check imported dependencies for compatibility. +try: + check_compatibility(urllib3.__version__, chardet.__version__) +except (AssertionError, ValueError): + warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " + "version!".format(urllib3.__version__, chardet.__version__), + RequestsDependencyWarning) + +# Attempt to enable urllib3's SNI support, if possible +from pip._internal.utils.compat import WINDOWS +if not WINDOWS: + try: + from pip._vendor.urllib3.contrib import pyopenssl + pyopenssl.inject_into_urllib3() + + # Check cryptography version + from cryptography import __version__ as cryptography_version + _check_cryptography(cryptography_version) + 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 +from logging import NullHandler + +logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py new file mode 100644 index 0000000..f5b5d03 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py @@ -0,0 +1,14 @@ +# .-. .-. .-. . . .-. .-. .-. .-. +# |( |- |.| | | |- `-. | `-. +# ' ' `-' `-`.`-' `-' `-' ' `-' + +__title__ = 'requests' +__description__ = 'Python HTTP for Humans.' +__url__ = 'http://python-requests.org' +__version__ = '2.21.0' +__build__ = 0x022100 +__author__ = 'Kenneth Reitz' +__author_email__ = 'me@kennethreitz.org' +__license__ = 'Apache 2.0' +__copyright__ = 'Copyright 2018 Kenneth Reitz' +__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py new file mode 100644 index 0000000..759d9a5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py new file mode 100644 index 0000000..c30e7c9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py @@ -0,0 +1,533 @@ +# -*- 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 parse_url +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 pip._vendor.urllib3.exceptions import LocationValueError + +from .models import Response +from .compat import urlparse, basestring +from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, + 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, InvalidProxyURL, + InvalidURL) +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 {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 = extract_zipped_paths(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: {}".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: {}".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: {}".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_url = parse_url(proxy) + if not proxy_url.host: + raise InvalidProxyURL("Please check proxy URL. It is malformed" + " and could be missing the host.") + 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 proxy: 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 + """ + + try: + conn = self.get_connection(request.url, proxies) + except LocationValueError as e: + raise InvalidURL(e, request=request) + + self.cert_verify(conn, request.url, verify, cert) + url = self.request_url(request, proxies) + self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) + + 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 {}. 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, use buffering of HTTP responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 3.3+ + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py new file mode 100644 index 0000000..abada96 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py @@ -0,0 +1,158 @@ +# -*- 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, list of tuples or bytes to send + in the body of the :class:`Request`. + :param data: (optional) Dictionary, list of tuples, bytes, or file-like + object to send in the body of the :class:`Request`. + :param json: (optional) A JSON serializable Python object 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', 'https://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, list of tuples or bytes to send + in the body of 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, list of tuples, 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, list of tuples, 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, list of tuples, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py new file mode 100644 index 0000000..bdde51c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py @@ -0,0 +1,305 @@ +# -*- 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 ({!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 ({!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 + elif _algorithm == 'SHA-256': + def sha256_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha256(x).hexdigest() + hash_utf8 = sha256_utf8 + elif _algorithm == 'SHA-512': + def sha512_utf8(x): + if isinstance(x, str): + x = x.encode('utf-8') + return hashlib.sha512(x).hexdigest() + hash_utf8 = sha512_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py new file mode 100644 index 0000000..06a594e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py new file mode 100644 index 0000000..6a86893 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py @@ -0,0 +1,74 @@ +# -*- 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 collections import Callable, Mapping, MutableMapping, 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 + from collections.abc import Callable, Mapping, MutableMapping + + builtin_str = str + str = str + bytes = bytes + basestring = (str, bytes) + numeric_types = (int, float) + integer_types = (int,) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py new file mode 100644 index 0000000..56fccd9 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py @@ -0,0 +1,549 @@ +# -*- 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 + +from ._internal_utils import to_native_string +from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping + +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, 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.set_policy(self.get_policy()) + new_cj.update(self) + return new_cj + + def get_policy(self): + """Return the CookiePolicy instance used.""" + return self._policy + + +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 = { + '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. + :rtype: CookieJar + """ + 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. + :rtype: CookieJar + """ + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py new file mode 100644 index 0000000..a91e1fd --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py @@ -0,0 +1,126 @@ +# -*- 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 InvalidProxyURL(InvalidURL): + """The proxy URL provided is 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py new file mode 100644 index 0000000..3c3072b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py @@ -0,0 +1,119 @@ +"""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 pip._vendor.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__', ''), + } + + system_ssl = ssl.OPENSSL_VERSION_NUMBER + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py new file mode 100644 index 0000000..7a51f21 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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 {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 {} + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py new file mode 100644 index 0000000..0839957 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py @@ -0,0 +1,953 @@ +# -*- coding: utf-8 -*- + +""" +requests.models +~~~~~~~~~~~~~~~ + +This module contains the primary objects that power Requests. +""" + +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 ( + Callable, Mapping, + 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 + elif hasattr(fp, 'read'): + fdata = fp.read() + elif fp is None: + continue + else: + fdata = fp + + 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, Callable): + self.hooks[event].append(hook) + elif hasattr(hook, '__iter__'): + self.hooks[event].extend(h for h in hook if isinstance(h, 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 or + list of tuples ``[(key, value)]`` 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: URL parameters to append to the URL. If a dictionary or + list of tuples ``[(key, value)]`` is provided, form-encoding will + take place. + :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', 'https://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', 'https://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, 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 {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, False if not. + + 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=False, 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 = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py new file mode 100644 index 0000000..9582fa7 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py new file mode 100644 index 0000000..d73d700 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py @@ -0,0 +1,770 @@ +# -*- coding: utf-8 -*- + +""" +requests.session +~~~~~~~~~~~~~~~~ + +This module provides a Session object to manage and persist settings across +requests (cookies, auth, proxies). +""" +import os +import sys +import time +from datetime import timedelta + +from .auth import _basic_auth_str +from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping +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, DEFAULT_PORTS +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 sys.platform == 'win32': + try: # Python 3.4+ + 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 should_strip_auth(self, old_url, new_url): + """Decide whether Authorization header should be removed when redirecting""" + old_parsed = urlparse(old_url) + new_parsed = urlparse(new_url) + if old_parsed.hostname != new_parsed.hostname: + return True + # Special case: allow http -> https redirect when using the standard + # ports. This isn't specified by RFC 7235, but is kept to avoid + # breaking backwards compatibility with older versions of requests + # that allowed any redirects on the same host. + if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) + and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): + return False + + # Handle default port usage corresponding to scheme. + changed_port = old_parsed.port != new_parsed.port + changed_scheme = old_parsed.scheme != new_parsed.scheme + default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) + if (not changed_scheme and old_parsed.port in default_port + and new_parsed.port in default_port): + return False + + # Standard case: root URI must match + return changed_port or changed_scheme + + 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) + previous_fragment = urlparse(req.url).fragment + 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) + + # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) + parsed = urlparse(url) + if parsed.fragment == '' and previous_fragment: + parsed = parsed._replace(fragment=previous_fragment) + elif parsed.fragment: + previous_fragment = parsed.fragment + 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 and self.should_strip_auth(response.request.url, url): + # If we get redirected to a new host, we should strip out any + # authentication headers. + 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 + + # https://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('https://httpbin.org/get') + <Response [200]> + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('https://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, list of tuples, 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, list of tuples, 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, list of tuples, 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, list of tuples, 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.lower()): + 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 = {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. + + .. deprecated:: 1.0.0 + + This method has been deprecated since version 1.0.0 and is only kept for + backwards compatibility. New code should use :class:`~requests.sessions.Session` + to create a session. This may be removed at a future date. + + :rtype: Session + """ + return Session() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py new file mode 100644 index 0000000..813e8c4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +r""" +The ``codes`` object defines a mapping from common names for HTTP statuses +to their numerical codes, accessible either as attributes or as dictionary +items. + +>>> requests.codes['temporary_redirect'] +307 +>>> requests.codes.teapot +418 +>>> requests.codes['\o/'] +200 + +Some codes have multiple names, and both upper- and lower-case versions of +the names are allowed. For example, ``codes.ok``, ``codes.OK``, and +``codes.okay`` all correspond to the HTTP status code 200. +""" + +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') + +def _init(): + for code, titles in _codes.items(): + for title in titles: + setattr(codes, title, code) + if not title.startswith(('\\', '/')): + setattr(codes, title.upper(), code) + + def doc(code): + names = ', '.join('``%s``' % n for n in _codes[code]) + return '* %d: %s' % (code, names) + + global __doc__ + __doc__ = (__doc__ + '\n' + + '\n'.join(doc(code) for code in sorted(_codes)) + if __doc__ is not None else None) + +_init() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py new file mode 100644 index 0000000..da930e2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py @@ -0,0 +1,103 @@ +# -*- coding: utf-8 -*- + +""" +requests.structures +~~~~~~~~~~~~~~~~~~~ + +Data structures that power Requests. +""" + +from .compat import OrderedDict, Mapping, MutableMapping + + +class CaseInsensitiveDict(MutableMapping): + """A case-insensitive ``dict``-like object. + + Implements all methods and operations of + ``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, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py new file mode 100644 index 0000000..8170a8d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py @@ -0,0 +1,977 @@ +# -*- coding: utf-8 -*- + +""" +requests.utils +~~~~~~~~~~~~~~ + +This module provides utility functions that are used within Requests +that are also useful for external consumption. +""" + +import codecs +import contextlib +import io +import os +import re +import socket +import struct +import sys +import tempfile +import warnings +import zipfile + +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, Mapping) +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() + +DEFAULT_PORTS = {'http': 80, 'https': 443} + + +if sys.platform == 'win32': + # provide a proxy_bypass version on Windows without DNS lookups + + def proxy_bypass_registry(host): + try: + if is_py3: + import winreg + else: + import _winreg as winreg + except ImportError: + return False + + try: + internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, + r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') + # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it + proxyEnable = int(winreg.QueryValueEx(internetSettings, + 'ProxyEnable')[0]) + # ProxyOverride is almost always a string + 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('~/{}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See https://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 extract_zipped_paths(path): + """Replace nonexistent paths that look like they refer to a member of a zip + archive with the location of an extracted copy of the target, or else + just return the provided path unchanged. + """ + if os.path.exists(path): + # this is already a valid path, no need to do anything further + return path + + # find the first valid part of the provided path and treat that as a zip archive + # assume the rest of the path is the name of a member in the archive + archive, member = os.path.split(path) + while archive and not os.path.exists(archive): + archive, prefix = os.path.split(archive) + member = '/'.join([prefix, member]) + + if not zipfile.is_zipfile(archive): + return path + + zip_file = zipfile.ZipFile(archive) + if member not in zip_file.namelist(): + return path + + # we have a valid zip archive and a valid member of that archive + tmp = tempfile.gettempdir() + extracted_path = os.path.join(tmp, *member.split('/')) + if not os.path.exists(extracted_path): + extracted_path = zip_file.extract(member, path=tmp) + + return extracted_path + + +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: cannot encode objects that are not 2-tuples + >>> 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, 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 _parse_content_type_header(header): + """Returns content type and parameters from given header + + :param header: string + :return: tuple containing content type and dictionary of + parameters + """ + + tokens = header.split(';') + content_type, params = tokens[0].strip(), tokens[1:] + params_dict = {} + items_to_strip = "\"' " + + for param in params: + param = param.strip() + if param: + key, value = param, True + index_of_equals = param.find("=") + if index_of_equals != -1: + key = param[:index_of_equals].strip(items_to_strip) + value = param[index_of_equals + 1:].strip(items_to_strip) + params_dict[key.lower()] = value + return content_type, params_dict + + +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 = _parse_content_type_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 + """ + # Prioritize lowercase environment variables over uppercase + # to keep a consistent behaviour with other http projects (curl, wget). + 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') + parsed = urlparse(url) + + if parsed.hostname is None: + # URLs don't always have hostnames, e.g. file:/// urls. + return True + + if no_proxy: + # We need to check whether we match here. We need to see if we match + # the end of the hostname, both with and without the port. + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) + + if is_ipv4_address(parsed.hostname): + for proxy_ip in no_proxy: + if is_valid_cidr(proxy_ip): + if address_in_network(parsed.hostname, proxy_ip): + return True + elif parsed.hostname == 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: + host_with_port = parsed.hostname + if parsed.port: + host_with_port += ':{}'.format(parsed.port) + + for host in no_proxy: + if parsed.hostname.endswith(host) or host_with_port.endswith(host): + # The URL does match something in no_proxy, so we don't want + # to apply the proxies on this URL. + return True + + with set_environ('no_proxy', no_proxy_arg): + # parsed.hostname can be `None` in cases such as a file URI. + try: + bypass = proxy_bypass(parsed.hostname) + 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 list 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 = ' \'"' + + value = value.strip(replace_chars) + if not value: + return links + + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py new file mode 100644 index 0000000..6d1e627 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py new file mode 100644 index 0000000..89b2188 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py @@ -0,0 +1,952 @@ +# Copyright (c) 2010-2018 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.12.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) + if hasattr(cls, '__qualname__'): + orig_vars['__qualname__'] = cls.__qualname__ + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def ensure_binary(s, encoding='utf-8', errors='strict'): + """Coerce **s** to six.binary_type. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> encoded to `bytes` + - `bytes` -> `bytes` + """ + if isinstance(s, text_type): + return s.encode(encoding, errors) + elif isinstance(s, binary_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + +def ensure_str(s, encoding='utf-8', errors='strict'): + """Coerce *s* to `str`. + + For Python 2: + - `unicode` -> encoded to `str` + - `str` -> `str` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if not isinstance(s, (text_type, binary_type)): + raise TypeError("not expecting type '%s'" % type(s)) + if PY2 and isinstance(s, text_type): + s = s.encode(encoding, errors) + elif PY3 and isinstance(s, binary_type): + s = s.decode(encoding, errors) + return s + + +def ensure_text(s, encoding='utf-8', errors='strict'): + """Coerce *s* to six.text_type. + + For Python 2: + - `unicode` -> `unicode` + - `str` -> `unicode` + + For Python 3: + - `str` -> `str` + - `bytes` -> decoded to `str` + """ + if isinstance(s, binary_type): + return s.decode(encoding, errors) + elif isinstance(s, text_type): + return s + else: + raise TypeError("not expecting type '%s'" % type(s)) + + + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py new file mode 100644 index 0000000..148a9c3 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py @@ -0,0 +1,92 @@ +""" +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 +from logging import NullHandler + +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.24.1' + +__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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py new file mode 100644 index 0000000..34f2381 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py @@ -0,0 +1,329 @@ +from __future__ import absolute_import +try: + from collections.abc import Mapping, MutableMapping +except ImportError: + 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 + + +from collections import OrderedDict +from .exceptions import InvalidHeader +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. + obs_fold_continued_leaders = (' ', '\t') + headers = [] + + for line in message.headers: + if line.startswith(obs_fold_continued_leaders): + if not headers: + # We received a header line that starts with OWS as described + # in RFC-7230 S3.2.4. This indicates a multiline header, but + # there exists no previous header to which we can attach it. + raise InvalidHeader( + 'Header continuation with no previous header: %s' % line + ) + else: + key, value = headers[-1] + headers[-1] = (key, value + ' ' + line.strip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py new file mode 100644 index 0000000..02b3665 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py @@ -0,0 +1,391 @@ +from __future__ import absolute_import +import datetime +import logging +import os +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 not less than 6 months ago. +# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or +# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) +RECENT_DATE = datetime.date(2017, 6, 30) + + +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. + - ``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. + self.source_address = kw.get('source_address') + + #: 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) + + _HTTPConnection.__init__(self, *args, **kw) + + @property + def host(self): + """ + Getter method to remove any trailing dots that indicate the hostname is an FQDN. + + In general, SSL certificates don't include the trailing dot indicating a + fully-qualified domain name, and thus, they don't validate properly when + checked against a domain name that includes the dot. In addition, some + servers may not expect to receive the trailing dot when provided. + + However, the hostname with trailing dot is critical to DNS resolution; doing a + lookup with the trailing dot will properly only resolve the appropriate FQDN, + whereas a lookup without a trailing dot will search the system's search domain + list. Thus, it's important to keep the original host around for use only in + those cases where it's appropriate (i.e., when doing DNS lookup to establish the + actual TCP connection across which we're going to send HTTP requests). + """ + return self._dns_host.rstrip('.') + + @host.setter + def host(self, value): + """ + Setter for the `host` property. + + We assume that only urllib3 uses the _dns_host attribute; httplib itself + only uses `host`, and it seems reasonable that other libraries follow suit. + """ + self._dns_host = value + + 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._dns_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 + if self._tunnel_host: + # 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 + (bytes,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, bytes): + 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, server_hostname=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 + self.server_hostname = server_hostname + + # 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, + server_hostname=self.server_hostname + ) + + +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 self._tunnel_host: + 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 + + server_hostname = hostname + if self.server_hostname is not None: + server_hostname = self.server_hostname + + 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=server_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 server_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py new file mode 100644 index 0000000..f7a8f19 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py @@ -0,0 +1,896 @@ +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, NORMALIZABLE_SCHEMES +from .util.queue import LifoQueue + + +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 = LifoQueue + + def __init__(self, host, port=None): + if not host: + raise LocationValueError("No host specified.") + + self.host = _ipv6_host(host, self.scheme) + 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 = {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:%s", + self.num_connections, self.host, self.port or "80") + + 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.7.4 + 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 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. + """ + if self.pool is None: + return + # 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, self.scheme) + + # 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. + """ + conn.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:%s", + self.num_connections, self.host, self.port or "443") + + 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, scheme): + """ + 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('[]') + if scheme in NORMALIZABLE_SCHEMES: + host = host.lower() + return host diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py new file mode 100644 index 0000000..f3e0094 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py @@ -0,0 +1,30 @@ +""" +This module provides means to detect the App Engine environment. +""" + +import os + + +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py new file mode 100644 index 0000000..bcf41c0 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py new file mode 100644 index 0000000..b13cd9e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py @@ -0,0 +1,346 @@ +""" +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. + """ + # Normalize the PEM bundle's line endings. + pem_bundle = pem_bundle.replace(b"\r\n", b"\n") + + 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.b16encode(random_bytes[:8]).decode('utf-8') + password = base64.b16encode(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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py new file mode 100644 index 0000000..9b42952 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py @@ -0,0 +1,289 @@ +""" +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 io +import logging +import warnings +from ..packages.six.moves.urllib.parse import urljoin + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry +from . import _appengine_environ + +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) + + original_response = HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=io.BytesIO(urlfetch_resp.content), + msg=urlfetch_resp.header_msg, + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + return HTTPResponse( + body=io.BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + original_response=original_response, + **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 + + +# Alias methods from _appengine_environ to maintain public API interface. + +is_appengine = _appengine_environ.is_appengine +is_appengine_sandbox = _appengine_environ.is_appengine_sandbox +is_local_appengine = _appengine_environ.is_local_appengine +is_prod_appengine = _appengine_environ.is_prod_appengine +is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py new file mode 100644 index 0000000..8ea127c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py @@ -0,0 +1,111 @@ +""" +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 = {'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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py new file mode 100644 index 0000000..363667c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py @@ -0,0 +1,466 @@ +""" +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 +try: + from cryptography.x509 import UnsupportedExtension +except ImportError: + # UnsupportedExtension is gone in cryptography >= 2.1.0 + class UnsupportedExtension(Exception): + pass + +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). + + If the name cannot be idna-encoded then we return None signalling that + the name given should be skipped. + """ + 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 + + try: + for prefix in [u'*.', u'.']: + if name.startswith(prefix): + name = name[len(prefix):] + return prefix.encode('ascii') + idna.encode(name) + return idna.encode(name) + except idna.core.IDNAError: + return None + + name = idna_encode(name) + if name is None: + return None + elif 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, 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. + # We also want to skip over names which cannot be idna encoded. + names = [ + ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) + if name is not None + ] + 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: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + 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: + if not util.wait_for_read(self.socket, self.socket.gettimeout()): + 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: + if not util.wait_for_write(self.socket, self.socket.gettimeout()): + 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_chain_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: + if not util.wait_for_read(sock, sock.gettimeout()): + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py new file mode 100644 index 0000000..77cb59e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py @@ -0,0 +1,804 @@ +""" +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 + +__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 because 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 + + try: + while read_count < requested_length: + if timeout is None or timeout >= 0: + if not util.wait_for_read(base_socket, timeout): + raise socket.error(errno.EAGAIN, 'timed out') + + remaining = requested_length - read_count + buffer = (ctypes.c_char * remaining).from_address( + data_buffer + read_count + ) + chunk_size = base_socket.recv_into(buffer, remaining) + 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: + data_length_pointer[0] = read_count + if error == errno.ECONNRESET or error == errno.EPIPE: + 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: + if not util.wait_for_write(base_socket, timeout): + 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: + data_length_pointer[0] = sent + if error == errno.ECONNRESET or error == errno.EPIPE: + 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 not 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py new file mode 100644 index 0000000..811e312 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py @@ -0,0 +1,192 @@ +# -*- 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 username is None and password is None and parsed.auth is not None: + split = parsed.auth.split(':') + if len(split) == 2: + username, password = split + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py new file mode 100644 index 0000000..7bbaa98 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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 performing 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py new file mode 100644 index 0000000..37fe64a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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) tuples 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py new file mode 100644 index 0000000..78f1e19 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py @@ -0,0 +1,98 @@ +from __future__ import absolute_import +import binascii +import codecs +import os + +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. + """ + boundary = binascii.hexlify(os.urandom(16)) + if six.PY3: + boundary = boundary.decode('ascii') + return boundary + + +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:`urllib3.filepost.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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py new file mode 100644 index 0000000..170e974 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py new file mode 100644 index 0000000..740db37 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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) <= {"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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py new file mode 100644 index 0000000..190c023 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py new file mode 100644 index 0000000..d6594eb --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py new file mode 100644 index 0000000..970cf65 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py @@ -0,0 +1,156 @@ +"""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 in Python 2.7. +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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py new file mode 100644 index 0000000..fe5491c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py @@ -0,0 +1,450 @@ +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 + 'key_server_hostname', #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.copy() + + 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) + + # Strip headers marked as unsafe to forward to the redirected location. + # Check remove_headers_on_redirect to avoid a potential network call within + # conn.is_same_host() which may use socket.gethostbyname() in the future. + if (retries.remove_headers_on_redirect + and not conn.is_same_host(redirect_location)): + for header in retries.remove_headers_on_redirect: + kw['headers'].pop(header, None) + + 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 containing 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py new file mode 100644 index 0000000..8f2f44b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py @@ -0,0 +1,150 @@ +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 = {'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 NotImplementedError("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() + + urlopen_kw['request_url'] = url + + 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 mimic 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py new file mode 100644 index 0000000..c112690 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py @@ -0,0 +1,705 @@ +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, 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 = b'' + 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 GzipDecoderState(object): + + FIRST_MEMBER = 0 + OTHER_MEMBERS = 1 + SWALLOW_DATA = 2 + + +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + self._state = GzipDecoderState.FIRST_MEMBER + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + ret = bytearray() + if self._state == GzipDecoderState.SWALLOW_DATA or not data: + return bytes(ret) + while True: + try: + ret += self._obj.decompress(data) + except zlib.error: + previous_state = self._state + # Ignore data after the first error + self._state = GzipDecoderState.SWALLOW_DATA + if previous_state == GzipDecoderState.OTHER_MEMBERS: + # Allow trailing garbage acceptable in other gzip clients + return bytes(ret) + raise + data = self._obj.unused_data + if not data: + return bytes(ret) + self._state = GzipDecoderState.OTHER_MEMBERS + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + +class MultiDecoder(object): + """ + From RFC7231: + If one or more encodings have been applied to a representation, the + sender that applied the encodings MUST generate a Content-Encoding + header field that lists the content codings in the order in which + they were applied. + """ + + def __init__(self, modes): + self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] + + def flush(self): + return self._decoders[0].flush() + + def decompress(self, data): + for d in reversed(self._decoders): + data = d.decompress(data) + return data + + +def _get_decoder(mode): + if ',' in mode: + return MultiDecoder(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, will attempt to decode the body based on the + 'content-encoding' header. + + :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, msg=None, + retries=None, enforce_content_length=False, + request_method=None, request_url=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 + self.msg = msg + self._request_url = request_url + + if body and isinstance(body, (basestring, bytes)): + 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 isclosed(self): + return is_fp_closed(self._fp) + + 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: + if 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 + + 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: + if content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + elif ',' in content_encoding: + encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] + if len(encodings): + 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 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. + """ + 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.") + + with self._error_catcher(): + # 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 + + # If a response is already read and closed + # then return immediately. + if self._fp.fp is None: + return + + 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() + + def geturl(self): + """ + Returns the URL that was the source of this response. + If the request that generated this response redirected, this method + will return the final redirect location. + """ + if self.retries is not None and len(self.retries.history): + return self.retries.history[-1].redirect_location + else: + return self._request_url diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py new file mode 100644 index 0000000..2f2770b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py new file mode 100644 index 0000000..5ad70b2 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py @@ -0,0 +1,134 @@ +from __future__ import absolute_import +import socket +from .wait import NoWayToWaitForSocketError, wait_for_read +from ..contrib import _appengine_environ + + +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 + try: + # Returns True if readable, which here means it's been dropped + return wait_for_read(sock, timeout=0.0) + except NoWayToWaitForSocketError: # Platform-specific: AppEngine + return False + + +# 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 + + # App Engine doesn't support IPV6 sockets and actually has a quota on the + # number of sockets that can be used, so just early out here instead of + # creating a socket needlessly. + # See https://github.com/urllib3/urllib3/issues/1446 + if _appengine_environ.is_appengine_sandbox(): + return 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py new file mode 100644 index 0000000..d3d379a --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py @@ -0,0 +1,21 @@ +import collections +from ..packages import six +from ..packages.six.moves import queue + +if six.PY2: + # Queue is imported for side effects on MS Windows. See issue #229. + import Queue as _unused_module_Queue # noqa: F401 + + +class LifoQueue(queue.Queue): + def _init(self, _): + self.queue = collections.deque() + + def _qsize(self, len=len): + return len(self.queue) + + def _put(self, item): + self.queue.append(item) + + def _get(self): + return self.queue.pop() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py new file mode 100644 index 0000000..3ddfcd5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py new file mode 100644 index 0000000..3d54864 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py @@ -0,0 +1,87 @@ +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: + # get_payload is actually email.message.Message.get_payload; + # we're only interested in the result if it's not a multipart message + if not headers.is_multipart(): + payload = get_payload() + + if isinstance(payload, (bytes, str)): + unparsed_data = 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py new file mode 100644 index 0000000..e7d0abd --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py @@ -0,0 +1,411 @@ +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. + + :param iterable remove_headers_on_redirect: + Sequence of headers to remove from the request when a response + indicating a redirect is returned before firing off the redirected + request. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) + + DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) + + #: 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, + remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): + + 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 + self.remove_headers_on_redirect = remove_headers_on_redirect + + 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, + remove_headers_on_redirect=self.remove_headers_on_redirect + ) + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py new file mode 100644 index 0000000..dfc553f --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py @@ -0,0 +1,381 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac +import socket + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning +from ..packages import six + + +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 + + +# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in +# those cases. This means that we can only detect IPv4 addresses in this case. +if hasattr(socket, 'inet_pton'): + inet_pton = socket.inet_pton +else: + # Maybe we can use ipaddress if the user has urllib3[secure]? + try: + from pip._vendor import ipaddress + + def inet_pton(_, host): + if isinstance(host, bytes): + host = host.decode('ascii') + return ipaddress.ip_address(host) + + except ImportError: # Platform-specific: Non-Linux + def inet_pton(_, host): + return socket.inet_aton(host) + + +# 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 + 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): + 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, + } + return wrap_socket(socket, ciphers=self.ciphers, **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 abbreviation. + (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) + + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + # 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 + + 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. + :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.7 + 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 we detect server_hostname is an IP address then the SNI + # extension should not be used according to RFC3546 Section 3.1 + # We shouldn't warn the user if SNI isn't available but we would + # not be using SNI anyways due to IP address for server_hostname. + if ((server_hostname is not None and not is_ipaddress(server_hostname)) + or IS_SECURETRANSPORT): + if HAS_SNI and server_hostname is not None: + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Server 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) + + +def is_ipaddress(hostname): + """Detects whether the hostname given is an IP address. + + :param str hostname: Hostname to examine. + :return: True if the hostname is an IP address, False otherwise. + """ + if six.PY3 and isinstance(hostname, bytes): + # IDN A-label bytes are ASCII compatible. + hostname = hostname.decode('ascii') + + families = [socket.AF_INET] + if hasattr(socket, 'AF_INET6'): + families.append(socket.AF_INET6) + + for af in families: + try: + inet_pton(af, hostname) + except (socket.error, ValueError, OSError): + pass + else: + return True + return False diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py new file mode 100644 index 0000000..cec817e --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py new file mode 100644 index 0000000..6b6f996 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py new file mode 100644 index 0000000..4db71ba --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py @@ -0,0 +1,150 @@ +import errno +from functools import partial +import select +import sys +try: + from time import monotonic +except ImportError: + from time import time as monotonic + +__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] + + +class NoWayToWaitForSocketError(Exception): + pass + + +# How should we wait on sockets? +# +# There are two types of APIs you can use for waiting on sockets: the fancy +# modern stateful APIs like epoll/kqueue, and the older stateless APIs like +# select/poll. The stateful APIs are more efficient when you have a lots of +# sockets to keep track of, because you can set them up once and then use them +# lots of times. But we only ever want to wait on a single socket at a time +# and don't want to keep track of state, so the stateless APIs are actually +# more efficient. So we want to use select() or poll(). +# +# Now, how do we choose between select() and poll()? On traditional Unixes, +# select() has a strange calling convention that makes it slow, or fail +# altogether, for high-numbered file descriptors. The point of poll() is to fix +# that, so on Unixes, we prefer poll(). +# +# On Windows, there is no poll() (or at least Python doesn't provide a wrapper +# for it), but that's OK, because on Windows, select() doesn't have this +# strange calling convention; plain select() works fine. +# +# So: on Windows we use select(), and everywhere else we use poll(). We also +# fall back to select() in case poll() is somehow broken or missing. + +if sys.version_info >= (3, 5): + # Modern Python, that retries syscalls by default + def _retry_on_intr(fn, timeout): + return fn(timeout) +else: + # Old and broken Pythons. + def _retry_on_intr(fn, timeout): + if timeout is None: + deadline = float("inf") + else: + deadline = monotonic() + timeout + + while True: + try: + return fn(timeout) + # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 + except (OSError, select.error) as e: + # 'e.args[0]' incantation works for both OSError and select.error + if e.args[0] != errno.EINTR: + raise + else: + timeout = deadline - monotonic() + if timeout < 0: + timeout = 0 + if timeout == float("inf"): + timeout = None + continue + + +def select_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + rcheck = [] + wcheck = [] + if read: + rcheck.append(sock) + if write: + wcheck.append(sock) + # When doing a non-blocking connect, most systems signal success by + # marking the socket writable. Windows, though, signals success by marked + # it as "exceptional". We paper over the difference by checking the write + # sockets for both conditions. (The stdlib selectors module does the same + # thing.) + fn = partial(select.select, rcheck, wcheck, wcheck) + rready, wready, xready = _retry_on_intr(fn, timeout) + return bool(rready or wready or xready) + + +def poll_wait_for_socket(sock, read=False, write=False, timeout=None): + if not read and not write: + raise RuntimeError("must specify at least one of read=True, write=True") + mask = 0 + if read: + mask |= select.POLLIN + if write: + mask |= select.POLLOUT + poll_obj = select.poll() + poll_obj.register(sock, mask) + + # For some reason, poll() takes timeout in milliseconds + def do_poll(t): + if t is not None: + t *= 1000 + return poll_obj.poll(t) + + return bool(_retry_on_intr(do_poll, timeout)) + + +def null_wait_for_socket(*args, **kwargs): + raise NoWayToWaitForSocketError("no select-equivalent available") + + +def _have_working_poll(): + # Apparently some systems have a select.poll that fails as soon as you try + # to use it, either due to strange configuration or broken monkeypatching + # from libraries like eventlet/greenlet. + try: + poll_obj = select.poll() + _retry_on_intr(poll_obj.poll, 0) + except (AttributeError, OSError): + return False + else: + return True + + +def wait_for_socket(*args, **kwargs): + # We delay choosing which implementation to use until the first time we're + # called. We could do it at import time, but then we might make the wrong + # decision if someone goes wild with monkeypatching select.poll after + # we're imported. + global wait_for_socket + if _have_working_poll(): + wait_for_socket = poll_wait_for_socket + elif hasattr(select, "select"): + wait_for_socket = select_wait_for_socket + else: # Platform-specific: Appengine. + wait_for_socket = null_wait_for_socket + return wait_for_socket(*args, **kwargs) + + +def wait_for_read(sock, timeout=None): + """ Waits for reading to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, read=True, timeout=timeout) + + +def wait_for_write(sock, timeout=None): + """ Waits for writing to be available on a given socket. + Returns True if the socket is readable, or False if the timeout expired. + """ + return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py new file mode 100644 index 0000000..d21d697 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py new file mode 100644 index 0000000..29cbf91 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py new file mode 100644 index 0000000..295dc92 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py new file mode 100644 index 0000000..e12c10d --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py new file mode 100644 index 0000000..d16e326 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/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/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools-40.8.0-py3.8.egg b/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools-40.8.0-py3.8.egg new file mode 100644 index 0000000000000000000000000000000000000000..31cddce2f1ed4f6cc2fe9a106cb11fe3f05cd12a GIT binary patch literal 571910 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�|&dmFJ$RQMZMrLJzYg+Q~I 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%0D<6 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 Ls*6z&tVmgrT z(+zo?<zR?rf$0u?c$y4uIB7KxctR^?97XU34K+wJl;N=?s&^PTFZEL+b@XTwfF;0O zWLG#|@i086x~D{+jRDF0<ij!dq@Vd4egUGt?;R=@U~~wJp!0~($kBO|C<nwz{0;We zp`oK$l>|mdIm`GcEXK&{I?tEOX$$d%)MyNQnuh}Cj7*@+-{gy^T^-%HA>UW?z|Ts( z1Y>gwaO!KPb8{1qV#;Gk8~`yJr@<2t8G1oPGsB=&^`{t`q;DpXI;p6;YQSU2+84wC zM|F3cTkjkrm4IPR-6t00trn8g_@h!eTL5%%MIl-HJFT2jpxB*`0Sc;sKMfi@>Gj(D zj7eX~=Q>=-{+$LYqTRq82C9w9G`IT`<?bA8N`^wnVfKpHGP~A{V~5~X<vHDnmFun; zuQT!KP`CZ-DUnx0`!&hP)8NV5=FQYbaK_sxO(eR$Qirn;$`BD=TF&4{NYXo{Ge!<6 z8|D{31ye6L3i}EM)%Zxg{uEVp_q9xC1?Opn+Oo+mXvs|*V49`anmkd)Kg##EKj3wH zT6JK5EQCWW{x#1lX-)=C!TMN!kzlhIpEc7brbS0^=kVg-BwrX-e$<1@45^2R;4rik zrLU{Sm2hEl5a=;4;LkYC>x3IhdT|uy&Fp`ROQuC`w!sil<?xeIsfYAyGv+-#e38GM zmfAYc1l*hlKAc-aP91*2Fj<#gin?DWx8#VV&>9|S&RS?4RsSW2NLiP+AaSj9FLN48 zvFfOUaSg^YBppva*bYeOPN)5K>@U`jJv#Q()U9l7w%f3@^!lwI&`p|?dTAzExR6<$ zKjvXZJjudABOL?fY`f!XbFTSzsvjgt;#}()yM=OSNy5!ghhPRq*7kg&XJ>V>CAY_$ zcIxH`5mjbNRD+6<Z$pWHDqe?4ErUk<<Pf@Mt!GKrXXVsgVr}GWE3S$JJPVheS!@wu zuEEiEG-kPlZ<38}PF`mXM{ud3&9tvY;oZ3{5`<iHzQ_J%gSA#*h1E<l*C5&q2Uxh$ z*3wa@6R2cwM7V1ZR2{PT8!%SX{-U`37#!6o2JCw3?i<@Z>NM{;xNsXx>?CTXaL!m> zW*#OTPylZ04pQ_Nhf>X!B^}t@RJk~Z7o~%<hl34UIL@*G1}vr>umL${43(;WF@`b2 zKe+{hwWWZ?L_Xh{m#=NdHGfsUh`0*(?K#Uu*!+@tt@VU^-EDY%(fLZahuZ0j5g4D* z<?)l^ht(oSuF{<~w3mM2ppu5%99@5RJcUmJmG3Q{MS|-o+Ey&?`YDBR-mH5-l_Uo` z5LPSD*gh`eN}mWO^d={o;Uig}Ov2y*C4Z&NDiq&yZrxnorGG%U=dXQqETd=EzS$id zAR-5~?+`$|DO-kTXpvhF=ktBu9wK4%ImOG^;f;`;6mwRSAyFr@HHbr`AC@Y{+GjSc zQFGdULK1nQp;UJsPXtWwKaKrYGk8M<3?|K6_E)Mem8gukTec<#!(B@po#smnzHr=e z2tL=e4R)vKmWLgGbI|k00u9iMWo2^BDE6+?9YKtZ4(2c;!H1Ojv%d?>zY9B9AGbwF z;Rkq60QJ9|ZcHeL^Ii+sudLuJvOyRzrnlZjei-+0@Q$;NYFaB3i3%b1do`7Op>w{7 z;+kU*zF$YR2Yo*QSdc+mU(aSuc*n<TlGg;(HH9QrZ>fcFE?Y-v>pC^K;<=(xQm)Nf zW4BM4VOvw3*OkeGif>WQ*Voa^R+5?AZXWk9lwGF8*1#dAIvTd9)B*r1q$VSs<e}4n z1#P_;R{3I}MlOpM=3;zH9eES!$fVFXwfpw~l%x7+rit_9qdt}BeCL=%yZzCGuVEoL zO7?vghojU}hY}n0TzL_7HEeTJeO?jdrfe=lXuM7|HudAHOMcxUyq24#pHz=xN)auU z*g!3p%Q09MC%>f{x##7O2Ftx>h}63-u%bAs%kuuLJzZX|%c3Sn7_LppkP+?75*#s5 z&{<>)tD`F9z|SM|+W0zr?~pf41{A5g7|j59SN~l*c9CKW2tD(BM|%-iu-T1!dft@O z$_f?*Lt)Z=B}T25kfP6~$X5e5cC{XLq9<31ZK1ChAV0sfw<*j9&qGH`pubXFM}J+n z|NZJ#kt(>KzF5dP>H27imt1N~rce1n2LTv!t<Yq9X;UXH2fewMj!8_JD5)=)51nhj z9xvL?q3FeMR-9zoZiQ$kH-+!m;1da+?Ml)T*UCmc{Ado|zi8C(VcF~4c4Ya9nH`|= zXHmJRMEgOKiqliGO0t%ZEu-zfoH%V}3PSGZRKxZI^*5%@LKCY)FN<O^GL9J!!yHI1 zl*im=gQ9NcvQ)tmOT-v|Dmg}JD}Ekf@uJiV0B{iq=fCd4DkBx|J#qC^;kH&%Uu1#g zvYuIml&Ym9&C`{D0Zdmo8NoRee%F}>Q)CEob@pc9rwZ^#clo(W>z#7W81=&T9M@4# zvOGnPaIB>YvVlDK-^X!E|NNM&QfFIa3WhbwQ-h+54i|`p9)>RbGpbt2r_A;dO;Cts zx}0jmlp)3jtJdMpdGXWiY<}0;L07{27ue}%yY@hju9Y@+eywrmnzmF5hHQ}Na~c!M zGw76V^C5e`1ULGHSv{unozv#p5wJ_tJvaR2O}!S?y_SRw+|e)_LD=PIoqd0iCY*iO z<nTA3D`%q&sgo-6><%azrTEc0h~(V4hSPY=d4XaryMc(KzI+;O_1u5MV3Ep0L?R^P z_65kQlTCp6kcQk;VqMDCYC0jccNJzh^k6y15?ObzzR&9PnvS4?F1Zf$9hCtstO&GB zTN0gR-@^zIhV|y{dlfZtB|Z`K&{NBZH`Qtb8}o9uYaQKsP@Z2x<wX;h&==5|)485J zl}9a^&1@Og3Uu1?+`f`gcrP-`9ZgkAU8zZ>2tb^$%Xs`!Z*p@zWrG1Kj^rgqniUne z(gYiHwfB@dSNUd7eYIj?H!Vz<LU;l0#s=bSBacC#ep!BUYQn_o-w&cx)?+K&gpRep z-TBnM8uEhw?T5`TwOb^o6htL4#xLm0_A`VfTJ|mL?m$JBRH7kw%y2#EAe*T0wOI?M z)3%OuJyZn533-<Z@eEu}Zr50IF{M6quR#EoFD`$v$$UcwOKGF_cs^ZOpkqN4%1hjU zx$s3;V<f^{S-ZGp7TshPtuNFt{NC84^JK4lZ;yJIgnj=RCLrIuEaZ_VomUv)cIi?& znJqL5@R2l;h)ikifJHiPi0_tmf>}u-{tXvUdXG_X8GYVd_iacozks2Qb&ze1B<xDk zz1rd{G7dqs`ojlQp{nC%n}tiV$+jhZ9SYewb?pgH&U)_w_^pV8?4^c<JExX7&ro#o z%pO25)Gq*^L~vmzWpViTWftvI4GHyNOBIme(q+yZ61w)n-1p6BL}VfpY{M%e8$B<^ zw(c8J&|Y&<y8U}KNWN6L)V+0gjW;ss`$24j^O2y}4<awukmb>M-sejyh>I4OWGm~O zD0n-U3I#RQIOgY>d@q9Shcu0)cHHjHQ}_ADG^0-bbm(otJ=)u@l*&|t(2ZJgR}koO zD;pP8I1bLOQ2|;Z1;zt#+AfJSj3&~cBgPZqKaf+2GM)$58deSm+u9Giy-iXR7}L}N z%a~Sek2c%`tDDRwdz<N$GNS>XHqRNJ?ST4|Q$3Sxj|`%7J7R2b$CIXk)(ZvDzv~IW z<iOVW(>+|np!Lvl?g?~T(6poTxy-&VCYU<C&3bmU(>CHM``hP91%K<HLRJ3~dGb*7 zc01!_??8_Z++DUEP!f^jFL}Ln$}4WMZAZSw?j+fT0V?esV?KABBgt5m*wW1}hjBBh zOi|q{PDLHj4u6Rbh6$!se7}6V)hSPQc)xD{X<w^sJCHScRaLsRNiB)p{l4pA05G-@ zopc&;%hwn6;KTsM?=Sqseq}1RD@P*hFnF>0kiAXXtODsp^w&iwtO4sRb_$_TbaAvO zAy6S4sln$oaYv}9)x5bVH+l|iuoLuX7)$GoEGfde`+D+16&sKvqNHA<i{JVTzhomo z>9r7Ou!7DA0uGrJ7$5nQNz$7=WVEi{E{{jT#(YfvL<M&Z-<hXPhO);bWplsMgede_ z>Y<;u>zsX;K7VB=1T96kq^ma+zb;?kekG>hvrGvWc#lDFM*yPwE#&swS-ltmg(~^h zN5*-83(5v!cyUdVX7{g7qg6gcbklms1vcHP8}}K`zTHBJp3h+hLCvo6jZrj}W}^)G z{%rmfZbwrsz${M~C}OZfb^)L@=q7ggXCiU}sbQ0!)1$L?@&l}=!+Nzch^HrWW!iU1 zQd{QQoMm-DPfkGnUtRpphxTrcdC$tS5Z^z&?{a{wxSA_o(-BW9yE@SpV+4h9RY)vn zW`>5!-x~4c-56YoRx`wlO5D}4o~M}Ihn)jkqK$~DE{XZQJGe%9pTsp1-1TXC%mOFQ z?J<2Ax=jfkdaqEg>y}-6#BHj)3w~s;wu|~~<ecrzg3ORELZGTmtw#AOavifRfK0%W zhOgKe!;jc8J{!gbXE^$4+J-c&vV|;C1A{l|9(lmm#%Wrc5h!ZwLQK3u5Wg>?If)5? zpiTRIo|u(_Roig^?Uu&yPU`x9$@H(^e!!`bTT_6Y=ik{6KlQ1oL#U!H8b19N4e&#= z0gNDlKSRH1Xt`5>XMrR;nj{__@hresn}nTxDg`BNTrKx6q@RzWyE&btZx6Mv+MnTj zW&?G-!g@f^4Wvxn!l6KY8-v}ag@soe<N=6g8<Z0(TNf`cGl&1yJ2WF@#Ve!D@#v@t zo)zyd7`ON0O7h45{J|l9(Jw^y!M^X#9}F_1k7S4F|DOE%vVFT_<Hqi;tLg@*LToQm za+HNEC->WvlZ%I+6Ln>6$;fxiQWxn=4x9rZv?^Z>G+ipN9%mI(WL~m!>#YQYOi8H> z5_BNnz;cdKg2v+TxAxE4*kdgs1fNg**?Hwhc+U2JeZ4X8NA$_ZqUH*=jxWLVrjn&| zzZf)X`U?4IN#(%fK0hCw?O0L)eX;xD6o@%yB1LBlqr*ufdvWA)SvMs8$77HBl7{Gr zOC+jWu{7)eFRd1T!Dth4Jt{Q|#gF4(1l6pR_%%0XwySTLlYTpEdRXR@zwUajr!1~` zG`1sxSxRdAEfvN*>eNp$X`ri7X)tp(|Nd%5{|<NC&vYwg%5^<Y0pLgD55re;BEuwh z5(!_b(Aq*-DT274{VC#X*yVCBKix;A>^q(fBAaA^D$&3z<@3#(Q`MuU`+500wV|i$ zoy#L$XIk~k1nKcoclVqc45qiULf2e;LG*+-4<ePOU=NXupqoRX-!8h7BM^Ou$50T+ z+a?HxGvp;ue&6BcuGf}FQ+0Ot6JKlJOjcwt0T~axKaYbidl`#4m4fAwP>$QH*9;IA zUK_4B;jolL6)#6zosJkEJ?mH832U0{^G@IU_E2DL`llIOktJtY#2gzB&tW}YrNa(% zDEK)GN*k(EG)Gw_Gy$vXraP4qWRkOwoSo5P_eLcmdCzgvRHH=@+|q&n)kGy)AOk?J zyb?vJN#nHextDJaI}N2>A%DLmsH+mRHsfnE@`qBG6f2Yo=S-hN`?RHC7NFOR*Ps8A zmRn-uPPVuo_VSP`Ar~b_Ll3aYLG1A*=Q=BGZqhK9rV#U62u5SXF3IZW9roJ>+A+(Y zCnZ96;T<zF^p`jMo`-W~dP{bakG6@&iv0Fc(faaC`BvB%rU(8n*NN6L=KrzvPEn%8 zY7=1Fwr$(CyHDG;ZCj^p+qP}vv~Am-zVk3^-TTi&-gmxaXQe7%Rq39=&Ze26)akso z?o<|nwG3ZY`Aitw9#th06-y|+?j%i8ofyMzcMmE3UhOBn(@BQKnY!v~CRi`Kt4ruW zDfMGzr+GGlYe2^@GnAN|JENaJEUYBZZnWXe$ri6oJYXTo&V%0$acv*}6GUUJ<Woj; z*0G@>t~P&B?ff^Dvc!Wh_$+#Rev=>Y1ZCx{xYBf1Q!T$Pq}|QeDyv#e@h^?V0cGS7 z(2{kzV2tg#VUuR7bSKR2l>R=qO~Xq}*K1@3I(6zy8`X#>t^ZzegEWvZ@Z0`i60O!n z1(hAP3Rp-bu@#N6O?pv1!P||IzVM={2m?#4M;liOdPB>sQAfH=Nf^D3Qjc!+z)R}Y zSyj1e4N@tkY)4qaYu~C!?TY%iIMs2XKnwOAwwOX;ykL<28yXB<ttu^v>q2JX8E?P4 z_mS8Z94ONiZ@FQv(w+k9$0F**>ln!MliT<&3Zi?BpU8-!j^CwSjjFCPXpqn6a~yHF zSBH(S^?#U`VxX81;`DSsW$a6poVn2dIpwQm5B-5OyV%{4WH1u>Jk$My{mCeC9boM1 zR2FT=NID7z%FD^|41n_`ztA+0bg>N#z-~wf%k9J{jtkGt=x4YbQ4JI3;Kkp<%yk<- z8ShBb1a)U1T@!c`dxJgXwJ~y9H(9zbJ_<2Fj+UFB92Jk5jvuskm8V&ZgauT8ZHO-{ z=jMo1-M?4_c7AXsu);X^cVpg9@)|d~qO$_4zm*SI;imnjtM`)jXM@(c3QK>9=b5Ge z5D6-2)NDJpuy1PgC>UFunbCEYfe`QgZ!V3#q)-c1>A29&a6y$b8gu;RW-Hc5f2QnW z0?`zXv7Zv5T?p0qGw0S#{zFDQXfd4z-3B|ebmcv(hn0Km;wr2-!DNg(Y3!jQ-gq(3 zelyQGs{Vt^<~G0+Vz)>_D_zbz?HTwu<CQSLxT<)~>BZonOOeH8=G%lT<FOS~%pNOw zm;UJ^OJI<V@>68#>+B^Pc6*=*JJi6ZoN3<~qs8;%CAKw~Uw}4u;!Uv|b{t3J`jC{v z{hA)ty>;;{>s@Z!0OfBQ4dW-7Gm*CO?xG3LrI^eN`XdIAEcUX$bZj{QWQU8INvK#m zLhfC9B(Ot>vzpDhdnDYj%ucuO^Gf2&;tPE*x5wAs7lR{rnZO*+2TSz{7vS}3#MIqK z$ETaD$&adOL&>KW)wP+58MZ?jP}Ff=a)I3W$u)N@N_sNGfsBlJ%9iuzvf_^Fke^yi zqK8`K10BgpLe5FZy)N)DjNF^rrQs_5V^Q~t=U&23RUi(C6Oo|WUoAV2yGP}2EjtS$ z^zn{`bqC_(BoeVtR3*!Vlbm3u#=un4szXshc_2Ptx(R11o$OOd83$h%O9@P<r!IC& zIhAYp0XRTQ6{*F4e}6E^e=c?zf22bWjB1t#R^U!tL!C}2^m<6<oVqU&kuL9umHA># z9Oq~Iz!`vk_S%J>PyMxseeix{UWJ_Aq45aY0;H)WB}9bwV1#8J$K`qZ+oCnhK1^ZB zIb#D+Q`8I8GI6(h`JupSf4FYTwpB0UvEKK-!iZ@U;bj!c+@klqE}o!AiyUn3_k3L! z*ZQJ|I9O!q4;NS<u!Kp7`lA$Go+*9B=c`g{iM?5@BS_>6db)P!Ml?=JHHcwezW>KV zJ`(79O9c)9z=rDo2zKmE>{*ytoej+XBiO0d^m5u@L;BIn1tOOZJq#|P?M-l>aXa9$ ztw?8iW|?8-T`3eIAt5Z0NP*wzkm>ojq60wkUX}DLWs86SirU(tdj_?suS}*{6&eXF zZr7d&9=!{ty?35wO2>_DS*@UH+;=xKqnuP>g&%P4PPAd_0j_mBcHr9aXy;IufqNtL zbHV5ihdT*Nl%!}ws1<2)V@dDgfFh?SuhqT0M)8oSG-aX`h2y?5CgNV@rg>|CXqYzV z!Rtkg81taSkSB7@J#M|kYcWYZNrfS6XmrlLQ=BoOnS|{eaH%sFxtuYLs;F{g%w%kz zS?DtM)-7^SiA?vz`}^ol64gLuq7Cxes;Lv3KJ3uJ^3a%;8pWcQd7_<WH(XNJ6Kc^A z_f+APL(Zgu7U`QdQV$`WPWA+c?m^;+*quUHCzc3w=iiqG8RE@AKQ+gc@?g)BQ9L{t zeX?f>W?zTA3-Oc?fVQ>i5OlIV^~G!X9SS&#{Z}kry{?$TEOLGgcUI^105=xHd&0Z0 zXO|ouz+?de6^5p8e4h|SW4r|Y<X7hzjV^=3+%jAu`UkRwb<M{?0hu)%<aHR=@0$q@ zK~=Y7;9-qkMRB6}RYmr`qpC|9*&w3t<N@ait24u=E=cd6j5p~uiTa=5x?w}wgaqP8 znmsE)v>@ukz-ssY$=|Fzxm-^D<;=D0G3YcXwhjs0T0xQx0@}XyaVGHyJYZ0DOpFhR z$b=J<0JICP+*e$D-5-mGF;7<@yFqm>;a}~56=CRh*n4-Vbax%Vpg2lRtQt5mtN?JL zE<~ntw7zwJa?u~n7+zrOgp_Hax~P~53B|s8#G&<Jhd}vqnN8N&&4Q^fw2x+6?b!$G zfazes_-a<2HAG*p5my>JP-<#{-~cIg6$mn9v<L?B@IEGub|h=sL>6*Q-ZszYHS}L4 zizL_p-;ow+PM)FJ&Cz7{wT6ACwcgG4>qJrq8BWz(Da(r$)bYcZG0G%%U86Tfjpxqt z?qNwK$n7oK^JA@|fS`FGF?o}8w5TYVP<x!gC|%I9<uv>&!eo@Q{R_9NomZbI3{C*- zhczIe-OQjCzBcA1jNHK?Rc)~Rc4QA*v>$-g?h{lC+7Z>?@COP11F*+AzHPm%Zw8Y# z;ecg-ATlA5-M`NM1dV%~zy_5?2&8y%RDgbjMtr{k>@K4R-}#li^l>AQ0w6ktE(vHu z?+(&O2-ATQQ<cTse8ie#{zF@74^{S-s@|^cfcZ$FME=XG8Fs5}X1wRjIR|?Xi#*_) zBYc$_jV#7}j#^>KB;4hQc5g0g^=Lkdh+>2Pve5m>?92091rM=!;pb5<s77c4w~+~7 zWT0EZh;(hcu#SjAct1F}o0jh^@yklp!A!ZiML`?UGNAbmm^+Mf<-XB9=i%6_z7<HB zWQYyKBf>xRzS?a0Rj<S?)*77J)4Tb8_6D&_{g%f8UOn;d4&adMx@4sBP7D!C5d3iM z+*z|h)$;QU|DH6%Mq|X{?Om;$Ey*`d?)dWgd_3=8Qp2ogeyW&4v^*UM__(w4cDnoU zdGUX}ys51Uo-CI^v2XgMUDE9`ch$HOf$vQ4td9_b!|=y}fTi|cdEk9?vqM))_1Xao zgetNEP(X(z+I~B&GK*<DXBW*9<yQNsrc?NHO4)2YRwo|^W8zlYY=l4AQfxRik_1I> zx#(kwg|Qu73pEp=$DxG`xB&5pFppY^wLFapWGSLhs11#78V4(Orlr%EdL-xN=3L!O z2ar#<qV5W8g?z%FdD=PN?(ZIb&-X)5il#eP-xMxT)kc9%u%<iFCw}oBvZqKsF?hLq zuyAwPR~hH00*LX1iB?<Z>(qhRkg;4)B^(o>?c!j=M+EKK{GuUg^vjdQ#;6zkek1Lk z?$@i62RF6G%0<2HEWN#ik7O7%GPq6Q5~f;Xn0Udz!UA;?f*=%!O#SZDiAYqVETIKp zu1A(uW4Vr{`UaqkM3e>&Z3z(&RTP4s@7Bkesd>Fz`Jsd+DNjI5B-s?_!y|1#RSr`; z0xczO10zr`jF@+YZ2Ek##76Bu_hpcN#*J)iG|)d#D(Y-_8W?eR0wNIgRUe<CUpHw@ zC1@HZT2G6IB_lG>J;QvypAe7BXW4aB>k`I95h6&oP37n+(JBXtrccx02n38Mf-D<T zy?|-7Exn`qQ)yZ$rIT5;>6L1EypFEU0#4gRHa8g9$W`jaD$!_o8^;vLx3Ug0A3&hO z+AAZ7gYR6F%7`&wP{U5)XvSwkMunj9;$?mt!eyB2xc=r=Io9Ua#%Sl)Aj*51L$t1d zFjONx`%svs0JCgkO@nb=I;`rY8B`QwMC;-2v?D!_NRRlOZNf${X4HThR3)XD_OS2h z?vL0pYg~UT)E_JTwye!fU0c&jEiTz=g9H&YVS(JFSjwe$8<ivk54)&9d0Q{{#Q*8F zPb^xt8=6e07EJWZ<>Ns}X0?Yeew2J4iO!>?a*?>GjLh_1X?K~0okl=?Inr~$SSK%- z*X_Fv?E8up(iKI8x$fn4F+b^w>{aYbsRT_MT(Xj=!ypknizX97=|@BY4DFIcS3=PG zKoXgGZVFdZcKajiOmN3Dc+oSF9w^vH&=6jfIVv)YvJ*H>u4RN5zVI5XutTv&MrPCo z9-d2t2-CuL%PwjeW5B^Xjxyg$<e%f3a~V5DLRLfgY=clBI)X=G;Jk82G|zi0sSOfA zULRFYiI8~29Z%wVueZDNf3!W-W@txXL+7Bo>Ic0>@fKkiL<CF+#^d(K4|Z%L4QR5g z!Md)oWs;e|jS_;`_wiy&20jl3Z4VU!=NiN*lxk%wHm;ggKI(4%;X$!%5S8<LpRB{+ z_Tna0%O4Z67IkANb+3S$VaG24Zo*PQ!JUB*cyN03jW_i&H{!50i2MY4Dh<a4tY7iS zK&1_F0}YO#$IIj>i(ofCIZVDG^esLFwo81>vDDl<9N=(g;s-^_3W38wJK#goR0A~t zAI3E%cDvn|drIwhQ;sVPpsYS}6m`nU6O}#&+5%~@^Dh>6h&C4KDkUW0Lu0+PA1V5) zkKpfSK^e1#idVrIYJXXx59Qw(^e5>P?KVG@0qfsuli&RaZz05Dn<jbnfp`~U$RrOa zHywaTBi;gMG_ulTBa(Hi_-q;ZA!oftKQdgt={=S5RCoh`w&rO7Y~j=MDIq;o;}i@t zRWj&_!KPvmn(F&*tg|$&^EzdUMeG{fl#w65!L@Pf=PR)>0r3x-5V<_E5c{pH^LPFk z4$R^_>%fZw)-D8!9AdHgV*f*{wS3#iXy!AE?Adr<-K9t<pliL)vq)sYbC|xdPDtCz z6Odci?y8!j3f6Vy&|0G>$}JhCsEktvOoVA`DIlSznY_}tm)-XFHbVQ%F+116H<s8{ z5&%CH060ch!kEp;4e*4;)051Qow9hNopR1scZa1@foZhZ7rR`t1k3>s8)yn;rA0<E z&eGXmtATIGlzl!N$1E?QikFLfxo(^~d~5O3WQC5!Ry(PRTcUUY6o4d2UKwFbyC5W@ z`>?(1Sb=e;EC(8{soQ#493&M8w&Ubjqtom%?Owc_n?e)+@l6)TzV9&yff#Q>Cjw*j z_SCpd!?gS{WP?6dMqsDZMf{S0={Uf1^~t*Y>S18`Olip$N$RqN{I*agJ+^F;ppczg zW*r7ls%=YxVh&i3Xxwl`mds`j0a=)<?RMt(T#r0#gEGZkyMir4ATJSM9{t*rpAN>B zY|U{;BMsS}uHkc>e<WyB{H0NrWsP+|VUfjI^ytv`)(C(8wwmAX+3xiC3VXSTof(R{ z<$>2UXM{55c&4p%#By%uuz<9#df7Oro13^RWvKoJ9XX@gs$1;Skv_73ddtrw7TarS zSsO7MdIkD%>6Vn3bV<Ir%GZD52w}HV!QVWIjX?WTJj(w-{qd@3Z;HZP`X21P0Db4` z-`%-lM_cI}?PQk#!o#BakU(9)XubYXGVGbL<kwM-3h@@;&}UKDh8NGHdeoHDg8jV; zHNBSrTJJmKGF@ZeQaDz#mb4x<@?K_ZIxg0N0?Z4wYd@;f#g`!#X@I?eR83n9pdIT> z(6$;SF8MMOu<1nDrpzNrKGk*z*(~A7b?=P48)Oc!vAJdRt8Gvnx@MS?*8h9&7Zxb2 zfl`0AhKetyjepZ;UN*}fK%+9nn{AqFVo)$xdh!I3a+$2jaGE{5)cEsqLbLwm;@Z9C zBOVqBhk_QNu-1NV49HO<cbn5F`QkXJJ57mt+DsY_a3|dDEj=f0&YFegB<PXbpB}uV zt5xATxaHlFbm#ASicX^dNGeypbn^XRCl4r0DbqQssg?JfaBg@-J>6n3A-j@*#^wBE zTE>xcZnwJOR(!!^>9N4PwY<zXQ~R-5nyPfHxY5-!quN^ulx>iw=DWO~nFMJoy<jpd zFk{;wG%Sn%!=;P~+97w6Gs<CjONDo&($RddhLry^XVV|Zicq;*;`u?A8XzJOF^@FR zl`M<Wo`bXF>;rTa<OaRqti-_0d}qeLdXZxlb!}$m7ihV;<I?jOkaiNd^SoDCzZLcf z$BA%JwV4;iJ~Ma8>n_s^_EQHnQWoeS4;nl8gS_1`7JQ;8P=Q&T2Vy*3M00HW?YLf_ zMc#(Z5N%xuJIDlSf=VUP#5vdkvezm+$d{@1irmIe4LJ^{;lz!}gU8!&mH2G#>bh&q zwSHi|2QQqWk6Fzei~u<`KFC8GX=8-(xBk4DZtaqMYW@_RJIVCX66ofm9oN(yqmuMH z=TGRfq+p2T4x4$r0Hc4eXVtHDN2uLg?hl0T`>8}n^S5oKyO4~NhGls4X=!o_tp1FN zStS+d2mOC5uNzED)#!fn=rDdG&Hg9O%-(~E-N??y-oW`6ivEpfv>IeU2yy$09F)eP zU`ksMAW#Z(H7A@CI5SRqwT_ZVnahs)x}k2Lm|Mu#Z0dUH9_=om7%FVkt>?2U^ayAj z_d>_uLf>t>-4!c4g8R1$RH4rT_D3Xf&NbPikVC2(LB}2q!sGrji!g%O2!rrKVpb>| zjr%kn+eC&r&yrEWB3|Oj9b8Sj#S8GR*#D9LOdiLGg(p{TbS0B+C>kOLW(=k-l0FE} zOJS}yXDoqVVJ&IUnC?%>)T*>wc^;4Nza7x;wFkS~>9{qq*u~A)Vp|lQrcmId$~RX| zNodA(N9ZtMYuyCT#F_3$M`}dDen$ao2^S2^Awa{69eb8w{UqL2sAJwKi%K{28mcx* zx->D|w6C6u8729JT3~7PcPV69^&S4pbLWQtsj<T!;Cs*C8ngUn{{5dCGc*2wHTF@Q zlp7R)>AF!<KU$DdfwLD5M3%76m#E(LpR<(AavkO)ss*0jIgrf&INFnDOX0=y60<tU zTDAw2pOvz>ikCf;k@AV@1WQ(w*=h%hKyJHnM+er{%|b2psVF%Om}hTxfmmjb$6!nA z4eg+oR(C9t+v^z$-D{z5Ba37az~fq|F}dh56_Z&a_mb<~g(KiJZCrcw6*wn=j8oXJ z2d}7yoWQ_%f!PLW6s0N|5x>A0>*zzIavp;yF)eZvUP98<41Liy(2mq^B}5vqge6n< z$Z!cIBblNmi_?1IU<=*HUOFosz-nsgZ&-c^uF>_rP9iRi)aQxBb7Rz3-4i35u>5YG z*Z{=Lv|fdR$C#m6{2s!%(ZuOEi87+27|q`qM{tzhL%tEe@YOU*Z#M>hie*1o-y1fT z;t4#e6_P9Rl14d9M>ts=BegCY9&Wu4YFEAJSAP=;=9`%N15PXzLQ%7xZ@$lEZYcFE zdg;Q`f>`)P?f?Eifi0>q*Law}|3l@kr^^3bFXsPmy<C)Z>^2Bcd`{Hzx>m25DlL+E zL?(-5nwKT5xMbIw$|Di#Ymv!dAjVQYKXmL9Iq;7F0bjD5W<hJrqg!%R2N37!+MB&w zcak)vD7xn+5cjWaWhi1+cGuYx`dUB^&Qjf#)hlhHAO*SdnXCQd*3Uz^Zm|!VQ|Q8~ z!7HD+<g9lD4lyRMztFYW$(c8~>Vg@T{ZEPyXBb1rKWFqC%$S?0H(k0;BH0!4+k#ml z?uz7*ZKQMn(YmCVge3mu=eptzFjBi1wb@0L=aoc5lJXdp18clk^cmZ*MBAr{w@bpr z)4@x79Q~3&x;L!=8uKJeC9z};!B})O)y>6yldMZ%H1OZ$3V)K$kMOI)$qW+n065EN z=UWCh@1E{CO2?5Zc`ybeL>Ix~PO&hNls!S61u*RpUA&C<Cd;6xMh<9q@Zx`#g@lIu zAl46zNMLLbaBX@Bj2*C0T*Cdbf@9P8<^0gB-@hJWOAXohl^_dcz2gdQPW1znUUqE- z?M}DsgC}ctpv%K^<~}A#stYAA%3fLNP2q=y?OA*LLkXKT>u-PNG+vv8Jk<9Z!-!w* zee2pLxH=~pc5sRp=I!12Cu*3atGg7iIauKq`ipy2d0h9gpWx+8T<`Qo_#pk5A%ely zTEQZ#>u$PQDRtr47Wn*kuBv>1Yzq65H=Ql=qvBg*32GNt-VQ#`E?V1U8ogu3$NndM zFIp+XXcis-V2B+60QJAkEu0K&jScPo6Bjv+ZDqG1cHikcoTGzNuDo{?KokZ*XGwBR zDDdEapj~4RYbaVnBZg9bozUPS`|~k9#n&dSn6h|mPfma)Ix{o#(JWKH{jb5GIRoWg z>T1)3csWz_57bBJHpF<Q=K4-l%S1*8-Bw@$B2ydT)_PS9mcvHU@aFa!%38(XUwAu` z9T_rcjoNf1*-k=bNFIa+!<4RlS9lSi*aVku)QN$ajRNaPsp(ZL#0?*{m2#8{TN5(n zhBaQFtfdQBI{^KFP4dhH_9)F7<R$yHvdjXFk$Li-qxr|T;QrA_Vco%dQw_B`o9&eF zYB8eiy`2^3D2HK1gc^$Exu`vK?tGuAf=NwMRK2K5Nn$rJuwpm`5^smh2-(4HfU)$X zW*EWkf5~Y@dFfETyQwL1x@9FcP$+OU4n!UnH^@}5*bqZN+y5L@lvgOjJ($vqDCs9z zLTKqMUJ4i6ElFlGUb-eup04Jjal2`X0G#5uZ*tl{&He<*M0E^!HB>7qZqHjgg0?x; z>zB8oVmhK6;3thl>!dzqrRH@t%<O)EaI!*iaB&sfxRLlgqeRdRYbwKD4V;5ELL}+~ zhU0{wjeCgn{%Iv)wbKhuFWB}M?qBf~|16V1%L_+-APC_1;8{YeXHaesikIq8IsT3~ z3d1wbfMek?)-=kgj|qo3i)H!sGjtdhAX7rvfzLK0J$9U?_N66}RK2T~Xz$t{QM8uQ z3x6eHF9`=oovo#zhltElc3C_a0S+yO5Rc6|+BZ`RXIeQu+b$^U^K|`)Gw=Ig1hVaj z7C#;RNcpBO9j@x(r$sO>qH&Bj3?}KnkDjVE%dNezBz1)c^lNdRXX%gXid%o}8fGS= zT9Ufuf+)&!u~$LO+dywmVAX@{E89oFHk7zn8V|7sO^c*&;$wV2^B+Ra?HR|ri-C3p zS>Y}2v{+(_C4AP6Dk-&sNVaG0toH@)Z6qaVo%8Dhz<~-BjGd6GLHSTP0~tOk<|ssf zi6?bc<CV=-m01<1U{*kufKeImk4O<>YE593j(MvC?U?I79w-{<ic)dD3mULbsRjk% zl;x2kx9dO5*b>VNY_u2+Ck+{+w0o5UB$S0NPh2EI(6?sGU=jf+ItnK?sAbSKr8!VJ zTx527WneD+gSOPBEl{P%I!-|wz;$a>wqTA#B8w=zsNoL3<^(N^=FA;R5sPW=2XCPO z;9nW|4>S$1xKQ7sH;sXT4L;@|_%beCVfz5e7WvH~)Bx){PhM)@WF0eg@DVRs?pY?H zdycPP*Q#_5%t<MUbd9mBy0IBEjt*KE?FY;yUa0?`01|o*%^;|Y+IY5(;-Ex7SE$6I zN~HaEYV0<^4fu4UfU%GHcnY5GWLr}L*L?m~U*-VW?IsN-L3y9!jEKoPzG(SC{3!P^ zE3dUB-6%No<D=X)h_C$l(jsj{V2u&>_Db{d$jKPAD&$MyUT7~?C+yjLUz%j0ON0c= zK94p`U`v>bjARs#0r;u%ZmX!uqsFu+iRU^0H7SrHk{4H_e6v-X;kVy8%3+x%AS}}a z5L31jqHLT-UmFV75_x(g<S<zXS~=T3Pef=ih+--u<6k^y*Kz1;Gi?iwRDMZmMTbq+ zuRzzp=VS$>g>3eGdZq|^qAmYsxZ~fTi-mrx@BUmHZ`KtVc#Wa_=V%_kHQyLg6;GDG z@*k4{3{{IGXy*}I?zU9Jv(dbVQ(ynGZX2IUM}m=x4w%w%K-~#8_D~JMCx~_ljRB-* zT?p6D!<(IURP*WZiGA1%{4fGW((><2)7{jC^r+DcJ)1mr<O69Xt(!3FC-$q#==rB% z1tD5yFf(H;7G>A1C7(*E-Wn;!i%8#i%wHuB)LG~*0m*lKL1C<%%c(Y|W4NP?M!5&V zg`UC)Mo0arl*^LJ1rYn2GP(*lI4#(KNRAOsf+)l)G}3e9P(zz^=^cyv`PG5S{Q<(i zrf30<vO1_%oEwcj)wA;k`dXh{Bb`L(TA{ugSd{n+`_a}e3P#SY2r^k03V<&$+!Axo z6CxdL?6C6SF%_r<Q1<BRfES?0mmR+yU>sX9N?UmQybrHFx3NXpHC^;%jR)eUk{5Ll zS3PBQl}#gR_SrUY>*{OaQRocZ$N6^ED0UW?0WgYsn~v!HnD^O$CO&Q;eygFy*VMxY zcBP=5f9Ou?7})>jngrEW%NIgN0)Ruf_*OK;B17U3QV63279N`}9b;>(I?KZC5rWUL zr*b;xYg=4Oz{zf>X7&i0Ypj+S;6RnS1J)bv{_-23PXgITSZkp6wjgA<s8)c)6|`;6 zvu$*Y?L}A`Xe|j915iG{o*mre*&^iAH)mRnJ8j)7j!XJVb<YFgK-UZ2PUVN>8xSvK zK$qo{iX0Uz{EG|~W;+g&j2*9^3l8i$5cp!&V=5f4k~S_vWp84NAC$8ukSLcEKA~mR zT1H_hoEpfO5mJJ?1j<WKYrh{BBc-=~XfIH=@EcTWO7)K^#~;3#f_}whG2Y`jUKsTr z?pZ2N#lWp1ip=XrYKXv}=6V;FsQSB$sG(6jiA0MzA<XV4JT80!vdnq17WoX_D8?S; z%vhMK&VvvIk+yCvk~~VPH|tcLdh*D=r!S=?WwR(5`!9*C(qiIY!W6=~!OSuDV_>K$ zvwooI^=t6(=qw&TB<1)9RannNwAsO~MyV0)R=+UCB~%$I;Z>m3iwtZ_E|UTAI$sjx zl4YH%cp(xAFda6|?kN^sPUzz^hydF^{G;vkUz(z!Yb;|m@_Hz-9|k1y8Op7YMdzWw z@oxLa8F)ADObS*E;3guQ`Ba>-%33&3z+bD$L=?2Tr_0-!wJ0N_DCd0VpChadWJ?G0 zbGgdji*cEa?MzSZ-k<OT#3^pF%eiC3>EzOQ-q5@RSFN#<VOLz*ad`L%mlH}%a;(@H zJzZp5ncfwi^Jln*NM&1rn<OJGC@t}WBI;_d8teCG!7ca<BGnXaLeIr7r4Gl7S{|VC zr3C>ldQatd5qFdqBE%ub%`#QbOw1XV$K~KzYrgJL9O0WiigO4s({ZN3>?@5whB#{U zrNC)`;hZ+}1kT3`N+Bxx9P+2IfBLeNR*FjJZd&Xkj!7BZVV|%yhf^J#*olpJ;&#Ur zIy@wPo4*;+!xF`(yb-r!Fy8oz=reEn7QP(vBo&Vgohia84E4G%R5F4F6?)_LF&u&0 zH!FSalqUDFxM_Hd8IKb*q3;K<_l04Wg-qCt+JV&k{Qm&;;8od{1ljLP`(cRDAeq4_ zR=t6h(Xu3ev|t`=H6Y$-Eaa-59Vm9~eJmfv7crCYSW-t>hU{3jmPpgX0hujVa%+Tq zo-voWdrEe*tdIMe1Y-rExavd_u1?*Z;)^^fpV9@C(<_kMK9?#-KzLfxRLE{%OoYAO z{M&<g_5Fg)UR{R&D8k%(FfZAY0krD&*g^7+k-qifYRa6+uD@70F2ou`cb60=aSw=k zf|YQ2FX+kVzCaCdHh&a=!Ea7(7HMa5&l6x{J4Y~<)>!d0k`)w)FVYmVYob7F?x|ow z9HU6;g6=xTY$4*>^#%>vF`GOfi=C%kdjI13bM9xooYVe}ao%#Kuxaq1H!lvP_4oD? z*M^G8iN+ntht~wY3F92=UAO&%>wK$LebpCxXwbbj0dBpI5ca%VEV&qeON;*9Ii=}- zDQQ1qV-Z+EWfwtL9*Nrw@*)9!4q9jsHk-WuFXu2_(R>?Qe`awWv!)|V@chEvB$}5w z<Siaz55EP{Be$Y6lUwSAYf=8^m^fq<)|yf!?O`ehE`nham(=)H=0&ofts9jmm=``( zqgc40NM!Ob)QR@G(EQ5NTS>V|2kpqO?Dg8<(kW`KmBur?uwhK$9GUZjh(;E7OXYNr zWc&fZ*`ES^qk>lYLs!G|xfb2*hEBKJ=K&A9U6T|{-}R_h08L1z{n~l1`DI<jPL9+* zC7v}0!NPXb`O~N(yK@c2Ym7~*$>VG8&}^f0dkp9@e|z<rUy!k8NN!k{(xFbftx@Lm zc2k2c8U=)m90NsdL|w@(D=mZ4dX*8sQ7I!XW%yH4iJvr`B|Oqp?frJE2dBS=RIiqE zDDsUw4kaoUpWkD%TuW>mIEc*SR=NP)2N~0|iD-y6UrcbH1E59VLG8WEuUZdF6N)>E zZ=D&^K4>`IZOn6DV>~apsg}c8c%&lbBAR-yBsxw{8dv@A)#L0cyCMw~eh8=T{cTWy z_?O8xqrIQ9LmC<sw?WE%LFs5Wdsdwqub#w!L1eDlWoP7|0vlc*T$jLtA811(f~P~? z56AQK;zoNz*#%OdB@wGpV~yqz`|pE4CT<z_nTdpxHx9Bp3HCd8X)pfm4LCE95C`+E z`f#^5Qbil`ZhZMFcLf}~LPlmcH5c!^^Obbl_c{)I8*BYFL2HWA{w_mlM;sQuokyot zU7>(T<z2_v--OSKd0t#R_)S*71sDtPZZ!c+hyD4Yt*ffRqA{Z=qtyZdl+$ny$iYpW zzVD{RSgS9@_HHbk!`QLW@J6Me!X22|zCJG~LMp|`*X|Xe#}dx~`Kl<FL3@fW_8qW4 zE7anb$&&P5t*HYzDp&%sLG=n%ddv8imq^zTpqLbq71EoVU-*F}T8=W5J=Uf^mf*Ue zqCT5@*l6WH)ta~k(rR#;&z(qTu^=e1T@Lge+&$4PR6p>n9h^4y1^!#5r%C;?dB@-T zoD4?Icf)}ms(U7gKAO!GoJ4uX_hr7%mup|fKq?1=iq@hL6${|}yeW{3AJiZ2-{<=@ zUw5U8eqH#Qpt28e#hBgw^AN*fNHK(0a~<PD<o87%eti0V9+{B1_?JImQkLm6t0oMO zyUfq#Qh|HBFxgYvCHS*DJ#S}b&uqMYZ+AF7ay#AJUJpogx>>o|x_vLhZ(;28w;z{J zovkOOC;a%NmP%-{Jlz@2^mA|%CAa)7&eby(_7kR)9=u2Z%TdEImY3IAEbilTMF=Yo z0tvKdR~}!v$$9*fqDw<P6(32wX1yjCpD#NKeSY!1jXSFB?r&adLpln7bE{vQAtFL_ z9g_5k&}Q@9T&UB@I;D43d3G};&DGPWr>v07w6Apc#vL^l02N{cyiI3cR<$9*bDTW& z81EvelM3O0Dm{#J?m{Tss^%a9I^Je>1PgT@a24l^+g*i88R^eJ=fqZ@xGYnSZBT~$ z;;9}ncj4u;PfZ{bWWuDRAzXC^<RFc1qyUe=2!?*zP1ebXxPUNQrjcY3CC()W_6CE_ zz`h~NH@V66AtXS|R!{ppy+{2gJF0KDQm%(<cdK746b-GqA!q6o+gN$>Kq^nAytx|K zLZEeH<qYQDkq%?o?}ETxRoSvX|EJ$)5edJt@E7^7{|=o0VE~LAE$p2MD2z>9De0VT z?5%mH`k@9GV8C`ia)<~Pz}WEhcMVSAf(Z9RcgvG9+6%O-Hp*k|LZ-8XzUhCUCJNe( zm+~#5I%b}aIIUbu&sUG@j<*wpQb$BNZGte41Wu6%ad^qE#-IT=dZXNU)eiy@verIm zsqDx~$Cx*#@V)ynTuSj-*tO3{t6+SrJuc>g>RIkZ2_)ckas+VR<Mt<D*vPt~n(rqV zLqbaWd;<x|^!}ScE@N)$vHYD><nKWH|C`+ZJ1r$udl#6Pe@~Cla1M`m^RTXP_b?Fk ziV8~<bP}@5Gz)-C2~kYYQu_}`PD-p%ZTkmNiqO)`QHoIq2dLJ2=l=WY?VxX>q<42% z=b&q60xH9A#iHZo!{-^EqQxF}2uduw$5eTkRpX%l!{t>|1+l6B@~+<y|A)(SvT!z` z{bjd}%zycp;$Ls%4UYeKBg13_87reEJgWAE6;Q<KHgJMapoJ1L>{F1@!~;o^Q`0>E znj=e!DjuRiSJAPJzq#K`+ml4VDla86^6mJp0q|B_{C(O5W7o@Q^L%}{yN>+`tBrN5 zE9^#kifRx`ojrZ9=9+4mZ%yZ>0Dlo9#(?G&rT<WU9a)8Q<sQ>b{`Srcm_us1V{Q$$ zO!oGJ_*muo3>j{s(AlBNMc&qZEgbaigrw`P7>}ugzM(auA~1@gN)XdpD&R9z?c4bg z5u1@_BdG23|Gw7x_l9FTv;?cTR)(mR+_X?I*j0hGWT-+4GK8Nr3YUauByTOzV=wkT zWN$pRe|u~^EN|1K_8twOwkua*w(@RGYYBg-9youiWMQEjK_q$x#!#CPTlYKyr!*mw z6_?17UzKIk*~hZ3AczTv?gClLDin%QXtAbnU%`C8X_&(am2QKMhr-7B#YDlccI!?8 z?8b7U8d&zF(R2lXwubqMxT8L*T?xP_InLi3G&q|m>fpJd^Nh*A4QJ(l)-nel^!09- zg!7_l<Vp81xEre+GfS;^LTRK1z%B@gq?1k3m8T2nRWoS-iTzVi|8h%A@@ZRLZxw7* z*_Fy~icf#$_t;t1|3inQq^nleMlzSce>POU99Lkb(K=$#^O!!-MN^MDv8O%pImk{{ z#60Ukgm`a5I3R7zR}|&5;M`xqU|SZhxWu<}lFdPAH_YAK%ZXy&s59fwq5`M2eAm)N zy4A@S%2Iv#R|~ePV&KHA7*|ssO9xz>TsQ8D@S6IZ{nsLdJcdz<`Jpgv<#J?kr9im1 z45@k0Q(YF>E<r|OTyaiWQux5ICblyk(xk|m#Sfv*!W^kQ_#M^?f&iL8n*~_>X(4Y@ zuk<-KfV!Wj&10}+WQFRl<*!|0m<^Jr(2i1uZ;t5*p|QolTTK72v)yu(+cA`{p_q3J zRmB>`1<%vOE`>FkCx(O$w}Kva3Y>{Lwezj@Zus*SYIgjg+RT_;NZi<TW-R9q-Wf(Y zichR&5BBRtzuPcgyubM?Z{MS$gI8e_{jTJ{Qh5vMx5>4Ahi|YNf0KPui}Q@k@?4>} zUL1)?#!b`4KcA$7^lKGRxhQ*@Vy6e_a+l=RizCPXb5_hGv&3jX0|3wx0svtC&spJQ zt>@%oZ*S-LpXa7uqrLxhK7QBe1=N!hFC^!4oeh_lTrVAP$eKF3&N!}56?4Lg2q76p z>I2RtT(9iV0VEKRl3uyUB}$U$*Q;OheSnEnNtMIIdlGE2(=LMBp6gBB{x$cd)b-0$ z6SXXwdeUc5a};G^SFr%6*ukiQsu&KfIV4^gqAyp@iCPP%`AeC|g5JeI++cVVJ|zk# z%~N`B5KmEKQoP`Lg$r|-jM&hoDpi5lzKt=wV5-l+V9AY%@cM6b?#<s$Q5WleBu1S} z9LVV~aC0mW9!zrJo=0-`MVy=cGlZIPC(`il{rh|Ck(Ih3t8y<K=A>XOA&ImRD$HKw zG?<quzA^nH+tDN;A-xzc28UVWKCsf5Zpr@Eg25b8zqhckus<!+S(`7se*6i;Y|qa1 z+%>P9DF)!shWsunEeeIE5LdEzNu54@UuPf=I^mGXq@CP4JSoZ4jac)3NuOuSa!~D{ z)vzROJ;rX2X7Oyp(?<ANbh|WUnfLpzaT`{WK=Yr1Xv2z0?KBEFYs?G)mSY4F)SvGC z^*Q?%(%uBoep)7dQGeF;%<6du3;hob6L)~P?Ve8Wqf2IQd>A2+J_aCZb43ZGc~So$ z@@As~f<I%P|4v}c?BH)cp*Xoj^qNCo<mwE`bjYO3W&2e>2{y4~U{^4u@#7?vc5|KA zaMrJ9olYadtl%TUbH78Iqn01KWi7$coGLfI&&T`dWSmN#W{e-9C#hdpZ9yploaY!W zZBN!ryyX(A<~R=Ja7{piS>!{=)<~@4%_x=9dpMxmfERuOpa~ifQc4s}UZ*7-U(O?W z_`Tj+5kdZh)t)?Zzgy2$i6C5zyI&4e?wZOKYeuJ<CdV%E3^$MZo|S81U1Da<=>L0r zEyuhApN>?O_@sb1svxLUukoNBV)OtfJ4k2tYiE_#;Nf1{7^s^j$(wlFtP;Q_b}V>} z6r5_JOG4f5UW$V|5TGzA=3>xc28NP;yW3EGkL%3j$@I27vWW&*WW~;ys9>1CC0PYZ znoIazZPrtxA3glLj7mOgcCyp^>MFEah=NH_fRIN?bfVAqM4>2Ws)b;yYteKgMYVlk zm{LW6fqU*F0U4G?-J))gMs%2PD#d$GdmqdJUN3q|I_qgIl^*3Ry(%@phLAdc;TS`M zK_rOWon%#)$^g-T2~vm$Je-~q@>lyzF>tpD8kme_=P3*B?=VIm(mz#eU|yj-=miuH z4`$Nkh%v-BuxDCScUhdU-33x`jmm@~M^JJi%An~Lqcx_h!Ds(u9#238P8>Z^#`ZSz z&qh3GH@;op+r|vYF~7rTuzxSob1Bp0#_#XXUmK~1$Io~bBm^|o1vUx<(Mbw}0H|01 z1c4O*#6h~t((!b_p{AGsgdreMDzFNHSW=*1bA3<^(6bRBQb&D3RtSrw%j}mduuF>_ z)1ZKLF9x5#5R)UOJd(9fconM9gAbq3^pf-P88jG`XDh{c;ZXYmuM@02+X03>DOrKp zc>eaF_pH<osPw>tfb`JsSLDtxY2HRDCm+TbaJsW<?bhL!SDSH*c~$)?ZF+g98Km<{ z$Q>B@W;xOb!?BA90I1(LsbsgvSNrlbgflJ@klf^AmJ;;?5G7+c*Er*>z7?rdqojIY zrs{xGq5IJDZHuUBC9p9zP{8OjpO&TnSCvLAcoCHJ;_3Zx_7V<NE4?vE*!kxQ1lnW> z7-TO7zk#Mv%Gm+e$PAVS)?XV1K|+#zq6sv@c@KH3avUm=pMZc4Dg=OP42>ano7|E5 z<_JM}`IeolD7Tn`=n$nd->?6V|LgQDd#l@uTI%8jhlCs(6d<FEiqPNVwrb)IP_baZ z#%hv|kf006xi?r&!2x8XegozlDG)RYfHcICuO0@L4YmtHb{QLaar8}rG?g)e$b*rY zvZqAP17rz-Q+av4tnRuet1IoRwF;bmz~i(@9AHZ}A_e|L_M5rTUHWx-qohzNa40@< zqc+LP$Lt1p?U7?Vifm}6u>B4o(!>p*F3dCw0bnR=Yz3NwPO8>n_GNXJe|r3Gd0?Iv zgQlG=G|@5IW56Czm}HHG%VRxomnte520{88#B**e!5G1?eI~ZH{ul(vpxfb^9=jWe z9z)rPeRW;bnBg!eY)Qg+SD;SvbJUWwjos?!IBQhaW)*xYS9B>Fn=AUVOYo!^>R%D_ zaSdaw2(X-e^n(HxPUr%IY?36M=>>8SuWjqk82MCO85dK9+xi`JEL<6`RNK4{csgp0 zUlp8W_<Y{0)eH0FIPcc3AsM8i%5l_cjh7N@4O%J!@T}^fbtPUFK+K&;V+AI??m6Fn z4W3_|`d{x4E+~gx;g%H`R40u-aLr15c&uL=$f7Z>E&LNCE5mcC_`%Rxj{<Do1#S_! zab-4L4ApHA-G(N?tjA@XA~>Vm&Egb16kk7tU&v3W=~j?=)o+HOd?c`K2x;PyWhnJi zwhloCR<Z6nVMGd(hYD4-?XX8G@wj_mK^JK++kq~0^gKNT9db4&f_N9C#%B~{rw3I` z(pupfJvfD}>JAzPswZT{7}*=kTme&d2_%jt=1yy9`j}?s%mMK&-`jD)iVJX)1Rv`q zT>T%Mz3KbC;2W<Xwr-O}g%=boW|bNvRjq=RUiWo5kItd3T=ALL6PIH~okoNAamTc& z-?Z}v)1|QUda6Ch-SkgIl}D-+9d7M958~D<5_|HyQ>baUR2W_QP9ZW--IaTiUh6eB zmxfrUcy^frdvT<BLu$GM`JF~`-t$0!AoNN5b0kkIM*F+QM!kuE!UV*K?mMQ~$Vveu z&)2i;Fa|~1Ot`k09EPWkbzSG<hvYUI>eByU!JY*IxLnD3V=1m>aJ9zdM-DWa=l<#J zu6mIKv|^o{oXnCRX5)U{?PE5{o2ho;)8{NWd2Szoe96}D7X4|wN^853sg}AlfpF8w zlK)ht04YCpi(`%%WMfa5j7~OZ`%^Th;GiY3&KGXA5z@}f^h&C2_K%;$HoSbh<jgh# zccUdkP!Cr8rYgv^+EDJIY*`@6^%A<?V^*rukRHG}rWORQ3&2(N2u#rWb>y*g{h#$_ z2-B84ez7$i?S$w`>3)y`ps#badOF9e*z4?=R{8v#sC@=~YxIkBAJ?yYGB-^;K7`Pb z7j!0m-qH8<O_&4pC{)Orq>3EZhc?h3MZMj?%8SmA!|V6lo1IOa-lq8R9+pRzIfJE~ zd?)ajTs#)6vkuvX@XM9(&XMhIr)@9&iqz!s!;Wz8*Nh%tcyf=oi!DH>d6v|Sm(LY6 zz&KI{iI!QZKTfw%1gZksKbS%&gXqYa9ftc__FjudA7fA(O>7v2gf@8n2mV@1I*IbZ z-KD7-pgQjRL*~`3z2@dGeSF;y;i|1djH0UcZANb0pP04sBsTb%SNViQA{>YCZ%WKI z^+j9Si4yiz!B_HWn&znyw_3ZVJ;~+W$f-eI4c^l&Tz6N-JGAlPu95(=9372+dQ(;# zS^m|fq9@%V=lsLNtV^pBH3*2=#vAt1b^f%P#3Ckp4Jx<G>U~_^e{rU#;F#-4>>BV9 zGHt?xRjyZ}e@s*ksi;NopuuS+6+&OT{)<`HjDT>UL*-0|P^7Pgt=_uYxE14upJI?} z<srKz_u|gzyE%y9D{VRKKaXuPyhRBG8ls}j($#^3m($hR-Tkt-jYFI4!{F4j{gO5^ zc(X|~){)0269(<*BH2~BNBjVR3n#1n!BhmRnpX4xb+x@s3`q(Yt&o4BszEC&KCryv zmcJ&mmknuJmVNb(iiSY;ZAn_+T9zYu8M~dk3H+_;6!8Gmw>(FWHNtXuW`hHI&G3Hi zM}5i<_l^GF*j=9tGMD(b)8+EF)8&71H(YEjjO>g}^jw@RtpB4$%2tw%&1696exMc` zCyXO2>#kOf^fXUsL2t3_EG3DefQe|<C-yRL_<F((dRw)IQ{e=_o8{^Cu%nrfvIx|S zR5nQ?O>!@QO-En+vV82)u0(=S)QMLNfxHtcBXu6%-}l%?>9O|fYb{_?z-EavsBquW z2aDxzo#dt;^oDp>5h~r?2KE(!8-TE&h_~phuS+AmV`S`BKE1yzOb5y3DZr5`o-9J} zo68m5c(MkBbygC5H=$@YP-o4ZyB}-IEAjSVhput@M*PM?J<?L{DpE(}X$i-!PR3JW z0@H_zCn8@c6Net}&|Gu;L!gDky-s{ZmMHnKC81;m!bLhnA6)qQmlnhd+D50vT(L0B z9QXv;PI~x}N+yEWvJKiJxN%{&Wb|7vNb{a8E;FrOgUFVEhp1f_V)9yoAE3CueEDBd z#1u&7tWlFAKonoT=n)h&^&y3a{@uhYwPyC4Hs9*&dI{?`LnUDe38Y5hLr82y_E{)P zYeQWTm(@rj*C{m#r368(iImWI5kR#i*zov9yi1kVrEQnzwpt;noxLkSd_u~7Y1q@s zsne&=V1*^jm5MR*r=I6?QxNaf!=N|T41bG=+e>B8U%caQ+jjo2FgL*1rjr`RyMII7 z0Uk%5Ga+m!=$n68YoJ)k(skZwjbbo{%zk`2X*kPIP*Na^$^8T%I@YMKAU4o!UsyF$ z_u_}EKH&xZ29Xn?`iFji{(Emp)XNx}{9?Sg-|;_fFRmtzP8N2yzq`sNS{llq0Y>D7 zQ`BwgFF1m>XN*5qQJJiyB7bXZIClRU55~64DpFK?(-cKfmI(<cL%XIuX*hQTSWI}$ zhvu|QsFFe=gE6(#Q8Ep=k?zvUG&cyBxYY4Gc=0RuGbdeq?CBoZe}7kF3iCl3Bmh7T zJ^%pne`8QLa}yKm|BykLUv?WKPi|kR;3k0MDSSm+U@#j0rlgam%nz_^;taLeLW$(j zj3SM1Vp@(2em=In+(u)Gi#xLYIsV=G`1LM2wtrfXi<GBXW|pL6(5Frg8&Y5JPC^%J z=_ExS=&4@b@phtdSxhL~S+(n}GS|yTE%;D2#dXw3AHkhpmzS$J>=b#Pz!llc!;3c3 zO4XkV*wr9YDsN55IKN7rwlFqH4j{%M*GU#5jaSE2lu-k(95^_@@2hl4HfBC{l+{SK z!m&$Nc2G4m(cp<F7JE6s;6K`PsQLYL!!Jb;W$=4{iD&CpLS|QO-z-v{?EeZmDr~M4 zu1Qwmliu5Di&mqgDu)f@NxbqGt7MX;kXj7i=lqM&_`htrzv<d}{8~eqDdS9m*<jFN z_>gekZf=j3qQsVSMN1^J?Os#q3z>PEpWlv+W_sN*5ydbTGG(=r+IeGj7ydZeKVL!? zWfuJG0|m;3t3Sr?Tutl*Ak-s@-@;$uf4_glUWDH$WnZB|qkN85KB!%Qe0zI+yJl-^ z>vn;w1QNWq&E4N-F(eM9kx35dAKnt|w*wSP98iJsp&AIyN+Qt?`H*2v(?NL9n$Y6% zMhi3)iem`_h8ILtX5|Ti<22?lgoBUF4yQDuj{GSzPB{#T)~I3O6A4A^>#no|Mb_^O z+7_$>6rv;fFh=BK)M=DQJ5!n>z*DD_$_HKK?w`vOax@M*+@&rm67ewfCdf7l)ew%Y zDkE5W)zNfC(h$5YT!+Q+p8*IYX+t5kSdDk)z=dMkBwC6Qm5-5_uok#+(oyEEw_yPS z#U;-ZyIPfE69m+^Xe(ed-l#W6&B}L1x~dexOHrs5`qQl6q#QMuP7zr!I+^|B+0L6} zI9Z|T#<7oAq!@lA8IVhU$!hFTV&$Rl0ZS($GaxYRnD6|j7;AwpN04<nz){*^ajd0) zUfJ9lhk*q$cQ=Q{rnG~ilj6hdsW!ymy#mEziS4sh%ov7n=kQ6V*^^$2kpVJ^%^cg< zAI^^v#T|ZiMjr7HUqx7K`r^&dfMnZHObzt75$UJ}-J~x(5}u=(J}3WSiA)6q*VVjR zqpupQQQ@+oW@t5?i8e_ef1v?Y*<v8C%r-yj@DdKxSmKh?iwgL;DYbl7HZHl-2w|Ex zX5fp=wAEZ8Ay99!!{(l7(O@Xw;8NujoRbBny0{sbNW43_j(9#35Gg7BhT--W7y2U- z-o!#_XiDXE3>J#WEED)2WgYn0>JnuGI187?Qz1YYSyC%OH97I=meYO(B{VJ=PxwA1 zj)VhNpCkt~t3r<gB%9P&CG6uwIVv5BirxXoTn)IXTgdkOWL0vUU`OM`Wd41208+z| zB?Fj!R!+x@!6A0luP84x4eQW}3b+WzgJ$6OZcB{zXKK5s7zvovp(;<|`LWSk%qOWA ztas9I(XbfP%bbI|DmodQ96@=+={OlWjS<u;UnN{42r4>jSat4t@f?96O>o$}4W=;v z$G!B=P>(U7FRZ5vBK)WdR<ZRIKg^RakR+%|g14G<ReMrm)%F6W_#tz~V4ZYe$Ol4R zy>nWGSN#qIkmssnk<j1KNq#N3`48LEqh}fx5Hg!V7aF+5umOc2jO#-vBASOps=vA8 zbLSAE+Gom^!d7T5cs~25lF+!p2}eufX?jqpHcP26R*Lp^6>oEw%CA;wu_=Sf)dB$x zGK$Imz14c)Hi+`0MsUZqf(=!Qpss_?0)n!YxGGdq7M<R=ekjwK185;N1mY401{bMn z{t`TIB?*5};5rtGQSSp&i8fftvtn~A8cY8lw$33+5MaroW!tuG+qP}nwr$(CyKGl= z*|u%`KC_znXL6Cd%uQ@wX1ur$%6no-l@a^Ih^0(0O%F4|agxV|cb;dt(s1M+F*A1f ztl$smXnwL;3)G7JZl11A?>k?E*tu-xGU|AZ<zK-tg1_CST$zV)t*esByfWJ*0zj-< zXbdMfq#+7?A8j4C=uyKqQ36Ab*|7q}v-<siy2b^<b#q_!e*0XoLjq}Ca53$h&WAjw zF2z&~^*yf=HWk?=V*`6^%QAhVC!(DtfSrw?Y@uFjxX=yfFRs_~fi8p_Ub3>b1#znp zT)6u!Y16-=et?sna6jZEw!rQMJU1yJjbdEjEbO3*1Wo;0k=JJ`nmT$zuK!f?ZXNC! zs2ySlJ51w0f@B=5uY&_4!i)+@Ur-kuxXvQZ>{0)~OurZ%-}~(k`Of4YAH1v!^!<g1 zQe9~L3Wanzh~3k`bz2DnOpTh97%nVaebp+P=QOkq?F9<MTw2<%>Fq1j^d*zVK@h26 z7%srd3juk}x-!faH?!WLU&({>&^ep`77r(kn^I9)(d5F7l{>wKSd#3;a_$21-0ke( zqkZ^?Brof%VXZ;6o+eoHu!I-c$JRhPf_;NOIHtqv7w$#pQV{U?L)+9wqP}r4%%*TQ z{Swg}&!xiEgAc3V+9P?KzurVs_2MUKd?x66h~-FLz93UBm~WucW#Se7szvzq7=@PO zK+Na?JSK8WtBOd28nICxd|mod2Lo=4HJp<9ua}0bl{T8R1vqHHIc|WY$w?(}#7}(l z^ugIIVlK5cm&}}lxW7eXEglLH>BNIlx@aT)mT@I8wCW7PCnh#K3hLn-a24Z*JMS+} z-P$m85E-@+{GQJ2+x8sG=+W-y|MT(n-Pu=w8{GG?G6Q@sGf;fFFl=_dck}et8$?~N z^;eIlwaR=f)t{lq1aoZE>dO^|ue$$<X;nWUH;5%}oqNAz#|IABoOCxO13#X*ZZZ1O zo3|MnA5+cm`fjQG!Kt(4Q_gA=Ez@g6u3zqWg-%`eJRB^X3x^Y5ePS$F+dZWM<|1Eh z5t<Jgz^##BprZNX)s;`M-h`7G|B&4|*UbtiFLm-`#YH)PU*;fq1pZ|b7P_#Lp1T&z zFRuX~ge%t;E^D;A;}TgT(4f;Iga+OQyihah9O@(FxORBTHnA#r(;=fd`g7;Xz%fHl zH0W6JW`A}Qr^!G}&N{B`U(5pXtoLdqCUzBbE2{WPam%SxF8BjP*&-KH^sV<3%g2+G z5C84nU)9i_XLk2DtdkqZjIk>bP5crWzF4*{FL>Y$SVAxN2EhLQz<60|QB9jOL^EI? z9GT`k<86A18@lgd5)UFt-Xi7896HZF)BQ_MIYxQ3V8OsVqbwy~p<~L)Eg*@_U6`}R zP<ypdzfWfLszr>oRTNO=D@t$x+0j0JT-sZGfU7+?_pCt)X#00xqcm`gm2W73Qj!eZ zdY)=6nJ%O3&*xD`9;H;TY;J*seL4=So7phfa!A6QUs4vWum6fceV@94b@?}DG5PO7 zgZp2??q7PKy}R@OYB0De$=d&Gv-X^-d+1moTD>Qb!9rRR2nY)?03wemX}OEENTzoH z|9mf`*%4^aH5R|-<>Nk*q(%|M`bL#VVbDJY%u-s7YD6I7bV3{}dMgc^Q%{N*ykcbh z%ht#%p37orwDGtQ_Eko@Af@4lqErSl;$IKtWAS;e%$~QviSt|v?nD`{bMQn|{(A0m zGBlkNej>svPW@=<d#hNs8tD-N+AxNLQVftUd7~o+u|yizBtQ+(F%(eB#Z_w{lOk&% zm-4Qwo`8pYz*a?>Dn=e3{+?7oP8a%foqj4;zJ1+AYMYI{CX{3ugbTDEnS;%qr#`#z zSmVVhH`byI;`---o3RWmRUX#&O*qW)3P%Al<`3>ET$g9fUWO+c6uXisgZFOD%GAmB zr$w_y+)tu%nK!Uk0h<nuSvsJcxv_nN9)0;x{PUW3cAVH@r(ug+EnKzV@{#++2tFJB z<F(aLNJ)-=s}$d=#yVp*o0=5Wlo|j3)#3jt1n{p?|FiJ^?arnyt`08t_BPJ+`fjHG z>g7bQ|1b5?(nVkYpCkwVufDDsd`P425&(dE6fnR)A^-oKcJOpC{P)hVGyiw|%GcI= zldb9Ol~4W`xO%IuB1Fli{JPC9M|aFoYnO|j-K~B5(BpX?$+kI7BDLhoL;2Re?-2|E zKv2?cf!F({whLRDgaH67c));x{x!&wFHb(nz>POLnrUVhtoc%&zZ3iy+U;T8H8C$& zU6A7f6x-T5{sY_kQXhQa(t{5Y4tyZ`ulr+*M9JG_Nk*Az=80xP+JL7L3Hj=PCZf42 zQ(Vv@kz~*p3r6nPh$a%KD&FwAD}!_t64ep8YL3}F7f@6%VoOYDwR3>VN%^v>4vB&v z&ai1_`~rpm*r5+gKA9$}`r45tm*gZt&1@sL;HdzWtJl&JM<lsm7GOV#LVZwm3)kGK zssf3rY6&q2vS8s~6TY;(3Z!J0EGce?zyu|tEl)_{fgQ1ku_u&YGM3);FO#ISQ^X+5 z^0oen?x0grK73M4wGcqw>F5F(GGvgXK>&++SNuvCmJkKAh+QcLv0DAyQ)O?7fVxG` zM8TnnjL}@+kBYzgNs6Qa4WpKPnMdjjG8P=z<s2<e%481+J7eVUrb5KVP~#6!UNb!d zl9|iNwDpsZ7-5b=XXYeA=m5u!j2%GUN@@Z~l+$B0^cA}9^T5mTx9-8g>T~e^8-C5$ zSGXYcyWJm~JI&kXg65w9e(ptk<vl~U`rjTH0+H;S^zgrU-ClS$eP7;pLpxLEA@AGy z`hDxX91wavkS}`OJG+~{XrSKo?l1m6ZLbf1_9#_+-!B-}cD)<jAspcK6|;eC?a?oI z#VP3BcCUQk<=gUau5WRFc%kxcaeGA?<^XTp?z}!{_IGCEKR4}zR{489zb_2Xx$a>I z`nJ5^zhGHfK8;?F3FDwP!o~(}cK6&J?!I4s_*gr>iD3?5pPf#ZFZ=q|KW{#V_CD1= z=iK)97j@5eUlzZ0?XHh^EiG^CZ+jww%s1)V`Zi0W>H+4lsVIHF&Odd%KxFNPe%;_+ z^?F3UuDZQE-@yEk{NVI^IG0-eH@MeggZ`y@gGc0?+Up5IN9a~OMePYJr~iS0V2t+_ zC-90ZK!H0Q3*PP$pL1(}1>6E$VJA-^e_xaj6V@0TGHgKY{(ef9D}OvE&qAhLS%P;X zYq$vvNcbv)teJ3}sQzG?$)HGfpMY3VFQ@|A&6L~!EYG*`orZtGNEa`Tr*wm}=#h$o z!2qqv^<blZ@NkL4#YKhW30ZJezgN$cGgnZ5Mm0NX!kJg9h{`}GrAd~2xY>8*!Lp1% zq$8mL-2z{gOU#)ecLWSD@1Jy#1xnc?-_v#FFW%$I_y3sSnCoiDKt6#>CZQ`>y!)i0 zs1Ho;1@2W~(2^xF@?Pw~$~_b=M$N#y3X6rx=qKuv8RO9H=a7%;AkgDW;;flHgyI(N z5#ItRsLCLA=UVLmNYexu%F-bQ_w<Ej&VxmG-6fwsIsm{LXo3LTln<JH?H3DN{Z2to zzBkV$2$4I4a|XkPH`MNciE+U4`IwmfoIPa9o6fA|j|>{S_lN<OP9o2DwKLe{$ShB$ z%9txC*6{u16~NmSxijStwTvTYpU!>VwKqS^Cdee|z)l6=-tyn|o%j91`c%DocpPwm zfQ1Q{w+q6_FxL@$oehwa((N0iX0TbKZ(_zExAT6ax&=<7OD>Y~V6OOMpmu3%M-&J2 zmV?&7yd(nU0@jVD2+ZxslbJhKO64hEOBCuUpj?wUYI=rVqfmqI^sIMBa3+HLw(9$) zDIUl-1{r8IJAF5W34;I<?d-RF&JXA&cMW5~1rGuE)wQ}fB}az)a<q=)Zs1H_EpFe6 z{*(_QuIsfF8)O&qJCFVKp!upXU`7=@67sfW6p9cl1edT=?<~NJ5<PZ50m5dnBN_<P zh+}hH?wgS$nX?ZQOd@K6Z*tE<Y06xWPKN;bwBJt0d;3#dO<9anp?BR!PUV%H@+hea zbbTkLM}lheC;-dyS4ko{D{x?});<71yuV2<pkIu*#2ck90y9OzjG$X(-cTcg1Y>}R ztPR;b-;c;wU_Sy343#?3{vwW@<A@UmNwkG2pA4#&AwOWKk^z+D<-#j1PQauCjxO0< z<MV=NBB+|ElvIcGmP+piREoOae@_q**<Z*qWOC>!r5S?+2?b0vK{3QRHHZaCep08a z*g{!?IcZlA0aS)hFhD-pisekvyKmNcIIc$iX7Gswv$%nIvV0g20W{z5L03sJAHFJM z#rAhm{^RC!QT`__jnbKK1V4A88xhYq8888xfvU<KDLryVr`%H$l(U=qLK8tKgy<j9 zzd*JmNAS*gLcsu8jR(9v;7B({8#&VK^c}Tj?5r;HIRq2o7J8+OfTWTW<<%d&3lc#3 zTjS#}VB}DcCx~bO^)B^CGZ7e=t&o|y&cYHw*h~NfOmVR17#BVL9Oez<dQ6t!^Y)jT z@<Dwhx?4hpUEeg)%fJl*orc+UZ&}^~Il%Sv4HWLjQ!6Ev=TrRkzWN|?2cygXf^R1j zchlg5^wx6``KXf!AVU|pE@KD=jl$<}%3Ux|lKg2sd>xWrU`-NQ56PHkoWS#Jf8DxI zhN>_>UEw=S0O%C|F$zSEn>*B4cN;z7%y986KH;z20<=g!M`5x8(+>DefdbgKx2sh^ z@htEl0u~))fC;>Unf&5Og7o%XgT?t|P7+T96Va8gM)uM0?5Kfp!ww@Je%WG({=oSY zK_;k+jIQ?P*FpB)*bpui)E^3%aOuDAs&MrKhnlRox!<mFJf;djY~qkL0nH`}q|3-w zdT#Q1`1yW9Prj+c=%P+lZfajpTaQrr=TIJARo43HAKW-jOlJ69Ub=M>VJ$dD2P9Za zCP@gyb@?+E(98UR@Nr4W9xjUfoq2@E3jSjPY^Vj2t{UH?_o^e$WrS=n)y`YnDiiFV zoP#nuu}PY!SAU1Li^idw;nW#LU@J|5`pVnZ#KlC7|1mvGN~&%NlQ{$poir!V2?hiQ z&<SuBuUcM|+4~sZn(?o!V%u4_`iskFtBqiQuHG=ODkbQI4_|}wRvlQca;OhZx{+*Z z)}ZkD%^Wp|=nWMQ6K=ktA>9?!?wT<6*m6Py!Pzu6Hnw>ApiBh8@`D>5J>S_bLGr;1 z8-0k~XI_Hv>K)b|EgkWEKP1sTXrRQbrrroUM`!wdNd7?Z2H_U_WU6~(ejCk3={r)q zp<^<9=gwAL(&039%}JWbjLO&Fzdv>dfJ*N5O~F6r`Y`1q)!aHf4$zB%zW~13mGv#0 z%<`8A1N82o-px$q_&u&#aTl{avkmc+t=2ao`sd$Q#`mIw#C5zWW4zJH5_FHIKdESZ z+JP;=te%d|1Z4qUiq9QV<zbMjN;iq0If1({*aWG3Lh-%vlb|;0ME33WL!z6#Grh+h zoBhdTpU`}Oi^kO{X%<eJ?5rY4^S4;Sn>Jta{PN4tC&~P2A`U0&N6zW$;x9ZSKls-8 zM$LFr6|QOby@1EnYkE)7+Dn%CzP?OOx#(APGEYjMF!Ukg*Pls}@r#A4x|D1hdcfx$ z&qQ%Bk2VwsDim{*^^5-8ehsI8ac54Dt9xI^K`q@BMSQ$np9baP%Up{H1KV2%yh=Sa zV{}d~18?|;5M5~hqQV9wMSQVHfTWKq@XqTtMgf?AwBlj}_(9SiwbLhS8Yg@9%E-6` z^f%!Y%pOIDj6-!0l|8u4pUH3Fa)7i^=YALA_tYgxx8$Qwbi#(8Sspz_Ri(+6C!0%3 zeqVo)P^`|<Oj16ZvcV>${Fzk31i&Lb6hT9@tr_3K#BKIuQ!-&F<{cgxt%v(YpFokr zWzi)44MX0iXf(qCm@-~ka;QW)vD9bK&Xe6TRYh}j8>PQ|26B+{9!MY&ux=3><dGJC z=cqKCF=rzzVCbxka|A&(=>(B{I0tES5>iXdEA7vQ+n)!ONgl|fB+E1_Kj+?aU}Rqp z)oNs9gvej=0Le~EI*CSo0b)}UYoJ9na^xx=;!`12ZuRY#Q=Adxfphd$+Jtr?yv4QU z3wo&k<?{hCy^<2Q9vfIeo5Vl23?MZD#_3)A@$7hgNT7x(yZ^)VU2gO1(QWi~uvxWN z9x?j}l-J(}WDG~Iib(2M02LX(;E^z>7}$c3ZeF7;rMM_e&c+!rcZ@I#RjV=K4H125 zhi)!kN@kaO?1KfGOcE^+LVuP9x*{GV9w;$;8$#@nyQj(bN9=fxB&eB5B~TGbFIh6P z<scA5#z!;-d~WwII_n@~L=Vdy1OI!ec?2@SKlH<cCO>H?6cQ&LDwkH(0*_O_jgUAI z#!tLVF~NQbB+hI-I6>q<BG8K>om#MX2m}U&%VdGvp$k!Xk;cHr%$Yul8^W?AT1l0x zCL)xCsbG0gyy(oJ7a3(e3qv0$<NzHa5v$bL*%8Vt8fu?#);lc*4A?+&U})9{_`D&M za`eJaL>H1IGZ_=)?-H_&&VDZ?CezIIL@TBQ4SFd|S6(qd8_SByfF^W;A0DwVZNh~L zVhI^KMO>oF7&*bIeu5sWXL=J##5S&ncQrwlE*fPECx2|<6_6oRQsK84ut3ZTij(94 zxVa=La^VSKh@$JREO~`q0CCp5NxQjlEi`~blG0$&XSuii7<{iSeblK{@OoIXhZj>^ zuod%JuP^s482p~aH(f|5idw&a92?u`<ya5i7w?T{qL~1gSYB#HJ(?{=%Gq{Y=TR~U zy+LC@j$a6>AI2f)iM!JS23+aLzCs*-!?gT8Lwxu*oCBqa(qJ)5^g$kSu+WbPOQ?Hj ze@+6sE7-A3l3HOWLe|mF*)~9&aX*g`0icRhnAk4Sg;M=$foRY5`x(OQfr5A5n*9E- zQ<@14H_jj<c02JKa@Z=1M^_tx9A@2X#fUsVp&n#1x6Gs>jOacHUiAQ={90-GKz`Al zBMMJs5ZpzT<h?|CMUiiR<Zu-5-xvncVdZX=vMEN5Gmb)`J!7-{=Ry|^J$d;DNI9cd zd3ikd9k)MDqtmhKhOhG5;K#u??YbvxEV1(v4r-wNTM8SH2by{poEMmnakU}<aMa(- zxuIswiGSlb8#zcU(#6PhPrXzG3#LB$g*aT)YT(^d>PSpRYx-v;0-w&wX-1T(wS$HQ zb>bFWAjYCf1PCG0DxQJn!k!Km<rUmg`0PM)Tc2aa^?lx#^ZS0l66k@L`-<%0gJxeA zbIt$E9VR1AyNP3+Drr020+rqYBFsxh263-~GZKB76^FZ<OFa#PaR=)^ut1B4tRot! za8*U`!!Zp~dmNh90^Kf0SmhB3f6ovIFOZR6fL`ubxawqGwCMLMg1Sm}=~S|_G64&w zg<@mX*eyBRf~iLq9>fNJCU<wyy8~E&E1nF9CQV!HDjB%E=dhPkx&cUjvCv5l06wXg zX-NxLLxc3UV8ID@g+&JabCn8G;M>*)b|~lB7OD{!MRR>%WspRuf+?WQ!~JS;v#5+j z<JTNC;n#%Jw^uOEO<_uhp5)m>=-_eO*>hw3LG&}u8!3c{o23Nu2CB7+g&z#tk^GTL zo?g8GW3v1{$AlB_@G_4iKEm{vJiG7)dJJ}UqkVmHQ4Z9)d3x&V1rt9a?kn+~SkM58 zE25r#BPzxpPWR-Z14hvR2+Fbs@Jk!%$A}n|BX?M$4a7h3_`}CvsruGS2Q3_!7}{*o zzZOUzLhuI7QPhVP=ACxNonl*7)|t`93ocFCfVJ~=5#6+Rl=Zajae1sD%)htD?86AE z;1kh(NJ6>vt=Xe+Z#EsuG)WE@fq33#2O6UF>;m#C%C@crF`VcoEQpXZ$i*`*H&1l& zaH&8)J+1+Hg2z``2m}qo%^=o2c39}<WxKckU29N{M}Kt-g@A3{7olv>*#?88lnqy# z%9^X`oAAP&pDu{;2&;AXjsdcR@TcYd9fNj>?5;h0W3Aoo@(q&pH*)Lekz^dcFfVVN zvYSqSiJH%IPrG=7g^uo}X}!D35$*3#35SCC^=$GSp8Hm4OLTh=apzmTWE_Oj4PgQl zK+{#I4`O)1^&)X1BNasq_YYQH4&jt0lMpv6n#M+)!`hp|><^UbthV4*TIi@>gWWCD z=o>B)W0nGuU_~CTEtV{f_{_R1zZrKTn6HUIV6tRAV`9}F03tUuEfGe!1Tf14UKfg4 z*j5Bu0uq)WQcx7(#Ei;ns+yH#DP=bX5ww4$d%{Kccs&yv&K_{A=l3|8f{(SVtuOUy z4yxx9IMXTo;UxZa9BSQ}o4@n^->54u1(oZ4Nc8%cAvn7SbIHHwnqpiO&u&>`ROZIw zi8IH(B%^~Tn~%I`XuX)-edjO|CBsD>K3;O~^48Hs3m8i`+#3C;nuSX3)-N4porhe^ zW3IqOR&Lvc46a2C6idCrnlfb`16$-9B%QqX3)WeMThQRfC?^>nj%LX<dBQCBGpFls z+6IpAH7y{IE?lys7K99)dP}yaQshrDBWG{)9%U%N0P+*qEh*JY6e$=SohN{WJqa#8 zzr5GB;PcikMHn#8bL8v}M^~#S^1J}da*Dn*XtZ8FB~-(Xt4>9XW*qNvMl8z_%?5e< zx*T@s=ppuv_A(8!N<q0K^Spy5z^bo5q~Q7N6E>=1Ag&g{L4+kHseFhSzS`A7ROma8 zlCtLWfOisCJ$RS_HTD|&wgWwuHcq2OK~%o2zKMcfQb)Ho5%7;jlBr0yNKbH<FJ}aX z&ZScxO!e2xx+0X+@P{a4+KpJ9tdqkvXxeWJ8jXsK=qw4xRIpct7gzn~wxu3LPaG%7 zIKs5RTbZ+xoikErmNr(*o@&o9*yS>$Z36HpX7@i}^KJ0q<9WQ~Ew{pwMEKo&f~kR3 zYc!O|J@Vy$v8;Ncv~SgW%s;@Y18rwm;ed`xERdaoiy|!VIVMk&8HvE)96{+6G|WP+ z^bSY8zu4?5?x~tQx7eg{4oXq+9CNkWlLNI8n=yU#iry~mSLewy-S<2gUoW0e+W5sg zO<>c-xV7WWuwwz$9x-vd&r6-{WbTcmtjhBmDFDRJ8^!nR5Zmr-E3E5qv111*OlW4v zW@fQk3lo~1A&hWbESNY7TH(U)8)=LhC5Z8H7@^_I?np#yZ&@PO--BTlQekT`nhW#l zZ;bL|l_kw_Zo2bHG$|Uq*?Egm64+7)rl#CAl%)18RP5tc;_a=n<%-MFzG9++$3$&e zz_C%aG3gp>7s=V<OG-l$X@v)ySPG?<;7dz@d9HNG86yk`_}uZ`V0|M$JrP;}GlC=> ze*_Um?_I}I25&$o>K{=uBDNl6Wq-`!qyV^rJrwxcKh3%e$Y!!jyaNeCtRgwuAXM!x zr(J{QG*_ojF{P7qe^0XQ@#^e(d|K?<L!lvR^MnYF7j2-^GpoT63Q^_uzsUz}I$SaU z^ah(&nGwbMxg@HD#(LxqY5M>sZGD$XZCtgXVL&WjxGP27QB<bYNoMXqS{f3pjQK(z z4Z?HKyl9I&4B}E~9}t&4_J0w6HFxLr@oU}Vx8Db&y(@-YvFK6JI>yC{0gM870M9;j zfuS{y8W`-ocr^Nj<_;qXOF_}F?3mm55cZ$V?ku)_M0$dT#=_na(4l#NE8vEXc>zTr z*O0_~`kVqQ&{Wy+^p34{4(z%@fl2g7JcM>@b(eZ$(G(D=B(z=hl!iCL3`PbX4qVw8 zK31HiVdtNrUll0q4t4F#QXO}{^Ie)9v}we_^x7}#=^iXERW<H)5iu~FBjzavFQgdv zpSr=r#?(P;Ne%e(<n@zc-_de<zfCPlJZe>Mv`Gw72toF8!G2n$3sNQ|Y&x|D;;9sO zIk1;~Q=)#mO01sB!^n5z*l;^4?w^I)>b=#if;IBKt~zH}miqM=p5qV+sD&75_= zkhQSUV1iW-NOj>BBEc<j@a@<fB1J8dHn>$6hyUf-gsH8f%|N0>8KB=4N>QY^4wan4 z-B7OPRKInpzy#R!X!Znv^RYD+RV$Q|VCvFq0lkfJugtTL)I^HN6h7v&eIiv|M3T47 z+n^~-RBXn^#d-G%en3`+T~-I<8^1ii8q<5|dD0qu&15$zYJ;QTJ@d5ZMuMCHeB%u2 zwX8f2Srfi!vzp@aEggg&%32q*E{PsBlz7XQT3C-=^0g8Kx)$xjPq1ni6Jqb%dwZx9 z)>F?#?6`lMORbkKfM$Cqh`IDfNX3ZFdr6x)llY?84q&qt+9K+-?PF>eBOV#gk1P6r zcLYwPc_Lw;1>%6FQ!o;hcd&dYu_NI8akr+sp)1;R8qwYCzc5`A>ZkL{#nZ*9o+A8) ziCr6vj$li~!wZk2+txMk18SwC73ut36*ZA@@+P-%szgrTVMCk!&>dZ9o254t{0v_Y zbMoj(s2=cEJ|Tpsb;Y+-0??YN@Ag^{waC>gZrw!N=nlO}yK$hlSZW`>5+Z3V$_LI1 zmHdsJq1*6QhA}?a_OuM;gIn2Pi`^SQd)-w=El1TRyMtfxwxc&p0%r5UZ~ob7TwA6W zWik5f_&gVY3SV-V>)A@w0&c{H!M@HbyFFoECZf#yo3rJh(?(68POwh`zM_KiFEf}e za~L495XP571fcIOGQn#lNSX#rhlHfnIV2nk>MXz=TQF&+oI;kY@NcB()-J^;bd4+E zdhNhE<I-+ENT0?^{7k9MVljiXckZ~Tv1Nl)KG{oAq!KoqOl#r9a{KhPby#)o(Yr`B zziMp)8}3(MAC&}v=gVBl_{5M5U}K!Ss**=na6I~}xMp*m#=8abj6W@c#uZT~9j}(H zM(wGiq+1OeRdGRam229~R#Z-BD(NVN*s3iA+n-?|pZtZo7;*rK+7=`$uZlkhJ)_Ha zo}g{P;kcv;WM0sldsS^y;C>AN3&B)2uE6}ca;LFM)J#egHsDq@`!$1w@FKJ#&%(!h zTmtpi6RvYCizD$mg0`6u-OA2D7M8&w!pnHy9hYYxOC+1t^p<Od)UkTN%lL7Jv7o|q ze)K%_HczjkuGWVgMp_&Zn{D`|&&yG9ZNasoE~iE=?S9aYblVKt3uQv2`b@AqQwpvf zsope~O<761t&0oX>B9SCcw*SeT7dW8ClU&d6Ujf^F_I)$(TPJZ3qqU#j|3x&aC7>; zeM;`cM$ll4Po)|DIKo6D)MhMY4R-Cp0Xm^;MaD^|=r$U&CsH*tguw<bAp032t|HJ; zFoyBUqY>Vo&ecui(BfQE=28Zo@nC=NPJc#F{j6Cn{e&NI#c`E~#7V&B{hMG>E}^<C zQNoLBb6=A?YV5qiI`;sx(^BVGFL(lgxI9K@y{~RzpRA)8@5N#gb6?licVIi)2(b!N zryVAO<dpY><Hm~VQI-!QcozZ=6fDcK7G*IU3c%-)rlw471u7*J>5Sf6*E82NKnOIS zxA8y-Lkk463nyA%bk93+iyK!HtVqt{5<wxydyZj(QOwM{-%?FIWXZ@>GeD4SfK^}| zDsUe|tT5tk?6t56T1X9063&%nsuTZkCuA~qW}e2WBjV;G{DbBrGvWCv^%`Ip{`sKk zRbAQ#8vK}DYaGyqUSY=rjb~fo=3OdVU|qt}=jSb|E{DCmvBbRc;9<+%m=3I&Z`dx| zz98X~B$H!cEY~NvKOjVe4$J+%F8}lCLU?suX)giM->9(Vr{%6(ci}Y?%qAvWg!zI^ z#E51ihBw$K?2#3(qWOE%RxCFtGTyR9L4`Z=U`#7UO^e8-R!kb&rB;fWZcEf>`U1HX zPPkR2)+K#X0lkd2Xv1HiX9K3NklRPPtUIR7Lr?VU&PBMxR1sXGe`lDN64`Cpat01? z1=<DW61wZc%UrVMct@XEs#E92JzVCjWsl>Qp)}`!VR4&5;k*hBr>@l8esgMyevL@y zg$6XOjj)ZWg0nxmP#4|L%ypg3G5<Vb3R=UJ!8$MMeVRtKf?y<)>>+X-x6R6E>94s< zK>yc$p5|UD)vo4KFjG_(@<Ikvg>Zvd^~zo&<|YJP0-Z)tV@pJQodmi2iD?3ZX41!{ zQWrv+vAr5Gd>>igevu`Iuz$t$>4J;^5%|+>XsRIWIBocBN@~9Gr90Rq%V=EDAgYOx z2+zV;MKsMWAsV(2q7Q$@ZXDpkDOOt(Boj6BIr14CPXB}KPl0vKLA_Jn9JGr%(Q&Gf zE9{V0Hx`5HYVWptCcZ+dR?789F)>B!+vu1cj=wWHctd(gMT;0NI@J#){5*A)t>Kko zX_AdMX@wQS>gf0&%W(f1ef3AhJdtKsd&*8N*{rXP;4~`axJ?hCqXW8ivjj3U&UefB zde3e{4hm)wr4U04VgI<$7dcegBw|o8>jU<T9bpa^QOMtao(e(hXcP5lEt~JEi+WM3 zwA=$)J7~VMvc2Mp-`koOe}l?zNbHvZ{Xvq7)X4IU70^yzyy`n7D_$T=A=m5P>KfW* zE0xBCUv9KCNbgqBut2s`RBjZ51}JaV2{EF--hnlgAu!ogz;IdBF^b$E5>q2CnP4>B zvF0w76)Ppb7R?Jr)!q)^C}IQX`aX>ZR>?QS?;1;~-PJf3RLT132pSKUI+g)06xZ>R zW<C`zcjTw?x1z&LP5T4RLJ+;6N-4rhI=G}6HM@)#n1Gr6Rw2gv3nVx+Of}Fn<#>Y4 zUBOWCOW#Q6%Ph{+@xER%>s^0z-6&E=wdCF5A~}6s&uo<RV*DW|?~e}B7Y&>gv5;VU z4%pv}bo6B8{5vyZru0YAk4rX%2xq_9kX2A<y5GcOPl9PheW6D%!fQb5l@^Px5J#t9 ztEFKXv7i%Y)s>kp5oEVjq;=yZ11w9<u6Va{O$8yb7$LL5WXqPs)x^Mh*IXnu>E5Zk zuq-}HXlLKuPI=8DG;V^g!z(`fnjsOfjd1H-GPU$q?w%B|09aXZwg)?RYIsNfHq82g zqR6_|lz-G%w<XhALLkV&YnzjhuM5#=+GM%BfwZWgpS-ExmsQ25Ma8c|2nv1$;B&#M zo<2WkE|Qb#d0Hh*leNa(v300&3C)Dv5PuCr=+x21-3Bkh2hdxNOMr>Vvs&tS(YV0+ zCT=gI0c+Rar^+N*>W2Yqj)WmYw`K8Wf^N3C$(lbGi~aSog*##9;SKMKG8Ei_Aq`lz zRie#Mft9jt?<ra}(Ug%%J@>M%He7U(A0Zg)>@Sf)DaWvfrO^yBE-eOFQ4U<x;xslE z^g{dQ?L>*L7d1p*rQ&wMBPLgt=irXI5jXZEfM_bWXm!BOO(3RMu82?A2E=}$Ry^d) zOq8ZL>1rgMP1`13YA#qCM*_)qF7GL0%o1&!hNu9i+_WuW3qBqJONjrY=6{eh0?p#3 zrc*0proCOa%ssto$_=A{?J;P{vbYu0z?Osx@RB=rqID7q)FWm))sLpt628+xptg-l zX=(uP$XeU*mz1%B{9mr}RY8d>5RJ7+TQrkBjBU~J!ny=n(4c*7FNq~n(viOF1r{li zzfGhr^?epQ;<1U(y)*;mz5d6|#r+K^q?IJ&;^um1#3M*7J>^Bel`m9K06VKoa-?O1 z*m8~$?r@lQ7w0jbW7ZbTFsj^pNtDZ1hOX@;K?g832|M1Z1q6y=XA1q7$;1S@eVfUs zx0oNyw5F&rgbkejp$o+<M3K1)LmEts)%o9hdhdugi)Fy~o9}plmYdk-mp#>^W6o}C z^g1kYHV0>0gS)rQ8rYSC_WA^^z80wSUvAaI=rglMyKZT#`|y%eJuw8U#YFw;1#gd| z4tc9`DVrw_s2z7hgl*Y`-;~8;bY71wQJrz)nm#f3^~2;mq>9*``x&T1{HXL)J)pVa zZL51E0%a8IwXbnZZoc5esz8ffMa;k$eOFv=zr`iIY@F%)0J_v?NVZ{`nD1+1sV|{G z97bI1b*_qOhf_wg2I$fAaYHDihv#&rIiJI^Q<qI`E@oR0qxpk*vJo*f_|{+Fy9?5q zcA{AFbN<UKZ0Y{X35Dx!bgNw$uK1OEBT!2mKLWLT@>;~Np1+-znk%xxie6E(faP2f z>BhUK&S91+4zWPCUc~5+KJZZ;11+V>as_9hlkk;6dTo=#)z=jY;%Rn;S84a0&+#R< z={+ANAPn}dK;-uNue!mH$<4$$lP<x$j~%2I?pIq94*H3?&U_-NL2Pht-IQw^PwYNE z?JkheIRXVO$K&T!?paU(k1FPzPhF)v<;`W@_P}i&lbC)fQz)>G?~l>Gr19~Oim3UR zet(T~ijfw%Z4$?rc7e>6)xgz=!JmV!8_%Qc_E~(wB;P4=1?(F|pmZ@oGBksdCK?l% z&0Hz4I}2^%lL-P#Bj(;?VYNS!3a^z;ZOwSB@;ELMsZVv3xJ1x<%A^MTvs-l78_$d{ z$zTjLAL=&3XN;P}n*|nteLWFe3<}&lU}X$Y<`imq>q~SZbwtZ#ft&~*@yJcJNJe!d zGFHzZU)FpTF6%ZL*89XFBY9eu5gATl<K50c7K_h8um65I>C$y&l;&qa7mKD2&DVe~ z^+%^XS_@o~F3wWw*3dXmoc_4Hz`5&dXe0-pA{waBO0D7JyA!EG`|+NGtf;c)mJlcA zUuw&oUiCU$T8*FB>RHVT#m1)fh{p%Q1CK{saEYH&?K3Qojq=<_W_d*9Zv&;tj<i=) zqQ_i<M&^TNH-ICyUqAZ4ylId6#oIm5FEZj8MvjQ1<WI1qMZN0<whHv3s(xgIf7HlC zW5tOE>IIAgb$I-F{85rC;QIjqy=WeO*K^mp2XF8HbADvW*PE8%YW4%9#s&zmdt5Z4 zqvK>iHzbRk+zA@!@!=Z2kvj%|jkjh~7s|@_bSI`N`e?cm3Irma83hObh*{k+^&UC# zBI2dmOGBNVt|Nv~uXp|6#}~D;*Z@X{4t<Lr8(0AnU<F`~1hmq6K%>P<RK`LYhlkRO zTx)v~(47*9*7}4(+cKPOqcJgBNx{o2E3w5I{3f^9?2I~$jtpK*pixRZ8Duvc_yysW z)-)Zq=9G(2_UIP#`~1xRmR~IvnCy`W!&y{cRsXOSy6wH4CzTT`D<x$oe~H2DMlr!C zBqff)M({d*BhP>NgqCsmgT{csN>u@^?~8U|2RneG5;2z)_vffGKf`xwVfA9CzRY+* zz~=jURIH)5cV~C)j6X=;!QR;TyK>W5d1&sA=V_J-M5%?^YP3cmTenT2vY7N@5Ej@K z!@B{~#)icLBo8asrW~}Y=ch&Yah^_pBYpd2B4&_JqkJHYuE$|6`UaDjlz7rD5m^t8 zhOMn=xobkc<|phzOA}_ocr}9xA}8BiDZdqc)R*k3gATrhT_2vAp*ES*s{`$M6}u6; zq`fv_IMcDz+dn-t30cGz654#v4jp#Xe3_Gs0+4KcU{EW5U~b`!W=h(?W%3m6+>gkz z<H563=tj*&>5-B?M)~>$g4OA0K3#f2kz$7TPo*#Tqz+Om;cFU+ND`|QDIYro2Q%x= zu?<o(T<9$;<)67<{z-dknmwpG`sk-EH_b?Fjd0)^eTgRl<`ROw1c)GP+LC1z!|tsy z97X%)I#mgMR;FB@ibd|TKNy!6h^?RktF)(QqE(WnYXh1?g9w|QXNAo%mDkm-je7dJ z;`D1|U5`DtMR(ZG<N95A3Vc^CeDwVEp981IW&-H<M8aX)1ZO+tsPM#{7OaAf!BDkW zt<V>(kY2rddQ6T|rxn`pE9e^|G@P;=undkmA7o~r24DnTLYDo7vLv&0vg~Ej;F>h# z)=Kw;w@Pec{Ldwbt97Zk>9)*!(;F9yW-%>~Y{CniA3i?a6Z)h{HKKxq$qMvR#B<IW zLwHYJrcV4GOnh4Cp*(chX|vS%Rc6zc_NU9=SOIFQzExQc9D<wnMR6>+k*)}K)!et8 zt=JQ;H=B}UhbnAJraticiJ;4Ho*=rEIjNuCuu`o|^Ra)$_#p=Ick|VkZ65cB9Qmlg zbHY3l(9PlTd2>q0MRj!eQ>rq0-t%C~+9%tnq11;ai@ptj;?b_=${%5fSEY?y)#pKK zj7{xs*?~&sFt-ufEvn!?UFWtn&PNW%s&0TQOP$KX)lM!EHt$7}lVouX*TG{KY2Xgd zNTB4KlMPT}i(^|`^;&w{PNE>2nxUU{ON|lsdNs5Sqr=g<>e>z}Hhs`s<g@1D05}N{ z1Wxzn6w?>fm3M5<$aX@2yRtrJZ@7AGm`fWXhIdA?FDE3}BTqhjs;8&Oadl;oVs7=0 zi+zl&c=rlGzYvDYS0bKot~2Db53{N&Ba-#}OmUsC?&Wid5$a~$j?E5xZ44RPn(Q$C zu46=;i4(u{Vm_rxX|zq*J&_lqGax*gXW4plTe~!tXKUDRq_&Iw*s{K}Xt#j!^ElJ> zdRS^z49<<1Q@3Y%j}s+LArY;+6*)`Hip2j6Pz(O1V2qkcLoe!u%Gpuxskw5bePFzw zlhdE1j6Z_f)LQ^3lbB;bmo^CHDGBzD<$;`aft#qDK{ScwV7j4Kt4LAGTpF3gkLZYJ zbRoB~2q2#D7hOjnNu*{tgA{j-&zur+p)1|k28Jq6aK*T~MtNtdPn4y;YOVK68l4L< zy^!3Rq42WvQKlXiWu}A$<dXDDBhB&@v+07uX+Ue$zy$3DB+*}Sp8uQG@_X!fUQWht z106L}m<v&drTQbAcRo5S@>iy^_3`I^|K;E3?*WL~?A+{I!qleo1l+${;f;VSjvTvW zlBvfkWoE<|8<~@+t@hPpe1a-WqLgH<f$`>Y%<f%$fVlSch0-rOSXS|bo#Q1t2i2C2 z5qSjW3TgSC8V7Ky(mw?`DFk!~2kMbQuOO=+m6}-U1d`0cTH=M$pFZHLzVgLVUG3hQ z0cE+7SFrTV2-0=fC8>{GS~WQC=F{Z-!w>tZserj9y72|f1J})A&RZVE(vtl-4H#9h zS4Lu#ToJq150&I?(m{b~#kaPCpJnN&Hd~spy{K`hk6=Sz;1eA3Ny#6X9k+z@El^i+ z6s6OVxh&cKfr&BP^yZhPz{`T=EnPGP#E7mU?YomKFGKR<i6<DbvTOufSBqu5Uy21@ z1ggiJo8)ZHnQ29CJlIx%3Ch<OaKYk%&gR+UevrLl;2Z5~d#zj~vgzoAiGR4QT#9BR z#eN75Wt-WHyE<+7GBaqm*yS4qBDc*w@skOKvvv1u6cl_ECwf{^rbzvq$)F5P%nmuv zZBhemnb&m%(0?2RKw(bI3^@0`HS-9eGZ@Bv(&PU5BQoL~5ah{7O{Xv8k`-t7&*!<j zB+6Yz4_FQ~qSg@?Q0X>1B&w}P{0)=@Z7z{;gm~5Pl@bvG4cyk;BjRht#d>*_=*)7^ za<>-SqnpdG292#g3QD5F$LcIiSt6@stFWmKDJVqD$GB<%c?z!rHkTBs_rsnZssvIc z4Chk1S0jik6k#W*TwU`92Q0T;2|v`Ok38`rar8RZiG%t)uM{skfE%1^SQ?c(>^!-c z^9`FWK@;+*j%+I<2ZL3&y`s$^H%D3bK_?OLZ9p$~R@>Hvd7&~<%51t?1WqlYG8C~0 zQ9mVii;3u`__}_F$i&IU@Ixcel^bS}+KJxj%5_CMKBg^XKM@h@x)sGerlT_rf@Ew} zqSL2KrFO|E5yx;W9{%o08-WsJ$}ISk0WJ@P*de3Pa2S;0DS7G^fz}axTR0zLxOd$t zK9zO~kw^fLIpYDrW9o*mMAWjX%X`V28;0S<l8;X)Xf4QGObuW?#R>q<n}{|4gKtcq zoy^C%DP8khy`Wa2e`3}~_DSq^p7PS}`9vt9mN^DyEKA_Lg)N+p;?39pc-=<$e-=yQ zYBnHRkNKIXk{h}rfzqxKQIxh@tBHQBs@8E98*8{>w5WPrMNpzyZ6vPLDCD-p43(Ko zUwY-GNTjQK$a|JPs5<cnh6TcCVZj=8GKppZ2B|UpMJm+Z0L1U=IO<C5h3}CfNp;B@ zfD9L$PNK<E$q-k#C~^*6-~R4N|1)InJ(oW;->X!6%?sbA|HHfH`E0|!_U`w2?EVK_ zvEj3QJAL5y=Y9_%ug|0L^Wl!b<C)B(tMB^(JP1fM?*{Lu1-cZjZx>eY=Ep~34seN? z7tW`-xu*{wrxz;k_sxlX&D*m9y!PwK?DP3@n?3PwKKk0y;`ZJM^;>8A=N0oC1IAII zFj8WBx3pWa`r<eZ9uZMk4h@bu7_2%A2o!_*uNJ>w0k?tWj264vuiyDD%{Mox%fKJa z6&mF2pG~%@wp^!FTO_OJTm-+;HA+43Ll>DSrnP92?thLa6Yl{NZ#x3rj|9rLzt?Qo z^uK7{r`_x=41unLT3Craa%<L3kmdOtZ1m(t7lpP))>Fd#(stO|qha_QeudU2KmZt4 z!0VCd%~4uGV_IdFfThwOrl?;nn--G*OHrit$VpHV*)TkkD?ry?rb&uMT!_D#{pqy$ z7Zj(lv&PBJyojE=c`D7_!_bJFrBhz>`v@7^Mn~)yiQ?EQSFk8BnwCv`R^$x+;!=QQ zttMw!88qfo6}^<tnCn)lU8R|IZl5J2MkPG@10b==nWpGm!>9w5@zQf{`S!mZ{v7|T z-aSLxgm>rc;1L&lwl8g7+7g5bBytZ-hCdpTV#b^t4v~FD7reNQVPz*C1Q<Mrizo7@ zlr(RcD%+glaG@y;J8rn`wsiV}#iCqtQqsq+r2`BBsB{3gt!iZESRc5cB~Aw_PBlV} zfh``^o9wpt6A+tT*}1vp1N7*~F>@4uEA~)zZAi=Cz;_PuDVnDHI%oG~{bEqPek$;k z(#D=>q~#YCb2w}MB#yP4;u(}tzY^UM!?j&U&EDkYL)1dr5jL<0%Umg+y-2<j<8cU) z*OxETm3f|~4qN^`E!|QN?qJSL?tmG?YXr}R&|s;XR4u7FU~3ex-ayt^;9!LYXFu=I zJ?AG0ID6<Q^cqAz4Sgo@TTrQu2}eh)w~tfp`6Y}n%;B+uf3=ABpjaAgaE~x)W6-Zf zhMbVv(HiZ)W|XF8JV~p0stHl9tn!jeT;#|-Lu#|U?D2O*>_MMvj;84gvdyT-iG#8E zRZIsqgh<oo<R>f=m(%+vk$9c?gd@i-@e@AC2#cNmIC@zgQNN-KfY?+&)k0z0{lh7# zHTQ=J$e3DW6Wmnr=%F)Gl`~0kkyWcY@LbCrTC2U?%9*!P#m!k7yWwEuk{3gl;$)DN ztM*CkX{eQzWq0ZHkTnZ;-&>Z<n`#d>!@RxU{K0e`<$kB}d9P0IxR)U}**>HP46a1x zoAg*#Fvu;Yyg`9)j#R_ej)G5?xWkwPL5-)UWG0;QMY&nDL^BDo^gMY}b_%~U(guaL zcmjueMQ<~vxhcz8L%)8Q2Lnl7m`8=oRE{}Wd<SVOm?D9gC;}W`jTX`qK!M7&Wr*<) z)^o52!REvXkx_MDCvfEtJxuy%EsTj9%{Z9i5w)&o%*i!Mc}g*Y=O9gN1m9p@D8ffu ztrKXka({=8`>oiTlw|HS*2ma^0Xl{aR+iNPI_-H0WIXl)MxTtU878f_C;uB?H=Y8E z&5}b_x}bU@>XnvMh$V=U`6^uOUi@YP7KxHex>IihhJpv&TbLhu>DAxhSK&_Fc;{Fw zrv(7I_Wj%%OYh*m@WYymuOld1(A(h+oTsKo!-nsE*m@!OqvkH|?`kqi?+>xEx)N01 ztMN&=_V!SXo{I`I-lwyx5#6AL;`4l*9^V_(hpq4XJyJ~H_x3<-%)b5Ynx{94Ttb%W zY;?-IqX#KQamGC{|Amp)BGVH%6CWXA{Wr#}W2eCw*f~}cH0OI`d$9H_Q)BDoj&89% zikjQ?pC}~&72I_dP7$UFVCa;hl#{X*<gwjFK%=xV|FdEGuY1^Za!ru8cfkwx=7pIr z2na>t#l60*@#_YaP|mG2$UNA0RmFnJZyRQPi5(9XEJzQ*=nF+ar*SFTVQVsR!nKWV z-{mQ0YbOkG0fFjfw+=WmsAk=b3BI1Kwy|#OYK$9s$=(pnO^H_=mzOMNBpz0y2j2l$ z+zH0p>4*lXZ*R3eUqU_W*vp%F7wdVB7>ll?oj4E1dVmnE2E#!Og%-!mo2d>4WFow< z;YD2%E*M6yk9%Xsq<N`gGT^I|`HG#L^`~BHJk8$P0t6g4tHoUzs3bpWhkQ0A0I%4K z0=M#-@jwSVC3+@9u&hWz=!=O62?_!H5=ty_cAmox$@s~GMS}6g8P&2R?B&%*ju+tT zl*2IYN_De%jGSE5DO1S@c`0S|7RFoNa2vN~NiZ$X5gf+u79p5!qg^PdNpmrwwP`4O z>|!%{S;=6zT&DG#b)!}89|uLu_sRyKA->!_P~cQUo~>edhiVi2^>5Dnl?3wys;xWi zKme&&Kf%N(X_D$%=dJ<fzhTV{o3pcAR{Q+!64z4}OJ;i2QBI+Prroe@16ifTeL4C4 zJC^~UJCHuUd<7ezc;zGL7yl9%%=CV93(4`)I~yOOPaG|*JY@rxEf~@I><zAzw-6k1 z$%zp&YhWe6>+V(Ej)7H|umX=Ki(2dn%$7-7gTt2LcH72agGm+z^Rlp|HW+Eoi`lE8 zh(VMAfD1>Ngwf8N3JbDg0XV^7DD1e>E@_-OScerKaCpaB7|FzIXi1V}%a<NQj8bn? z_wi?@WJcJqsK~yyJ43epb=2^S5^{qJq8|!AH#O5L99JJ%b~Tk|$;0&a*J_)ovLl+! zhwsJdyIzeh)Wb|o&BV#~1i2PTK_xzMb%QA`m+|hpcFRi;ig3Be{DKV+TfLBcGaMCA zbL2?fccR6WwiW*p-Eh-U$IY?g8%wk_i$lzP%K~@fYqj!}c(I;+@C$G=?bAaDG1p*l zb&R!<oHW0H%ItO<OaYZe@<_ZxjBg5xULT-%@^{s_pg^@)7~#`3#zjttlr!WZ77bOB z#UWbe(CS1WA<)6xk>cpL7{@@p_0Kl_HY7!>es36YP5i{r2TQT4^rxpR*f<cjZGz(Y zf`yM<<G6)|glek>F`yac#*5M$qNSyXBkDnH(@Pp8G(4FvtfhOXo<H?UG1p)%jI+ou z?+S$^rOFr{*;wr$;KyCd<C^Ll$X8VcF)r1^5%yj=3*g2ZW#w(hVxD!fLMNF_;lmtY z_nt`coFqCtg1V3^EA7`|XYY)#ljqLd)lO4!KB7~OA3iRR|27|Nr;i#d3Audk%JQ@c z`#O)4pC4R$KbeLc`%xl8DJ2ob7R@6;^To2*zeSC^s;sa38eQm1m`bXs2CT`9`qbv{ zsIU|V{T?!9?jy{6$V+wh<LTm;w(gR)?YtS06AimZLyjI7M<x$dVWgZCriaZtt|CS{ zd9VYDCEH3k{VGyrGzOM2q2iHp724!VO;WHdhmDpeCyn2qk^Gy)YH}WmNa!L09&VkU zF~3@=Xmg{%@cD3a!Y*S!6v-{Yo_>~5KFmil2y)Ugos-CG<%VD;^$VjT?HQR^cT~<I z+99SxGHnQqS?@so_{>odJ%@vgw*FR_A`kw`P@>47>^FAxVpK$@!rct2*dr3lUCAT_ zSyC`lMJX&!iX}T3V9-s`4Tqw&H!T2pqo^%W55y2~K2AoJ;Wp0@<a3P@*JFZ~Fb|nK z+KcBXC&*>aPT#a+U4oVsfTpX9UwzM6psmP5Dn-3n?F2tYz|rHrP`)i!I~qgS-~-=k z;XaZn&KyEil_2)t0Y!s7ER1Xz+kM(M4DI848%tpH*LS*0Lp9l~?=b`r!U>0309GQz zhrLlCg{vWvcrEoJ@J6ngdkKVQj;vY)Tq`&+{{dn^oxd&E+vtvXLMBHFSFeSEHR6yQ z4O)V;;!ce#JhZ$VvYu3GjWkYcL5+$E1ESo3d(JkX!j8=1|2Ae1%k8-~_)r@%pwHp) zauTmaHg))x0|{N>1DrBY;k1k}h!zsCHH70kZPz;n>8<Hjhh0&GU0RTgV>fxIB}LJ@ zX`Y}1K16T%PR(vHJ}2ulGQl!NBHl4qc+Rb=WI7|gKP)CDdl#C-MyyW@1|%9`OSMAP zs_(F>^CG{pvl1K{Cun_bkmYg^g+q2liJGWpeJHor+0Bgw5~KW3SP6-Fy=XTWGzA>X za_BT$N_#^z#M#69Nu2$%PNi%p*(^dt{FTqqEWBY%!`Ab40fz#tnvUrTevoO@Y5a^k zQ_pg5w;=bM@S7hb*71Bg#WkIXW-W9_++KYF0_q}UT4i&`mL9R2r23_tvGS1>he(u~ z%V$U3D7RyemlrD)-MMezpb6Nv+j3xE>7)VmO|>g-Kns(EjzUSMHOvmWc@D7;kLwz^ z##MQYCO}aZuY6I}up-;aFGVb3br0ksFJ@hpw=YQ<6+5z$`^@sPYM(C2zsrdln(*{X zZL|Nc;IFeHKTTD}5?Zy?@t65dJUVY{W~sV9upQ>q#r>8Fhr@<Zz2F|l>Q?4dE?F23 z!G+6%nvSQI>vSjLJ8Aa$?$9=JS3mED4nAyHf}up&s&97+Htrc*%MfYBx^vJ0fK2-^ zZ=~47ScdiLUdV%5{An~SB5m^xt60fFA6|1gr-YY_w)0lep(mNPY%vy4-Fa>*vT4SJ zB|NgWRa_|4*{syUl*vXS(_X<pXC`lc8XG`SqYV}P9?0#^_7PU{j88F4i>@}>e5iay z%~2Y28Od@-5oJNUt&7lV^3;$!@6wv%ALYLd`yahV6h3XcT8v7@K%Y1}+5dkF%8&C8 z8Cng^fl%+PzCG2c3p?tes%~C}h5BO4H9&|Yh2fTC#vZXj@>bIr!M2xZs2Gvh!+L0H zgS5_xo^&R9OT85_)rW4kAB&tV6^2gRIY5ob1!8fk@ATSZvbmq7GqkvR`=>FncLn69 z2bM+aSgg`pE2LUPscKqc2(Iv1f#THX4qF<2^tRU6)sTizePn5eWvlbU^2=KretAoM zKHjE>ACIeU3v0UdLis3*<hBdscUc@CWnujHEQ-}wa2xA%j~>Zb9X|R`I+4b89j0lO z^Thh9=ZW=py4HsahlKnmO<lx1aKe_bqI#gYc~}7}eX0=iASqV6R_sud`Phmrx20ur zheCuUZOA;-gB`^g!FY)&6g=ZyJY0gW@nu(Rj48A`8yT`yOI`;@tJR*nf%QiGiak+> zKV~PWR7%EtsJC6p)#$aaA>qb#5x|O0Tva`2;5blssLD7$xwWuiq$;U-1ko2sLs~J$ zM6gH^4&@@N1uxvvgd4HW)CZm*96=e3n?a>~(8#gCixv%Iz-2uA*#izM40Q&P_EBRI z{}>7FXA~s_?<2|q+v{O;ju0MO^ljBC{dLMkb!ce5TJ)m5-Vnz~p%0oh6$*51t`EF$ z_^KEuMKZ>8t}WY{Q1$clG;bqlg=>qbp|SLzUOM;yGS(!3rk+OM{Uui-dV>URL--2* zs>H8*?koUbIZ>Nxf()JzE*DAv3j?v}w&CD4!~7PZd!gligmM0mTrWC-s*j2g=ssV* zoa>(HCEWsM=`zO8(xr@_yDVp2@0Lqi*So{A)^+c&w4Dv>KXwhfI~;yseGE@iN)d*M zWfL)J87IHalkn(R`t<+idRJp#Vae+Stt;UVbZN(+{K&*x*0(M$7v_kkkG6UjHu%RH z|Cnq1UY&c3mlGa`B`g5m;uOh@vs$y;I$8FgNVuU3HYP6e`Pq3O5fCoTJ9WA4Lu>RR zu7>q`4er%Gaeybbd^x!mcbD;Nt`PRV)y3%EU-{1g_@rVU)FTscj7osYYfpPa5auxw z;G2E;tBA`kfiZ0GTz#|_1#8DOW~goPH^9^q8X1#o<!d1J-4;g3H9<SbYfFisui#!K zWIxa7z;J?QDbk2zp70#dnM^Ll;GzO7qd`V~ijm#a?Z3*v7L!>|jrjV2#HYBAcQg3? z-eDBH*gL>TK<EHozu{bccwy*m#sq6LYLGJF&Gut%&Sc9WXF)Z)0(&HE8C;wD-8|uQ zNuU5OYVvgtQ(4q+qOT)FT3gh%cF9Zi*Eo`^i{8~-pKhxmoV9Hi_XOEyR0+c%CZhRM zX#sTz%tidZ)Yy-p*@2Ge7T$+nWY)U6a*xK<9%HcCU`Uvy7?J#K{aEZ1TU+Hl!?Ojq zG`yT9U^TUogp=P38;xp9!o@~!EmDHY71BO(#rw3onMH9+f_|A?+34N^EHrog<tW=c zCQf}E+^5}pX$5mk^m3Q?7~AToWk|dqsqILhf<!gsaFXjAUprQL47?0F(pX0sYM~=p zitgOwG43hToVQmD`)qjQO!BjIWLxLGQ5&#m-`UEoRKa9vk5Pfql$Bh_ZJm>BX4~B4 zr&U7A?kT!RVKC}R@-8?lVhpTX_Gn`=Y|6Ah6|bN%Q;e;#MIue&v20DrI}ijaBL@6K zsFIH3io?Q;(Gc#19zR;PkpqF95bq?1t$^y)Y0|Q>Mw4bbrHw1=2T%s!1_TS&=BXdJ z6A6zD7cZFAn;tx(e1F<1SZ@cjBEL+>u90BC2G|UaCI-VQX=f!O25$FT1WZwfQf1;! z{!5t)kYfdp6fA;|rshgBNPyNHC{hCpyYMiF>gg$-gf4Mr#d~;cqtM3TA*ErRCCM0e zcC=k2k5|CIWPt@-An8bSDA$pQA6o#=QL-rkeSPi<I-WgO0Ym_Hi5rPRm$q>%b!SNc zwIE*SbIH)6oQtoe9)Lc~sVkS{YG+KuX+j<e5!SZvuw+ER6rDghQZof>z@x8-f=;}L zfz2d(7*}cU)a_%TA<r?I*3SD`c|FR>*SmwO5YKL~`{HQM@(y*Z?t=wv=e^b7jdJh9 zg6wEVpa<x9t9nD=#yM%`#yMfzUc=(dPBb<u;__VP<s>O}PzaVQ-1aGkPt7nasPQSv z^*k>`E_!O(mu-t@LJ&0Ow^5)5zi@&qhF$*<OLM!bvuQY;T3FU=51O7fnGcY6%jMsK z&8;Exx;F-^*=5|Sg<A9Dj-j^%FDy*>9$SKiHo_EVipGJ3FJ~u{Wf5a`X%kBPhTi&o zb_R?vYkGSg%8`>Dt5e<ric|7Q&aK!ju$x6eo{6(EZ>DCn8Kcp2SllNG9-cAhg5`@O z%kv6@!%??*GiLv$U*~C&)KO!g*|f0zd;x3?%W}GBi+bK%=$yUtULmj!G7%baM=0RL z*jid<hX`?Kx6aeEn~h=d-}J1(u=nzg<wcAucao0MO3uwCM}>hM9etOPf#gm1WrIJ# z6y&I-XN)itC~^!_Ey?0ICl~qu*&b{blHC^6$+=_~YAeUPIc#Fs&3%owJI>V#f|rrQ zoP1`-AXQO(+R8kEdK?~@)uY%2q8cW{z@M~D#%;dOG>9fp>j>F5_XBL`Czw2pL`le| z4M~l!xqldQXD#foG=0Q1#K+dpCpUJa196<=J<xPBuA>Vfxk9^E#D>~$FtVp62#mN# zjXAA>nr(HF<jQ)EtPTPx0(ByBDvx?fufksS)NN<Endox1W<Tmo#?&6vtQ&XjkYe2! zKPT}2t`Wr<KW=>LrS%QgNwHZL#3=&~pc0(5a95j;o5#M!Zpy0AI!vkW0=|CjZdxk3 ztrbGn-c(n06G>W{G5e{4wKkk0W#+f^*MZ5t46e~o<Cx}%mJ-Lbby)LQlB?-zacH=m zAuOXBDp5$=km4cMEZkRixg*SCGqZQ2rX8bAHqGGmzFYN`t+-G-g`Qv>7Ok(H|D;b8 zf&_KQ5#L6Xn9iUU7<r55KrWPS2>a909fWG2q1C9PYFOr!z~$Q{n`!(`MaCMw*#3FA z_wo=#3qaB&o-LDh4siEqa6(!cj-wp<U<bRfR+Zlz2V7BcTxyU`SUt&v=LFY4PNAOQ zsUFXViPDUdu#k(Jbq#pueLd2eA5&5}kg8^cBZ?QoXNPXqRXwNp4U~bzIbiL)7d%lg zQA*&1!DU45k$0HwRzp%pX%;5v2y9C*wZO&Wc1O#dQPts#gdi6Auo-}*-tX@oX~hVz z;%@#D>MsE?Xgp3hCd?`!^Gev=DBgCboQ!`tUEg>#DaXJ3a&h|Ti!b5H#V@B{|M{EA z#V_UQ_?xf)+_5W59&ZBSW_O~DW<)uJz$hViEi>DDZ(uA30pc~*$40tA_dd_WgP{A5 z?)?zp_3436S=+3`eL*L6-=^FQaqD1d1>D#*{(&D45Wmv)AOG-_S08EA|I&rAtQ7Zq zS*cqB)gMO2;^Xz*1%kWo^mpCsIccW$eQ4S8m%A|XcD-hj8@stY&)jX?C}S6JWAm*d zfhlHZwcV6Z4DZS<+r3f&cx-G=w{k(yjyCm(SM;pKOtkx^%ZR7C@)fb}D`lr_LcNU> zuI@B^dEmL4S#ZxJ33vC=6$s%hFuhRdZO`L`pKFX=RL6CbF-sfm)u11;@h!2sLP&R< zBxlT%6~?SS+~U$v;Aa7{U5JY@xdNaSy0rvK8|nOiE-lwGFqF+o6lwf|@FJC7h55)h z)&(k|YVqObhU7<yRalFzn4+8HA{}o~_z6jO)7Vf}n;9Hw^s%Ks;Hv~w`0TuQMgVQ= z&_GI~V(Ba5szQO=21rVxN;<;5Gb1Rfu2NtoQ;UV+XIV+(B9gUevE+qShX9gvS^tNJ z1QIKm?-=?urh+=^qK+ns2$aMQAn}eyAiWuvmULMen4$9wkP2<yj;h!gJYc+BAh4?7 zokH+kjaAelkuTlX3*#6`h@nB1R+FUR@8Oes0iZjw4n>#aVO`N0K}8BGkj80=%0^V= zP2+JAoK5l~&F64hnNO!|`b0Ni<($HRUgyQdz{<k#+M9*pCA7C!QrwZBxV=}W!7FI* zS>4_XZ0|eO-T}Aw^qRHY2hbi=`8&4PvhHx@Z&6GG^#pUT?Al_*J)|tm2!o<XajD~( zQpm@WS7(}Ws+oC)nr<X7g+5(eZ91fc%T4eot{K<dC4P_7v-1j8Zgquvb!Rfzj!Lr# z<G^G}e+_j~Q<$NnOjJg-=xH9~y?o0+oidL!VpSmaHp}A{Z*5-$3wdRFQ$?m9)grGt zoIcnWEA7hEwyn7hkZ;xsfbX<T8klkKj_{)>%-K|oS`Iqh9IHaKIa@Q*1p+)lp~#<J zxYHT@lBXF5|3kSy8lFy&@ns=Yv@C-D*vSKB!yFf*^IPb%7KD+^D2^TGY+ba+mvoPG zdaX44G2L~k?MU`^(hwO7+DxF%7k=)A;73zk5ki*fu5PiV-6OM`Sz1vdbm$ibDkPPL z=zCyCpJO7@5vLW!jXHv6CX@V%Gg1FDDRLd06Q7zzonSoB(vVuPw$TAKfX3kRo1m<; zLn?p+i&8q6o(Kh>EZ8e3RgC_<pTuMH_jfrQefBum<1U);7kG*2&z?YPxA`>e@day| z(UqEt%!pKwfLx@li6nI-u7OEnIn*{nW7h*h_`l<zmM2|0>S8<H<0v@lVmtf|Ti|a9 zTi)^?qk-<R!}<hR6fh|GOMu`nfx+kaj|HM-{kA%iTAs>BLABy;YO;@@7aae=em(3L zSYgxU74Swcj7tPcp*l_u@N^$nc_EIwt<3nlBul8EvUkFea|jdHi+jn+9M!mHpn&tG zYRlku3s@|3R%*lHtF<{DU-6TWh~-KnyN<fDHNZ8-Y+TPbgSkhN7+v+-k{9jcWF6gI zn$S^S8AZ)ZLLM&Pe1)GG=HcGLaLTVvDV1T^8ARW1KJ0(?myXMBnIBOhtTtd`=%7r` zDewOh$$=ulQvhaCh94&}dM;pvYK|tQpRL4nx(F3H0YSts`iBNjPdqJ9>DGYQG?Df} z0>wG|$wH3dl{XYExza1E(k#gl<nRW+XwZ&l*^5@ra(y?tZ>(WoqgH&l;V>SLwWl1* zL9J^O<K++^(?_NU0UE;4a_#GLHHuE#+4$yWfDyV=BOpKRdKO2lflJKyk~2C$$^G|| z-S?(MVM5l;Z6uhpA|W>@^IQ&H?nIcM%zgNobH8++fFOf+Q{Us42+L2#ZXpTdaLz?2 zd;_;?Swhh3<>zUuAvU+5M@YsI{zGr@%V(`rZJ(ofLL*B2-f~jpDQ{TEHFFJziaM;u z@J7Sapareb=2cwaC2KjrFJWgV&JfHfpPry1OJ!$4D-a9_{CVl|&B2I#6j+xUYzyLX zK)J$x;^rdW<|fHyGTGX2Sei%-c6wELxQ!?1qrhAu$8}T;UPZ;nT1MpJh8~doh{Bi< zmW@Oz3JGSk)<3A=ccua!_k(88+F?0Av8VnPGvC)UA2s=>T&q)%Hw?S`$87)GW*cV{ zCL5+<Fr@GS2Y`PvU82UF#owTS+bsV6AB+D#o*a1Geb3^b&L?W>Z@c#I8*4vCtw~9D zJUVS96nJE%vow`KRNz5i{6Sxf-P-w?9A+r9<}^{MIaAil#KA^irx#EltN9F5{grU$ znXviy&inV%G>br>1y-aXu%UC2oXxSA;cbn#R0zXR?C36tR0|*xy*GGHORf9wz6|Mp zm__9Ge}jsn`WdHcu8qar$)@g7;SA8R|Ng&{BIjJxHz7XmHG(vR1$vD^M=0WNf}(R4 zC@L=NS-7#1IMn^5{Oy_BFQX&j8oq9Cb`8tkzDdE3r`08+uHmdN1fsKe*Dz`*wRu_t z4>}ndD-6)2+(_SG5QSDo@zK3xhpt8vu_T^;E18taM!HvDyGh2^KrtT2(&>C^9NV!@ z4I>|o<^`E>mjf}*$K#`s;7kJEixuBhk(!PbP8WdS{zcQa5<_P82+Pl9iLlm$v%x7k zpH=Dyp313?aV&K&Ot=6o;Wq9bDglPO&CxY_N1GeXGboirC)al0APsd*cD$o?_ZGy{ zL-hK^k(1IyRa?-C*_SOimoE;dQB!}|5~jj|*A|#x;MM8uTfi;2W-`Qx`?|>oOS<Tt zRSRd0m+QwqQo_$Na`McnQK-LV0$52I$;%$YeUQL}8AxbTm!0D}=vv!%mjlvvKQG~M z3;*;)^<Bady582&XfiT>u3L$IeCE%0=>@j$ZQj=P!|WJH2_82Hk{kaU`s%i{Zc9b5 z7iY;C8}E{bZ^ss`%o$mwwKBonI=q#O%P@Iyo}fEXLSatOjPcibJV9>Hj;ls#r+IU* zuv{!6YOcmR41Nu}11w~%*KrXY8m;+aJWb<^M5WQ9t7UIc0u)c5EL-LRB@~&z3Aw-S zv-4fP`Yp&!?r5Ob-*pH73&tUqn!etfc)aZ(04yp$ju7_oeWN?Q+qKljF{p(V;rPS3 zuYjT&J-6so%di^<1Nh^d1&sqiQyXAKIF+*l7qX$`#of=7zqRRPNkjb{*Zd!6$A9D5 zu}1rHE#gO-_doOq|Dm+N<NnQ~M|k%kQ~!^)CI71UV|xFM)BCDezQjM)ME|kI|3is@ z$Ndk_8iz@``_%ubZH=Qt<sTFLZ=7I6_zD+-A8E4xSm*ztWWeM8lV_c$WXS-tFFA@< zpZ9;YE%KLnwVhqJ&adt#mQu~yokG(mO^{hUO}0n_*y`1No)^_<&Ng#o44YJM>RcUY z5Gw&$&<<#OGEw#~Y}Mp7)7V1=H#SY0XExqqOH#BwOC|nC_kQ<=auCNOvM41DtlP|u z@}jPxOTO+H5r$^<H*H~_>~7@Kw5m|k%kff6BNE9z=W@SU#h3Y>4yBs3UQ=Kin{iyl zj!DYEMs3)^zIA%aMg`MgKj`#3&2nWvDw9!`yJ@Cd+Gz!BLNeh5?c4+*Eyx{Xo^zdE zW6dQhJfpJ8*<DjIrmw~;r)7)lK+1_{Q$DZoULhA<zY|66=37MC>73MJ<n5uX$dnyr z4R|z}qx~{jBF<`$DQ=+6k446G;B?*`*d&QBlRBO0vhh9Rm~=ck%!EoY24H+w8iWcK zQyURtoG7)jO1W{VLAprkmVwIIEq+*oIzCl~t}__tDaWMZl7XJ>N#Xa2;oU|KTH5Gz znvdsr(RecFe8eXSStGM4W0?b4)dT34Xpm3pQ57Sy4Z%!mRzlcjX5aRl*L5vQ6stT6 z5LspW9J~TPU!-H11hG&vCtze}on4{FwnGq=sq@!j<X{`3UL?=B@t@4HtBu|YpR|nX z>Jh8a>RU4m-^CG(cHWcc)lJF9yD?sF3MncoaN~uTrn;iB7F%7Z=*09Qsi+2`Tpx8z ztwbpW?HG{kjG_8xtc8VS)#|U+f>DkR5C$s=f09YvOa-2kg)ada2VpWe8(^B*sc2r= zWqzD<P!C#`&H&-fw`y$(7VFsIWZ5h}qoSEl6m(R_JC{SLO3AEUF>hmmiFE*L^-Y?& zAGub=P}T_`bux*62_D|p-MjxVn3Na4jJrJ@j|z*p@u)m-WlBZ|)%7IVVQ?R>{V3@2 z^VQ5U8{&7H^sToGTSwf4s03_Pp&?tVn@^U^S4wN{7E#V`sxPXXX9sVqYV3amMYi{# z7c@2N9wz<FNMoi}7da&Hvq;4sR6n)-fn>mJ_wJ^cndm1wo5U1cyiO!N1%UAxhV5yt zJH6Z%vJW%+8U?7YyNnBND4djXuo**KmYB{OtObZ)+yaz~C<B=Ga52F3d;?sSIjVV7 z6L>m_&zgb$f4Av5pg@$^XdQ%-0#9NS5pS8qAz8dyMf7j@exu0C5;{FVhb>n`S8<)U zYEj&%20wk3U`$h}0qy-3H0-zV(>RjQIW;rTg{QfzvD^QFo|J}fTg|$$bvwdeCq5Yk z>l=@Pch~<6zW!#-?5}Yy^BTLqV8<nepMcY@2W#PawBGX+#gm;bEUb6rGX55zj{xWw z4$wyOY#o8Ht{!60Y!DHGFM3fBVnm<KbxQcY`K7Om&4&LB4S&7bXaI#Pj%IxwapY<$ zZZ#gL?F?xB(P|@F{}LPj>Vq2pveEcg7TF!v$F=f2zsfkMK}=y+$MX@}Fq#54^B)x* zwI7T?g3PDRV|K_iIG2jlCjMlk;V^fYn*sW1uwW~3?=9CX%eQyu{nhx!5aJ@~pu?u1 z9H;yY9%ETN3qMh)eVjcBA0t|xM2`V0PkJ3g+k@Uth>HPYCsQ6{>`P1=K{75QQVHsm zqBpuxRXIY&9-}g)k!9Cx%dIvDw$X+&%O#|-7^xD%NEbvHDluXz^x%9xjk7*lITF(* zMS=K88|bN9<75G71W+3IqL6pGkDAFRahY-?UW_$ep!5Ulhq#)Og(8zQ>Sm}Pqk@we zkXIMY8ggHA-gFv~S_`B{Nos@6Pn+TP)17C7!2l+xZQqCa!7aucUd)waTKE4&8~Vci zIaonDQ+xJmXT;$U1XZs>(^S?VjvXy{GFw=UqnwpyN+^;M>JVzps%{K7|DhQQyn)8y zWvhL^*&?i%(Zw51B8917SvH~dCE5^*|7!Nb%ovCuB+-OE_o?59=vKRRblfiA>|o<s z)nb@b6QOb<3K-9P#PNu!uR`;unCUJt(q9pj)Qvyg6iVFzA2~M|9E=M@DlMnMceG2v zzZvDH|0v<mCH6KegAq3JDAk4?K|9vZtw@_eXrus%1qSB^G}ug4hcBlRsQHC62`YXI z@{vbQGMeONt#S}uMH?DD!CDYS68VNQbUP>;U`u8U6mcitu0WnT0TlTXRf?~2l7-C~ z=oFnEs;o~v$G1jj8m%u*z-$V77OZ;W|8R_NI>rx&$*-*rAzn3rg@~41&cp<fWa$h~ zOra>5Z=%^7{c4`eZ>e=KXI~<Rta8{_)#ezf!x{`FHScY0d0eKlq!md54;2+`lDQ=o z%g%)soV3n8$)}|{z75kczjp6t7fg|f@GWgBZPotZzANN1W36C14%`eA6ehimp>kqH z+5vu@r%0d)C&VEJNH9RoJ3~b%UK8V6rDhGj%cUlTvq_9|TAEErCzy_k9IKE+N;yBV zHY7e}V~~@vT!2h4;+w?QFWRo$UVF14^^LLPkDR-zdQKNL##Vv7jv09t5QQ{5j}l!0 zVj?9J#1J;_*UHDm)Fq2DxtMe0XBv9jvARVAKwenpQQm%y7n4OrrS!t;tgl(;<t1B7 zgC(=%RO7E_5RZpH8^mb~ORbFCzsenP(Z&#^VVh@%h(Uw6ONXwtGJC6guNzVNg=h2W zOx}^YKrRgB5$4te$%o)B2_Ldd*1+f>Mas@r#=5`|<8ai$`A=e#ys%7EL#q>lv1LYK zwuIfp2;2XM)+C)^;_^DUim$D3a)2Qnj?oNVqSq_lbko`+T2no|%hJNbumO)_N+iy} zc~#*}0Ih#92yyW9doMWe(C{cPns=)uARB7P;SFgvPDh;SO@|^^*CxuljK<{BFOTtC z?l9#>s}+E{2OtCSt*_NTMZ7Jj7~?CQL$2hhFhgXicPP(MCo||E-zMX1eCu`<wscwm z5nsC!e5r!4?P)SrlDB`XnPZ%Y!UZqvs&PKIA(;!%h9og;6z*{hr(y}g^Gfy*N*jbe zCjhFBBVV`jhK*e|ffhs2Y)1+^J>{IrD^6Y;ZIX6~vZYa*q7X5Y<b`;up!JCz+<9+~ zh)(vj;YK=|kD3>`P&8H%P7ARQWE6qTDY~WL(WeJ(**n-raVT4emO+O|cX>A8*Nz>8 z`fx8XXmAZ=pgC~2+x1Dt^9(gLa$Vn0A>#+OCSOJEs?=Js-%|5*lE)GZw;W;eDmb`} zP)Z{Eie`<k25TG1#v>mnr8r+5*m}}m-)KGt?0CZ(bwu0JK|)~!qwgLHzCq_Xk<e$I zk24b(MfAG9g!WFvfB7m-(~=W*!if(5j?=TWQpeWrz|&ZN&@weuo^vuzZ?#8*^)CkN zUw-37pR+O33i=R?TD2M%2FnPyF}@>sa_r92GAeFT@KN6n=QcF$rRO7h`e5Uc2l(x% z+(Y3<^sE6{W};2J<;EA1rI#d~Bn{8E_xAlMo$6bFNA4xS7oM<+x1)0pjW6!l`yzoe zzBq}up*r|2FpK>b*hF|!4{5D&ui=Xn*}C4^*V-M>>%FmRp#@`$!Y$1Z`?U8cOU@jw z5}^+4w1Mj2rmE3?T+U*QLLnw5btANaMxu*X$J0rAk<ft;mwoearC4cLbSkkw<BD(J z8ljs@vtfMmh#T|YONM5u9R;(9uXLbiwskg=p{ghrC?F`3>=xa@f}EaaP-8v{wd-G4 zc-bOJgJJ<gG1OzHGdV{M3i=iHIN~0S%}y9@w<x0PqBfOuyA?>VHC4#~3WAlABJEJz zTDZ0!EBVZqERDlF;9!~>LDd(-tdzB~{9GTME4ilc;n79+0ZU>vUkGbeXi?N>l=RZf zlQFd&sIP*=e(t`_x*XJ58*afQ9($4R;txOmv?d4|6RuD|n6SV`BK*fQ94(MEGzZmk zO@RzVp^IS+@URi$foDsddVFrt_3W!}YGzDn!Cm4Dw8t}_g7-A8fG2MSo$⪚r4#7 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 literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth b/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth new file mode 100644 index 0000000..61cb752 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth @@ -0,0 +1 @@ +./setuptools-40.8.0-py3.8.egg diff --git a/submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 b/submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 new file mode 100644 index 0000000..7e51fde --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 @@ -0,0 +1,375 @@ +<# +.Synopsis +Activate a Python virtual environment for the current Powershell session. + +.Description +Pushes the python executable for a virtual environment to the front of the +$Env:PATH environment variable and sets the prompt to signify that you are +in a Python virtual environment. Makes use of the command line switches as +well as the `pyvenv.cfg` file values present in the virtual environment. + +.Parameter VenvDir +Path to the directory that contains the virtual environment to activate. The +default value for this is the parent of the directory that the Activate.ps1 +script is located within. + +.Parameter Prompt +The prompt prefix to display when this virtual environment is activated. By +default, this prompt is the name of the virtual environment folder (VenvDir) +surrounded by parentheses and followed by a single space (ie. '(.venv) '). + +.Example +Activate.ps1 +Activates the Python virtual environment that contains the Activate.ps1 script. + +.Example +Activate.ps1 -Verbose +Activates the Python virtual environment that contains the Activate.ps1 script, +and shows extra information about the activation as it executes. + +.Example +Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv +Activates the Python virtual environment located in the specified location. + +.Example +Activate.ps1 -Prompt "MyPython" +Activates the Python virtual environment that contains the Activate.ps1 script, +and prefixes the current prompt with the specified string (surrounded in +parentheses) while the virtual environment is active. + + +#> +Param( + [Parameter(Mandatory = $false)] + [String] + $VenvDir, + [Parameter(Mandatory = $false)] + [String] + $Prompt +) + +<# Function declarations --------------------------------------------------- #> + +<# +.Synopsis +Remove all shell session elements added by the Activate script, including the +addition of the virtual environment's Python executable from the beginning of +the PATH variable. + +.Parameter NonDestructive +If present, do not remove this function from the global namespace for the +session. + +#> +function global:deactivate ([switch]$NonDestructive) { + # Revert to original values + + # The prior prompt: + if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { + Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt + Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT + } + + # The prior PYTHONHOME: + if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { + Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME + Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME + } + + # The prior PATH: + if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { + Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH + Remove-Item -Path Env:_OLD_VIRTUAL_PATH + } + + # Just remove the VIRTUAL_ENV altogether: + if (Test-Path -Path Env:VIRTUAL_ENV) { + Remove-Item -Path env:VIRTUAL_ENV + } + + # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: + if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { + Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force + } + + # Leave deactivate function in the global namespace if requested: + if (-not $NonDestructive) { + Remove-Item -Path function:deactivate + } +} + +<# +.Description +Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the +given folder, and returns them in a map. + +For each line in the pyvenv.cfg file, if that line can be parsed into exactly +two strings separated by `=` (with any amount of whitespace surrounding the =) +then it is considered a `key = value` line. The left hand string is the key, +the right hand is the value. + +If the value starts with a `'` or a `"` then the first and last character is +stripped from the value before being captured. + +.Parameter ConfigDir +Path to the directory that contains the `pyvenv.cfg` file. +#> +function Get-PyVenvConfig( + [String] + $ConfigDir +) { + Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" + + # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). + $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue + + # An empty map will be returned if no config file is found. + $pyvenvConfig = @{ } + + if ($pyvenvConfigPath) { + + Write-Verbose "File exists, parse `key = value` lines" + $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath + + $pyvenvConfigContent | ForEach-Object { + $keyval = $PSItem -split "\s*=\s*", 2 + if ($keyval[0] -and $keyval[1]) { + $val = $keyval[1] + + # Remove extraneous quotations around a string value. + if ("'""".Contains($val.Substring(0,1))) { + $val = $val.Substring(1, $val.Length - 2) + } + + $pyvenvConfig[$keyval[0]] = $val + Write-Verbose "Adding Key: '$($keyval[0])'='$val'" + } + } + } + return $pyvenvConfig +} + + +<# Begin Activate script --------------------------------------------------- #> + +# Determine the containing directory of this script +$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition +$VenvExecDir = Get-Item -Path $VenvExecPath + +Write-Verbose "Activation script is located in path: '$VenvExecPath'" +Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" +Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" + +# Set values required in priority: CmdLine, ConfigFile, Default +# First, get the location of the virtual environment, it might not be +# VenvExecDir if specified on the command line. +if ($VenvDir) { + Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" +} else { + Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." + $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") + $VenvDir = $VenvDir.Insert($VenvDir.Length, "/") + Write-Verbose "VenvDir=$VenvDir" +} + +# Next, read the `pyvenv.cfg` file to determine any required value such +# as `prompt`. +$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir + +# Next, set the prompt from the command line, or the config file, or +# just use the name of the virtual environment folder. +if ($Prompt) { + Write-Verbose "Prompt specified as argument, using '$Prompt'" +} else { + Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" + if ($pyvenvCfg -and $pyvenvCfg['prompt']) { + Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" + $Prompt = $pyvenvCfg['prompt']; + } + else { + Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" + Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" + $Prompt = Split-Path -Path $venvDir -Leaf + } +} + +Write-Verbose "Prompt = '$Prompt'" +Write-Verbose "VenvDir='$VenvDir'" + +# Deactivate any currently active virtual environment, but leave the +# deactivate function in place. +deactivate -nondestructive + +# Now set the environment variable VIRTUAL_ENV, used by many tools to determine +# that there is an activated venv. +$env:VIRTUAL_ENV = $VenvDir + +if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { + + Write-Verbose "Setting prompt to '$Prompt'" + + # Set the prompt to include the env name + # Make sure _OLD_VIRTUAL_PROMPT is global + function global:_OLD_VIRTUAL_PROMPT { "" } + Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT + New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt + + function global:prompt { + Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " + _OLD_VIRTUAL_PROMPT + } +} + +# Clear PYTHONHOME +if (Test-Path -Path Env:PYTHONHOME) { + Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME + Remove-Item -Path Env:PYTHONHOME +} + +# Add the venv to the PATH +Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH +$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" + +# SIG # Begin signature block +# MIIaVgYJKoZIhvcNAQcCoIIaRzCCGkMCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDq2sTPEIJ8JE5n +# msRhacE7nmlm6ccumO/BwpdDqNYl5KCCFBgwggPuMIIDV6ADAgECAhB+k+v7fMZO +# WepLmnfUBvw7MA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJaQTEVMBMGA1UE +# CBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52aWxsZTEPMA0GA1UEChMG +# VGhhd3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0GA1UEAxMW +# VGhhd3RlIFRpbWVzdGFtcGluZyBDQTAeFw0xMjEyMjEwMDAwMDBaFw0yMDEyMzAy +# MzU5NTlaMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh +# dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD +# QSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsayzSVRLlxwS +# CtgleZEiVypv3LgmxENza8K/LlBa+xTCdo5DASVDtKHiRfTot3vDdMwi17SUAAL3 +# Te2/tLdEJGvNX0U70UTOQxJzF4KLabQry5kerHIbJk1xH7Ex3ftRYQJTpqr1SSwF +# eEWlL4nO55nn/oziVz89xpLcSvh7M+R5CvvwdYhBnP/FA1GZqtdsn5Nph2Upg4XC +# YBTEyMk7FNrAgfAfDXTekiKryvf7dHwn5vdKG3+nw54trorqpuaqJxZ9YfeYcRG8 +# 4lChS+Vd+uUOpyyfqmUg09iW6Mh8pU5IRP8Z4kQHkgvXaISAXWp4ZEXNYEZ+VMET +# fMV58cnBcQIDAQABo4H6MIH3MB0GA1UdDgQWBBRfmvVuXMzMdJrU3X3vP9vsTIAu +# 3TAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0 +# ZS5jb20wEgYDVR0TAQH/BAgwBgEB/wIBADA/BgNVHR8EODA2MDSgMqAwhi5odHRw +# Oi8vY3JsLnRoYXd0ZS5jb20vVGhhd3RlVGltZXN0YW1waW5nQ0EuY3JsMBMGA1Ud +# JQQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIBBjAoBgNVHREEITAfpB0wGzEZ +# MBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMTANBgkqhkiG9w0BAQUFAAOBgQADCZuP +# ee9/WTCq72i1+uMJHbtPggZdN1+mUp8WjeockglEbvVt61h8MOj5aY0jcwsSb0ep +# rjkR+Cqxm7Aaw47rWZYArc4MTbLQMaYIXCp6/OJ6HVdMqGUY6XlAYiWWbsfHN2qD +# IQiOQerd2Vc/HXdJhyoWBl6mOGoiEqNRGYN+tjCCBKMwggOLoAMCAQICEA7P9DjI +# /r81bgTYapgbGlAwDQYJKoZIhvcNAQEFBQAwXjELMAkGA1UEBhMCVVMxHTAbBgNV +# BAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1l +# IFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIwHhcNMTIxMDE4MDAwMDAwWhcNMjAx +# MjI5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29y +# cG9yYXRpb24xNDAyBgNVBAMTK1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2Vydmlj +# ZXMgU2lnbmVyIC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi +# Yws5RLi7I6dESbsO/6HwYQpTk7CY260sD0rFbv+GPFNVDxXOBD8r/amWltm+YXkL +# W8lMhnbl4ENLIpXuwitDwZ/YaLSOQE/uhTi5EcUj8mRY8BUyb05Xoa6IpALXKh7N +# S+HdY9UXiTJbsF6ZWqidKFAOF+6W22E7RVEdzxJWC5JH/Kuu9mY9R6xwcueS51/N +# ELnEg2SUGb0lgOHo0iKl0LoCeqF3k1tlw+4XdLxBhircCEyMkoyRLZ53RB9o1qh0 +# d9sOWzKLVoszvdljyEmdOsXF6jML0vGjG/SLvtmzV4s73gSneiKyJK4ux3DFvk6D +# Jgj7C72pT5kI4RAocqrNAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAAMBYGA1Ud +# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBzBggrBgEFBQcBAQRn +# MGUwKgYIKwYBBQUHMAGGHmh0dHA6Ly90cy1vY3NwLndzLnN5bWFudGVjLmNvbTA3 +# BggrBgEFBQcwAoYraHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5jb20vdHNzLWNh +# LWcyLmNlcjA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vdHMtY3JsLndzLnN5bWFu +# dGVjLmNvbS90c3MtY2EtZzIuY3JsMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBU +# aW1lU3RhbXAtMjA0OC0yMB0GA1UdDgQWBBRGxmmjDkoUHtVM2lJjFz9eNrwN5jAf +# BgNVHSMEGDAWgBRfmvVuXMzMdJrU3X3vP9vsTIAu3TANBgkqhkiG9w0BAQUFAAOC +# AQEAeDu0kSoATPCPYjA3eKOEJwdvGLLeJdyg1JQDqoZOJZ+aQAMc3c7jecshaAba +# tjK0bb/0LCZjM+RJZG0N5sNnDvcFpDVsfIkWxumy37Lp3SDGcQ/NlXTctlzevTcf +# Q3jmeLXNKAQgo6rxS8SIKZEOgNER/N1cdm5PXg5FRkFuDbDqOJqxOtoJcRD8HHm0 +# gHusafT9nLYMFivxf1sJPZtb4hbKE4FtAC44DagpjyzhsvRaqQGvFZwsL0kb2yK7 +# w/54lFHDhrGCiF3wPbRRoXkzKy57udwgCRNx62oZW8/opTBXLIlJP7nPf8m/PiJo +# Y1OavWl0rMUdPH+S4MO8HNgEdTCCBTAwggQYoAMCAQICEAQJGBtf1btmdVNDtW+V +# UAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD +# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGln +# aUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAy +# MjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +# MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hB +# MiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQAD +# ggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtFmbE620T1f+Wondsy13Hq +# dp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funRZ9PG+yknx9N7I5TkkSOW +# kHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPpiCwgla4cSocI3wz14k1g +# GL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRXu0q16XTmK/5sy350OTYN +# kO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIPEvTFjg/BougsUfdzvL2F +# sWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEAAaOCAc0wggHJMBIGA1Ud +# EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF +# BwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln +# aWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j +# b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4MDqgOKA2 +# hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 +# Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB +# c3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYKYIZIAYb9bAACBDAqMCgG +# CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAoGCGCGSAGG +# /WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAfBgNVHSMEGDAWgBRF +# 66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsFAAOCAQEAPuwNWiSz8yLR +# FcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrfIFU3sOH20ZJ1D1G0bqWO +# WuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+QsRsHDpEV+7qvtVHCjSSu +# JMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wgXNlxsQyPu6j4xRJon89A +# y0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0ZGuy62ZD2rOwjNXpDd32 +# ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6EpQYhS6SkepobEQysmah +# 5xikmmRR7zCCBkcwggUvoAMCAQICEAM+1e2gZdG4yR38+Spsm9gwDQYJKoZIhvcN +# AQELBQAwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG +# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBB +# c3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTAeFw0xODEyMTgwMDAwMDBaFw0yMTEy +# MjIxMjAwMDBaMIGDMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTmV3IEhhbXBzaGly +# ZTESMBAGA1UEBxMJV29sZmVib3JvMSMwIQYDVQQKExpQeXRob24gU29mdHdhcmUg +# Rm91bmRhdGlvbjEjMCEGA1UEAxMaUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24w +# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqvaRLsnW5buglHGWx2sRM +# CMpqt+gflMjw9ZJPphvbE+ig/u8dPiJpVfIvkvN7V/ncnDrtKn67nbh8ld/fSodW +# IRbG6bLZFYbSdyJTZ36YyrOOVoBZJk0XS7hFy/IMmiQRXRFQ6ojkIbnM8jdb25Do +# uJSTccJhbqSkfXvsDlPenD8+jw7woSskafVqdqq0ggKr33JLGsxp3/aE8wFF/o11 +# qHt/sc+fWCRJJMCh6PK6oXmH4HSojj4krn5Uu/Prn1VNsBYmxhqSTFnFVZikW/gp +# 5BJLCijQPMy+YRGxPM29UExaG706uIk2D5B8WZ/3rNVO73dxn6vvEyltfJ8g4YqE +# cxpG5nyKG5YjHeAj1YcMVfp8EpHz4eWF2RqIERYixdGjL4RBTIrvNSz4Wo6jaxFi +# 21uzwxMX1gMoVnDI+Of1af6AsZ3k1QRXI28P1BUYES03u/Hztt24lQHwXgPKUSwy +# 1lN+PD9q7oCY6ead4rlRypIm7BHJloY2TvLeqPTq63H4dNOoeCL3vlSnF/KvACqS +# i+hkRYFVKm+S7w9WGQFdwuY17owQeUWJoyiIAMB4qZflEVGQ35WuZgZODjNqPF90 +# d4hjxO8t/jy1N+adAl33yB4lC//TU1TL8XG7CoC5ORp7Pk2XUvE/QKlMeGCHM7gV +# EPiK1PbCpOHiOmiPD1BmewIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK +# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFPwqv37Uvqzzgpykz3siATu4jwfyMA4G +# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg +# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx +# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl +# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC +# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG +# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t +# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl +# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN +# BgkqhkiG9w0BAQsFAAOCAQEAS3WhLbVfRrGJp8+PJj6+ViqNYq5S79gW5hYgSrqJ +# FFoVps0OGP1EEVAX9omITmaytAQ58APr/qBVIf3WVlYGqDo0R4b1P1JduIA+8n0I +# RYWx2RdSuNtaG8Ke5nuSpS5TkEC6YjVBFuliBkvdQD6JleSaNsaHWWfytSFYjFsF +# gvhKDaeqkHjinsJQViQ+P8xvBTaC8FXaleOPlZqyShm2wAIy/mDjYE2hUuhECL56 +# /qzTs8634m0dEibzuVPK5zzCHSzBM9TCSwpstTVl2P0Kmq3Nee5UTTDnR7Em9FIr +# dW3iD7S+KCkjeo+YN2mR/37gy/LRcw1yqu2HDbRH4+QiUzGCBZQwggWQAgEBMIGG +# MHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT +# EHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJl +# ZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEAM+1e2gZdG4yR38+Spsm9gwDQYJYIZIAWUD +# BAIBBQCggdAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB +# CzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIDwkNFE0J7lFqDFWlO8g +# a0Vg8TqicqZe2fbuhTmOCdCDMGQGCisGAQQBgjcCAQwxVjBUoFKAUABCAHUAaQBs +# AHQAOgAgAFIAZQBsAGUAYQBzAGUAXwBtAGEAcwB0AGUAcgBfAHYAMwAuADgALgAw +# AF8AMgAwADEAOQAxADAAMQA0AC4AMAAyMA0GCSqGSIb3DQEBAQUABIICAJVRHHyG +# aSg/QAce2Gk2vae47EiAxljo70Tygvew++CoLy67kRcb03qFNxlfcO033TA7muKF +# IbRaEU2o8gIWArJmPZmMfmSB0vF+YzISbWEWBGJuHOEeNuCQIR2DRziWvmrfdwdo +# dNpoUnD6M/i8pI5asDc6BxyR33WCrH2xNJlXDg8XGuG7df+nymqXucGwydAB6DoB +# +QbIjnRMr1ZCFtWsetCKRX2zS4tKQxFmB7cOjsWKsilC1fgDf7/YGoPlrvaPuVpR +# i1OzhsZksi0M2os3S3NDa0Dsdc+pg8+tZrk3F7az4dskqrbv5++3o7xYv3c63Z33 +# dExvW6Jm6YexPE82gZnfGhtnt0shk8ga+JJkaE7/QBxVsUSHZHBZsXgZsLz6p6NO +# YsYgMQJoIb1Z7gxHrOIOto/7fvVYdkcHKTZ7OWcmzd5lvwn47cX0ElfEeiseR/K6 +# dVM2y7NMMyz33Aa2arGDIatrudFpCuop/Tk/PxqpiA99MkcUKOMPNs5RXpeR+VyJ +# ncR8Wktx9PtQKzbK9VVAg/iw5l0PDgvn9pIBLNKFxj/nAF+KNYVV4IyyCnseFMMT +# LetKz0LN+NhvUrHsq9NFwxMW3TCUUUqSdPTTOHnzmwVdLynqNsMd+Dx39qKADPBd +# i6Q1XEluhGhdxrRCo9xnF6orI37ozzVMYFSOoYICCzCCAgcGCSqGSIb3DQEJBjGC +# AfgwggH0AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENv +# cnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZp +# Y2VzIENBIC0gRzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBdMBgGCSqG +# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE5MTAxNDE5NDEx +# MVowIwYJKoZIhvcNAQkEMRYEFIMEvvUpkO4r3hcHdhB8ezxwvYT3MA0GCSqGSIb3 +# DQEBAQUABIIBAG6a8VUP727ARM++rUjHHi5e4yk8drKTw10/4pUNOI0PtNY1vpc8 +# XFssjutk/kiVCAzA96cZfoB14N3vTzgMhvg9KlxqWFlJyBR6vVI/1uXypfBWD6rY +# CiTWZjRvNWqGsY4yPmGv5t4hHdcMwz4pSXCgSNCzlPwAK5tZT1DVXZt/MS5tieHF +# PNw2phbMYyvFOrkQrtLF0bjBY0sWd+ABRnw9Ng3cu6IE42kqVqrCl4l/RF90hcTd +# V9TQOc9vYgbsuwDI7VILxI3WruqQhbhIj5KGb3N8qWayeNpAj2A16Pt4TIR9lTj/ +# T2hLH+2yqwga3KDkVcxVwxIibAYHjZkdCfE= +# SIG # End signature block diff --git a/submissions/k17pine/data_structures/venv/Scripts/activate b/submissions/k17pine/data_structures/venv/Scripts/activate new file mode 100644 index 0000000..4f1c24c --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/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="D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/Scripts:$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(venv) " != x ] ; then + PS1="(venv) ${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/submissions/k17pine/data_structures/venv/Scripts/activate.bat b/submissions/k17pine/data_structures/venv/Scripts/activate.bat new file mode 100644 index 0000000..6f09370 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/activate.bat @@ -0,0 +1,33 @@ +@echo off + +rem This file is UTF-8 encoded, so we need to update the current code page while executing it +for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( + set _OLD_CODEPAGE=%%a +) +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" 65001 > nul +) + +set VIRTUAL_ENV=D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv + +if not defined PROMPT set PROMPT=$P$G + +if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% +if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% + +set _OLD_VIRTUAL_PROMPT=%PROMPT% +set PROMPT=(venv) %PROMPT% + +if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% +set PYTHONHOME= + +if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% +if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% + +set PATH=%VIRTUAL_ENV%\Scripts;%PATH% + +:END +if defined _OLD_CODEPAGE ( + "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul + set _OLD_CODEPAGE= +) diff --git a/submissions/k17pine/data_structures/venv/Scripts/deactivate.bat b/submissions/k17pine/data_structures/venv/Scripts/deactivate.bat new file mode 100644 index 0000000..1205c61 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/deactivate.bat @@ -0,0 +1,21 @@ +@echo off + +if defined _OLD_VIRTUAL_PROMPT ( + set "PROMPT=%_OLD_VIRTUAL_PROMPT%" +) +set _OLD_VIRTUAL_PROMPT= + +if defined _OLD_VIRTUAL_PYTHONHOME ( + set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" + set _OLD_VIRTUAL_PYTHONHOME= +) + +if defined _OLD_VIRTUAL_PATH ( + set "PATH=%_OLD_VIRTUAL_PATH%" +) + +set _OLD_VIRTUAL_PATH= + +set VIRTUAL_ENV= + +:END diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py new file mode 100644 index 0000000..1700fd5 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py @@ -0,0 +1,12 @@ +#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install-3.8' +__requires__ = 'setuptools==40.8.0' +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('setuptools==40.8.0', 'console_scripts', 'easy_install-3.8')() + ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 zcmeFae|%KMxj%k3yGc&ShO@v10t8qfC>m5WpovRhA=wa=z=p_%6%z1@blsvwI0vv2 zNIY4alVK~j)mwY3trY!Sy|tffZ$+^cObBMdpZutbN^PuECoa`kXb2K>zVBzw<_Fq) zU-$d^{_*|%@qt&)nVIv<%rnnC&oeX6JTqHy>n_PINs<G9rYTAL@TPx0@%--}9r!$a z((i^#&t<$Zd7o|Z8<TGd-?_=NVdM9{v+=gOJh$I=_ub!9J^yrvXQOtv=gzx5rAw<k zcYSZ|9am>%4a-Xw9jfY!Ot@}WQUBkK=MqH|Mf{(O%J6=?F0E)R-u5-_q9XB5EmFjL zRMB1HZ7a&fd)b}0hpCKjVjS>G(qfxk>Uow`_J8Y;?6yo>h9td;lqFW`r_=Cu;je?@ zJ}aCeNvRaYzy7!6vsuJK8t7Ip04X137Vm)<B}y|cNYZo>`v3N5I`@q}=|CK){8#_3 zR`1xV;$zJbJP0ppD|Paae;!F%bM?lxx2d-wfQV@O6ujTW-;jSkRCTolCLPMh2Nx=) zGP{NVA?TB&mP=FqZ|whc3RJSvJUJGyHOs!nBie<k<-z=e)r`kVud+vM0lsONB<Y9b z0<+))qcqReE=`GTutop6y*iN=`x&*3EzZknc4W?3rP&uIJaeXK<D%wvS9N4nkT;0D zPW$-+vpsE9St6ytWVaCXsHU`%GVdR^wE=Xv01fto0vp%r_OvPOWj3j{W@V_Y;fxbp zySskme5v4&(U>PA7G%%m<=|b-UJ~!-boN$bi#jT{Hcy&A=Niq?KHpr`Y-?=MzKk{I zIl-)f*v>o`q`5M7OP+gKtTfLZsOCS(qPDr~x8=!_5`6-VLD0EMY5XaI$Uqq@V-Jap zR-V}6Ja=V~*CHdz@F4Rb<?;{KZ*yd>ij_JtwPEG;g{#zT!Uq*Py$3gDv`Z2tYF|X8 zYEi!^3#I2mi!9?8K!AuX>_C;=ltI=m5eE7*@I4UZ&p}=3ho&bc^h3P|C;`K|s)PJt z@!8GLOb})@Yp*SMou>fLhC@WZw%7ar>1Sm0aW&hPm&@Wqv5z<cJW4gM&zmkfJJ+a@ zj6&r=dVrlbR^{dLe--p{MqAX8%7LY}g_XQXq&T82+UL#6!luP}xs6BE?<fb3E#r6f ze^S%+ZFw$9UEExnmrHC?k~jf28Qa}v(?%Aw6cJb9i=;f%LL7GNV)O&mRYm+WAK2)J zoc6N?AE0A$CG}^`sG(_iS>i_&0GwOEjRhPMrYB*+WA64e$@ELiFO?ay?gvgcC<n$Y z<L^1CK%h$vSZG@q;PL(x?eqG1V1nyS(*z5;SA+M!_HB5xgCaCQzioLANgKIa^30b| zP)0-wnAuW?PuhpB1D*9VD+*d7r2(|XN$tU(8-F?I^V~ojiGY&$x^&Sr^ySP^J_*UW zrARijT__0kuL5&8h*xu#MI`axM$bS5AWndQ;JM+aKJrO?BE}`X#TVcgz$PT9E&8Dq zZ6JXIg6WKy%Zx0-)XbKtWRx0n<OM3tY=>1!dbl2?B=#{!9_2$Llg!~3%n@58CG`RW z1LPlkk=p2eFSa3N`&F?g@~A1mHitQyVq0yNK4^CN8joui^5gTpuf^0f+qMtEYVL?F z$fu`~#PaZA)VQ4Amx;XbZ%EJqQT~UlXZwx7HHW!>vn=MgCVU7v0(=qWSe%!~9KS(N zgLM=3LHzO$mU+*{wx!#)wXd#auhgvU=lF&*IVnT+hZ`~0nCHPOETKA3I;S!sQ8$^{ zZcv4UbEsTEpxvZ3yazYCQD1%G)vA+(ndH~oy5$RmDNA{h9?j)8QlvdBd-|V!63d!_ zr{P-1vS(7D+|itM9Rk61MnI<ijY!Ly%7^jv=YUlg`cLmOwOJ@HClJm79G^?wO8q+) z2vf7m?6nYbY6S#*GNiuY5H+x^+G@?tJP#TL9re>+K~KhBa?C)KKh+E*p-K?e54p;H z-uNb0vkbWyR)1lbnp%G$OG`vjpo}PU*o}&pp;`PEODluTuiNcFBFmELneD_AsyG+G zkGm*r)oMJHmxrXL#=Plxfj%;6&nXBm<I#%{teK#)2aU^vKFj+G2|d8ZfX<DYT4pfZ zfo|^HD@jrnxXrnoJ(D*BEsHtwkuBFp`spvA2GpIQLK~G_Fij)vWt2{I(c2x~KW)!t zCOE{y+%GQUQ^og%kazlaaoZ=NV(uK8O?>)d`#6i)km>UtDzrb-*V{hPU&@;WB&3=+ zxL1-^s(vuM%+x$5wc!b>TMmX_2j=|8Kt*)b-4;r#_ff_ny|oEKpX@DE=!THWD9l;8 zEWjV=HO&BTAtLP*tp;IMlM0_Vn8(sUqI$?Nv_U1G^tEZC@of=jxa%BH_{Ai!MYo}y zE@)vjviC#f;TCVZ=HXtX$EDFgCrJNz+eAX#tsgc!-#{X?u;vu7>K}|6xr+Y+O$ixV zZ+D5)r){a?S581&?=jW!dQYD^njLNZDwQ49Kbq9~QJUTP@Z(p`mlCNjK7uj2dw$*y z?Fs@NOQ3Fcxb;G+-Z81QBhBuJS%CWlpf9gp&E>m+$xzI$NMcrT+APveYg4QEVhkj# zC+2qrf~MxI;{Q2Zk_`Xps%rkG7-Dkc{@y;QZ4Oz0#y`#fgd*BZP3DWK6>a+@*L<mM zcZ+wv6pXlQp*qv|N$8nGnzy|!owe_wFT`9w_5eJz=cRm7?ApYLBWTQ~Z~Xh0d`OLq zTT$CqaQsCoH<7xV;0<Sr-s;g0IvOs}L}lA&k-l0$xByYj4z~8BGDno!&c4z=oz(hi z8grx*iDYlPN`q&LaV@ehXt=Ne8MeK-x}c@DjsM$J%twl6LU~JSD&H^}!^3Q<i@!_g zv@vrzI}>D@EZXPo+Bl`5Zw>0+GLF5OFNogis^p(SM>i~SO7+N+7^b&-f@XG3hYwRL zs{rPg^&WTKXuZW1;J*Vf^E(^LEqH+VoqCH0;~Qle%pqFtZQVGjSX7wPu*PZbFwOi{ zG*lGy6QCZdX|wX?4#`^~>lfT8wQf{0k4{L2{|oR+{f=JfFn@0V9WOeR5QLU=M!U6~ zB7d(sir<zi(J(xWuRwrR^cpgzK1ceMKSTyn=7h94qQ})c3tBJ-kufbC-S8FZ{*A-+ z;wE$p2;6zcG#Z^Q=wCTDUVHvM{Uf{T%s<wYuE%Y9r%meyA9u+1R(iScdR70ky|pt% zO*{K56g<p=`;6dF!Rj_V9Z4Kex3fBWL}~ny1nH|{??HFC&$rtV!@%g$GEs~YjUt-3 zyg5y8xAoVl=3`2GjRmRwg}nzj?Kb^myE<wR3=lWy37hs;ROnh+ySnXsoC;P)_ZOlx zK7zQFs(oe^qFNu3t$Ssyg|9J2k2}y#^%uW0`}(%CH2YD#%Pcs^MniW#E!k`h>Z!)# z>Ws#2b>jJh;6zDv(pxgML&lgyPQ#zcbb!!sgpiDoqu{tG6%!Ja>nvz7KufAa>qaA# z=oV|HC9oE}Y-%~C<~B7KIy+)gcYDw!`k|a8<5gBx6?_n^Hfnl`YGk#JRXDw`Y3W5Z zF72K~Dqd=&sK!kRIocXZ$WcQ@HMx}F(UwwzM=dX^$<yW*)lApsLU0ONe1#L$wDK}< z+m`P7xi@OFy|1a`^g5Sax&QBIL?i`BM9fM)?J~l{Rc2^%VhrUz829&peWXrWCnHlz z(^x9cG-`TL;&SCcT7aJf@*!}hy(}@hIc?50YSx@pYQ~(aH5qypGnehQvcielAG{aU zX~0_@&*J%hxyYZhxenZpYC#MBj39u^sFM>J%<uNLp{5+>??vDyuV3EiM+4QdBA;io zzdv6tSFL<#t<s2TfRwNG7HQKrPlW>QrIPdbG7F+JhObn}j(kln(mY$%K{!!5k#)1E ziz+3WTCrR!=CNXVR%|-O_{kh9N!CV3M%Px+KVv3eg)|H^tUYmMQB9Bbm&lY5<g+!A z3q(W{bNLa7G-%8GR2a%BXjxsm@<>uSRpgw1Z~T#cB&t&nSAs!Ug_}|kVHMz$WCS?l zqwD<1@hy6X9b^#7A}+?pyqY#|7U^Uy<!oE$R#G6OIHC7~?928tC#m||`Rwb!vt=?X zUvCU&<zZuqgAMm)Z5TgaQb)3^o#QYflyA_|`O&KZm&VE*-qc-V@o_Xmrh)G=FTI?~ zaUiwZw;@Gy>*X6#P>C%ujL9h3=b(@6wKWGF78?2)w89yy=;G^09Q<ASzGu)Qw(X;0 z{;ohoCMo#dETWJz;bQfN@r_l;$_tKiy+f|A>y^}WR?(y1w&Cj}$@F5L2YsfEL<3pY z8Z-dF^8sAbhP4Aqi=v(obhDs>e#QftDyng66L`)T%)98HH5&8BF<Y>v2#E?5hTb_9 zH2mD~chFE=MQHmw0&)Lo6u2YqKeGV1@zG*g<1#Bwv#zb_%-_+JlMrxKd<~ir3Ze1+ zy(_eP6{~SYKhV+(S~~v~1yt)79UHaSeZ5h0^WBheRNU;+TO4|;1L|kljg`GxMRVY5 zgy-B?`L%XKbD$65%Wkaf(<V0uOoUxGf)z4#f3Kscu6N_X#60DBpQ${*$V`+W)Q3=C zVh%!IBlLCRI)r)=>P<|yYD*~1E|lWFafIgb%{TqMMK!$}&wwd`weq~AJfD%@n)sU_ zUiHfyy0+TP&cgr)(wf;G1RCO$+F-8vOp><HO7p|jNn-Q6t|xsd^WT9I=Ikc$B){h> zOt(p4nn%&aNx*RFpHZMF4f(Ufvk=7?JRPMYo=R06O@dN!hp9(J{WAdZdPL@b!%!G% zLqHJ$fo+g=B{EqW3P?d+m=J67#;*QZ08JwbS`rFm!NrD0j{xSFfN^d-(+{H;KZnVO zq>c^Kn`akV>TQ^)nUX?$=?!SjnvZ-^xEv3@Td*3+ToB$GLi`Q1f1eLu;*Pvh0=OLj zdhtFgHl&UZQ-JSB8KgFySnsCLa+gvITEM<JVb|Z0=_NNbv&@H6(`bHB@Igt@ghI@c zl*U&;NMph*gq!`YU((D;uXAEi{}>T?_A^wxGy~aKk5P9rYN}h!*-ueoBA*hw4DFOr zciPZ8^v@j#d(UsI=5c%~N>l%e$W7+;ycJQ_!+(R9k!HS|Ec90*HCfot5kX%T)t%N- zi~Jqxa4NIzB;-ca!0JvWei7b)=I>ieG+2$PYbd;x;wr_LQoMggi&;CG;F7fIhG-(% zJ!c$nrEc$qdPCdkvnu1mRQk}y|2ztlU(w@aFd)D-lsL#-NVQSwulrLY!m_|0v*K-t zB7y%f8D%CG3s<7iT|s_@7ZVu%+>P|Sc?3OwD#DH8xgHD=<f-VsApaaa9sX=8nv;#Z z`k}l%#O<|7rBhsro=L%+c2xoT1-LwYZBh#O<!BUXr-(Z|lREpYkzkpMTP0~-Q7W02 zwZh$V@M_pc5wh%Sm%o^4qt8t_^m(klPsMxqW>>+Hq9%@@@^GtBaXR79?>LQ?^WZ#C z2`ni`a{1lFpInCsiUb$05edblZ^2mnBP=hXEp>8aJojRG7BaJEcKD<{j}yzhTP#U? z=Aa#XBtim8=Gg?r4Uj`5WN-&1pw{2h8%&)Z;9p{i7uubJoO^Qd2$-{7c$u@ERF>y& zqN~6wdfjPB!z|)D^aBs!k+_=q&oG%~7!{|m@ca2}v;&KPJ2>;78Umj~@P&9JSqLha zzlFYP<2&bKzVZaVB-Mc?2YHnu!LA|`O$fbh{3s#N;_-HA4$=p_MZ|rGufc4|OmzUu z^JPvljA~1&s$+Aa<w()zNx!G<0L@dyGr)f#BOMeS6)ST`QZT9-X)BDf9E^O4EH=;B zE*o==+8m?Sfptj=P=j*yt%Pm3WkA!^$&z|GbdnQQQMu~aAXl=XRo6Mq&w=2&97(@S z($~pS2zk2aJAG=JelIfRnTs4-Gueoy6w{_W-;!`D2U;p&H9!}KX!)wyGt%13G>Z>O zBaXr}qS-H-6;8gFl+j!hB|&HG__QCH?uAZY6+qd0>UH`KS<+@;OtPgV@|*2uh0NaK zb;wtOjM^yvHpr<LUa2YUt!L-)wNxOQvg7UAl}UBoaAs>tzb)z&!{3Y1&uQu2YF0;6 z-&pJkNPw~TIeP9tMbGFy@$3@M*Ts{I=TY%&5zoVT@~P)d6APo+yaISwqj*6}fd26l zSTkcVuiyVH03~%8i#~&ZzGlPMWCA!0Gf#IJR{FI;?gP_@en$)RA<KPQ>9elZzErW? z-z!$}DeP6T*8k_BYkgYiUq~IY)=yyvyM1}}O7uIRM!^y9drD&sLd~O$*hyeu#5%<D zB|MuR{sPa&<4WTs;8UXSCjiNK>=0hc&P=2=ADrQtvtr8#<-kGZK>Z2~i+YDr(2b== zcR`DCps{r;k|OD?J&uqOeF)jSt;!F64YPom7yZ+9fQ}L6K;B(=8G8lk_6m~j6~x@z zCDMtQotu#j_2}HA-lTK8dcDqNby|73nvIwet;T0PM(}dy%>!Xa=e&Wit+N2(1_4tK zJ>Ho&@F}G;2jTj!uGD5=No4gi+tKUoGxifUO6&p|zC}*Q`Nt@!^HZd-C<VXUGE6z} zYOGW~YKVB}>-c2srIvNJB1pwv_RV7Hs}lRAC|1y*^It@P6dqcjDCIs;$|7}n{a0bN zwEnC0YEJ!ETa@VSNVnP}A=G&bfqB<!qf3&BkW{O;I*ahh!r#?-)j-(OIT_(*`<&~w z3HA5cW@%$e`m=&S$*g^tLCz@<0M`kCCyB^pUPuD`kpR{zjc?QYPNne;dVddtKfN`j zaX-DcDvf*Ty+UdHHQvTv;)Yn1ge#yte=uO|J&YiKVh)%++R_{)&I_qiSd0WOwwE}M zKLJhMY%j5@ZER5*pMVy>1mb=`bXK5zVw9e>%7YwwQE9vvGOqVjDG&Y)-L5pEZIaIC zt1d9l3jE3C<x2EN7|!Ysdg9Sts0z6xi~B92`HDn$#vVI|kHS`EJa!sEBl<X=N~|0e z#G}+#WRvWC64CQfBGXLJSBXA?#3B7;AUgP28#eff33<>jm|E(KL}PG`1?WOK18iyR zr@EEK-#D<=?b9-MKLq7qL@AMpXFN*8q(*e^0F2H-_4k1j+Inw(tI~Km%BD8|oIZZL z3U#LP!ouD_m~3*fC^b0{i;`Lh@J}(6VsVI}X;M5&;!2eyMl~<&Z4!WS0Y`~eMhmOX z*{Fz-wZUowjBH+3?(n{;&a#?E?5n&i88K>u>i%i|!DBr`8qsAZj-fVnlD&ENu7UOj zcr8tPJKsdI-m^h@@FMC~8b8KU@3}+S`I1Qgj`G7<7-#jKJJoyip1alQde8Ti=;Qd- zEqbZmLK{d(>TSv1K-&|`*$o3Y^LH_kih}8`ftlRO=24yNSd>_EospK1t)P)MNSMz5 zMFbXV!)H|iohdPqaK2TlCsdyXsw|yVJM_5R`8Fcji2AR-qupV#6XH@LR3unydzvBM z4f~1F_TbC*c}(zSLwgMXgM4Bpq**9!s9VzD=qH!e1;$?DRCY2k%qp0&7j#pf$VRk@ zJ}vAuqB{{t3Z*G@GUUh<RahMtFhwyjk)sMzr4_lDBo%wm1?Ew<pEzDWl-uxWJxW(S zme6Q9$r7u~*=q@WxCI^x)$b=M|BjXmCLRK`hJZRJi82A?y-FLA>=QH+(oZ~6)oG_G zm7oW8n-SZG)I^@nHz|$JLoI;48x87n8XKNR#<&=^F9+-;eGV0gPPh}0%>uwt*&h7^ zikjIJeH*WM^eCR-1*y{y7<3vkDAAj#<hY}|)uZNEl<988lt+1aVQ<1g!t+y1WES>P zqW!0sNgW>q8t;8)$CzynZ~LYZ=TGX#rStC(HZCa)yTB3evmPy_-~(OswN&RE!Vcqf zp@Gi}J#;B+uy|&hmNr=+9n;P-K_62nm1xV3H2SPw#e|IhbXfof`+6|7-a1piP-HwN z7^H{2zdg+^sM$1pNn(G@e>T6pEQuKCV2I4dULmNrfxpt(oApIA)u1V4mx*V)ZKf|V zchNeer}=!|H??#5LN6WbNlX_CYfykKg_THOR9^_2FTwuZg0(8r_mh$V#aE#VnGn{e zeCl;DfP%p?tggB$k@J+TKa!uwd@4m9VSVvf-3M5SiBUWMu?`fM{}^?u#Rg7oj438} zF(JrR5f9(+cj98FDW)K7zZihT$5@OwgKx%nE3=G6vK4Y@Bde<-Gp$1S)m91meo|RL zn<`b;MO(K26BC3>4jV6|nK2@IAd(jIpM#El1d*~p8E?Q^LTFiSdXY#}J?38eXq6wU zILE&{2PF4XZYiYgP2}og_GW_ZL=T`a(o6hRfQ6D1w{88ns)Va232{Fagx$LRq%S0O zl)0Az+ySZ5pA=~!CT4ui_9ihZH^Qxh#U26>6Z7Hbqn#h2z5ie)Ybiu*0bt+kjg>s@ zjA<Te+x6L%J}EKXCyl?tC*6y`SMYZff1{CJnvdz?E#UyIH1B}!gaNm%H|Bp7#ui@( z%oNtXQp6YWU}CIctPO>{aix*=UiZ)(*qFTw&sY<UCyANuK8K{sX1gzSn6XuE_vK0L zzG=hSeU~9x*zTJ}dxI>C@-?(l4s4*jzOJb5O{H-dahv}rm2DF96vkFyo8F5}t^)$F zZ(9oMi~Bo>vl1%_AO0!k4`R(0WECATr`T9CY<emo<caMP7+pC8BYll5)vw8`??*{r zQwa1doJQE+frH9%)8A24O!>DxmPlhFq~FmY!A0jT?5Z*B+?Z-mztE>vHrpWqH$Nq7 znQ$bS14=<K=P<2<wbKUBCzDz~Nwd$g_PdY~mJ)PknIrr-mL;(=XMopVX(6vP9zl!D zG8t8u=>F3%*>!CDalr@dER`@@Y?!6d@*<PA64UCJIO-D{+shmcuo$LBx>vxe+Ey;C zzAb-8pA`ZV>?nizOJLlY2g_U%w^_#AX+&7PCq<)De2EOb$F4aLln1f;?205wZvaM# zVFVXXgXYER?xJ1UNedWLbhw#43pHVVJOXQCT7oAT1xqP@drH6g1<S->K{s|^C-D8~ zII-`VG_Cp(PnuTk%;)M~Y9hy;0G87Oi^b`fGFXmJv{=-iJc*G;s){U*MNc7w4PZX$ zFG5NYGosTWBeCdAJRx94bOr)R^%*-w;fF~?jmJo-7}k16tTxu|e7FZm>vqP@h}UDJ zMb_<%9ulu7Tg2<vB$|&tC^RDTJ7N`%xTwhn&1g*%jMzDVutmMrtSTNQWXCw9mbgHc zSQk?Rq?y?(K)r~>PMX=bAQTgbqx%Agz--_|=gN^3-U*{nC`=`o*^BWB5aoD5zDc^L zbCPah$}ndW(fDOKfCnSmYs?O0|98q>)A^t1Kmi5fV)^NK<0K|?>Ztkpg{wAx87u#* zeqqFx;gPHrpt<9XQ}|ZXmRbrVBf~@9!{b|~w(2b~o%2V>(ripi+vjs*FBxfV+~`j# zwUV4ks{+SXm<c0&r6KeC5rkopzl66j6a9?+$nen{e9~GIIv0{&3jd(>d9E1#@;j=6 z)uOkr_4gLM5-{%ICcH@ey-Dse{MZBUT1zu282Bo>*21v||3a&=U&8)UQ`x`eDO#(a z$+2t;o8*GowEI!b(%StdRN6V}iP(KElBg`U#9@D{z*)%O`vf>Iabn-XiXWl4ADbAC zbxL$JvcOIfTh5KDUbfOny8snu^oxD!YWTy%94p!42i&pJ2V91~3)1fIfdSdg-sO4d z0#s^?wrun5SjhZ6>?CT{-mI^K=Fel0?4c+GlPClQ3ODjHfx<bfb!|YLTAMfm$~F|; zzUi(GI2jc0gto%WFHCQ)PbR4%le@x}%Msf$Gn>-kp8?Z8kIzIS{LZ2kPIYA1qR0t$ zn7?WzV-v+FcYYJ4Hb@syr5~l=QXFk8m(jW!<oq3}hoUN{(zpzPWU;St4WBx5kz$$J zstdZw%J~Xa)f0lN%jHF>w}53gPr_z=9*MvMv}fS8675hU*yDz=>Qxqp`&p8$PzafG z#m<%=%AZ_k$Zh6-SXSFN%1V}W(ZY$4no;C;s{g~%TEA5qZDWZ>Vk4~|HI(T3pO(1a zDly^=Z=limT__6dNkqF<O)qXlFWR+|h=Y&CAT5mkLH;f(3SopqcV`3xyoaI#cJoZI zim;&G0GtxTkTVqo4z&eA!rAH-<PNvS(l(>HhpOr_vsaOh;YYEgH_}4<XGm>}xWc;# zn?;DgBeLc+Ou7F;1!12zVqb04b$E-(L8Pvlop1dlMR<bP+lzA4QYLl#oVuz6cm(EQ z;W=YB{ik))y=}SxV~#Y-JE9cTiWGBJ8vh#n6tWyja?=(jex4Nl0ne6Hft8KlkV35y z+y&dDCbKdpJ6!*f9e$D*QZ(PwG9*?lf;3mNx%oX9!Dm#%Tj>sXK7|7O2c;w@PH!A` z$}(qT%e{);@wHLrOr+~eoF4r(b2T#R>l_%jYgt>r>5{5}aWNyvNppn~*97@Ca5!n) zRB&u!64`2fsMa0iy>Oxm@QbJ?bpB*$d`r@}3#0zCM9#0Uq@}4Awna{XqNUUrOuWc% zslzKgZj_jgN(3Qdj%SMs)!HOMgJ?$SA5m?n;P?V#d2f=I&$4o7cdM>mQ?y*xMg;gx zgc(g7CW7dRu|;*V=I(Ayq5ilg`3a_A7|!c@Ic8!~S)viH$y!IUBc2WN3Q-Bvj^$c3 z5<sx!+AtAP?XbA>`_KmLmGEEV1Gd_1d=iz5E(t<VUtR&}*5~|vF-8WPHZkV-dpSZz zp_pr!Gxc~5uY<A@^EYRi-j}!SIA#*7YuofZ0ZDU<FPT}zCJ=W74^VFOBqlYZ^z9Ct znpJI{sOCq(3^0R-^me(SFPx2e+bIFLTI}*=5Tu69@DqdIKdD`5F%49^IqMZF*38aD z71(fbhEG!8)PhF}%!TM2><dpIQPFbva~SF(6L|_oSg~2j>p!M007t}T351I#sty)U z+#Si`84w_Buz4?P3V#KB5SPf|6%DG44C5i97KEp0qBcViqnfK8ixAqFYTieA`GW(w zAaRLIV{Rh7ntx26`g<b-#gL;{Hz3<k?DQn<ll%HHt7-aNNgEa5Q|P1E;2FVHjLjkQ z`T-Xxw7Q2{9Y#SISPD$<Tbr+rbgU>ie*R0Z-#Na;r%mD}%<5Jvs_7s90pggwVaNJy z;Gz5ncB#LFXNdQ_W-sV26M91L>)3K<zv8-CZ&&nBu)9dR+1}I*&}Lh1fJ$0Sh=Bu1 zZIV!tHtTQUYHDH4Y44xZ5%^qP#jpQBOzXUV(rydFEg-4H)}rs&NhB^VDy~OgsRcp) zBQj;caunT&@|oX7tBL@ERuek?2okS5fdLs%LT$*NCE(OF3x;97gEqE-ocb9DFl2Q! zgtm63uT#EgNyte@*InzB9Z1=+&_xdqJ!aCwM~?tK*3e@^?B#m2W|4N3p`^dmSjEDp zr5EJ*DeEctDj!a93cWB2&A~*29n=53!&rXK`>HxJ|5fbYYy!?SjKig2`8l{-`R#sJ z{y|JM;N@7?!z#|5{daszTz&pedK?9JQ8F;@qU0|0D_iceAI?7tSL#Z>U6e&#kwgbP zkkbtwSlf+Cu<f@_ncfPo253+zF_re*BqkMOz=e-l@dSF=3tHNe6Mx!NOm-RZ<2n>! z2^i*I1ua#Wv>X0&z_aSn73?s&*dqlVd-T@)W9p>J$FO7ZOZr;Fjpb*IiZ0<kj-=(t z)3frtzZVEN)Zu&;5GEyyDoKyR4}t#_Nqfj|4VZ{Qpi+zi1s_y<&#G{Aa&GbPMOY+9 zMu&t)2l!LwN5#q;zBt0;6CDn2Z&SxMOE<QuqarD*i|U-p1COE7rnIv5v>VIdYQtLL z+vF=8tIkQ-iCW8@Pz=4^uQuJ=>}nca<}1w6IQAlU`d|lyHiM6o3qDTHh2A>nrl2_S zA+q^%P|?VQl|Hvwh66uk?P7j%C%U{@zVS76a{Yy?)f|yCw>|CZvLrN|l>4FS+vXAI zH~1Q@M_VFOIwyh-O%sQD3<-Z4nfz%+pMuT$dA}3f(Y)N<c#Ca<Hc{-Aj|5{d<1iXZ zo-tGXE}|+3jBfS)BafO0JZ&L^nBNGx!%&i(k|jT2v%Ep@)Id7GlWuGz+R=G5+`2DW z)a`k83dV!1XXu&z6g?+ALC@Kb)3f+dJlE~aJ}h2YFNxQLN5m`jA@Q2FOT4byiPxhK zrncaPvkrTn6K}_!eR#*Pnmk1DXa@$0c&dc34gYu3$34$Yo-f5ypTaYP)@Z5EAVe%L z79fULyzOojc5hm0T5GmFJpjT`w=@qL21F6dx9}hS>_d<iZ+bBSNLanucs{{|sq9Nu zZ%5j$dIA$Db&Ad%>KL78sm^jCQ2QJXENk|S6i>1Swe1^0VH!|z6vhVJ3d~qpZgqg? zzXJ`{qP%dJwHn(Uw4c1)+4_+yvo*He^{Zd~>O~p~F~0$D{+lmT#%8yz$>m$BosT^* z0nr20&}O%cv?bbkjJiUE8qVZG$Ol*3*xZhC4DtbUv%|~|qj@h=J~GK)1f2?6ni^AS zZU9&Mjpv%9p98c#N(mlVtgend_5~7@=MO8-+r5XkjLvWM1!50n(f5dF84tfLw0Q}( zm*9+g613dxj758q1+@iGGXVyKBgR-iD*K=c=}3jXt{(VYjZ9Vis|CbfrAYwv)gXY_ zQ4v6I3!prr+D<=J)7@%Qhu1Goo8W5RnM%bbM$r5yo02?~go2uOrV+Uka(kl)NYvB= ziJ(Qrc=R;N`2{d8IC6yuvxg}q);OGU*^kC<_2?JJZgJKx9*$a$VY4ft=wFT9f@+7O zj$`$od74}ad%Gmf_rA69AldC`VZZbwE$pF`3rQ)z)dl0=BiP1ZJ-dY$-og#)1bxSP zNgczsgfSnLVGH~D`xwSpJO32GZILW~7K4{qB>)7j@ZQ<NRquK%CdOgGwE<m;>40L* znbh<k|G`<n?<OE)VVDVMWCQ4WfcB5bU=AtqL#CZZ1^b}qlhbb~9C*-Gk;ZxAT`V0Y zybkv}y{}K37*C}jNCD~Cih>GjdU1BZa@I@C(fhvEMh*p00h0JY@9QPky)JkP4t`7= zqP*~?>!A&M*52<x2k*Th{F-zns1|+)7*@OCH45wZaE#_Jpf@pHc?`&iqX9+x9zkQ3 z#(yT{uqtVpS=@!-#!nke{xxk-Yyf0~*(t(n5msJ^!~C*MP!4Ndq{RF@00SGz1&Krf zl7x`PN^-FpYdVe!k1rrQ)O`+Ple1_!S03m=74>zWqxiQFifLao4{wB9^g%?F=gS~0 zM>_u(!b6Igk78KGX%zF_BQvo$i2dd%>Ll%S;>zYS8{}-d^88%#^8m>@n(H6JN4eBH z0j1d%dV4m1hFL&aSv{tK$Ix%EF=8gH*LA?R>-5G>76)qa5?U!q{5zOkM$(KDXRO2( zGaf}bx2|K?&R=KDobU79gq@AE{9S-_z5ubTUu>V?@OfJ|ccbj>v{^6<LJ%vN_+lT5 zs+VQoBJBbzaqyAIfg+76Ibk<ohp|+arK#>CO_g}6Xg2YP5?z6EY1!XzyS@qf0Ycyo zuOK0K^{@C^(P8ojvDHkzYo|CVWwttu893J<y#^+hB@U&rn!3T0f)?HX1<Az8=m$z; z84_P?0&WlocJb_!`cw(tn=;==vp-BaJ7}^<vkj)5GB<|@BxD3D3m20zCAX#9AzLA% zHeAJuNh-{DyURAfZT&N3>rN%fv?<X)A_D19F*sY|SK`=n3hiSh@}3UycJ4WiH(bHN zbUmqcI2E<H#I??F`i~;nm*C<{G3o5OtmefzxlK(?W9UPt^?{_R4jL<mG)z;|t{nRI z35>GnumQA32}vG6{NITX#smVXGT-f&W{?OLdm#JQzu|LRVj9_7JPjAE=2mf)a`9Ab zAy_6`@*nHK5Zl4;M_QX+{4AWn;AI>6ng`K$p?E4K0IPv1nYAu|;3Z1JysS<AUUB&Z z&@#*(cou0$s4dFTZe<VbvtnZq!)oOs{F}_@DHn%f0h22Bz;l-Xygvx=wvPbJ=czn? za4`J^1Sw++(os(-O7^h_4k30Gv1ow*3jo*yuOlp`=K1je*G1A%BvDKgg|#5YBM4&7 z6Fcw+#8`T96Shm$F-4CMRvOmRzlU3yc>^y2SSS?R4u@cwoDv##^y~sxs3TZ9P{;%d zV4{fxRJ6JmKGh2ygURWXjF~(9skC^I_ki6)F#9EEOd#ZJVmWw7$<^jN><83bny&>Y zLev|G5KaS;mcdAD^#EG;S!iW2dlFE;4^Gs>Ag}%LHh~9<rUs`{k*H`89YP}tZwN9_ z5Nb4>{Qrg)EWdHM7sD`c1JExBvYFoV>hx-(khc<7V#FIC<h0_$S~x^Q-Xqi}81h0S z`z(%QOf59lZteEL8@Cf<Egd#yUDjAzwgL0B?HFrwc{U|)Sf3nluR1}w+xceXKz4pV zDF<3R#md&RV)B~jccRiE>scXhtpKePdPzHNO}c{S>_$Md+4Z2J`3~AJd3QY$$aFIX z`~CFMe8)VB4>GIofqW${KcIdLn~0fokH)b<em8~*vP0#B*Wwcfs_7_=ve2~sD0Cwh z4X~qPqW%M5l^nSL-&NiFUsQeeSbx>K{=2Hp>_(s@oc@#bn%UH3)&+`=hYRR5kn9dZ z4t}=DW@k4MKznW507XWFA~^)<B}jO2XA!N;-9#m#*l;v`Co<_-f^MC^gCL=EAEC~D z;8WB52Ias8vj}~36ULEv*{WTgK1{L~8r$6<UY<ovHi3v~o-iID>W8V7CdN|4i6qAM z4ebxmQmUl=ftwL8iI;^*g+j63Erc38A%+wZ;C|f;g&~0xDhNPW0h~tJdNR=LCeA_F z+`OLKFu)Did$N&(XP^abKo7X0_}Qc+i1%iQ04)<N6RtU%hyow&e})9WON1!ABurbj zSe5(+yGE=FcDHWzM$lQ1Z?>CA%1Iyuqv1qukiSCW1Bc&-h@49tFbOAM`K$%MhYGq; z(=Mdb8GBlv@Exc~)FVe+e8f?}(3glDZXwD$X&-}Zr%EHufLK``s0(E{f(m10Gpv~1 zip{cOe+QoUHphy6YQ=n3>^&=1YQ<i&V&ztBzZF|mOkGKpJVOZ}R|iHdYfRoAhPD`o zCJfAjO>5Ar<~s<uzn7}5Uivr6h%|Jr#I~<T-l^66Eav$kuMl+A-Czo(;)D~h21A_* zQ`$fw6Ok*(FQ;<(B5a<J1c>h2oIp|=g`GTNh0%lGX3!tM2{;A|w$fM&6xeLy#&FBW zLg$8`qxT*s`p<kP{FI20Bq8#+h)~a(@94z@fxIM8dq{xP(RwifN@|u~OhA%2g_*aT zWO5IE*-dg3Po<1&m-?_UCn%BE66HNfnNu2R6tx5x!vsx*e~$$I3b+71-N?j8VH#)w z2u!(M#6@{R?1`9`T<@Vo{xRYha7AVO8L$Pq_Kxt1N(i1+U@-~+tM2Jnl;!>0eF79t za`&uDxqFzE1tpCq?*5dbmvA>3m(ux<kWSVVOF6@ag?XYYR>Ap^S5b0}94oOE(<En$ z!u;GijRYIYiiCzU!>x6)Op5~OTCvw2;0wtUob>WYcvweLn*2RYH5c0bU(rF-f+I~e zJ?;Jr(tMPJ0|^`4<^~5H^sJ2edjcqjt{$0)Qv~`U4^)Gz(0`5=KwY!|f-Tvtyx{Mh z>UY-HodcW0prhZm;p_foQ6+hf2l<u`8iBB-=?pz}zcz*!!uA`N$aE~WIpFqu4VnV? zo-95=e42t!iI1_GgLA`ZxTinmQW}4NG`2+6JNk^_*djq;ddC;~VR*GW0Rc<))4~;g z2LDMLdW{_CRVQa6OiuGzWHovkZVzODhQ2)jTTloaCA8|ORvPQ6bQ~a?8!NZrbl8%d z{GLVLi#U9?eL^*zV&kXaC_#%Te{Z5fKkPxRwAFGijIrd5F`k?;MzdBpU9)32kS*M< zlV`D$N30zl6+ZY?Rh9fosNJat!B{j>Ohc{B6>^iD7!8eD4O5Y*?yiCAaCS<~NYV+e zhRHr%y%HyDErVkvwwGnv>kvLO-rTR7pmo&@vJdL!n2n#~q3B!C%!r+T--lM~JvOCr zmX&ZPC4eH3zMZf!;lp@*Xt+p=5T$WG!r={2V83@`)=~Ac2U1bZXBG-lfSt0eBkU(X zBsp=58&D1u0S23U?Wx6=&4)aSdmK=~W#JVlCwwu5)X?WQ^p~LYyTw0bl>rj~{NsJV zan9z#Apbr&%YW{*w@2(R&YC`73g3c4@(;rh-7PqhhQ|>F-4+^^RuM2Fc83FigO{62 zKsg6dy~={YUOskRc7jj<O28b9t{nuDlkIVNY*KhSN~-23iv>*Ly2!btcgsodhiaaF z(Nrfzump#s%=((j!^xyq;0+K8nAcaC*^fYXVZw?9q@DMn+llsSHX>hA1Z0_%q`Njc zOeE)5^kMVbq|hXU=vWCIk%UpXI(fk9RTw<1<4v^u?B%~hoHUL1ymCKHgxQDre~Ohj z^d85?E!F&ORD%QiC617{XH)q;;lk9jDTT%DaafQPuv#zQ^bu7ATt>$hVvAy<Po&l) zQ`Ku*FQ%YzkMOr)#t!YFqg%9OjU#5@jI<-jUlJea_!hV`L^fQ}WQ@nK%X)Ym(obiW z9tIf5EK1lz(3lRSMsjd~A6sX1%pMaYPQ&yaAU|(83}~9OpspSw#gHj%|E5y|0NeO4 z0BMnlU|#@v$PWp-o#nJ_3GVAS=aUZ5qZ)f*?VA*a6EWiCUEJaA+xVr>vB7<upy=`6 zK~=->`GOD2F7$Fc8S&#d-jJr7(>HPy^SbCOY;q)zN!e7K+yM^r=h#~t3dIqrFK`n< zCWLBTQF)H?&_Q-k_@P+0N#J~Z@;EFjpJP9)yfEKg6;xihC#~Q(ZYh#;qTQRvvpOgC zSG^ZDX0R2q{XOr+jl&k`Ez`a4Y{Y_Htc?20qPHk7(ifJ`L-K^L%WiOp6rg*D1{_>^ z;NUXg%>qvs%rFQj3@McOm7u2O$gv!KdljX@JDk1*#1|Q)^fF&wE1z`!sNP{qPFaTf z#0ZxdTwg#Zrfdbr#r}<G`Ve<5>=F&}qOo#d(l#A<^XgOJ1`lz$Z!2mWEtukH0>@N` zI(+e;%#kF%0kCc1td+=iIaw0-kj`l9*ONiM1}sR^L(3Awf~$6`=uBEivRA8$iqzrk z<aa-C>a9-u``*_!e*WDSr~RP!@FuyaNORz<w6!}i45Y_!lRPR*7HIuqs^%oOKH$_z zb{PF46zPWuuqA7Z3T%rxjU{W~_pV=%l_;%~SymVo!+=B2WA+Q)ckA-Ld&J4MuhQ4z z#0D!CpC{1g1@=DyA@7N8e`Ynk*a6$Vw)ltG`_eMvWot>`6Sc*=`r{20Us4QXqV>Iz z;&Y3C+#iop{OaOZfBb%mPb_}0KmGv4hZp~d;^`>A8F6#-TI_P32pQYg!Yu)ftTa!+ z{uwgL)?fr&xw?NG0)Ol&1iAOjp@)wirFbMw2l&deh}glRfCFAZUw*gSY1d@E#p!L| zcm_?kSID*A)=jDO8Fa2`GiOs7{QWP{k8Kf8xSW{bCfJvg{t72C>gg9VcPv)3Sz9C} zl;5gO!Jmx3wfU`DDc=MRNFFc6>2FLjZiC<*AQX4gBeBNZvWlG$Ck^4`(=M~L#I3AN z=ZZQ<=V@wwITqVLe6Qc^)IUzSk%F-<@xKocdb{b77=3`+yqg}0VF#$yyXleKx(x8q zXoKPJ2;u&Px(;y0NszV3-=U>rAo$xWa9e^a16By_P?Ufn|H6y1It-12KgUIfHl8g7 z7yZFlxCZI4A1z&LR2+>jT)Pv+P|DR7H{moQ%MuKgP26LDwW#7$-B?y}iWsYUl~FnZ z&Yh<cAMow45#X>w(w`zbS;{1H%i1b)c}FNQ7L>)=Sn}GzaaLSC^e5^9@$FK?um#wU zRT`XTjfHCqTKF048dwrX9I+U57-WGxD=v+$5>fc}gsF4yLQYHNlmC*L{dfna`*0e$ zCb{(s5*8dO9s}l79%^N+q(2(!Iw+3C3*c!b_>FDg)t4Z%X0Ud1HbwY0vVlOWC{*E5 z3eo0n4Qw%kNHeLSP<Xjrsc&`JwLIo?7kg5FJXXyvo=mUd#Z%~&UM%^3YSU7AiI}?6 zy#nDMuEtV9?9IWr({HIv<>gpr!CpmYRxzSr7|bE|d>kDyr&zTu400V?93i@~t2qsu zQlCW}3*oR2#)HpV$S9^0t62TLW|dHtSP<mPkb#{nsh?XMQm>8Js`xTM1D1xmCBdoy z-*z>4Ma*#qW?WO=7MzSR%zl<E^DmkLBW{O`>C*@~NxvK`uO|k~sUb)^<dW*=e<V4W zMnQ=t!l$iy3S0)N3R;3jI{O>8sN-Zl2B*tv1_`TQb{M0;-Su;)XfE7y<nR6M6x=jd zMsw;pW;(nH<mR-d6gU$(n<pyIx4|ENB6*3R4WrC-ItvQxV1=_e&Gb8)Y-Okb)ir*A z!=Si*L3_IXq6gP!UChvafs!2U3rulz7%fv8JAno+{_v=dIT>17S>o)H#K+<TSy|~| zC=kT$JA|OiwBaas!I4Bt+5GystJDjG?Pb`c!&HqfdBA3-t-f#y#)GazRzV9~bNsz@ zU7o-9SSOq<M=lbTr>t6l1|8A9q_&_B)#U<587SO5CqrF``|^r$AT|Ktsl14$T4-ce za~hgwHO|CRs=uX)EIv93VlOk(@oBlUtTTuK7}?X?QzW7oWpH&4M<QBMyAs9Ob&q7) z`Y)q6<HT|*SY0%MtmEL)L$Cx`6ZS9!Az0NkVLiN7tm*o0I#+GXo{r9iX*eBigO7k6 zccrl9@X7B9R8__5&hcTGmC;7nA!jjaoww;G?C)bOv}pnBY5g=M=1|~Oe?83E?*ObT z1b2ullG*Kj)j=xY2n;<|0p)w>%(WrTUt>*4ewWE9BqqPRHvlmm_(No#gNRobd_evZ z+SM>R!?{Uy##0G`SS>NtvOMWMTeV@4lofmE1MY<qC1BMPZ2%DYLs?nHT^Fw+iN)6y zO;U&ZeCuExzhJ%o#%4c@+TgX3AFn#r;|o;d9u@yN^BwqvfGXDn_|p&|OiOzan_PwU zc@HMe=Kw{<2Xeve<@?Zfa<an64KvR(D2}xyR>AjOh0R^N-^_lBlDfQSmBx*rAug;L zM(!9F>Cv6v?hBwUz5vxg@PW1yw$>+*LwF9MzF;+fI$y|j@&kEp_OHE3z@WXsn_)V- z1cT&0WZgr4WI!*4bewMw`Ew>U9kx%!7N&kjj}V-y>X(;%;`=>pC^)<uSF@sRYR37a zd&m<Zu?9Cmp|#ns6Z%?jf!1SYA4a&K%d*qa`;drZW(l|!g7cp%@OKq-!8t4az*3Z) z$c&!VaOoFramws6glqKqcZ}IoLG9}PR*+c2QCZ;*Se7lD0qJJp&c6*VTy#icV=n&$ z)>E+vv_SaXhzrNC#5mlI)<GwsnRPM)D|6*Qsm-Bx_+W^(T71}sD+*G#f-=^?(m#i$ zyQ<E&V&w}T>1LbWO8cBktOV@~+J%;q{#VHtvxzI4k{34Nq7>`8CeG&fBIk9Dr`5ct zK~6Zm<0YADO5%;!e7Ysik>A=Do8LDO`g$PLn+yr{iY|f>Xin^6u{xLctmgJ!-0T90 zz=0_S+?+ba3Q)xDIRDZBo-%iA9?#>jfepC}D1a!agS&um`A-gQm~YxgqS#fm!mUIf z1#Y-|$o(QML)T$<^?Jyzf|@d`tAf1nIm+wgD$0mUuu@=y0YN4<)%$P25nPB|*Lg2) znZXxP?NbJBB0Bz-s2v;WIG+mylbh+CcOl$_c?7iv?r$W|0%qC}n6U`QDx8&7)xn4@ zR^hI!GHRT#SDD!)tH|hv%aszXr7RUPT&DILw#1A5O5yuTlnxY-xX}?3??vT-)p%30 zZu_lhR_9X0t!2}tu0z|P>_D<XS%FQ62zMjaoA7NS7q>xArfE_=?XQ3PN+99B#9u@m zbhF0mK^!`8XSQh5(aA1^o#gDuP9h}Z-No9@uSNP{)=qExvBW}zS0RP2Q3K4e&SM`O z`|Q}s%p=;l^JiHXpm4_@zPQeRVn4QVxEF9+<c*3Ku$wcM<m1D5T%K9*0YWlD&hzi% zAmaNHdzGEQU1+GM_Ml7Br`1EI#4WX0B%&_D%nb~4mM;rbR)#%y4xE{=TpkYLN=SLF zF%A7irzmD(c?9Sg1!LI;C)_WvKD;Gwmi|>Abl%@KUmcsZIkxJzE|v)=fBimO-}<`n zGQh?(Pr)ID7pdDR;zlI#?Aix~nBnFzuv8n#!uk0Q+SJ@faB2bS!%b0g!D0T(y(U)A z;T&@V_`wA$CZ7v3gHvk+44Pr2>?2Wz(<5%fWLKE?<eK;7nD<QQ*-1dm*l-(f75j{a z^@8JMP&1EV%7ae-jD5*kv1_q<Cial&>k)i6%}+2qfk<?{OE?a?RPvux;>KUvFkOzj zd*x-7CT^JH&k5#n)*O_v+Y)Y~xo*Q7K<<vy(4Mk)w(vup0x!@*e*kCD6c`Mdi7DVe zuzAFgu??Uvp8%*e&nACxxVb7n*p22@RkPx?kOjS%G(EWtH(*-^F2iqO(rH<iD!{X$ z&~DQGFh^;_u?2&huoC2T7r=Q!9LK^=UKKGZ8HF%CwUt?Zvx7eS?~*@*c6G#ATa+ri zU9-vd@=J0zz|2DdLY?=a0KVjPEH!5Gh2pguF6;^Tq~AwiyZ~vIldHIH1dD*Dh%jL! zW3q_Shm+ZLJfYF~I(i#=52(P+>UQXlQ0EIsO1kwbQM&F^EDHr0nh^tqwh)D2B7?_n zilAi&`QQE=G)hu@5lxJ9;K%_k0oJMH<2)NCd6<`o@)-0kXC=MmSfHk`cDiQkG`}$q z6y~3x0xU+5+li9FoOHubIR>^gcpbyJc)-h;taj85W;S(+Ri@{gWqvXhWtv(Cf0>$e z$lbp%!;Bqs(+)|yc1RbX^k5a#NV3>Jpjg%eryF=Q*T`t}QyBQb7ImkwPZNC^B_zF( zX9T(9EIyHg$#JkFe-8TyIOC_SA3Sie8c8r`C00{j8cFzr7LXdYIx2CGz~tKqz*{(& zWQ18k{xfpq06{0AH#WZ!<c#9H1ZDO2H;*II#%JQ$xeYyx{G<64#0HT$euNgO*ceY7 z7y1~}VN77XuWg<l=_ok9f}Fx#n{xSI0VW)4t)jVxIB1AT<b1e;yP&|nq$>(Di9HWr zfsSP->B2i6qq!$mQ&>m2y&rCJ<(~y}+y7L>SNvLN4Kb7IUjt@^Au7Aq<MG`iZu{ZH z2pnq44>)mgC1zF|GxQc*KD;q8ux7+CO`gv4T{Ko#v%dU$!4bW!U*Im9JC8WPF|nPt zQeq*D8N(MD6*w)9sp$!PsEXxY%SOT9ngx4}<vnn*#_-mC(59)aUpa2lznZt%9+`J5 zyV>ErS=JWN_Ex?Am1omf_Ueg5Y;lU?{E5k{_LcT!Xj6f}<gtm|*i9V+Umo2@ekb^d zRfaq{<banNtCHDD2Yj9E73Yjw9kimtbD0cBDWF9=8AEEV>Cr#788zpWDC|YJ$FPUh z^t4`dMCO4fZ?5%zxH*M=Xos;&<U)4uJ4kuQ`#w&Lz%TzEhxZ;?^Bxd5U-WDm!(Kb_ z`T2JytH5`$-Jwk;q^?bji{0EI(x0=irB4Fidw?cNk=Y^#T?r^kWQ$~Di3}pcCmQQZ z>_9=AzOOXaqY@0rG3PNB0<=u~L&(1bPZ>||5?Nc*401J9D1EI>2oMpc)z>K!eDq!w zWId4pJ{e<0SWvfgUui~8;tB!e0$GPZg&c_gjv992vsk0RI|H+_UL(yYoe9_aE)!P2 zv-rMyo0xoC1|XKT4GhI*zXTBuOFl_z{YbHwJAY4ehpI{}P{enUC0TYxKo(J)Q?)+o zPc%`NTIC|Oue`(pD0kK0TOw&0`Wi={NYS^#1LF=-92g$o5lI*&2ldDrAOR~9u{q%g zHfPzy@A-#gi$|QPjFr2w<?`2jkQMWBoRAlw-c*9!?9lI$-9kF{sMI1@eJI^1ruGT@ z;O?ymVf9Ak!{CA4xLLTH_PZ@^cu`O-16q>Q84g3yg;!hkRLbSDa_teq*X_0o`0%0m z(D0WWy)eqKb)m*1j<Dnr#%mW{2Y3?YVW$p7jx;yB2CAXfCVr+bkxkrxwcTN+5@M{( zg()+`mF4~RVsHSP4@)__$AvX#!ftOV!DV6>SlgW~LW&z_k`#mg{XMrDKH2a&a2oX{ z?OepcE{Zi*>!*tSUT2tkG>HrbRGDl&kD=FMKan;-2`q;f|CSQ=YW`cTolfk)%-73% zOugw0wkplou3o$h7v3;b#eKb96b(4y^&A0;q|(}Mk@gyv)|f}9l4nS4sS|gb8}sGZ zO$f-we22dF=cU4(<fWezzciPXG#~D3ZEQhTH7zN@@vE&4!D0}}&(0s89FQ3<+wWh2 zVdX6dA(kF4EIgd--TX>uv@xxpDeTp6XtZ-|X)jLLEb@LC+g8-eCK(kjtbdgsE(c=x zl>sG62d=SkaaMWIix5;#>jejNV2^%b-sZH(ybzhoS3A6`Wv#^0Zx=k9#*sAk#1`9x zg4;z3?lMvrV-u6~Rw%f^kB{!61`g42OJ$U1K-n#IupP2-FDB}){5NeCy=0G3e)uGy z={N<B)R>N?vBlS7%Ty@Y)vV@REcc>O<AQ>u{538kBpWw7NTb{=<LM2_T6Oc{bZC)L zq(#yly6M@JTVFSdw8&dS^uyR#>8?`tR>C8`xnfJdp*$J|(n#)?bC)n}^~OrC!yU@T zVjJ$LMG6d0#)4j>^tztTIUpTYdxdx@G1@zaF24f)0ZVMg&AqWz1-(pjwe~rdVDvzO z-Y1$=+YR3lC0b8S)_Uo4{|6AqyL4bc>7xPVO$-}qT0gyq4-P0x#DF5ce2dr^P(bf3 zLfLMSQ7Y+M4K~wW!@_5v!isY-=a=kWA|<&cgT6Q8DJMrZkTtDeIj1>vAOx}s<@_d1 zY3fgWLCU#Eko8R>E54!e9Ya3e>xd=Ex?~7h{Vv09l;-qeraP3u-MfVXsF0zO?5U(` z^wu%@M_m}8!JSo$^b4L~bzP?Zrg`FXy`slVWP$DUSIvU%6Q9vAoh9_%dzcqgIhc3q z@}8-EneS@D^fouVF}x=?a_>oP2b(|z{}(Xt0p>kzWdchg+-o<OvkN(|P3FwF<lB22 zyO1NBKMo%ib`td@_oFgWXoh+tY|tTgv&*ot5|>_Rs(&#i2qa5f%mtOBe}#Du+bI~2 zZQE5kwSsVd3kSKe_+S=4mY1@k{<aLq^{eck8$o<nH4>kaw)wW?FWyyJU`~A#Uh`JL zC^X_(4ZV3}Ve|;}X2m&n%LNA;mXCSQmr4GExNpatrWV`RjbtrmH#xjF$=WK&l8~Uf z%h+2a;JvYJh2Tb`=FHSpO{E6@`V_5zRh+@VKRGio1JYxG?G!_z1wDCepMo4(CV&7s z`DRCQqR@kSWcGcBajydvvhR~(P#Uo<28GnmnK#J>04fQ<sFag<)mogH+1CoLYyy|o zO|7rXl(bC2dXSngGQ4b%NqaN4HI>q&0U%j}44QEt&ADPPS*R}Q5R;-4pJ&_vMFtyk zrZLP|Jc5KCx=`z~A0xR&(sdB)b8L9*UYju&w&ii&2{g`v+?Z>L$%2-yPopGKtA-p~ z;230bvKz@5dvT^1>y%u+_W<l3^e=f2Mls@;H)pmb7U23pUA+On5dz<tAUnwqO(&O) z-@Zf#i4(X+NvB)D>QYe>n7J$$!|t#Ef3ua=4%>5a07wiT;uz~;TG0K3O2$tJV2_vX z<wi&2hY;episL$buxb~G@ZaqhD9~<#ldeEiom3dk^8G6S+k*UG9;YhmdV^wDdg$7i zYy^q7QGAe}CLn77-*<W(mN11dQ4Jo=z_kM~9U9SD@Xs>#7K-OgJc~4!Fa~$Rwt#y= zF6U1H87y3Xh*#3CI2x7k(E~Vk9snp7+t@me<EoX|EbEe$H0wtN?D6Imc_|+py=d&6 zj^djhyByE@i@0gE{-RBri9zW6G1^nOjL$=fz-T6)`i-i71%jhTI!jOwE`RW-Bj^%d z%Yt+}P64AEXd&~?XJ{}vyFCWMXKCG~>5h7(aTg*yL6&#lde}D0-LYscFo1b8z|zcF z=|;?hsF~e?nGj`O19-rRR8?-oQH20f%<NP6&K?ug5(Qv)GCBu2ah-tjzyi?Sh?XMS z9HsW*V!r5iAj8d>OtiY71;1!Qdm~Y*3>VqQ^{u$;DZ4o^t7-YUri#DQ%{Ta|6WoB5 zxLG;S8sP7q5sguAWHG8U|22CBHi~@S!^#6sqF}&AeMrZ`dk&Zq6H$0jS-0Vpm;#Z+ zcx--IKv>!jfr&Y2#0&%?sklR_61Kw_6;z39&4@0^+?Ey5au8UB3~=lbtqs83eJ;SF z)RjyE`7FmCBHR@KW1?ynBSx~f7VRYh8Bt;`WoI_N>-(ww67EL?3k{SB9EKFy?mw4x zNx?^9tJ3#VQ8s1gTZouZD&G|43Onx{_?OH{(IzV|6cij;r}u%>ttBP8Kqkf5OYO6| zISIJT6lr|gG%SPHc?BhvXqf5|g{CC&RIk7#ECEA&=RJ8tfxQ9`YMF%%j;<Do`jq=G ze2umI<@nBqH;=NgY`R66#fBTDN@3@4d?+|VEC5ypf4&UvVwMz&jsV9+X(J}dT@~Oi z53=C$Bf&{5MugCxBwmy91#iTn<%oDIT$_s6!}Qe@UDZ5te*IU&@WTayTJ2Jn&teRm zFth><`>7BU4v{$McG4;(AIJV;(HTe&fO)7~OG*a2d4a%}AZ&tG-Zo|DjUtVz&KE6# zK|;BIG0N`r;EN>~5P2nf3=J!yCRHGPut|i6{v_r9R+Gxu!{V#em&ywx=g(iKqgkVM z(X5n6*2;B8j?bryHm4+C>kOCA*C2SNkJ`8Qf8M@-qM=t%V6c6+iZsGwNc-kd`+WE! z8nlf-V&7^A$!Ylo)2yZLnPasDjj-({Nc)?jDY)r}+F)<D33;)eXo0=mYQa-bdmCRa z=ne+M%d@bkiFLt#Ss9B_x%sW)p2z@e4Ftn<G%hK)C-EygjXy~WndnZ|mfs$THO{8Y z|44vUr+qI0dOzIpTEc1V6Ih&&lvS2sTdlVQTJ-TS&>%4nEEA)w^m7O1UQ$=)%zlP} zONt<-{v=5uc!5Ob((?8FlqPBG_5A`yy(*GgTO=eDzcw)%Cfejy)<gu2nTdHx>77Ex z+r+g=xe)r^2ZO8N!1}^*V(pyA-+7+$=YkacLj-k?*razdfk?h!qSY%gODK4wmWO{X zPPn<koQ7)-a9ZSJ(``KerInZeKokeNC>0|XuNcVV1N(22`Mm(ZQJ2*NaMqCiDU9+M z!*Ep){R&PjSKN&TXB%-Z8Ou}-EWXyEe`Hf%4)7vUG#K5Py}NWKF4h=LWVJ4`xw?l+ zf$Qz*#Ax1&B9oMHh)QX0(Qh&(3~9y?#uxFkLpqg8m&eFGXqyws$+nH+za1!u+Vt<p z3G-sxK%2(#9}NHq10x@oY|K%sF>@|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu<x?>6w zu^D>0gT`DfGs$gel^vGnqMFm{Sbi<)U=^ovM}T{v_J7pCAK<HK;4i5rYraFfgY*j$ zGNyO$V3#gw78UcBTEs20XoQTC*g71?|MMF#H(D_Gc^3R00hwTMkv3e;yLj+XLh4+s z%q$AYYHm69mA4F2o_BSZ4x8Y>-2wQGBXnZ^mrGc?bvo8MSvz1spgD`Uk!U$&1RXiB ziRLDk1WeoL$6{zZ(?vgjfdRksQ|J|JABy`ECh`m*He~nmN52(q!R-kxq=%5#(KIn} zL~My()Fw7f<R<|!B!jiL=kA;iaIxQchU-5gPQZSrtYPQET@3_-e9tiO_aRp&{Z^HZ zJHTlb-mWRlN|Wqch>H;>;rMA{+(1;m2|oZ);nqGU6zokoKJN)7dKi3EIEij9ciXht zv8{BCA-qf{#{6gCkKc>mtqAa$FGGaMK#t4K@nbN(oBm8cIMe$S7UyjwVs!oZt(d7| zb7u36v2AI6Mx7gFOt#8!i!#n&PTXIHyGV1R3^>@om0y9&buceznv`%ftx7WsYkJ68 z{~S5%M*=IvZ_I!|FZ|~vJF-4R!5u?^u^+US9nODKzmT%6BDOV&Lb4ea3U_`R1vJAA zm;KzPN&FU+$qq-ZTw&O#+%e=Ff|CJ>;X`W~@D#>A8Uzz08Hu~S8w&sUN9<g|BW^3$ zeDDWS+=KJ@svzxwe_1r4kyb#3RaN9WA71+znNrbv@VxF4Ql`pAF@Yqq`}ct17!psV zq!f@EJ-2-d-LBzxEh@}WWgmXVs9Qe*)^O*ymV5o~I-Ae%yLS^jyf&1^XHYoC{>CSW zMaZFqcBaJ7AbD{0QyR{S8-5R)eFl}o|Dq<3+(O(~@Q@@qUI8rpFf@<leWElzh=lDW z)_%r$l)v$YSm`{uSi+of%P9Ush&DTfJ?-4M^g7PABt~Gr2|w`?LQ+OtA{xQo2$vMn zALoi-m~Whm0>R7YtXnVW*CkLFO;bNc&1^Q&q^imS5H5D_u)|n@dtbATexLU{scQ8K z{0foM_$;z`D{_?w{|y0C%Z20&&Dpt&zQ4BJpWKci^kI?7NTNTQzcmF_o`V!e;%S6F zJS-FAa39pi-)sRKso=2>!1=<ZMWAmv04DozN>vs8dX%H8Dv@R(LV%#G#~Sxxe+^nk zsF9cd2PUF0g@!sqqHC~&(nUH^^o|=R5a~Cl2D*y$vd2Tp+J6RX39$y8jC@|dM``>3 zErhERybREN)Ngz)K(XBinxhZ?z-DtnP*59RErJ3Uc=n_hba%dh+}n%wo{lYr=q9UE zNAnjagDSo7TKZ!=T~H-1s4|QE+%D-??CRk+dI9(x8jC{;Ek6>v6A|<R6a@NsXpOjc zKQRr&fnN?f3iknkINBK=n}q6c-%%H^KL6qP?y1PmW4)*>F|MDKC@eYBn%UGK26~-S zGl-TwzX2rlBrtR0_pr!G^)Di+J$6S2j0<80!7u-pfeRop27#nBXiP?;sZB=^zi}n7 zAr7(_6R7j)KmsR<{*jkNW#yot?{0$VS<-$1guRjcj<CrZ6tWJlryd|on$(z0fQeZ{ z#GL%UL}IEaM9A-3=oFIQINm~jIRZj{bHEhoLVj}w<<~><>k{(o9F*Uje);_sb@7}A zvkP7}TkuPvgR*;^=>84a4Ul{9rG1P|boI`dV;+7?wu*naOZ0FxRS61_^r9v-4);#E zY5N&2uGCzxSQS4)W<PLwLM!Md;Sk7!y>sa|*9KaGF6Q$mfW3*gX-Hq_MK4Yyrgnj; zodHzA?*st-l3xx)@D%p)2KtC<gxqJJBc|xVR~(!A<Ufcb;;}o<40QkWhyFqLPeCF& zUUWY=@zTB@-A65jP50X#GBh0^|NI6BAud|sn^B*+S>|_(x0A0EZx^o>Z#NH$cMe}d z@9X(O5%utS;+@BD5bx>y8u6aNFBk8be3E$2;$y@+mn-63$kWAp4mbZdVdyhA`}jEo z&CR9!jChyx)8f6DpAzo?|ATnn!e1Bf75tERui`I>_Zt43c(3Kph<BJjA>QlxqvE}R zKP28N-znZ(d82r5<J<5i6rQgKm+`wP_4!5$-Y$Yo6kH*K<Oj|xM39s+Um$`HQSb&4 ze1w8CM39`j_+$}$oPwi8@CgcLir`Zeln~Sp%^0}xQgn(so27YE#mx!O1AoLmInKr6 z*Vh))T?$BfO{8pwKTANQ1o?}U@{K~a<KP~y*G%U5iB*cro4O*I617s?-qcmelucGj zjyH8pGUYZaCD)s}Hkq>2O7VD8!^xClk+M0@JA1uI3G#eO>Bk1M4dD+9c}&Na7W~x4 z^W9I2X`?aIn(tqUC}u^N3E@Iznw~oF3u^DPqlM#C$AYCAxt@OBJiKYxf-=kv?Mt<@ z@X&POMyy+@81d_RUncfmaw-S2oM7@C!T;0Vxd290UW<AsGbBR@%pgI-dk|0*#3&CF z0ydEZf)W@AB&3QG$zT#g5|h1oSON(XY?3jR+SaPa(~79Ix3<SVL~XStKodZUAXZU1 z6_itV&TupyBg7h+`>lV^B$Ei%bK85*z2}~RmA&`>e*f!VYyE3s2}W2t*mRDL+r|C9 z-BHe;*vF%45dPr)Anr&THpVEgmMG^A`}nF4xLvr{9lmX$=(*rPy-;UNcrz=pvd2^n zSL)zXy(+bgPpeXY3}em*(8-p1R3Xtv6xu5|ZyY%94b*Ei^$HB@{&Xygz<DtdNR|Bx zU*#HVe2GU;&gE_E8LA+eOC;w|J8TKbaD*ED<(~3Q?p?lTe-tiXQn=BF(db8%VEA10 zqjfj*F!LkAhBIjH)zBdUP6W@y^tR*dZX2T-g?7<1ql_su>SZ$vqKpY~r}R<HrfX(; zv@s0F!7~eNh70}%wqxT?8Hk-Aw7+e{t|KRWyQ21--OY-m>4}Ze^cBgxPX`g{_}Sgj z;{Nz*KOU0)AzWJ|{oj-ROTOmlKz&%Al>X0?;}_&#p&K`I^QR^C95bfVxkWI_+D`>} zt>jK%J**<`M(5?Cj?edJXX?3IZ!;XX-nOD`GBoXw3DKcgA;t75cZw>n{P>CB`0p+K zcAB=$-}-B*tgp>p$pu-PZ65}AingU;cc-aP{CS#uZd=cv$ANvoIBDKk^!U`zi)x%3 zO}h2-qJ1qkU#m*}V0Y?_%kHo$RFtnJ+SeK_Wq7hX)HW*&_EV*V7;VM3zT1~HZlWN` zKoT$!a07{e3vdAbjBlN4$hhwmPm`y~^EA)XJllD;^X%Z+!LyTRCr|jI_jNVdg@vQp z+HIYo=I{rl(xt$9;9f}^>G<1FMlUsve79;Ja*=r%*&;MYIBb)C4ZNt7u23h8@9Bhr zpMU&B7x}i|PcFf;Z_?6_@=99aKKaz@lS$Gi9h8L-5_p@PKNA5D&^XsN?nwPSo9_eF zdLOFR`$a_3QnpZ-p1%4Z+V`RAh5Cq)+akhI18NxRvkz>(52a_FTXLDI5iv;namw&C z@GIa&U@veGcnx?Tpsh#J)+2c)@=WBJz%zlTizmXO--_pnfa<p#Jh7_%Ejv$?=tuUA z)kfNP=x-nqm<)v5m~zts5q+V)scl3*SYa%;UVRsyY&^f(dg~9Wg%*hhYoYxJLPx|( zyLhoMjaZk#yErH2VR^I5Oc=}*dj)i^)fj9R?+BBm{H^{s0yly{HDz~!Ux|pkc2Z$% z1RP@FrXY0vJ?72C$q&4u)bxi8Qd?B9Ca7OE?$5#PV6w{Px{`#Vi9)<uL<~64Vi^(j z{uYI9q^XIkTQmRVvF<Xo_+M{3%rxjjqI;bXkmz3Q4rr0+GWcdg2<-cE5*?hX?^y|a zqfY`hD*@Qy{@sC_J!XYVj#E8^JW#)$6NdR?h5ES~Q24v-L}0jiRd;IUbd|m@`?%7u z6(;G$QxmlO`j?$B?<asFdi_+gu!vrk9Xus%V-9;<P?BsUUWAe`&^JHc(VCtp0y2TY zeAt`P6Y#=GR%|4Dd<7_0j*6g0ai8LLgtLVQ?wh@h^8|OQoLjkV2~~lc!NH-AC`?#X zU|h*U9a4eO@iBK&tYdZpu4wu|m>#>Dr^J1SBolnyV}9RqJggkQ8*<!YIsQsHJ{WRb zgJb@VNBN=_2}O@s$$QLY%KZ`Cx62<emqjU~B$z(WWBwA);B@&y$NiHMQgn5k(I+F| zI8mJ<hBak(E-pc6{WR<^Pw)*Ak2!-5dZT}BHcjN#0x8?2T%?<Xk}*kwAQMDuPZuvE zw@dl(9O5zOhCDeQbSZ!Ie&K0O3AuB8krRwMKM+9f&4QPNZX(e^a(m;@#?jE0HlaPi zW+ZISaC3N@s2&Xi)yD|)B3QYRyw`_+s75N(T97zMx>+(SQV0ZRd4+J6-wAV;j}bDG zv%Io9W*{f53OE^I*<~OQmV|J^>++U~gs?uqU)AONpuecLv!SalJPu)+X(BJ{f_@Sb zzO^&8k<xE5KP7$i;fRz0N(t@exF<=CJE`V<4f3LJpW4$C*_V3`wrBcn122ur<%VUP zIaNq$X58;#VsVx&x!8>7HQx#X)yd+Fi7lCizq9=a15F?HhL8a-u~!iV24Y#T^QU!{ zzy%a@KNyVRv@S+2W^M_82|+%>&P54kmL$+nE{9_yh&RjZ#d!=%aOw5)#$eD|pOKzl zro`tR4>7@@#^heAX)EMxiF)EM$opT5EPsMOt83~$^A}r{yuZuunYhI78Nb9#po4sS z9bXXlmrD%Xd|2k;BD{-CLiQf4p4jVY!aTfX$$?N4<?e#qS_tYheH+J5#sp=mK7R7r ztGKn`kN;%@_T%N+!p2{6Z{ZT_-a^JN9p-#lPvqq`UINcau?sDe5S*&13s<cQ{V=h> z@HW_`44C#^9PeKepR(9t^ix+E_T()7&373PfdQcx5<zy$(J;r}aA*9o#h&H)EAnsV zhC=XgnA)F!bh*%4PMgox2{FJ0W+`hvSAozyW=uAZJkndnBcE@U`kLxa(bQrQg(0>d zW6?^fPSE2)<fAw4=kNH<ShYBv(>R)C9OLM|7oMi*QJXFi0yOtBOB^24%Q{IIMghjK zzr7ECJkUUM1NN;M!~Gh^%nP*Ee0G%)<I7Hr4j}e0$*|!FWfgkly*H7k&|m6qP%q=1 z_oeUxSLDi?&yt{SW+p(3hn&+GJ8M1G+LtRQhd7PJkL8Ms*1k@cF@)g8AQj3!Yq?>c zCt3Vlio;UG%JAx0$gewJc0L!s@JzE^cQ}9hvac;EFoH{5<fmWL_;O8KLCvSba9?Nh zwYh!G`%|+Ms)kW$2NydlFE{L|2iA_|)2@vFqJ=tf5!QCxN`EmbmE&cz2;9sCKj%NK zNU*&L(?_cAXF>-zKgHecr=pD6z7x@U|5~UW$gZvHPc0`w^<R6LnFJT&OlD$KtHz+$ zU>an11p`i85cF8iVrFY$?WJRB(CCI_ao25US9JC2K$r@F#Bi9TUS4RZ?!KMRv9o(o zPU$Cx$&J{e^&=Q?X!rREbDV+EOBaQpQGbW?%0`C$h0ZJXAAtLYapTDIO5#5%+&Dq} z!I2;2bK6AzECtpB-Di+5JFiIU;IrLf&wpM~Ww_vZC6vZz<Y@vYfMdX6U>~pxcpd=9 z{X3jjBr|_dDm@aI2+R_f|Ly0MM}H{!s`HA6*9)9i9;YmFq9Me#U-5nn(D(?SG0uBl zk<ef5yrR+#r`3(sf7y8@l=f1xxCJN#N&y|%2-E@J2k4u>!+AwA^9P^d@AJSu;JCPi z`{r*suPE$5&KG&P=1Z_&gjTD2wu{9r-#M_eGc`i>i!uiI&P5v|&!lC*8wa(xpP(gC zDA#L{I2=Uuk-28IymRPqfSIt[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest new file mode 100644 index 0000000..f0cff0b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest @@ -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="easy_install-3.8" + 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/submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py b/submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py new file mode 100644 index 0000000..62126a8 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py @@ -0,0 +1,12 @@ +#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install' +__requires__ = 'setuptools==40.8.0' +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('setuptools==40.8.0', 'console_scripts', 'easy_install')() + ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe b/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1487b7819e7286577a043c7726fbe0ca1543083 GIT binary patch literal 65536 zcmeFae|%KMxj%k3yGc&ShO@v10t8qfC>m5WpovRhA=wa=z=p_%6%z1@blsvwI0vv2 zNIY4alVK~j)mwY3trY!Sy|tffZ$+^cObBMdpZutbN^PuECoa`kXb2K>zVBzw<_Fq) zU-$d^{_*|%@qt&)nVIv<%rnnC&oeX6JTqHy>n_PINs<G9rYTAL@TPx0@%--}9r!$a z((i^#&t<$Zd7o|Z8<TGd-?_=NVdM9{v+=gOJh$I=_ub!9J^yrvXQOtv=gzx5rAw<k zcYSZ|9am>%4a-Xw9jfY!Ot@}WQUBkK=MqH|Mf{(O%J6=?F0E)R-u5-_q9XB5EmFjL zRMB1HZ7a&fd)b}0hpCKjVjS>G(qfxk>Uow`_J8Y;?6yo>h9td;lqFW`r_=Cu;je?@ zJ}aCeNvRaYzy7!6vsuJK8t7Ip04X137Vm)<B}y|cNYZo>`v3N5I`@q}=|CK){8#_3 zR`1xV;$zJbJP0ppD|Paae;!F%bM?lxx2d-wfQV@O6ujTW-;jSkRCTolCLPMh2Nx=) zGP{NVA?TB&mP=FqZ|whc3RJSvJUJGyHOs!nBie<k<-z=e)r`kVud+vM0lsONB<Y9b z0<+))qcqReE=`GTutop6y*iN=`x&*3EzZknc4W?3rP&uIJaeXK<D%wvS9N4nkT;0D zPW$-+vpsE9St6ytWVaCXsHU`%GVdR^wE=Xv01fto0vp%r_OvPOWj3j{W@V_Y;fxbp zySskme5v4&(U>PA7G%%m<=|b-UJ~!-boN$bi#jT{Hcy&A=Niq?KHpr`Y-?=MzKk{I zIl-)f*v>o`q`5M7OP+gKtTfLZsOCS(qPDr~x8=!_5`6-VLD0EMY5XaI$Uqq@V-Jap zR-V}6Ja=V~*CHdz@F4Rb<?;{KZ*yd>ij_JtwPEG;g{#zT!Uq*Py$3gDv`Z2tYF|X8 zYEi!^3#I2mi!9?8K!AuX>_C;=ltI=m5eE7*@I4UZ&p}=3ho&bc^h3P|C;`K|s)PJt z@!8GLOb})@Yp*SMou>fLhC@WZw%7ar>1Sm0aW&hPm&@Wqv5z<cJW4gM&zmkfJJ+a@ zj6&r=dVrlbR^{dLe--p{MqAX8%7LY}g_XQXq&T82+UL#6!luP}xs6BE?<fb3E#r6f ze^S%+ZFw$9UEExnmrHC?k~jf28Qa}v(?%Aw6cJb9i=;f%LL7GNV)O&mRYm+WAK2)J zoc6N?AE0A$CG}^`sG(_iS>i_&0GwOEjRhPMrYB*+WA64e$@ELiFO?ay?gvgcC<n$Y z<L^1CK%h$vSZG@q;PL(x?eqG1V1nyS(*z5;SA+M!_HB5xgCaCQzioLANgKIa^30b| zP)0-wnAuW?PuhpB1D*9VD+*d7r2(|XN$tU(8-F?I^V~ojiGY&$x^&Sr^ySP^J_*UW zrARijT__0kuL5&8h*xu#MI`axM$bS5AWndQ;JM+aKJrO?BE}`X#TVcgz$PT9E&8Dq zZ6JXIg6WKy%Zx0-)XbKtWRx0n<OM3tY=>1!dbl2?B=#{!9_2$Llg!~3%n@58CG`RW z1LPlkk=p2eFSa3N`&F?g@~A1mHitQyVq0yNK4^CN8joui^5gTpuf^0f+qMtEYVL?F z$fu`~#PaZA)VQ4Amx;XbZ%EJqQT~UlXZwx7HHW!>vn=MgCVU7v0(=qWSe%!~9KS(N zgLM=3LHzO$mU+*{wx!#)wXd#auhgvU=lF&*IVnT+hZ`~0nCHPOETKA3I;S!sQ8$^{ zZcv4UbEsTEpxvZ3yazYCQD1%G)vA+(ndH~oy5$RmDNA{h9?j)8QlvdBd-|V!63d!_ zr{P-1vS(7D+|itM9Rk61MnI<ijY!Ly%7^jv=YUlg`cLmOwOJ@HClJm79G^?wO8q+) z2vf7m?6nYbY6S#*GNiuY5H+x^+G@?tJP#TL9re>+K~KhBa?C)KKh+E*p-K?e54p;H z-uNb0vkbWyR)1lbnp%G$OG`vjpo}PU*o}&pp;`PEODluTuiNcFBFmELneD_AsyG+G zkGm*r)oMJHmxrXL#=Plxfj%;6&nXBm<I#%{teK#)2aU^vKFj+G2|d8ZfX<DYT4pfZ zfo|^HD@jrnxXrnoJ(D*BEsHtwkuBFp`spvA2GpIQLK~G_Fij)vWt2{I(c2x~KW)!t zCOE{y+%GQUQ^og%kazlaaoZ=NV(uK8O?>)d`#6i)km>UtDzrb-*V{hPU&@;WB&3=+ zxL1-^s(vuM%+x$5wc!b>TMmX_2j=|8Kt*)b-4;r#_ff_ny|oEKpX@DE=!THWD9l;8 zEWjV=HO&BTAtLP*tp;IMlM0_Vn8(sUqI$?Nv_U1G^tEZC@of=jxa%BH_{Ai!MYo}y zE@)vjviC#f;TCVZ=HXtX$EDFgCrJNz+eAX#tsgc!-#{X?u;vu7>K}|6xr+Y+O$ixV zZ+D5)r){a?S581&?=jW!dQYD^njLNZDwQ49Kbq9~QJUTP@Z(p`mlCNjK7uj2dw$*y z?Fs@NOQ3Fcxb;G+-Z81QBhBuJS%CWlpf9gp&E>m+$xzI$NMcrT+APveYg4QEVhkj# zC+2qrf~MxI;{Q2Zk_`Xps%rkG7-Dkc{@y;QZ4Oz0#y`#fgd*BZP3DWK6>a+@*L<mM zcZ+wv6pXlQp*qv|N$8nGnzy|!owe_wFT`9w_5eJz=cRm7?ApYLBWTQ~Z~Xh0d`OLq zTT$CqaQsCoH<7xV;0<Sr-s;g0IvOs}L}lA&k-l0$xByYj4z~8BGDno!&c4z=oz(hi z8grx*iDYlPN`q&LaV@ehXt=Ne8MeK-x}c@DjsM$J%twl6LU~JSD&H^}!^3Q<i@!_g zv@vrzI}>D@EZXPo+Bl`5Zw>0+GLF5OFNogis^p(SM>i~SO7+N+7^b&-f@XG3hYwRL zs{rPg^&WTKXuZW1;J*Vf^E(^LEqH+VoqCH0;~Qle%pqFtZQVGjSX7wPu*PZbFwOi{ zG*lGy6QCZdX|wX?4#`^~>lfT8wQf{0k4{L2{|oR+{f=JfFn@0V9WOeR5QLU=M!U6~ zB7d(sir<zi(J(xWuRwrR^cpgzK1ceMKSTyn=7h94qQ})c3tBJ-kufbC-S8FZ{*A-+ z;wE$p2;6zcG#Z^Q=wCTDUVHvM{Uf{T%s<wYuE%Y9r%meyA9u+1R(iScdR70ky|pt% zO*{K56g<p=`;6dF!Rj_V9Z4Kex3fBWL}~ny1nH|{??HFC&$rtV!@%g$GEs~YjUt-3 zyg5y8xAoVl=3`2GjRmRwg}nzj?Kb^myE<wR3=lWy37hs;ROnh+ySnXsoC;P)_ZOlx zK7zQFs(oe^qFNu3t$Ssyg|9J2k2}y#^%uW0`}(%CH2YD#%Pcs^MniW#E!k`h>Z!)# z>Ws#2b>jJh;6zDv(pxgML&lgyPQ#zcbb!!sgpiDoqu{tG6%!Ja>nvz7KufAa>qaA# z=oV|HC9oE}Y-%~C<~B7KIy+)gcYDw!`k|a8<5gBx6?_n^Hfnl`YGk#JRXDw`Y3W5Z zF72K~Dqd=&sK!kRIocXZ$WcQ@HMx}F(UwwzM=dX^$<yW*)lApsLU0ONe1#L$wDK}< z+m`P7xi@OFy|1a`^g5Sax&QBIL?i`BM9fM)?J~l{Rc2^%VhrUz829&peWXrWCnHlz z(^x9cG-`TL;&SCcT7aJf@*!}hy(}@hIc?50YSx@pYQ~(aH5qypGnehQvcielAG{aU zX~0_@&*J%hxyYZhxenZpYC#MBj39u^sFM>J%<uNLp{5+>??vDyuV3EiM+4QdBA;io zzdv6tSFL<#t<s2TfRwNG7HQKrPlW>QrIPdbG7F+JhObn}j(kln(mY$%K{!!5k#)1E ziz+3WTCrR!=CNXVR%|-O_{kh9N!CV3M%Px+KVv3eg)|H^tUYmMQB9Bbm&lY5<g+!A z3q(W{bNLa7G-%8GR2a%BXjxsm@<>uSRpgw1Z~T#cB&t&nSAs!Ug_}|kVHMz$WCS?l zqwD<1@hy6X9b^#7A}+?pyqY#|7U^Uy<!oE$R#G6OIHC7~?928tC#m||`Rwb!vt=?X zUvCU&<zZuqgAMm)Z5TgaQb)3^o#QYflyA_|`O&KZm&VE*-qc-V@o_Xmrh)G=FTI?~ zaUiwZw;@Gy>*X6#P>C%ujL9h3=b(@6wKWGF78?2)w89yy=;G^09Q<ASzGu)Qw(X;0 z{;ohoCMo#dETWJz;bQfN@r_l;$_tKiy+f|A>y^}WR?(y1w&Cj}$@F5L2YsfEL<3pY z8Z-dF^8sAbhP4Aqi=v(obhDs>e#QftDyng66L`)T%)98HH5&8BF<Y>v2#E?5hTb_9 zH2mD~chFE=MQHmw0&)Lo6u2YqKeGV1@zG*g<1#Bwv#zb_%-_+JlMrxKd<~ir3Ze1+ zy(_eP6{~SYKhV+(S~~v~1yt)79UHaSeZ5h0^WBheRNU;+TO4|;1L|kljg`GxMRVY5 zgy-B?`L%XKbD$65%Wkaf(<V0uOoUxGf)z4#f3Kscu6N_X#60DBpQ${*$V`+W)Q3=C zVh%!IBlLCRI)r)=>P<|yYD*~1E|lWFafIgb%{TqMMK!$}&wwd`weq~AJfD%@n)sU_ zUiHfyy0+TP&cgr)(wf;G1RCO$+F-8vOp><HO7p|jNn-Q6t|xsd^WT9I=Ikc$B){h> zOt(p4nn%&aNx*RFpHZMF4f(Ufvk=7?JRPMYo=R06O@dN!hp9(J{WAdZdPL@b!%!G% zLqHJ$fo+g=B{EqW3P?d+m=J67#;*QZ08JwbS`rFm!NrD0j{xSFfN^d-(+{H;KZnVO zq>c^Kn`akV>TQ^)nUX?$=?!SjnvZ-^xEv3@Td*3+ToB$GLi`Q1f1eLu;*Pvh0=OLj zdhtFgHl&UZQ-JSB8KgFySnsCLa+gvITEM<JVb|Z0=_NNbv&@H6(`bHB@Igt@ghI@c zl*U&;NMph*gq!`YU((D;uXAEi{}>T?_A^wxGy~aKk5P9rYN}h!*-ueoBA*hw4DFOr zciPZ8^v@j#d(UsI=5c%~N>l%e$W7+;ycJQ_!+(R9k!HS|Ec90*HCfot5kX%T)t%N- zi~Jqxa4NIzB;-ca!0JvWei7b)=I>ieG+2$PYbd;x;wr_LQoMggi&;CG;F7fIhG-(% zJ!c$nrEc$qdPCdkvnu1mRQk}y|2ztlU(w@aFd)D-lsL#-NVQSwulrLY!m_|0v*K-t zB7y%f8D%CG3s<7iT|s_@7ZVu%+>P|Sc?3OwD#DH8xgHD=<f-VsApaaa9sX=8nv;#Z z`k}l%#O<|7rBhsro=L%+c2xoT1-LwYZBh#O<!BUXr-(Z|lREpYkzkpMTP0~-Q7W02 zwZh$V@M_pc5wh%Sm%o^4qt8t_^m(klPsMxqW>>+Hq9%@@@^GtBaXR79?>LQ?^WZ#C z2`ni`a{1lFpInCsiUb$05edblZ^2mnBP=hXEp>8aJojRG7BaJEcKD<{j}yzhTP#U? z=Aa#XBtim8=Gg?r4Uj`5WN-&1pw{2h8%&)Z;9p{i7uubJoO^Qd2$-{7c$u@ERF>y& zqN~6wdfjPB!z|)D^aBs!k+_=q&oG%~7!{|m@ca2}v;&KPJ2>;78Umj~@P&9JSqLha zzlFYP<2&bKzVZaVB-Mc?2YHnu!LA|`O$fbh{3s#N;_-HA4$=p_MZ|rGufc4|OmzUu z^JPvljA~1&s$+Aa<w()zNx!G<0L@dyGr)f#BOMeS6)ST`QZT9-X)BDf9E^O4EH=;B zE*o==+8m?Sfptj=P=j*yt%Pm3WkA!^$&z|GbdnQQQMu~aAXl=XRo6Mq&w=2&97(@S z($~pS2zk2aJAG=JelIfRnTs4-Gueoy6w{_W-;!`D2U;p&H9!}KX!)wyGt%13G>Z>O zBaXr}qS-H-6;8gFl+j!hB|&HG__QCH?uAZY6+qd0>UH`KS<+@;OtPgV@|*2uh0NaK zb;wtOjM^yvHpr<LUa2YUt!L-)wNxOQvg7UAl}UBoaAs>tzb)z&!{3Y1&uQu2YF0;6 z-&pJkNPw~TIeP9tMbGFy@$3@M*Ts{I=TY%&5zoVT@~P)d6APo+yaISwqj*6}fd26l zSTkcVuiyVH03~%8i#~&ZzGlPMWCA!0Gf#IJR{FI;?gP_@en$)RA<KPQ>9elZzErW? z-z!$}DeP6T*8k_BYkgYiUq~IY)=yyvyM1}}O7uIRM!^y9drD&sLd~O$*hyeu#5%<D zB|MuR{sPa&<4WTs;8UXSCjiNK>=0hc&P=2=ADrQtvtr8#<-kGZK>Z2~i+YDr(2b== zcR`DCps{r;k|OD?J&uqOeF)jSt;!F64YPom7yZ+9fQ}L6K;B(=8G8lk_6m~j6~x@z zCDMtQotu#j_2}HA-lTK8dcDqNby|73nvIwet;T0PM(}dy%>!Xa=e&Wit+N2(1_4tK zJ>Ho&@F}G;2jTj!uGD5=No4gi+tKUoGxifUO6&p|zC}*Q`Nt@!^HZd-C<VXUGE6z} zYOGW~YKVB}>-c2srIvNJB1pwv_RV7Hs}lRAC|1y*^It@P6dqcjDCIs;$|7}n{a0bN zwEnC0YEJ!ETa@VSNVnP}A=G&bfqB<!qf3&BkW{O;I*ahh!r#?-)j-(OIT_(*`<&~w z3HA5cW@%$e`m=&S$*g^tLCz@<0M`kCCyB^pUPuD`kpR{zjc?QYPNne;dVddtKfN`j zaX-DcDvf*Ty+UdHHQvTv;)Yn1ge#yte=uO|J&YiKVh)%++R_{)&I_qiSd0WOwwE}M zKLJhMY%j5@ZER5*pMVy>1mb=`bXK5zVw9e>%7YwwQE9vvGOqVjDG&Y)-L5pEZIaIC zt1d9l3jE3C<x2EN7|!Ysdg9Sts0z6xi~B92`HDn$#vVI|kHS`EJa!sEBl<X=N~|0e z#G}+#WRvWC64CQfBGXLJSBXA?#3B7;AUgP28#eff33<>jm|E(KL}PG`1?WOK18iyR zr@EEK-#D<=?b9-MKLq7qL@AMpXFN*8q(*e^0F2H-_4k1j+Inw(tI~Km%BD8|oIZZL z3U#LP!ouD_m~3*fC^b0{i;`Lh@J}(6VsVI}X;M5&;!2eyMl~<&Z4!WS0Y`~eMhmOX z*{Fz-wZUowjBH+3?(n{;&a#?E?5n&i88K>u>i%i|!DBr`8qsAZj-fVnlD&ENu7UOj zcr8tPJKsdI-m^h@@FMC~8b8KU@3}+S`I1Qgj`G7<7-#jKJJoyip1alQde8Ti=;Qd- zEqbZmLK{d(>TSv1K-&|`*$o3Y^LH_kih}8`ftlRO=24yNSd>_EospK1t)P)MNSMz5 zMFbXV!)H|iohdPqaK2TlCsdyXsw|yVJM_5R`8Fcji2AR-qupV#6XH@LR3unydzvBM z4f~1F_TbC*c}(zSLwgMXgM4Bpq**9!s9VzD=qH!e1;$?DRCY2k%qp0&7j#pf$VRk@ zJ}vAuqB{{t3Z*G@GUUh<RahMtFhwyjk)sMzr4_lDBo%wm1?Ew<pEzDWl-uxWJxW(S zme6Q9$r7u~*=q@WxCI^x)$b=M|BjXmCLRK`hJZRJi82A?y-FLA>=QH+(oZ~6)oG_G zm7oW8n-SZG)I^@nHz|$JLoI;48x87n8XKNR#<&=^F9+-;eGV0gPPh}0%>uwt*&h7^ zikjIJeH*WM^eCR-1*y{y7<3vkDAAj#<hY}|)uZNEl<988lt+1aVQ<1g!t+y1WES>P zqW!0sNgW>q8t;8)$CzynZ~LYZ=TGX#rStC(HZCa)yTB3evmPy_-~(OswN&RE!Vcqf zp@Gi}J#;B+uy|&hmNr=+9n;P-K_62nm1xV3H2SPw#e|IhbXfof`+6|7-a1piP-HwN z7^H{2zdg+^sM$1pNn(G@e>T6pEQuKCV2I4dULmNrfxpt(oApIA)u1V4mx*V)ZKf|V zchNeer}=!|H??#5LN6WbNlX_CYfykKg_THOR9^_2FTwuZg0(8r_mh$V#aE#VnGn{e zeCl;DfP%p?tggB$k@J+TKa!uwd@4m9VSVvf-3M5SiBUWMu?`fM{}^?u#Rg7oj438} zF(JrR5f9(+cj98FDW)K7zZihT$5@OwgKx%nE3=G6vK4Y@Bde<-Gp$1S)m91meo|RL zn<`b;MO(K26BC3>4jV6|nK2@IAd(jIpM#El1d*~p8E?Q^LTFiSdXY#}J?38eXq6wU zILE&{2PF4XZYiYgP2}og_GW_ZL=T`a(o6hRfQ6D1w{88ns)Va232{Fagx$LRq%S0O zl)0Az+ySZ5pA=~!CT4ui_9ihZH^Qxh#U26>6Z7Hbqn#h2z5ie)Ybiu*0bt+kjg>s@ zjA<Te+x6L%J}EKXCyl?tC*6y`SMYZff1{CJnvdz?E#UyIH1B}!gaNm%H|Bp7#ui@( z%oNtXQp6YWU}CIctPO>{aix*=UiZ)(*qFTw&sY<UCyANuK8K{sX1gzSn6XuE_vK0L zzG=hSeU~9x*zTJ}dxI>C@-?(l4s4*jzOJb5O{H-dahv}rm2DF96vkFyo8F5}t^)$F zZ(9oMi~Bo>vl1%_AO0!k4`R(0WECATr`T9CY<emo<caMP7+pC8BYll5)vw8`??*{r zQwa1doJQE+frH9%)8A24O!>DxmPlhFq~FmY!A0jT?5Z*B+?Z-mztE>vHrpWqH$Nq7 znQ$bS14=<K=P<2<wbKUBCzDz~Nwd$g_PdY~mJ)PknIrr-mL;(=XMopVX(6vP9zl!D zG8t8u=>F3%*>!CDalr@dER`@@Y?!6d@*<PA64UCJIO-D{+shmcuo$LBx>vxe+Ey;C zzAb-8pA`ZV>?nizOJLlY2g_U%w^_#AX+&7PCq<)De2EOb$F4aLln1f;?205wZvaM# zVFVXXgXYER?xJ1UNedWLbhw#43pHVVJOXQCT7oAT1xqP@drH6g1<S->K{s|^C-D8~ zII-`VG_Cp(PnuTk%;)M~Y9hy;0G87Oi^b`fGFXmJv{=-iJc*G;s){U*MNc7w4PZX$ zFG5NYGosTWBeCdAJRx94bOr)R^%*-w;fF~?jmJo-7}k16tTxu|e7FZm>vqP@h}UDJ zMb_<%9ulu7Tg2<vB$|&tC^RDTJ7N`%xTwhn&1g*%jMzDVutmMrtSTNQWXCw9mbgHc zSQk?Rq?y?(K)r~>PMX=bAQTgbqx%Agz--_|=gN^3-U*{nC`=`o*^BWB5aoD5zDc^L zbCPah$}ndW(fDOKfCnSmYs?O0|98q>)A^t1Kmi5fV)^NK<0K|?>Ztkpg{wAx87u#* zeqqFx;gPHrpt<9XQ}|ZXmRbrVBf~@9!{b|~w(2b~o%2V>(ripi+vjs*FBxfV+~`j# zwUV4ks{+SXm<c0&r6KeC5rkopzl66j6a9?+$nen{e9~GIIv0{&3jd(>d9E1#@;j=6 z)uOkr_4gLM5-{%ICcH@ey-Dse{MZBUT1zu282Bo>*21v||3a&=U&8)UQ`x`eDO#(a z$+2t;o8*GowEI!b(%StdRN6V}iP(KElBg`U#9@D{z*)%O`vf>Iabn-XiXWl4ADbAC zbxL$JvcOIfTh5KDUbfOny8snu^oxD!YWTy%94p!42i&pJ2V91~3)1fIfdSdg-sO4d z0#s^?wrun5SjhZ6>?CT{-mI^K=Fel0?4c+GlPClQ3ODjHfx<bfb!|YLTAMfm$~F|; zzUi(GI2jc0gto%WFHCQ)PbR4%le@x}%Msf$Gn>-kp8?Z8kIzIS{LZ2kPIYA1qR0t$ zn7?WzV-v+FcYYJ4Hb@syr5~l=QXFk8m(jW!<oq3}hoUN{(zpzPWU;St4WBx5kz$$J zstdZw%J~Xa)f0lN%jHF>w}53gPr_z=9*MvMv}fS8675hU*yDz=>Qxqp`&p8$PzafG z#m<%=%AZ_k$Zh6-SXSFN%1V}W(ZY$4no;C;s{g~%TEA5qZDWZ>Vk4~|HI(T3pO(1a zDly^=Z=limT__6dNkqF<O)qXlFWR+|h=Y&CAT5mkLH;f(3SopqcV`3xyoaI#cJoZI zim;&G0GtxTkTVqo4z&eA!rAH-<PNvS(l(>HhpOr_vsaOh;YYEgH_}4<XGm>}xWc;# zn?;DgBeLc+Ou7F;1!12zVqb04b$E-(L8Pvlop1dlMR<bP+lzA4QYLl#oVuz6cm(EQ z;W=YB{ik))y=}SxV~#Y-JE9cTiWGBJ8vh#n6tWyja?=(jex4Nl0ne6Hft8KlkV35y z+y&dDCbKdpJ6!*f9e$D*QZ(PwG9*?lf;3mNx%oX9!Dm#%Tj>sXK7|7O2c;w@PH!A` z$}(qT%e{);@wHLrOr+~eoF4r(b2T#R>l_%jYgt>r>5{5}aWNyvNppn~*97@Ca5!n) zRB&u!64`2fsMa0iy>Oxm@QbJ?bpB*$d`r@}3#0zCM9#0Uq@}4Awna{XqNUUrOuWc% zslzKgZj_jgN(3Qdj%SMs)!HOMgJ?$SA5m?n;P?V#d2f=I&$4o7cdM>mQ?y*xMg;gx zgc(g7CW7dRu|;*V=I(Ayq5ilg`3a_A7|!c@Ic8!~S)viH$y!IUBc2WN3Q-Bvj^$c3 z5<sx!+AtAP?XbA>`_KmLmGEEV1Gd_1d=iz5E(t<VUtR&}*5~|vF-8WPHZkV-dpSZz zp_pr!Gxc~5uY<A@^EYRi-j}!SIA#*7YuofZ0ZDU<FPT}zCJ=W74^VFOBqlYZ^z9Ct znpJI{sOCq(3^0R-^me(SFPx2e+bIFLTI}*=5Tu69@DqdIKdD`5F%49^IqMZF*38aD z71(fbhEG!8)PhF}%!TM2><dpIQPFbva~SF(6L|_oSg~2j>p!M007t}T351I#sty)U z+#Si`84w_Buz4?P3V#KB5SPf|6%DG44C5i97KEp0qBcViqnfK8ixAqFYTieA`GW(w zAaRLIV{Rh7ntx26`g<b-#gL;{Hz3<k?DQn<ll%HHt7-aNNgEa5Q|P1E;2FVHjLjkQ z`T-Xxw7Q2{9Y#SISPD$<Tbr+rbgU>ie*R0Z-#Na;r%mD}%<5Jvs_7s90pggwVaNJy z;Gz5ncB#LFXNdQ_W-sV26M91L>)3K<zv8-CZ&&nBu)9dR+1}I*&}Lh1fJ$0Sh=Bu1 zZIV!tHtTQUYHDH4Y44xZ5%^qP#jpQBOzXUV(rydFEg-4H)}rs&NhB^VDy~OgsRcp) zBQj;caunT&@|oX7tBL@ERuek?2okS5fdLs%LT$*NCE(OF3x;97gEqE-ocb9DFl2Q! zgtm63uT#EgNyte@*InzB9Z1=+&_xdqJ!aCwM~?tK*3e@^?B#m2W|4N3p`^dmSjEDp zr5EJ*DeEctDj!a93cWB2&A~*29n=53!&rXK`>HxJ|5fbYYy!?SjKig2`8l{-`R#sJ z{y|JM;N@7?!z#|5{daszTz&pedK?9JQ8F;@qU0|0D_iceAI?7tSL#Z>U6e&#kwgbP zkkbtwSlf+Cu<f@_ncfPo253+zF_re*BqkMOz=e-l@dSF=3tHNe6Mx!NOm-RZ<2n>! z2^i*I1ua#Wv>X0&z_aSn73?s&*dqlVd-T@)W9p>J$FO7ZOZr;Fjpb*IiZ0<kj-=(t z)3frtzZVEN)Zu&;5GEyyDoKyR4}t#_Nqfj|4VZ{Qpi+zi1s_y<&#G{Aa&GbPMOY+9 zMu&t)2l!LwN5#q;zBt0;6CDn2Z&SxMOE<QuqarD*i|U-p1COE7rnIv5v>VIdYQtLL z+vF=8tIkQ-iCW8@Pz=4^uQuJ=>}nca<}1w6IQAlU`d|lyHiM6o3qDTHh2A>nrl2_S zA+q^%P|?VQl|Hvwh66uk?P7j%C%U{@zVS76a{Yy?)f|yCw>|CZvLrN|l>4FS+vXAI zH~1Q@M_VFOIwyh-O%sQD3<-Z4nfz%+pMuT$dA}3f(Y)N<c#Ca<Hc{-Aj|5{d<1iXZ zo-tGXE}|+3jBfS)BafO0JZ&L^nBNGx!%&i(k|jT2v%Ep@)Id7GlWuGz+R=G5+`2DW z)a`k83dV!1XXu&z6g?+ALC@Kb)3f+dJlE~aJ}h2YFNxQLN5m`jA@Q2FOT4byiPxhK zrncaPvkrTn6K}_!eR#*Pnmk1DXa@$0c&dc34gYu3$34$Yo-f5ypTaYP)@Z5EAVe%L z79fULyzOojc5hm0T5GmFJpjT`w=@qL21F6dx9}hS>_d<iZ+bBSNLanucs{{|sq9Nu zZ%5j$dIA$Db&Ad%>KL78sm^jCQ2QJXENk|S6i>1Swe1^0VH!|z6vhVJ3d~qpZgqg? zzXJ`{qP%dJwHn(Uw4c1)+4_+yvo*He^{Zd~>O~p~F~0$D{+lmT#%8yz$>m$BosT^* z0nr20&}O%cv?bbkjJiUE8qVZG$Ol*3*xZhC4DtbUv%|~|qj@h=J~GK)1f2?6ni^AS zZU9&Mjpv%9p98c#N(mlVtgend_5~7@=MO8-+r5XkjLvWM1!50n(f5dF84tfLw0Q}( zm*9+g613dxj758q1+@iGGXVyKBgR-iD*K=c=}3jXt{(VYjZ9Vis|CbfrAYwv)gXY_ zQ4v6I3!prr+D<=J)7@%Qhu1Goo8W5RnM%bbM$r5yo02?~go2uOrV+Uka(kl)NYvB= ziJ(Qrc=R;N`2{d8IC6yuvxg}q);OGU*^kC<_2?JJZgJKx9*$a$VY4ft=wFT9f@+7O zj$`$od74}ad%Gmf_rA69AldC`VZZbwE$pF`3rQ)z)dl0=BiP1ZJ-dY$-og#)1bxSP zNgczsgfSnLVGH~D`xwSpJO32GZILW~7K4{qB>)7j@ZQ<NRquK%CdOgGwE<m;>40L* znbh<k|G`<n?<OE)VVDVMWCQ4WfcB5bU=AtqL#CZZ1^b}qlhbb~9C*-Gk;ZxAT`V0Y zybkv}y{}K37*C}jNCD~Cih>GjdU1BZa@I@C(fhvEMh*p00h0JY@9QPky)JkP4t`7= zqP*~?>!A&M*52<x2k*Th{F-zns1|+)7*@OCH45wZaE#_Jpf@pHc?`&iqX9+x9zkQ3 z#(yT{uqtVpS=@!-#!nke{xxk-Yyf0~*(t(n5msJ^!~C*MP!4Ndq{RF@00SGz1&Krf zl7x`PN^-FpYdVe!k1rrQ)O`+Ple1_!S03m=74>zWqxiQFifLao4{wB9^g%?F=gS~0 zM>_u(!b6Igk78KGX%zF_BQvo$i2dd%>Ll%S;>zYS8{}-d^88%#^8m>@n(H6JN4eBH z0j1d%dV4m1hFL&aSv{tK$Ix%EF=8gH*LA?R>-5G>76)qa5?U!q{5zOkM$(KDXRO2( zGaf}bx2|K?&R=KDobU79gq@AE{9S-_z5ubTUu>V?@OfJ|ccbj>v{^6<LJ%vN_+lT5 zs+VQoBJBbzaqyAIfg+76Ibk<ohp|+arK#>CO_g}6Xg2YP5?z6EY1!XzyS@qf0Ycyo zuOK0K^{@C^(P8ojvDHkzYo|CVWwttu893J<y#^+hB@U&rn!3T0f)?HX1<Az8=m$z; z84_P?0&WlocJb_!`cw(tn=;==vp-BaJ7}^<vkj)5GB<|@BxD3D3m20zCAX#9AzLA% zHeAJuNh-{DyURAfZT&N3>rN%fv?<X)A_D19F*sY|SK`=n3hiSh@}3UycJ4WiH(bHN zbUmqcI2E<H#I??F`i~;nm*C<{G3o5OtmefzxlK(?W9UPt^?{_R4jL<mG)z;|t{nRI z35>GnumQA32}vG6{NITX#smVXGT-f&W{?OLdm#JQzu|LRVj9_7JPjAE=2mf)a`9Ab zAy_6`@*nHK5Zl4;M_QX+{4AWn;AI>6ng`K$p?E4K0IPv1nYAu|;3Z1JysS<AUUB&Z z&@#*(cou0$s4dFTZe<VbvtnZq!)oOs{F}_@DHn%f0h22Bz;l-Xygvx=wvPbJ=czn? za4`J^1Sw++(os(-O7^h_4k30Gv1ow*3jo*yuOlp`=K1je*G1A%BvDKgg|#5YBM4&7 z6Fcw+#8`T96Shm$F-4CMRvOmRzlU3yc>^y2SSS?R4u@cwoDv##^y~sxs3TZ9P{;%d zV4{fxRJ6JmKGh2ygURWXjF~(9skC^I_ki6)F#9EEOd#ZJVmWw7$<^jN><83bny&>Y zLev|G5KaS;mcdAD^#EG;S!iW2dlFE;4^Gs>Ag}%LHh~9<rUs`{k*H`89YP}tZwN9_ z5Nb4>{Qrg)EWdHM7sD`c1JExBvYFoV>hx-(khc<7V#FIC<h0_$S~x^Q-Xqi}81h0S z`z(%QOf59lZteEL8@Cf<Egd#yUDjAzwgL0B?HFrwc{U|)Sf3nluR1}w+xceXKz4pV zDF<3R#md&RV)B~jccRiE>scXhtpKePdPzHNO}c{S>_$Md+4Z2J`3~AJd3QY$$aFIX z`~CFMe8)VB4>GIofqW${KcIdLn~0fokH)b<em8~*vP0#B*Wwcfs_7_=ve2~sD0Cwh z4X~qPqW%M5l^nSL-&NiFUsQeeSbx>K{=2Hp>_(s@oc@#bn%UH3)&+`=hYRR5kn9dZ z4t}=DW@k4MKznW507XWFA~^)<B}jO2XA!N;-9#m#*l;v`Co<_-f^MC^gCL=EAEC~D z;8WB52Ias8vj}~36ULEv*{WTgK1{L~8r$6<UY<ovHi3v~o-iID>W8V7CdN|4i6qAM z4ebxmQmUl=ftwL8iI;^*g+j63Erc38A%+wZ;C|f;g&~0xDhNPW0h~tJdNR=LCeA_F z+`OLKFu)Did$N&(XP^abKo7X0_}Qc+i1%iQ04)<N6RtU%hyow&e})9WON1!ABurbj zSe5(+yGE=FcDHWzM$lQ1Z?>CA%1Iyuqv1qukiSCW1Bc&-h@49tFbOAM`K$%MhYGq; z(=Mdb8GBlv@Exc~)FVe+e8f?}(3glDZXwD$X&-}Zr%EHufLK``s0(E{f(m10Gpv~1 zip{cOe+QoUHphy6YQ=n3>^&=1YQ<i&V&ztBzZF|mOkGKpJVOZ}R|iHdYfRoAhPD`o zCJfAjO>5Ar<~s<uzn7}5Uivr6h%|Jr#I~<T-l^66Eav$kuMl+A-Czo(;)D~h21A_* zQ`$fw6Ok*(FQ;<(B5a<J1c>h2oIp|=g`GTNh0%lGX3!tM2{;A|w$fM&6xeLy#&FBW zLg$8`qxT*s`p<kP{FI20Bq8#+h)~a(@94z@fxIM8dq{xP(RwifN@|u~OhA%2g_*aT zWO5IE*-dg3Po<1&m-?_UCn%BE66HNfnNu2R6tx5x!vsx*e~$$I3b+71-N?j8VH#)w z2u!(M#6@{R?1`9`T<@Vo{xRYha7AVO8L$Pq_Kxt1N(i1+U@-~+tM2Jnl;!>0eF79t za`&uDxqFzE1tpCq?*5dbmvA>3m(ux<kWSVVOF6@ag?XYYR>Ap^S5b0}94oOE(<En$ z!u;GijRYIYiiCzU!>x6)Op5~OTCvw2;0wtUob>WYcvweLn*2RYH5c0bU(rF-f+I~e zJ?;Jr(tMPJ0|^`4<^~5H^sJ2edjcqjt{$0)Qv~`U4^)Gz(0`5=KwY!|f-Tvtyx{Mh z>UY-HodcW0prhZm;p_foQ6+hf2l<u`8iBB-=?pz}zcz*!!uA`N$aE~WIpFqu4VnV? zo-95=e42t!iI1_GgLA`ZxTinmQW}4NG`2+6JNk^_*djq;ddC;~VR*GW0Rc<))4~;g z2LDMLdW{_CRVQa6OiuGzWHovkZVzODhQ2)jTTloaCA8|ORvPQ6bQ~a?8!NZrbl8%d z{GLVLi#U9?eL^*zV&kXaC_#%Te{Z5fKkPxRwAFGijIrd5F`k?;MzdBpU9)32kS*M< zlV`D$N30zl6+ZY?Rh9fosNJat!B{j>Ohc{B6>^iD7!8eD4O5Y*?yiCAaCS<~NYV+e zhRHr%y%HyDErVkvwwGnv>kvLO-rTR7pmo&@vJdL!n2n#~q3B!C%!r+T--lM~JvOCr zmX&ZPC4eH3zMZf!;lp@*Xt+p=5T$WG!r={2V83@`)=~Ac2U1bZXBG-lfSt0eBkU(X zBsp=58&D1u0S23U?Wx6=&4)aSdmK=~W#JVlCwwu5)X?WQ^p~LYyTw0bl>rj~{NsJV zan9z#Apbr&%YW{*w@2(R&YC`73g3c4@(;rh-7PqhhQ|>F-4+^^RuM2Fc83FigO{62 zKsg6dy~={YUOskRc7jj<O28b9t{nuDlkIVNY*KhSN~-23iv>*Ly2!btcgsodhiaaF z(Nrfzump#s%=((j!^xyq;0+K8nAcaC*^fYXVZw?9q@DMn+llsSHX>hA1Z0_%q`Njc zOeE)5^kMVbq|hXU=vWCIk%UpXI(fk9RTw<1<4v^u?B%~hoHUL1ymCKHgxQDre~Ohj z^d85?E!F&ORD%QiC617{XH)q;;lk9jDTT%DaafQPuv#zQ^bu7ATt>$hVvAy<Po&l) zQ`Ku*FQ%YzkMOr)#t!YFqg%9OjU#5@jI<-jUlJea_!hV`L^fQ}WQ@nK%X)Ym(obiW z9tIf5EK1lz(3lRSMsjd~A6sX1%pMaYPQ&yaAU|(83}~9OpspSw#gHj%|E5y|0NeO4 z0BMnlU|#@v$PWp-o#nJ_3GVAS=aUZ5qZ)f*?VA*a6EWiCUEJaA+xVr>vB7<upy=`6 zK~=->`GOD2F7$Fc8S&#d-jJr7(>HPy^SbCOY;q)zN!e7K+yM^r=h#~t3dIqrFK`n< zCWLBTQF)H?&_Q-k_@P+0N#J~Z@;EFjpJP9)yfEKg6;xihC#~Q(ZYh#;qTQRvvpOgC zSG^ZDX0R2q{XOr+jl&k`Ez`a4Y{Y_Htc?20qPHk7(ifJ`L-K^L%WiOp6rg*D1{_>^ z;NUXg%>qvs%rFQj3@McOm7u2O$gv!KdljX@JDk1*#1|Q)^fF&wE1z`!sNP{qPFaTf z#0ZxdTwg#Zrfdbr#r}<G`Ve<5>=F&}qOo#d(l#A<^XgOJ1`lz$Z!2mWEtukH0>@N` zI(+e;%#kF%0kCc1td+=iIaw0-kj`l9*ONiM1}sR^L(3Awf~$6`=uBEivRA8$iqzrk z<aa-C>a9-u``*_!e*WDSr~RP!@FuyaNORz<w6!}i45Y_!lRPR*7HIuqs^%oOKH$_z zb{PF46zPWuuqA7Z3T%rxjU{W~_pV=%l_;%~SymVo!+=B2WA+Q)ckA-Ld&J4MuhQ4z z#0D!CpC{1g1@=DyA@7N8e`Ynk*a6$Vw)ltG`_eMvWot>`6Sc*=`r{20Us4QXqV>Iz z;&Y3C+#iop{OaOZfBb%mPb_}0KmGv4hZp~d;^`>A8F6#-TI_P32pQYg!Yu)ftTa!+ z{uwgL)?fr&xw?NG0)Ol&1iAOjp@)wirFbMw2l&deh}glRfCFAZUw*gSY1d@E#p!L| zcm_?kSID*A)=jDO8Fa2`GiOs7{QWP{k8Kf8xSW{bCfJvg{t72C>gg9VcPv)3Sz9C} zl;5gO!Jmx3wfU`DDc=MRNFFc6>2FLjZiC<*AQX4gBeBNZvWlG$Ck^4`(=M~L#I3AN z=ZZQ<=V@wwITqVLe6Qc^)IUzSk%F-<@xKocdb{b77=3`+yqg}0VF#$yyXleKx(x8q zXoKPJ2;u&Px(;y0NszV3-=U>rAo$xWa9e^a16By_P?Ufn|H6y1It-12KgUIfHl8g7 z7yZFlxCZI4A1z&LR2+>jT)Pv+P|DR7H{moQ%MuKgP26LDwW#7$-B?y}iWsYUl~FnZ z&Yh<cAMow45#X>w(w`zbS;{1H%i1b)c}FNQ7L>)=Sn}GzaaLSC^e5^9@$FK?um#wU zRT`XTjfHCqTKF048dwrX9I+U57-WGxD=v+$5>fc}gsF4yLQYHNlmC*L{dfna`*0e$ zCb{(s5*8dO9s}l79%^N+q(2(!Iw+3C3*c!b_>FDg)t4Z%X0Ud1HbwY0vVlOWC{*E5 z3eo0n4Qw%kNHeLSP<Xjrsc&`JwLIo?7kg5FJXXyvo=mUd#Z%~&UM%^3YSU7AiI}?6 zy#nDMuEtV9?9IWr({HIv<>gpr!CpmYRxzSr7|bE|d>kDyr&zTu400V?93i@~t2qsu zQlCW}3*oR2#)HpV$S9^0t62TLW|dHtSP<mPkb#{nsh?XMQm>8Js`xTM1D1xmCBdoy z-*z>4Ma*#qW?WO=7MzSR%zl<E^DmkLBW{O`>C*@~NxvK`uO|k~sUb)^<dW*=e<V4W zMnQ=t!l$iy3S0)N3R;3jI{O>8sN-Zl2B*tv1_`TQb{M0;-Su;)XfE7y<nR6M6x=jd zMsw;pW;(nH<mR-d6gU$(n<pyIx4|ENB6*3R4WrC-ItvQxV1=_e&Gb8)Y-Okb)ir*A z!=Si*L3_IXq6gP!UChvafs!2U3rulz7%fv8JAno+{_v=dIT>17S>o)H#K+<TSy|~| zC=kT$JA|OiwBaas!I4Bt+5GystJDjG?Pb`c!&HqfdBA3-t-f#y#)GazRzV9~bNsz@ zU7o-9SSOq<M=lbTr>t6l1|8A9q_&_B)#U<587SO5CqrF``|^r$AT|Ktsl14$T4-ce za~hgwHO|CRs=uX)EIv93VlOk(@oBlUtTTuK7}?X?QzW7oWpH&4M<QBMyAs9Ob&q7) z`Y)q6<HT|*SY0%MtmEL)L$Cx`6ZS9!Az0NkVLiN7tm*o0I#+GXo{r9iX*eBigO7k6 zccrl9@X7B9R8__5&hcTGmC;7nA!jjaoww;G?C)bOv}pnBY5g=M=1|~Oe?83E?*ObT z1b2ullG*Kj)j=xY2n;<|0p)w>%(WrTUt>*4ewWE9BqqPRHvlmm_(No#gNRobd_evZ z+SM>R!?{Uy##0G`SS>NtvOMWMTeV@4lofmE1MY<qC1BMPZ2%DYLs?nHT^Fw+iN)6y zO;U&ZeCuExzhJ%o#%4c@+TgX3AFn#r;|o;d9u@yN^BwqvfGXDn_|p&|OiOzan_PwU zc@HMe=Kw{<2Xeve<@?Zfa<an64KvR(D2}xyR>AjOh0R^N-^_lBlDfQSmBx*rAug;L zM(!9F>Cv6v?hBwUz5vxg@PW1yw$>+*LwF9MzF;+fI$y|j@&kEp_OHE3z@WXsn_)V- z1cT&0WZgr4WI!*4bewMw`Ew>U9kx%!7N&kjj}V-y>X(;%;`=>pC^)<uSF@sRYR37a zd&m<Zu?9Cmp|#ns6Z%?jf!1SYA4a&K%d*qa`;drZW(l|!g7cp%@OKq-!8t4az*3Z) z$c&!VaOoFramws6glqKqcZ}IoLG9}PR*+c2QCZ;*Se7lD0qJJp&c6*VTy#icV=n&$ z)>E+vv_SaXhzrNC#5mlI)<GwsnRPM)D|6*Qsm-Bx_+W^(T71}sD+*G#f-=^?(m#i$ zyQ<E&V&w}T>1LbWO8cBktOV@~+J%;q{#VHtvxzI4k{34Nq7>`8CeG&fBIk9Dr`5ct zK~6Zm<0YADO5%;!e7Ysik>A=Do8LDO`g$PLn+yr{iY|f>Xin^6u{xLctmgJ!-0T90 zz=0_S+?+ba3Q)xDIRDZBo-%iA9?#>jfepC}D1a!agS&um`A-gQm~YxgqS#fm!mUIf z1#Y-|$o(QML)T$<^?Jyzf|@d`tAf1nIm+wgD$0mUuu@=y0YN4<)%$P25nPB|*Lg2) znZXxP?NbJBB0Bz-s2v;WIG+mylbh+CcOl$_c?7iv?r$W|0%qC}n6U`QDx8&7)xn4@ zR^hI!GHRT#SDD!)tH|hv%aszXr7RUPT&DILw#1A5O5yuTlnxY-xX}?3??vT-)p%30 zZu_lhR_9X0t!2}tu0z|P>_D<XS%FQ62zMjaoA7NS7q>xArfE_=?XQ3PN+99B#9u@m zbhF0mK^!`8XSQh5(aA1^o#gDuP9h}Z-No9@uSNP{)=qExvBW}zS0RP2Q3K4e&SM`O z`|Q}s%p=;l^JiHXpm4_@zPQeRVn4QVxEF9+<c*3Ku$wcM<m1D5T%K9*0YWlD&hzi% zAmaNHdzGEQU1+GM_Ml7Br`1EI#4WX0B%&_D%nb~4mM;rbR)#%y4xE{=TpkYLN=SLF zF%A7irzmD(c?9Sg1!LI;C)_WvKD;Gwmi|>Abl%@KUmcsZIkxJzE|v)=fBimO-}<`n zGQh?(Pr)ID7pdDR;zlI#?Aix~nBnFzuv8n#!uk0Q+SJ@faB2bS!%b0g!D0T(y(U)A z;T&@V_`wA$CZ7v3gHvk+44Pr2>?2Wz(<5%fWLKE?<eK;7nD<QQ*-1dm*l-(f75j{a z^@8JMP&1EV%7ae-jD5*kv1_q<Cial&>k)i6%}+2qfk<?{OE?a?RPvux;>KUvFkOzj zd*x-7CT^JH&k5#n)*O_v+Y)Y~xo*Q7K<<vy(4Mk)w(vup0x!@*e*kCD6c`Mdi7DVe zuzAFgu??Uvp8%*e&nACxxVb7n*p22@RkPx?kOjS%G(EWtH(*-^F2iqO(rH<iD!{X$ z&~DQGFh^;_u?2&huoC2T7r=Q!9LK^=UKKGZ8HF%CwUt?Zvx7eS?~*@*c6G#ATa+ri zU9-vd@=J0zz|2DdLY?=a0KVjPEH!5Gh2pguF6;^Tq~AwiyZ~vIldHIH1dD*Dh%jL! zW3q_Shm+ZLJfYF~I(i#=52(P+>UQXlQ0EIsO1kwbQM&F^EDHr0nh^tqwh)D2B7?_n zilAi&`QQE=G)hu@5lxJ9;K%_k0oJMH<2)NCd6<`o@)-0kXC=MmSfHk`cDiQkG`}$q z6y~3x0xU+5+li9FoOHubIR>^gcpbyJc)-h;taj85W;S(+Ri@{gWqvXhWtv(Cf0>$e z$lbp%!;Bqs(+)|yc1RbX^k5a#NV3>Jpjg%eryF=Q*T`t}QyBQb7ImkwPZNC^B_zF( zX9T(9EIyHg$#JkFe-8TyIOC_SA3Sie8c8r`C00{j8cFzr7LXdYIx2CGz~tKqz*{(& zWQ18k{xfpq06{0AH#WZ!<c#9H1ZDO2H;*II#%JQ$xeYyx{G<64#0HT$euNgO*ceY7 z7y1~}VN77XuWg<l=_ok9f}Fx#n{xSI0VW)4t)jVxIB1AT<b1e;yP&|nq$>(Di9HWr zfsSP->B2i6qq!$mQ&>m2y&rCJ<(~y}+y7L>SNvLN4Kb7IUjt@^Au7Aq<MG`iZu{ZH z2pnq44>)mgC1zF|GxQc*KD;q8ux7+CO`gv4T{Ko#v%dU$!4bW!U*Im9JC8WPF|nPt zQeq*D8N(MD6*w)9sp$!PsEXxY%SOT9ngx4}<vnn*#_-mC(59)aUpa2lznZt%9+`J5 zyV>ErS=JWN_Ex?Am1omf_Ueg5Y;lU?{E5k{_LcT!Xj6f}<gtm|*i9V+Umo2@ekb^d zRfaq{<banNtCHDD2Yj9E73Yjw9kimtbD0cBDWF9=8AEEV>Cr#788zpWDC|YJ$FPUh z^t4`dMCO4fZ?5%zxH*M=Xos;&<U)4uJ4kuQ`#w&Lz%TzEhxZ;?^Bxd5U-WDm!(Kb_ z`T2JytH5`$-Jwk;q^?bji{0EI(x0=irB4Fidw?cNk=Y^#T?r^kWQ$~Di3}pcCmQQZ z>_9=AzOOXaqY@0rG3PNB0<=u~L&(1bPZ>||5?Nc*401J9D1EI>2oMpc)z>K!eDq!w zWId4pJ{e<0SWvfgUui~8;tB!e0$GPZg&c_gjv992vsk0RI|H+_UL(yYoe9_aE)!P2 zv-rMyo0xoC1|XKT4GhI*zXTBuOFl_z{YbHwJAY4ehpI{}P{enUC0TYxKo(J)Q?)+o zPc%`NTIC|Oue`(pD0kK0TOw&0`Wi={NYS^#1LF=-92g$o5lI*&2ldDrAOR~9u{q%g zHfPzy@A-#gi$|QPjFr2w<?`2jkQMWBoRAlw-c*9!?9lI$-9kF{sMI1@eJI^1ruGT@ z;O?ymVf9Ak!{CA4xLLTH_PZ@^cu`O-16q>Q84g3yg;!hkRLbSDa_teq*X_0o`0%0m z(D0WWy)eqKb)m*1j<Dnr#%mW{2Y3?YVW$p7jx;yB2CAXfCVr+bkxkrxwcTN+5@M{( zg()+`mF4~RVsHSP4@)__$AvX#!ftOV!DV6>SlgW~LW&z_k`#mg{XMrDKH2a&a2oX{ z?OepcE{Zi*>!*tSUT2tkG>HrbRGDl&kD=FMKan;-2`q;f|CSQ=YW`cTolfk)%-73% zOugw0wkplou3o$h7v3;b#eKb96b(4y^&A0;q|(}Mk@gyv)|f}9l4nS4sS|gb8}sGZ zO$f-we22dF=cU4(<fWezzciPXG#~D3ZEQhTH7zN@@vE&4!D0}}&(0s89FQ3<+wWh2 zVdX6dA(kF4EIgd--TX>uv@xxpDeTp6XtZ-|X)jLLEb@LC+g8-eCK(kjtbdgsE(c=x zl>sG62d=SkaaMWIix5;#>jejNV2^%b-sZH(ybzhoS3A6`Wv#^0Zx=k9#*sAk#1`9x zg4;z3?lMvrV-u6~Rw%f^kB{!61`g42OJ$U1K-n#IupP2-FDB}){5NeCy=0G3e)uGy z={N<B)R>N?vBlS7%Ty@Y)vV@REcc>O<AQ>u{538kBpWw7NTb{=<LM2_T6Oc{bZC)L zq(#yly6M@JTVFSdw8&dS^uyR#>8?`tR>C8`xnfJdp*$J|(n#)?bC)n}^~OrC!yU@T zVjJ$LMG6d0#)4j>^tztTIUpTYdxdx@G1@zaF24f)0ZVMg&AqWz1-(pjwe~rdVDvzO z-Y1$=+YR3lC0b8S)_Uo4{|6AqyL4bc>7xPVO$-}qT0gyq4-P0x#DF5ce2dr^P(bf3 zLfLMSQ7Y+M4K~wW!@_5v!isY-=a=kWA|<&cgT6Q8DJMrZkTtDeIj1>vAOx}s<@_d1 zY3fgWLCU#Eko8R>E54!e9Ya3e>xd=Ex?~7h{Vv09l;-qeraP3u-MfVXsF0zO?5U(` z^wu%@M_m}8!JSo$^b4L~bzP?Zrg`FXy`slVWP$DUSIvU%6Q9vAoh9_%dzcqgIhc3q z@}8-EneS@D^fouVF}x=?a_>oP2b(|z{}(Xt0p>kzWdchg+-o<OvkN(|P3FwF<lB22 zyO1NBKMo%ib`td@_oFgWXoh+tY|tTgv&*ot5|>_Rs(&#i2qa5f%mtOBe}#Du+bI~2 zZQE5kwSsVd3kSKe_+S=4mY1@k{<aLq^{eck8$o<nH4>kaw)wW?FWyyJU`~A#Uh`JL zC^X_(4ZV3}Ve|;}X2m&n%LNA;mXCSQmr4GExNpatrWV`RjbtrmH#xjF$=WK&l8~Uf z%h+2a;JvYJh2Tb`=FHSpO{E6@`V_5zRh+@VKRGio1JYxG?G!_z1wDCepMo4(CV&7s z`DRCQqR@kSWcGcBajydvvhR~(P#Uo<28GnmnK#J>04fQ<sFag<)mogH+1CoLYyy|o zO|7rXl(bC2dXSngGQ4b%NqaN4HI>q&0U%j}44QEt&ADPPS*R}Q5R;-4pJ&_vMFtyk zrZLP|Jc5KCx=`z~A0xR&(sdB)b8L9*UYju&w&ii&2{g`v+?Z>L$%2-yPopGKtA-p~ z;230bvKz@5dvT^1>y%u+_W<l3^e=f2Mls@;H)pmb7U23pUA+On5dz<tAUnwqO(&O) z-@Zf#i4(X+NvB)D>QYe>n7J$$!|t#Ef3ua=4%>5a07wiT;uz~;TG0K3O2$tJV2_vX z<wi&2hY;episL$buxb~G@ZaqhD9~<#ldeEiom3dk^8G6S+k*UG9;YhmdV^wDdg$7i zYy^q7QGAe}CLn77-*<W(mN11dQ4Jo=z_kM~9U9SD@Xs>#7K-OgJc~4!Fa~$Rwt#y= zF6U1H87y3Xh*#3CI2x7k(E~Vk9snp7+t@me<EoX|EbEe$H0wtN?D6Imc_|+py=d&6 zj^djhyByE@i@0gE{-RBri9zW6G1^nOjL$=fz-T6)`i-i71%jhTI!jOwE`RW-Bj^%d z%Yt+}P64AEXd&~?XJ{}vyFCWMXKCG~>5h7(aTg*yL6&#lde}D0-LYscFo1b8z|zcF z=|;?hsF~e?nGj`O19-rRR8?-oQH20f%<NP6&K?ug5(Qv)GCBu2ah-tjzyi?Sh?XMS z9HsW*V!r5iAj8d>OtiY71;1!Qdm~Y*3>VqQ^{u$;DZ4o^t7-YUri#DQ%{Ta|6WoB5 zxLG;S8sP7q5sguAWHG8U|22CBHi~@S!^#6sqF}&AeMrZ`dk&Zq6H$0jS-0Vpm;#Z+ zcx--IKv>!jfr&Y2#0&%?sklR_61Kw_6;z39&4@0^+?Ey5au8UB3~=lbtqs83eJ;SF z)RjyE`7FmCBHR@KW1?ynBSx~f7VRYh8Bt;`WoI_N>-(ww67EL?3k{SB9EKFy?mw4x zNx?^9tJ3#VQ8s1gTZouZD&G|43Onx{_?OH{(IzV|6cij;r}u%>ttBP8Kqkf5OYO6| zISIJT6lr|gG%SPHc?BhvXqf5|g{CC&RIk7#ECEA&=RJ8tfxQ9`YMF%%j;<Do`jq=G ze2umI<@nBqH;=NgY`R66#fBTDN@3@4d?+|VEC5ypf4&UvVwMz&jsV9+X(J}dT@~Oi z53=C$Bf&{5MugCxBwmy91#iTn<%oDIT$_s6!}Qe@UDZ5te*IU&@WTayTJ2Jn&teRm zFth><`>7BU4v{$McG4;(AIJV;(HTe&fO)7~OG*a2d4a%}AZ&tG-Zo|DjUtVz&KE6# zK|;BIG0N`r;EN>~5P2nf3=J!yCRHGPut|i6{v_r9R+Gxu!{V#em&ywx=g(iKqgkVM z(X5n6*2;B8j?bryHm4+C>kOCA*C2SNkJ`8Qf8M@-qM=t%V6c6+iZsGwNc-kd`+WE! z8nlf-V&7^A$!Ylo)2yZLnPasDjj-({Nc)?jDY)r}+F)<D33;)eXo0=mYQa-bdmCRa z=ne+M%d@bkiFLt#Ss9B_x%sW)p2z@e4Ftn<G%hK)C-EygjXy~WndnZ|mfs$THO{8Y z|44vUr+qI0dOzIpTEc1V6Ih&&lvS2sTdlVQTJ-TS&>%4nEEA)w^m7O1UQ$=)%zlP} zONt<-{v=5uc!5Ob((?8FlqPBG_5A`yy(*GgTO=eDzcw)%Cfejy)<gu2nTdHx>77Ex z+r+g=xe)r^2ZO8N!1}^*V(pyA-+7+$=YkacLj-k?*razdfk?h!qSY%gODK4wmWO{X zPPn<koQ7)-a9ZSJ(``KerInZeKokeNC>0|XuNcVV1N(22`Mm(ZQJ2*NaMqCiDU9+M z!*Ep){R&PjSKN&TXB%-Z8Ou}-EWXyEe`Hf%4)7vUG#K5Py}NWKF4h=LWVJ4`xw?l+ zf$Qz*#Ax1&B9oMHh)QX0(Qh&(3~9y?#uxFkLpqg8m&eFGXqyws$+nH+za1!u+Vt<p z3G-sxK%2(#9}NHq10x@oY|K%sF>@|$jDp4t7maBT@by!vG1&J_?=DS4W3Hu<x?>6w zu^D>0gT`DfGs$gel^vGnqMFm{Sbi<)U=^ovM}T{v_J7pCAK<HK;4i5rYraFfgY*j$ zGNyO$V3#gw78UcBTEs20XoQTC*g71?|MMF#H(D_Gc^3R00hwTMkv3e;yLj+XLh4+s z%q$AYYHm69mA4F2o_BSZ4x8Y>-2wQGBXnZ^mrGc?bvo8MSvz1spgD`Uk!U$&1RXiB ziRLDk1WeoL$6{zZ(?vgjfdRksQ|J|JABy`ECh`m*He~nmN52(q!R-kxq=%5#(KIn} zL~My()Fw7f<R<|!B!jiL=kA;iaIxQchU-5gPQZSrtYPQET@3_-e9tiO_aRp&{Z^HZ zJHTlb-mWRlN|Wqch>H;>;rMA{+(1;m2|oZ);nqGU6zokoKJN)7dKi3EIEij9ciXht zv8{BCA-qf{#{6gCkKc>mtqAa$FGGaMK#t4K@nbN(oBm8cIMe$S7UyjwVs!oZt(d7| zb7u36v2AI6Mx7gFOt#8!i!#n&PTXIHyGV1R3^>@om0y9&buceznv`%ftx7WsYkJ68 z{~S5%M*=IvZ_I!|FZ|~vJF-4R!5u?^u^+US9nODKzmT%6BDOV&Lb4ea3U_`R1vJAA zm;KzPN&FU+$qq-ZTw&O#+%e=Ff|CJ>;X`W~@D#>A8Uzz08Hu~S8w&sUN9<g|BW^3$ zeDDWS+=KJ@svzxwe_1r4kyb#3RaN9WA71+znNrbv@VxF4Ql`pAF@Yqq`}ct17!psV zq!f@EJ-2-d-LBzxEh@}WWgmXVs9Qe*)^O*ymV5o~I-Ae%yLS^jyf&1^XHYoC{>CSW zMaZFqcBaJ7AbD{0QyR{S8-5R)eFl}o|Dq<3+(O(~@Q@@qUI8rpFf@<leWElzh=lDW z)_%r$l)v$YSm`{uSi+of%P9Ush&DTfJ?-4M^g7PABt~Gr2|w`?LQ+OtA{xQo2$vMn zALoi-m~Whm0>R7YtXnVW*CkLFO;bNc&1^Q&q^imS5H5D_u)|n@dtbATexLU{scQ8K z{0foM_$;z`D{_?w{|y0C%Z20&&Dpt&zQ4BJpWKci^kI?7NTNTQzcmF_o`V!e;%S6F zJS-FAa39pi-)sRKso=2>!1=<ZMWAmv04DozN>vs8dX%H8Dv@R(LV%#G#~Sxxe+^nk zsF9cd2PUF0g@!sqqHC~&(nUH^^o|=R5a~Cl2D*y$vd2Tp+J6RX39$y8jC@|dM``>3 zErhERybREN)Ngz)K(XBinxhZ?z-DtnP*59RErJ3Uc=n_hba%dh+}n%wo{lYr=q9UE zNAnjagDSo7TKZ!=T~H-1s4|QE+%D-??CRk+dI9(x8jC{;Ek6>v6A|<R6a@NsXpOjc zKQRr&fnN?f3iknkINBK=n}q6c-%%H^KL6qP?y1PmW4)*>F|MDKC@eYBn%UGK26~-S zGl-TwzX2rlBrtR0_pr!G^)Di+J$6S2j0<80!7u-pfeRop27#nBXiP?;sZB=^zi}n7 zAr7(_6R7j)KmsR<{*jkNW#yot?{0$VS<-$1guRjcj<CrZ6tWJlryd|on$(z0fQeZ{ z#GL%UL}IEaM9A-3=oFIQINm~jIRZj{bHEhoLVj}w<<~><>k{(o9F*Uje);_sb@7}A zvkP7}TkuPvgR*;^=>84a4Ul{9rG1P|boI`dV;+7?wu*naOZ0FxRS61_^r9v-4);#E zY5N&2uGCzxSQS4)W<PLwLM!Md;Sk7!y>sa|*9KaGF6Q$mfW3*gX-Hq_MK4Yyrgnj; zodHzA?*st-l3xx)@D%p)2KtC<gxqJJBc|xVR~(!A<Ufcb;;}o<40QkWhyFqLPeCF& zUUWY=@zTB@-A65jP50X#GBh0^|NI6BAud|sn^B*+S>|_(x0A0EZx^o>Z#NH$cMe}d z@9X(O5%utS;+@BD5bx>y8u6aNFBk8be3E$2;$y@+mn-63$kWAp4mbZdVdyhA`}jEo z&CR9!jChyx)8f6DpAzo?|ATnn!e1Bf75tERui`I>_Zt43c(3Kph<BJjA>QlxqvE}R zKP28N-znZ(d82r5<J<5i6rQgKm+`wP_4!5$-Y$Yo6kH*K<Oj|xM39s+Um$`HQSb&4 ze1w8CM39`j_+$}$oPwi8@CgcLir`Zeln~Sp%^0}xQgn(so27YE#mx!O1AoLmInKr6 z*Vh))T?$BfO{8pwKTANQ1o?}U@{K~a<KP~y*G%U5iB*cro4O*I617s?-qcmelucGj zjyH8pGUYZaCD)s}Hkq>2O7VD8!^xClk+M0@JA1uI3G#eO>Bk1M4dD+9c}&Na7W~x4 z^W9I2X`?aIn(tqUC}u^N3E@Iznw~oF3u^DPqlM#C$AYCAxt@OBJiKYxf-=kv?Mt<@ z@X&POMyy+@81d_RUncfmaw-S2oM7@C!T;0Vxd290UW<AsGbBR@%pgI-dk|0*#3&CF z0ydEZf)W@AB&3QG$zT#g5|h1oSON(XY?3jR+SaPa(~79Ix3<SVL~XStKodZUAXZU1 z6_itV&TupyBg7h+`>lV^B$Ei%bK85*z2}~RmA&`>e*f!VYyE3s2}W2t*mRDL+r|C9 z-BHe;*vF%45dPr)Anr&THpVEgmMG^A`}nF4xLvr{9lmX$=(*rPy-;UNcrz=pvd2^n zSL)zXy(+bgPpeXY3}em*(8-p1R3Xtv6xu5|ZyY%94b*Ei^$HB@{&Xygz<DtdNR|Bx zU*#HVe2GU;&gE_E8LA+eOC;w|J8TKbaD*ED<(~3Q?p?lTe-tiXQn=BF(db8%VEA10 zqjfj*F!LkAhBIjH)zBdUP6W@y^tR*dZX2T-g?7<1ql_su>SZ$vqKpY~r}R<HrfX(; zv@s0F!7~eNh70}%wqxT?8Hk-Aw7+e{t|KRWyQ21--OY-m>4}Ze^cBgxPX`g{_}Sgj z;{Nz*KOU0)AzWJ|{oj-ROTOmlKz&%Al>X0?;}_&#p&K`I^QR^C95bfVxkWI_+D`>} zt>jK%J**<`M(5?Cj?edJXX?3IZ!;XX-nOD`GBoXw3DKcgA;t75cZw>n{P>CB`0p+K zcAB=$-}-B*tgp>p$pu-PZ65}AingU;cc-aP{CS#uZd=cv$ANvoIBDKk^!U`zi)x%3 zO}h2-qJ1qkU#m*}V0Y?_%kHo$RFtnJ+SeK_Wq7hX)HW*&_EV*V7;VM3zT1~HZlWN` zKoT$!a07{e3vdAbjBlN4$hhwmPm`y~^EA)XJllD;^X%Z+!LyTRCr|jI_jNVdg@vQp z+HIYo=I{rl(xt$9;9f}^>G<1FMlUsve79;Ja*=r%*&;MYIBb)C4ZNt7u23h8@9Bhr zpMU&B7x}i|PcFf;Z_?6_@=99aKKaz@lS$Gi9h8L-5_p@PKNA5D&^XsN?nwPSo9_eF zdLOFR`$a_3QnpZ-p1%4Z+V`RAh5Cq)+akhI18NxRvkz>(52a_FTXLDI5iv;namw&C z@GIa&U@veGcnx?Tpsh#J)+2c)@=WBJz%zlTizmXO--_pnfa<p#Jh7_%Ejv$?=tuUA z)kfNP=x-nqm<)v5m~zts5q+V)scl3*SYa%;UVRsyY&^f(dg~9Wg%*hhYoYxJLPx|( zyLhoMjaZk#yErH2VR^I5Oc=}*dj)i^)fj9R?+BBm{H^{s0yly{HDz~!Ux|pkc2Z$% z1RP@FrXY0vJ?72C$q&4u)bxi8Qd?B9Ca7OE?$5#PV6w{Px{`#Vi9)<uL<~64Vi^(j z{uYI9q^XIkTQmRVvF<Xo_+M{3%rxjjqI;bXkmz3Q4rr0+GWcdg2<-cE5*?hX?^y|a zqfY`hD*@Qy{@sC_J!XYVj#E8^JW#)$6NdR?h5ES~Q24v-L}0jiRd;IUbd|m@`?%7u z6(;G$QxmlO`j?$B?<asFdi_+gu!vrk9Xus%V-9;<P?BsUUWAe`&^JHc(VCtp0y2TY zeAt`P6Y#=GR%|4Dd<7_0j*6g0ai8LLgtLVQ?wh@h^8|OQoLjkV2~~lc!NH-AC`?#X zU|h*U9a4eO@iBK&tYdZpu4wu|m>#>Dr^J1SBolnyV}9RqJggkQ8*<!YIsQsHJ{WRb zgJb@VNBN=_2}O@s$$QLY%KZ`Cx62<emqjU~B$z(WWBwA);B@&y$NiHMQgn5k(I+F| zI8mJ<hBak(E-pc6{WR<^Pw)*Ak2!-5dZT}BHcjN#0x8?2T%?<Xk}*kwAQMDuPZuvE zw@dl(9O5zOhCDeQbSZ!Ie&K0O3AuB8krRwMKM+9f&4QPNZX(e^a(m;@#?jE0HlaPi zW+ZISaC3N@s2&Xi)yD|)B3QYRyw`_+s75N(T97zMx>+(SQV0ZRd4+J6-wAV;j}bDG zv%Io9W*{f53OE^I*<~OQmV|J^>++U~gs?uqU)AONpuecLv!SalJPu)+X(BJ{f_@Sb zzO^&8k<xE5KP7$i;fRz0N(t@exF<=CJE`V<4f3LJpW4$C*_V3`wrBcn122ur<%VUP zIaNq$X58;#VsVx&x!8>7HQx#X)yd+Fi7lCizq9=a15F?HhL8a-u~!iV24Y#T^QU!{ zzy%a@KNyVRv@S+2W^M_82|+%>&P54kmL$+nE{9_yh&RjZ#d!=%aOw5)#$eD|pOKzl zro`tR4>7@@#^heAX)EMxiF)EM$opT5EPsMOt83~$^A}r{yuZuunYhI78Nb9#po4sS z9bXXlmrD%Xd|2k;BD{-CLiQf4p4jVY!aTfX$$?N4<?e#qS_tYheH+J5#sp=mK7R7r ztGKn`kN;%@_T%N+!p2{6Z{ZT_-a^JN9p-#lPvqq`UINcau?sDe5S*&13s<cQ{V=h> z@HW_`44C#^9PeKepR(9t^ix+E_T()7&373PfdQcx5<zy$(J;r}aA*9o#h&H)EAnsV zhC=XgnA)F!bh*%4PMgox2{FJ0W+`hvSAozyW=uAZJkndnBcE@U`kLxa(bQrQg(0>d zW6?^fPSE2)<fAw4=kNH<ShYBv(>R)C9OLM|7oMi*QJXFi0yOtBOB^24%Q{IIMghjK zzr7ECJkUUM1NN;M!~Gh^%nP*Ee0G%)<I7Hr4j}e0$*|!FWfgkly*H7k&|m6qP%q=1 z_oeUxSLDi?&yt{SW+p(3hn&+GJ8M1G+LtRQhd7PJkL8Ms*1k@cF@)g8AQj3!Yq?>c zCt3Vlio;UG%JAx0$gewJc0L!s@JzE^cQ}9hvac;EFoH{5<fmWL_;O8KLCvSba9?Nh zwYh!G`%|+Ms)kW$2NydlFE{L|2iA_|)2@vFqJ=tf5!QCxN`EmbmE&cz2;9sCKj%NK zNU*&L(?_cAXF>-zKgHecr=pD6z7x@U|5~UW$gZvHPc0`w^<R6LnFJT&OlD$KtHz+$ zU>an11p`i85cF8iVrFY$?WJRB(CCI_ao25US9JC2K$r@F#Bi9TUS4RZ?!KMRv9o(o zPU$Cx$&J{e^&=Q?X!rREbDV+EOBaQpQGbW?%0`C$h0ZJXAAtLYapTDIO5#5%+&Dq} z!I2;2bK6AzECtpB-Di+5JFiIU;IrLf&wpM~Ww_vZC6vZz<Y@vYfMdX6U>~pxcpd=9 z{X3jjBr|_dDm@aI2+R_f|Ly0MM}H{!s`HA6*9)9i9;YmFq9Me#U-5nn(D(?SG0uBl zk<ef5yrR+#r`3(sf7y8@l=f1xxCJN#N&y|%2-E@J2k4u>!+AwA^9P^d@AJSu;JCPi z`{r*suPE$5&KG&P=1Z_&gjTD2wu{9r-#M_eGc`i>i!uiI&P5v|&!lC*8wa(xpP(gC zDA#L{I2=Uuk-28IymRPqfSIt[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest new file mode 100644 index 0000000..9c19e18 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest @@ -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="easy_install" + 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/submissions/k17pine/data_structures/venv/Scripts/pip-script.py b/submissions/k17pine/data_structures/venv/Scripts/pip-script.py new file mode 100644 index 0000000..98442a6 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/pip-script.py @@ -0,0 +1,12 @@ +#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip' +__requires__ = 'pip==19.0.3' +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('pip==19.0.3', 'console_scripts', 'pip')() + ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip.exe b/submissions/k17pine/data_structures/venv/Scripts/pip.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/submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest new file mode 100644 index 0000000..dd6f562 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest @@ -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="pip" + 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/submissions/k17pine/data_structures/venv/Scripts/pip3-script.py b/submissions/k17pine/data_structures/venv/Scripts/pip3-script.py new file mode 100644 index 0000000..1414b9b --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/pip3-script.py @@ -0,0 +1,12 @@ +#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3' +__requires__ = 'pip==19.0.3' +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('pip==19.0.3', 'console_scripts', 'pip3')() + ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py b/submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py new file mode 100644 index 0000000..f98e908 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py @@ -0,0 +1,12 @@ +#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe +# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3.8' +__requires__ = 'pip==19.0.3' +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('pip==19.0.3', 'console_scripts', 'pip3.8')() + ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe b/submissions/k17pine/data_structures/venv/Scripts/pip3.8.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/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest new file mode 100644 index 0000000..1c292c0 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest @@ -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="pip3.8" + 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/submissions/k17pine/data_structures/venv/Scripts/pip3.exe b/submissions/k17pine/data_structures/venv/Scripts/pip3.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/submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest new file mode 100644 index 0000000..cdf9df4 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest @@ -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="pip3" + 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/submissions/k17pine/data_structures/venv/Scripts/python.exe b/submissions/k17pine/data_structures/venv/Scripts/python.exe new file mode 100644 index 0000000000000000000000000000000000000000..a0260f74e01ce82a65ef0109254d3f408f8cfcf2 GIT binary patch literal 416840 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 wtz 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ⅅ$``YU$zP!tdiWLui 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�r+_tZwV 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 X!fiUceI0`g(hsx}r?$v(zCq$&XUXj^ literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/Scripts/pythonw.exe b/submissions/k17pine/data_structures/venv/Scripts/pythonw.exe new file mode 100644 index 0000000000000000000000000000000000000000..a45b937a70077302aae6ad22a89936e8679d3785 GIT binary patch literal 415816 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 literal 0 HcmV?d00001 diff --git a/submissions/k17pine/data_structures/venv/pyvenv.cfg b/submissions/k17pine/data_structures/venv/pyvenv.cfg new file mode 100644 index 0000000..f55dc78 --- /dev/null +++ b/submissions/k17pine/data_structures/venv/pyvenv.cfg @@ -0,0 +1,3 @@ +home = C:\Users\K9\AppData\Local\Programs\Python\Python38-32 +include-system-site-packages = false +version = 3.8.0 From d487ba527d509e92fd6def76c8523c22a52490b7 Mon Sep 17 00:00:00 2001 From: k17pine <47183551+k17pine@users.noreply.github.com> Date: Wed, 18 Dec 2019 15:40:25 +0200 Subject: [PATCH 2/4] Updated Updated --- .../k17pine/data_structures/.idea/.gitignore | 2 - .../data_structures/.idea/data_structures.iml | 13 - .../inspectionProfiles/profiles_settings.xml | 6 - .../k17pine/data_structures/.idea/misc.xml | 4 - .../k17pine/data_structures/.idea/modules.xml | 8 - .../k17pine/data_structures/.idea/vcs.xml | 7 - .../venv/Lib/site-packages/easy-install.pth | 2 - .../pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO | 73 - .../pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt | 391 - .../EGG-INFO/dependency_links.txt | 1 - .../EGG-INFO/entry_points.txt | 5 - .../EGG-INFO/not-zip-safe | 1 - .../EGG-INFO/top_level.txt | 1 - .../pip-19.0.3-py3.8.egg/pip/__init__.py | 1 - .../pip-19.0.3-py3.8.egg/pip/__main__.py | 19 - .../pip/_internal/__init__.py | 78 - .../pip/_internal/build_env.py | 215 - .../pip/_internal/cache.py | 224 - .../pip/_internal/cli/__init__.py | 4 - .../pip/_internal/cli/autocompletion.py | 152 - .../pip/_internal/cli/base_command.py | 341 - .../pip/_internal/cli/cmdoptions.py | 809 -- .../pip/_internal/cli/main_parser.py | 104 - .../pip/_internal/cli/parser.py | 261 - .../pip/_internal/cli/status_codes.py | 8 - .../pip/_internal/commands/__init__.py | 79 - .../pip/_internal/commands/check.py | 41 - .../pip/_internal/commands/completion.py | 94 - .../pip/_internal/commands/configuration.py | 227 - .../pip/_internal/commands/download.py | 176 - .../pip/_internal/commands/freeze.py | 96 - .../pip/_internal/commands/hash.py | 57 - .../pip/_internal/commands/help.py | 37 - .../pip/_internal/commands/install.py | 566 -- .../pip/_internal/commands/list.py | 301 - .../pip/_internal/commands/search.py | 135 - .../pip/_internal/commands/show.py | 168 - .../pip/_internal/commands/uninstall.py | 78 - .../pip/_internal/commands/wheel.py | 186 - .../pip/_internal/configuration.py | 387 - .../pip/_internal/download.py | 971 -- .../pip/_internal/exceptions.py | 274 - .../pip/_internal/index.py | 990 -- .../pip/_internal/locations.py | 211 - .../pip/_internal/models/__init__.py | 2 - .../pip/_internal/models/candidate.py | 31 - .../pip/_internal/models/format_control.py | 73 - .../pip/_internal/models/index.py | 31 - .../pip/_internal/models/link.py | 163 - .../pip/_internal/operations/__init__.py | 0 .../pip/_internal/operations/check.py | 155 - .../pip/_internal/operations/freeze.py | 247 - .../pip/_internal/operations/prepare.py | 413 - .../pip/_internal/pep425tags.py | 381 - .../pip/_internal/pyproject.py | 171 - .../pip/_internal/req/__init__.py | 77 - .../pip/_internal/req/constructors.py | 339 - .../pip/_internal/req/req_file.py | 382 - .../pip/_internal/req/req_install.py | 1021 -- .../pip/_internal/req/req_set.py | 197 - .../pip/_internal/req/req_tracker.py | 88 - .../pip/_internal/req/req_uninstall.py | 596 -- .../pip/_internal/resolve.py | 393 - .../pip/_internal/utils/__init__.py | 0 .../pip/_internal/utils/appdirs.py | 270 - .../pip/_internal/utils/compat.py | 264 - .../pip/_internal/utils/deprecation.py | 90 - .../pip/_internal/utils/encoding.py | 39 - .../pip/_internal/utils/filesystem.py | 30 - .../pip/_internal/utils/glibc.py | 93 - .../pip/_internal/utils/hashes.py | 115 - .../pip/_internal/utils/logging.py | 318 - .../pip/_internal/utils/misc.py | 1040 --- .../pip/_internal/utils/models.py | 40 - .../pip/_internal/utils/outdated.py | 164 - .../pip/_internal/utils/packaging.py | 85 - .../pip/_internal/utils/setuptools_build.py | 8 - .../pip/_internal/utils/temp_dir.py | 155 - .../pip/_internal/utils/typing.py | 29 - .../pip/_internal/utils/ui.py | 441 - .../pip/_internal/vcs/__init__.py | 534 -- .../pip/_internal/vcs/bazaar.py | 114 - .../pip/_internal/vcs/git.py | 369 - .../pip/_internal/vcs/mercurial.py | 103 - .../pip/_internal/vcs/subversion.py | 200 - .../pip/_internal/wheel.py | 1095 --- .../pip/_vendor/__init__.py | 111 - .../pip/_vendor/appdirs.py | 604 -- .../pip/_vendor/cachecontrol/__init__.py | 11 - .../pip/_vendor/cachecontrol/_cmd.py | 57 - .../pip/_vendor/cachecontrol/adapter.py | 133 - .../pip/_vendor/cachecontrol/cache.py | 39 - .../_vendor/cachecontrol/caches/__init__.py | 2 - .../_vendor/cachecontrol/caches/file_cache.py | 146 - .../cachecontrol/caches/redis_cache.py | 33 - .../pip/_vendor/cachecontrol/compat.py | 29 - .../pip/_vendor/cachecontrol/controller.py | 367 - .../pip/_vendor/cachecontrol/filewrapper.py | 80 - .../pip/_vendor/cachecontrol/heuristics.py | 135 - .../pip/_vendor/cachecontrol/serialize.py | 186 - .../pip/_vendor/cachecontrol/wrapper.py | 29 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 2 - .../pip/_vendor/certifi/cacert.pem | 4512 --------- .../pip/_vendor/certifi/core.py | 20 - .../pip/_vendor/chardet/__init__.py | 39 - .../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 - .../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 | 6 - .../pip/_vendor/colorama/ansi.py | 102 - .../pip/_vendor/colorama/ansitowin32.py | 257 - .../pip/_vendor/colorama/initialise.py | 80 - .../pip/_vendor/colorama/win32.py | 152 - .../pip/_vendor/colorama/winterm.py | 169 - .../pip/_vendor/distlib/__init__.py | 23 - .../pip/_vendor/distlib/_backport/__init__.py | 6 - .../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 | 1339 --- .../pip/_vendor/distlib/index.py | 516 -- .../pip/_vendor/distlib/locators.py | 1295 --- .../pip/_vendor/distlib/manifest.py | 393 - .../pip/_vendor/distlib/markers.py | 131 - .../pip/_vendor/distlib/metadata.py | 1094 --- .../pip/_vendor/distlib/resources.py | 355 - .../pip/_vendor/distlib/scripts.py | 417 - .../pip/_vendor/distlib/t32.exe | Bin 92672 -> 0 bytes .../pip/_vendor/distlib/t64.exe | Bin 102400 -> 0 bytes .../pip/_vendor/distlib/util.py | 1756 ---- .../pip/_vendor/distlib/version.py | 736 -- .../pip/_vendor/distlib/w32.exe | Bin 89088 -> 0 bytes .../pip/_vendor/distlib/w64.exe | Bin 99328 -> 0 bytes .../pip/_vendor/distlib/wheel.py | 988 -- .../pip/_vendor/distro.py | 1197 --- .../pip/_vendor/html5lib/__init__.py | 35 - .../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 - .../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 .../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 - .../_vendor/html5lib/treeadapters/genshi.py | 54 - .../pip/_vendor/html5lib/treeadapters/sax.py | 50 - .../_vendor/html5lib/treebuilders/__init__.py | 88 - .../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 - .../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 - .../pip/_vendor/idna/codec.py | 118 - .../pip/_vendor/idna/compat.py | 12 - .../pip/_vendor/idna/core.py | 396 - .../pip/_vendor/idna/idnadata.py | 1979 ---- .../pip/_vendor/idna/intranges.py | 53 - .../pip/_vendor/idna/package_data.py | 2 - .../pip/_vendor/idna/uts46data.py | 8205 ----------------- .../pip/_vendor/ipaddress.py | 2419 ----- .../pip/_vendor/lockfile/__init__.py | 347 - .../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 - .../pip/_vendor/msgpack/_version.py | 1 - .../pip/_vendor/msgpack/exceptions.py | 41 - .../pip/_vendor/msgpack/fallback.py | 977 -- .../pip/_vendor/packaging/__about__.py | 27 - .../pip/_vendor/packaging/__init__.py | 26 - .../pip/_vendor/packaging/_compat.py | 31 - .../pip/_vendor/packaging/_structures.py | 68 - .../pip/_vendor/packaging/markers.py | 296 - .../pip/_vendor/packaging/requirements.py | 138 - .../pip/_vendor/packaging/specifiers.py | 749 -- .../pip/_vendor/packaging/utils.py | 57 - .../pip/_vendor/packaging/version.py | 420 - .../pip/_vendor/pep517/__init__.py | 4 - .../pip/_vendor/pep517/_in_process.py | 207 - .../pip/_vendor/pep517/build.py | 108 - .../pip/_vendor/pep517/check.py | 202 - .../pip/_vendor/pep517/colorlog.py | 115 - .../pip/_vendor/pep517/compat.py | 23 - .../pip/_vendor/pep517/envbuild.py | 158 - .../pip/_vendor/pep517/wrappers.py | 163 - .../pip/_vendor/pkg_resources/__init__.py | 3171 ------- .../pip/_vendor/pkg_resources/py31compat.py | 23 - .../pip/_vendor/progress/__init__.py | 127 - .../pip/_vendor/progress/bar.py | 94 - .../pip/_vendor/progress/counter.py | 48 - .../pip/_vendor/progress/helpers.py | 91 - .../pip/_vendor/progress/spinner.py | 44 - .../pip/_vendor/pyparsing.py | 6452 ------------- .../pip/_vendor/pytoml/__init__.py | 4 - .../pip/_vendor/pytoml/core.py | 13 - .../pip/_vendor/pytoml/parser.py | 341 - .../pip/_vendor/pytoml/test.py | 30 - .../pip/_vendor/pytoml/utils.py | 67 - .../pip/_vendor/pytoml/writer.py | 106 - .../pip/_vendor/requests/__init__.py | 133 - .../pip/_vendor/requests/__version__.py | 14 - .../pip/_vendor/requests/_internal_utils.py | 42 - .../pip/_vendor/requests/adapters.py | 533 -- .../pip/_vendor/requests/api.py | 158 - .../pip/_vendor/requests/auth.py | 305 - .../pip/_vendor/requests/certs.py | 18 - .../pip/_vendor/requests/compat.py | 74 - .../pip/_vendor/requests/cookies.py | 549 -- .../pip/_vendor/requests/exceptions.py | 126 - .../pip/_vendor/requests/help.py | 119 - .../pip/_vendor/requests/hooks.py | 34 - .../pip/_vendor/requests/models.py | 953 -- .../pip/_vendor/requests/packages.py | 16 - .../pip/_vendor/requests/sessions.py | 770 -- .../pip/_vendor/requests/status_codes.py | 120 - .../pip/_vendor/requests/structures.py | 103 - .../pip/_vendor/requests/utils.py | 977 -- .../pip/_vendor/retrying.py | 267 - .../pip-19.0.3-py3.8.egg/pip/_vendor/six.py | 952 -- .../pip/_vendor/urllib3/__init__.py | 92 - .../pip/_vendor/urllib3/_collections.py | 329 - .../pip/_vendor/urllib3/connection.py | 391 - .../pip/_vendor/urllib3/connectionpool.py | 896 -- .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../urllib3/contrib/_appengine_environ.py | 30 - .../contrib/_securetransport/__init__.py | 0 .../contrib/_securetransport/bindings.py | 593 -- .../contrib/_securetransport/low_level.py | 346 - .../pip/_vendor/urllib3/contrib/appengine.py | 289 - .../pip/_vendor/urllib3/contrib/ntlmpool.py | 111 - .../pip/_vendor/urllib3/contrib/pyopenssl.py | 466 - .../urllib3/contrib/securetransport.py | 804 -- .../pip/_vendor/urllib3/contrib/socks.py | 192 - .../pip/_vendor/urllib3/exceptions.py | 246 - .../pip/_vendor/urllib3/fields.py | 178 - .../pip/_vendor/urllib3/filepost.py | 98 - .../pip/_vendor/urllib3/packages/__init__.py | 5 - .../urllib3/packages/backports/__init__.py | 0 .../urllib3/packages/backports/makefile.py | 53 - .../pip/_vendor/urllib3/packages/six.py | 868 -- .../packages/ssl_match_hostname/__init__.py | 19 - .../ssl_match_hostname/_implementation.py | 156 - .../pip/_vendor/urllib3/poolmanager.py | 450 - .../pip/_vendor/urllib3/request.py | 150 - .../pip/_vendor/urllib3/response.py | 705 -- .../pip/_vendor/urllib3/util/__init__.py | 54 - .../pip/_vendor/urllib3/util/connection.py | 134 - .../pip/_vendor/urllib3/util/queue.py | 21 - .../pip/_vendor/urllib3/util/request.py | 118 - .../pip/_vendor/urllib3/util/response.py | 87 - .../pip/_vendor/urllib3/util/retry.py | 411 - .../pip/_vendor/urllib3/util/ssl_.py | 381 - .../pip/_vendor/urllib3/util/timeout.py | 242 - .../pip/_vendor/urllib3/util/url.py | 230 - .../pip/_vendor/urllib3/util/wait.py | 150 - .../pip/_vendor/webencodings/__init__.py | 342 - .../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/setuptools-40.8.0-py3.8.egg | Bin 571910 -> 0 bytes .../venv/Lib/site-packages/setuptools.pth | 1 - .../data_structures/venv/Scripts/Activate.ps1 | 375 - .../data_structures/venv/Scripts/activate | 76 - .../data_structures/venv/Scripts/activate.bat | 33 - .../venv/Scripts/deactivate.bat | 21 - .../venv/Scripts/easy_install-3.8-script.py | 12 - .../venv/Scripts/easy_install-3.8.exe | Bin 65536 -> 0 bytes .../Scripts/easy_install-3.8.exe.manifest | 15 - .../venv/Scripts/easy_install-script.py | 12 - .../venv/Scripts/easy_install.exe | Bin 65536 -> 0 bytes .../venv/Scripts/easy_install.exe.manifest | 15 - .../venv/Scripts/pip-script.py | 12 - .../data_structures/venv/Scripts/pip.exe | Bin 65536 -> 0 bytes .../venv/Scripts/pip.exe.manifest | 15 - .../venv/Scripts/pip3-script.py | 12 - .../venv/Scripts/pip3.8-script.py | 12 - .../data_structures/venv/Scripts/pip3.8.exe | Bin 65536 -> 0 bytes .../venv/Scripts/pip3.8.exe.manifest | 15 - .../data_structures/venv/Scripts/pip3.exe | Bin 65536 -> 0 bytes .../venv/Scripts/pip3.exe.manifest | 15 - .../data_structures/venv/Scripts/python.exe | Bin 416840 -> 0 bytes .../data_structures/venv/Scripts/pythonw.exe | Bin 415816 -> 0 bytes .../k17pine/data_structures/venv/pyvenv.cfg | 3 - 345 files changed, 106889 deletions(-) delete mode 100644 submissions/k17pine/data_structures/.idea/.gitignore delete mode 100644 submissions/k17pine/data_structures/.idea/data_structures.iml delete mode 100644 submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml delete mode 100644 submissions/k17pine/data_structures/.idea/misc.xml delete mode 100644 submissions/k17pine/data_structures/.idea/modules.xml delete mode 100644 submissions/k17pine/data_structures/.idea/vcs.xml delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools-40.8.0-py3.8.egg delete mode 100644 submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/activate delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/activate.bat delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/deactivate.bat delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install.exe delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip-script.py delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip.exe delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3-script.py delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.exe delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/python.exe delete mode 100644 submissions/k17pine/data_structures/venv/Scripts/pythonw.exe delete mode 100644 submissions/k17pine/data_structures/venv/pyvenv.cfg diff --git a/submissions/k17pine/data_structures/.idea/.gitignore b/submissions/k17pine/data_structures/.idea/.gitignore deleted file mode 100644 index 5c98b42..0000000 --- a/submissions/k17pine/data_structures/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/data_structures.iml b/submissions/k17pine/data_structures/.idea/data_structures.iml deleted file mode 100644 index 85c7612..0000000 --- a/submissions/k17pine/data_structures/.idea/data_structures.iml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="PYTHON_MODULE" version="4"> - <component name="NewModuleRootManager"> - <content url="file://$MODULE_DIR$"> - <excludeFolder url="file://$MODULE_DIR$/venv" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> - <component name="TestRunnerService"> - <option name="PROJECT_TEST_RUNNER" value="Unittests" /> - </component> -</module> \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml b/submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2d..0000000 --- a/submissions/k17pine/data_structures/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ -<component name="InspectionProjectProfileManager"> - <settings> - <option name="USE_PROJECT_PROFILE" value="false" /> - <version value="1.0" /> - </settings> -</component> \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/misc.xml b/submissions/k17pine/data_structures/.idea/misc.xml deleted file mode 100644 index 69be26c..0000000 --- a/submissions/k17pine/data_structures/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (data_structures)" project-jdk-type="Python SDK" /> -</project> \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/modules.xml b/submissions/k17pine/data_structures/.idea/modules.xml deleted file mode 100644 index eecf825..0000000 --- a/submissions/k17pine/data_structures/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/.idea/data_structures.iml" filepath="$PROJECT_DIR$/.idea/data_structures.iml" /> - </modules> - </component> -</project> \ No newline at end of file diff --git a/submissions/k17pine/data_structures/.idea/vcs.xml b/submissions/k17pine/data_structures/.idea/vcs.xml deleted file mode 100644 index 0f6c7cd..0000000 --- a/submissions/k17pine/data_structures/.idea/vcs.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$/../../.." vcs="Git" /> - <mapping directory="$PROJECT_DIR$/1" vcs="Git" /> - </component> -</project> \ No newline at end of file diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth b/submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth deleted file mode 100644 index c5c7346..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/easy-install.pth +++ /dev/null @@ -1,2 +0,0 @@ -./setuptools-40.8.0-py3.8.egg -./pip-19.0.3-py3.8.egg diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO deleted file mode 100644 index 0b410a2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/PKG-INFO +++ /dev/null @@ -1,73 +0,0 @@ -Metadata-Version: 1.2 -Name: pip -Version: 19.0.3 -Summary: The PyPA recommended tool for installing Python packages. -Home-page: https://pip.pypa.io/ -Author: The pip developers -Author-email: pypa-dev@groups.google.com -License: MIT -Description: pip - The Python Package Installer - ================================== - - .. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - - .. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - - pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. - - Please take a look at our documentation for how to install and use pip: - - * `Installation`_ - * `Usage`_ - * `Release notes`_ - - If you find bugs, need help, or want to talk to the developers please use our mailing lists or chat rooms: - - * `Issue tracking`_ - * `Discourse channel`_ - * `User IRC`_ - - If you want to get involved head over to GitHub to get the source code and feel free to jump on the developer mailing lists and chat rooms: - - * `GitHub page`_ - * `Dev mailing list`_ - * `Dev IRC`_ - - 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`_. - - .. _package installer: https://packaging.python.org/en/latest/current/ - .. _Python Package Index: https://pypi.org - .. _Installation: https://pip.pypa.io/en/stable/installing.html - .. _Usage: https://pip.pypa.io/en/stable/ - .. _Release notes: https://pip.pypa.io/en/stable/news.html - .. _GitHub page: https://github.com/pypa/pip - .. _Issue tracking: https://github.com/pypa/pip/issues - .. _Discourse channel: https://discuss.python.org/c/packaging - .. _Dev mailing list: https://groups.google.com/forum/#!forum/pypa-dev - .. _User IRC: https://webchat.freenode.net/?channels=%23pypa - .. _Dev IRC: https://webchat.freenode.net/?channels=%23pypa-dev - .. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/ - -Keywords: distutils easy_install egg setuptools wheel 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.4 -Classifier: Programming Language :: Python :: 3.5 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.* diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt deleted file mode 100644 index eb4810d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/SOURCES.txt +++ /dev/null @@ -1,391 +0,0 @@ -AUTHORS.txt -LICENSE.txt -MANIFEST.in -NEWS.rst -README.rst -pyproject.toml -setup.cfg -setup.py -docs/pip_sphinxext.py -docs/html/conf.py -docs/html/cookbook.rst -docs/html/index.rst -docs/html/installing.rst -docs/html/logic.rst -docs/html/news.rst -docs/html/quickstart.rst -docs/html/usage.rst -docs/html/user_guide.rst -docs/html/development/configuration.rst -docs/html/development/contributing.rst -docs/html/development/getting-started.rst -docs/html/development/index.rst -docs/html/development/release-process.rst -docs/html/development/vendoring-policy.rst -docs/html/reference/index.rst -docs/html/reference/pip.rst -docs/html/reference/pip_check.rst -docs/html/reference/pip_config.rst -docs/html/reference/pip_download.rst -docs/html/reference/pip_freeze.rst -docs/html/reference/pip_hash.rst -docs/html/reference/pip_install.rst -docs/html/reference/pip_list.rst -docs/html/reference/pip_search.rst -docs/html/reference/pip_show.rst -docs/html/reference/pip_uninstall.rst -docs/html/reference/pip_wheel.rst -docs/man/index.rst -docs/man/commands/check.rst -docs/man/commands/config.rst -docs/man/commands/download.rst -docs/man/commands/freeze.rst -docs/man/commands/hash.rst -docs/man/commands/help.rst -docs/man/commands/install.rst -docs/man/commands/list.rst -docs/man/commands/search.rst -docs/man/commands/show.rst -docs/man/commands/uninstall.rst -docs/man/commands/wheel.rst -src/pip/__init__.py -src/pip/__main__.py -src/pip.egg-info/PKG-INFO -src/pip.egg-info/SOURCES.txt -src/pip.egg-info/dependency_links.txt -src/pip.egg-info/entry_points.txt -src/pip.egg-info/not-zip-safe -src/pip.egg-info/top_level.txt -src/pip/_internal/__init__.py -src/pip/_internal/build_env.py -src/pip/_internal/cache.py -src/pip/_internal/configuration.py -src/pip/_internal/download.py -src/pip/_internal/exceptions.py -src/pip/_internal/index.py -src/pip/_internal/locations.py -src/pip/_internal/pep425tags.py -src/pip/_internal/pyproject.py -src/pip/_internal/resolve.py -src/pip/_internal/wheel.py -src/pip/_internal/cli/__init__.py -src/pip/_internal/cli/autocompletion.py -src/pip/_internal/cli/base_command.py -src/pip/_internal/cli/cmdoptions.py -src/pip/_internal/cli/main_parser.py -src/pip/_internal/cli/parser.py -src/pip/_internal/cli/status_codes.py -src/pip/_internal/commands/__init__.py -src/pip/_internal/commands/check.py -src/pip/_internal/commands/completion.py -src/pip/_internal/commands/configuration.py -src/pip/_internal/commands/download.py -src/pip/_internal/commands/freeze.py -src/pip/_internal/commands/hash.py -src/pip/_internal/commands/help.py -src/pip/_internal/commands/install.py -src/pip/_internal/commands/list.py -src/pip/_internal/commands/search.py -src/pip/_internal/commands/show.py -src/pip/_internal/commands/uninstall.py -src/pip/_internal/commands/wheel.py -src/pip/_internal/models/__init__.py -src/pip/_internal/models/candidate.py -src/pip/_internal/models/format_control.py -src/pip/_internal/models/index.py -src/pip/_internal/models/link.py -src/pip/_internal/operations/__init__.py -src/pip/_internal/operations/check.py -src/pip/_internal/operations/freeze.py -src/pip/_internal/operations/prepare.py -src/pip/_internal/req/__init__.py -src/pip/_internal/req/constructors.py -src/pip/_internal/req/req_file.py -src/pip/_internal/req/req_install.py -src/pip/_internal/req/req_set.py -src/pip/_internal/req/req_tracker.py -src/pip/_internal/req/req_uninstall.py -src/pip/_internal/utils/__init__.py -src/pip/_internal/utils/appdirs.py -src/pip/_internal/utils/compat.py -src/pip/_internal/utils/deprecation.py -src/pip/_internal/utils/encoding.py -src/pip/_internal/utils/filesystem.py -src/pip/_internal/utils/glibc.py -src/pip/_internal/utils/hashes.py -src/pip/_internal/utils/logging.py -src/pip/_internal/utils/misc.py -src/pip/_internal/utils/models.py -src/pip/_internal/utils/outdated.py -src/pip/_internal/utils/packaging.py -src/pip/_internal/utils/setuptools_build.py -src/pip/_internal/utils/temp_dir.py -src/pip/_internal/utils/typing.py -src/pip/_internal/utils/ui.py -src/pip/_internal/vcs/__init__.py -src/pip/_internal/vcs/bazaar.py -src/pip/_internal/vcs/git.py -src/pip/_internal/vcs/mercurial.py -src/pip/_internal/vcs/subversion.py -src/pip/_vendor/README.rst -src/pip/_vendor/__init__.py -src/pip/_vendor/appdirs.LICENSE.txt -src/pip/_vendor/appdirs.py -src/pip/_vendor/distro.LICENSE -src/pip/_vendor/distro.py -src/pip/_vendor/ipaddress.LICENSE -src/pip/_vendor/ipaddress.py -src/pip/_vendor/pyparsing.LICENSE -src/pip/_vendor/pyparsing.py -src/pip/_vendor/retrying.LICENSE -src/pip/_vendor/retrying.py -src/pip/_vendor/six.LICENSE -src/pip/_vendor/six.py -src/pip/_vendor/vendor.txt -src/pip/_vendor/cachecontrol/LICENSE.txt -src/pip/_vendor/cachecontrol/__init__.py -src/pip/_vendor/cachecontrol/_cmd.py -src/pip/_vendor/cachecontrol/adapter.py -src/pip/_vendor/cachecontrol/cache.py -src/pip/_vendor/cachecontrol/compat.py -src/pip/_vendor/cachecontrol/controller.py -src/pip/_vendor/cachecontrol/filewrapper.py -src/pip/_vendor/cachecontrol/heuristics.py -src/pip/_vendor/cachecontrol/serialize.py -src/pip/_vendor/cachecontrol/wrapper.py -src/pip/_vendor/cachecontrol/caches/__init__.py -src/pip/_vendor/cachecontrol/caches/file_cache.py -src/pip/_vendor/cachecontrol/caches/redis_cache.py -src/pip/_vendor/certifi/LICENSE -src/pip/_vendor/certifi/__init__.py -src/pip/_vendor/certifi/__main__.py -src/pip/_vendor/certifi/cacert.pem -src/pip/_vendor/certifi/core.py -src/pip/_vendor/chardet/LICENSE -src/pip/_vendor/chardet/__init__.py -src/pip/_vendor/chardet/big5freq.py -src/pip/_vendor/chardet/big5prober.py -src/pip/_vendor/chardet/chardistribution.py -src/pip/_vendor/chardet/charsetgroupprober.py -src/pip/_vendor/chardet/charsetprober.py -src/pip/_vendor/chardet/codingstatemachine.py -src/pip/_vendor/chardet/compat.py -src/pip/_vendor/chardet/cp949prober.py -src/pip/_vendor/chardet/enums.py -src/pip/_vendor/chardet/escprober.py -src/pip/_vendor/chardet/escsm.py -src/pip/_vendor/chardet/eucjpprober.py -src/pip/_vendor/chardet/euckrfreq.py -src/pip/_vendor/chardet/euckrprober.py -src/pip/_vendor/chardet/euctwfreq.py -src/pip/_vendor/chardet/euctwprober.py -src/pip/_vendor/chardet/gb2312freq.py -src/pip/_vendor/chardet/gb2312prober.py -src/pip/_vendor/chardet/hebrewprober.py -src/pip/_vendor/chardet/jisfreq.py -src/pip/_vendor/chardet/jpcntx.py -src/pip/_vendor/chardet/langbulgarianmodel.py -src/pip/_vendor/chardet/langcyrillicmodel.py -src/pip/_vendor/chardet/langgreekmodel.py -src/pip/_vendor/chardet/langhebrewmodel.py -src/pip/_vendor/chardet/langhungarianmodel.py -src/pip/_vendor/chardet/langthaimodel.py -src/pip/_vendor/chardet/langturkishmodel.py -src/pip/_vendor/chardet/latin1prober.py -src/pip/_vendor/chardet/mbcharsetprober.py -src/pip/_vendor/chardet/mbcsgroupprober.py -src/pip/_vendor/chardet/mbcssm.py -src/pip/_vendor/chardet/sbcharsetprober.py -src/pip/_vendor/chardet/sbcsgroupprober.py -src/pip/_vendor/chardet/sjisprober.py -src/pip/_vendor/chardet/universaldetector.py -src/pip/_vendor/chardet/utf8prober.py -src/pip/_vendor/chardet/version.py -src/pip/_vendor/chardet/cli/__init__.py -src/pip/_vendor/chardet/cli/chardetect.py -src/pip/_vendor/colorama/LICENSE.txt -src/pip/_vendor/colorama/__init__.py -src/pip/_vendor/colorama/ansi.py -src/pip/_vendor/colorama/ansitowin32.py -src/pip/_vendor/colorama/initialise.py -src/pip/_vendor/colorama/win32.py -src/pip/_vendor/colorama/winterm.py -src/pip/_vendor/distlib/LICENSE.txt -src/pip/_vendor/distlib/__init__.py -src/pip/_vendor/distlib/compat.py -src/pip/_vendor/distlib/database.py -src/pip/_vendor/distlib/index.py -src/pip/_vendor/distlib/locators.py -src/pip/_vendor/distlib/manifest.py -src/pip/_vendor/distlib/markers.py -src/pip/_vendor/distlib/metadata.py -src/pip/_vendor/distlib/resources.py -src/pip/_vendor/distlib/scripts.py -src/pip/_vendor/distlib/t32.exe -src/pip/_vendor/distlib/t64.exe -src/pip/_vendor/distlib/util.py -src/pip/_vendor/distlib/version.py -src/pip/_vendor/distlib/w32.exe -src/pip/_vendor/distlib/w64.exe -src/pip/_vendor/distlib/wheel.py -src/pip/_vendor/distlib/_backport/__init__.py -src/pip/_vendor/distlib/_backport/misc.py -src/pip/_vendor/distlib/_backport/shutil.py -src/pip/_vendor/distlib/_backport/sysconfig.cfg -src/pip/_vendor/distlib/_backport/sysconfig.py -src/pip/_vendor/distlib/_backport/tarfile.py -src/pip/_vendor/html5lib/LICENSE -src/pip/_vendor/html5lib/__init__.py -src/pip/_vendor/html5lib/_ihatexml.py -src/pip/_vendor/html5lib/_inputstream.py -src/pip/_vendor/html5lib/_tokenizer.py -src/pip/_vendor/html5lib/_utils.py -src/pip/_vendor/html5lib/constants.py -src/pip/_vendor/html5lib/html5parser.py -src/pip/_vendor/html5lib/serializer.py -src/pip/_vendor/html5lib/_trie/__init__.py -src/pip/_vendor/html5lib/_trie/_base.py -src/pip/_vendor/html5lib/_trie/datrie.py -src/pip/_vendor/html5lib/_trie/py.py -src/pip/_vendor/html5lib/filters/__init__.py -src/pip/_vendor/html5lib/filters/alphabeticalattributes.py -src/pip/_vendor/html5lib/filters/base.py -src/pip/_vendor/html5lib/filters/inject_meta_charset.py -src/pip/_vendor/html5lib/filters/lint.py -src/pip/_vendor/html5lib/filters/optionaltags.py -src/pip/_vendor/html5lib/filters/sanitizer.py -src/pip/_vendor/html5lib/filters/whitespace.py -src/pip/_vendor/html5lib/treeadapters/__init__.py -src/pip/_vendor/html5lib/treeadapters/genshi.py -src/pip/_vendor/html5lib/treeadapters/sax.py -src/pip/_vendor/html5lib/treebuilders/__init__.py -src/pip/_vendor/html5lib/treebuilders/base.py -src/pip/_vendor/html5lib/treebuilders/dom.py -src/pip/_vendor/html5lib/treebuilders/etree.py -src/pip/_vendor/html5lib/treebuilders/etree_lxml.py -src/pip/_vendor/html5lib/treewalkers/__init__.py -src/pip/_vendor/html5lib/treewalkers/base.py -src/pip/_vendor/html5lib/treewalkers/dom.py -src/pip/_vendor/html5lib/treewalkers/etree.py -src/pip/_vendor/html5lib/treewalkers/etree_lxml.py -src/pip/_vendor/html5lib/treewalkers/genshi.py -src/pip/_vendor/idna/LICENSE.rst -src/pip/_vendor/idna/__init__.py -src/pip/_vendor/idna/codec.py -src/pip/_vendor/idna/compat.py -src/pip/_vendor/idna/core.py -src/pip/_vendor/idna/idnadata.py -src/pip/_vendor/idna/intranges.py -src/pip/_vendor/idna/package_data.py -src/pip/_vendor/idna/uts46data.py -src/pip/_vendor/lockfile/LICENSE -src/pip/_vendor/lockfile/__init__.py -src/pip/_vendor/lockfile/linklockfile.py -src/pip/_vendor/lockfile/mkdirlockfile.py -src/pip/_vendor/lockfile/pidlockfile.py -src/pip/_vendor/lockfile/sqlitelockfile.py -src/pip/_vendor/lockfile/symlinklockfile.py -src/pip/_vendor/msgpack/COPYING -src/pip/_vendor/msgpack/__init__.py -src/pip/_vendor/msgpack/_version.py -src/pip/_vendor/msgpack/exceptions.py -src/pip/_vendor/msgpack/fallback.py -src/pip/_vendor/packaging/LICENSE -src/pip/_vendor/packaging/LICENSE.APACHE -src/pip/_vendor/packaging/LICENSE.BSD -src/pip/_vendor/packaging/__about__.py -src/pip/_vendor/packaging/__init__.py -src/pip/_vendor/packaging/_compat.py -src/pip/_vendor/packaging/_structures.py -src/pip/_vendor/packaging/markers.py -src/pip/_vendor/packaging/requirements.py -src/pip/_vendor/packaging/specifiers.py -src/pip/_vendor/packaging/utils.py -src/pip/_vendor/packaging/version.py -src/pip/_vendor/pep517/LICENSE -src/pip/_vendor/pep517/__init__.py -src/pip/_vendor/pep517/_in_process.py -src/pip/_vendor/pep517/build.py -src/pip/_vendor/pep517/check.py -src/pip/_vendor/pep517/colorlog.py -src/pip/_vendor/pep517/compat.py -src/pip/_vendor/pep517/envbuild.py -src/pip/_vendor/pep517/wrappers.py -src/pip/_vendor/pkg_resources/LICENSE -src/pip/_vendor/pkg_resources/__init__.py -src/pip/_vendor/pkg_resources/py31compat.py -src/pip/_vendor/progress/LICENSE -src/pip/_vendor/progress/__init__.py -src/pip/_vendor/progress/bar.py -src/pip/_vendor/progress/counter.py -src/pip/_vendor/progress/helpers.py -src/pip/_vendor/progress/spinner.py -src/pip/_vendor/pytoml/LICENSE -src/pip/_vendor/pytoml/__init__.py -src/pip/_vendor/pytoml/core.py -src/pip/_vendor/pytoml/parser.py -src/pip/_vendor/pytoml/test.py -src/pip/_vendor/pytoml/utils.py -src/pip/_vendor/pytoml/writer.py -src/pip/_vendor/requests/LICENSE -src/pip/_vendor/requests/__init__.py -src/pip/_vendor/requests/__version__.py -src/pip/_vendor/requests/_internal_utils.py -src/pip/_vendor/requests/adapters.py -src/pip/_vendor/requests/api.py -src/pip/_vendor/requests/auth.py -src/pip/_vendor/requests/certs.py -src/pip/_vendor/requests/compat.py -src/pip/_vendor/requests/cookies.py -src/pip/_vendor/requests/exceptions.py -src/pip/_vendor/requests/help.py -src/pip/_vendor/requests/hooks.py -src/pip/_vendor/requests/models.py -src/pip/_vendor/requests/packages.py -src/pip/_vendor/requests/sessions.py -src/pip/_vendor/requests/status_codes.py -src/pip/_vendor/requests/structures.py -src/pip/_vendor/requests/utils.py -src/pip/_vendor/urllib3/LICENSE.txt -src/pip/_vendor/urllib3/__init__.py -src/pip/_vendor/urllib3/_collections.py -src/pip/_vendor/urllib3/connection.py -src/pip/_vendor/urllib3/connectionpool.py -src/pip/_vendor/urllib3/exceptions.py -src/pip/_vendor/urllib3/fields.py -src/pip/_vendor/urllib3/filepost.py -src/pip/_vendor/urllib3/poolmanager.py -src/pip/_vendor/urllib3/request.py -src/pip/_vendor/urllib3/response.py -src/pip/_vendor/urllib3/contrib/__init__.py -src/pip/_vendor/urllib3/contrib/_appengine_environ.py -src/pip/_vendor/urllib3/contrib/appengine.py -src/pip/_vendor/urllib3/contrib/ntlmpool.py -src/pip/_vendor/urllib3/contrib/pyopenssl.py -src/pip/_vendor/urllib3/contrib/securetransport.py -src/pip/_vendor/urllib3/contrib/socks.py -src/pip/_vendor/urllib3/contrib/_securetransport/__init__.py -src/pip/_vendor/urllib3/contrib/_securetransport/bindings.py -src/pip/_vendor/urllib3/contrib/_securetransport/low_level.py -src/pip/_vendor/urllib3/packages/__init__.py -src/pip/_vendor/urllib3/packages/six.py -src/pip/_vendor/urllib3/packages/backports/__init__.py -src/pip/_vendor/urllib3/packages/backports/makefile.py -src/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py -src/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py -src/pip/_vendor/urllib3/util/__init__.py -src/pip/_vendor/urllib3/util/connection.py -src/pip/_vendor/urllib3/util/queue.py -src/pip/_vendor/urllib3/util/request.py -src/pip/_vendor/urllib3/util/response.py -src/pip/_vendor/urllib3/util/retry.py -src/pip/_vendor/urllib3/util/ssl_.py -src/pip/_vendor/urllib3/util/timeout.py -src/pip/_vendor/urllib3/util/url.py -src/pip/_vendor/urllib3/util/wait.py -src/pip/_vendor/webencodings/LICENSE -src/pip/_vendor/webencodings/__init__.py -src/pip/_vendor/webencodings/labels.py -src/pip/_vendor/webencodings/mklabels.py -src/pip/_vendor/webencodings/tests.py -src/pip/_vendor/webencodings/x_user_defined.py \ No newline at end of file diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt deleted file mode 100644 index 6d3bbc1..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/entry_points.txt +++ /dev/null @@ -1,5 +0,0 @@ -[console_scripts] -pip = pip._internal:main -pip3 = pip._internal:main -pip3.8 = pip._internal:main - diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe deleted file mode 100644 index 8b13789..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/not-zip-safe +++ /dev/null @@ -1 +0,0 @@ - diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt deleted file mode 100644 index a1b589e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/EGG-INFO/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py deleted file mode 100644 index f48c1ca..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "19.0.3" diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py deleted file mode 100644 index 0c223f8..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/__main__.py +++ /dev/null @@ -1,19 +0,0 @@ -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 # isort:skip # noqa - -if __name__ == '__main__': - sys.exit(_main()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py deleted file mode 100644 index 276124d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/__init__.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python -from __future__ import absolute_import - -import locale -import logging -import os -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._internal.cli.autocompletion import autocomplete -from pip._internal.cli.main_parser import parse_command -from pip._internal.commands import commands_dict -from pip._internal.exceptions import PipError -from pip._internal.utils import deprecation -from pip._internal.vcs import git, mercurial, subversion, bazaar # noqa -from pip._vendor.urllib3.exceptions import InsecureRequestWarning - -logger = logging.getLogger(__name__) - -# Hide the InsecureRequestWarning from urllib3 -warnings.filterwarnings("ignore", category=InsecureRequestWarning) - - -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 = parse_command(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=("--isolated" in cmd_args)) - return command.main(cmd_args) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py deleted file mode 100644 index d744cc7..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/build_env.py +++ /dev/null @@ -1,215 +0,0 @@ -"""Build Environment used for isolation during sdist building -""" - -import logging -import os -import sys -import textwrap -from collections import OrderedDict -from distutils.sysconfig import get_python_lib -from sysconfig import get_paths - -from pip._vendor.pkg_resources import Requirement, VersionConflict, WorkingSet - -from pip import __file__ as pip_location -from pip._internal.utils.misc import call_subprocess -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 Tuple, Set, Iterable, Optional, List # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - -logger = logging.getLogger(__name__) - - -class _Prefix: - - def __init__(self, path): - # type: (str) -> None - self.path = path - self.setup = False - self.bin_dir = get_paths( - 'nt' if os.name == 'nt' else 'posix_prefix', - vars={'base': path, 'platbase': path} - )['scripts'] - # Note: prefer distutils' sysconfig to get the - # library paths so PyPy is correctly supported. - purelib = get_python_lib(plat_specific=False, prefix=path) - platlib = get_python_lib(plat_specific=True, prefix=path) - if purelib == platlib: - self.lib_dirs = [purelib] - else: - self.lib_dirs = [purelib, platlib] - - -class BuildEnvironment(object): - """Creates and manages an isolated environment to install build deps - """ - - def __init__(self): - # type: () -> None - self._temp_dir = TempDirectory(kind="build-env") - self._temp_dir.create() - - self._prefixes = OrderedDict(( - (name, _Prefix(os.path.join(self._temp_dir.path, name))) - for name in ('normal', 'overlay') - )) - - self._bin_dirs = [] # type: List[str] - self._lib_dirs = [] # type: List[str] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self._lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = { - os.path.normcase(site) for site in ( - get_python_lib(plat_specific=False), - get_python_lib(plat_specific=True), - ) - } - self._site_dir = os.path.join(self._temp_dir.path, 'site') - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open(os.path.join(self._site_dir, 'sitecustomize.py'), 'w') as fp: - fp.write(textwrap.dedent( - ''' - import os, site, sys - - # First, drop system-sites related paths. - original_sys_path = sys.path[:] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set( - os.path.normcase(path) - for path in sys.path[len(original_sys_path):] - ) - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - ''' - ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)) - - def __enter__(self): - self._save_env = { - name: os.environ.get(name, None) - for name in ('PATH', 'PYTHONNOUSERSITE', 'PYTHONPATH') - } - - path = self._bin_dirs[:] - old_path = self._save_env['PATH'] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update({ - 'PATH': os.pathsep.join(path), - 'PYTHONNOUSERSITE': '1', - 'PYTHONPATH': os.pathsep.join(pythonpath), - }) - - def __exit__(self, exc_type, exc_val, exc_tb): - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def cleanup(self): - # type: () -> None - self._temp_dir.cleanup() - - def check_requirements(self, reqs): - # type: (Iterable[str]) -> Tuple[Set[Tuple[str, str]], Set[str]] - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - ws = WorkingSet(self._lib_dirs) - for req in reqs: - try: - if ws.find(Requirement.parse(req)) is None: - missing.add(req) - except VersionConflict as e: - conflicting.add((str(e.args[0].as_requirement()), - str(e.args[1]))) - return conflicting, missing - - def install_requirements( - self, - finder, # type: PackageFinder - requirements, # type: Iterable[str] - prefix_as_string, # type: str - message # type: Optional[str] - ): - # type: (...) -> None - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - args = [ - sys.executable, os.path.dirname(pip_location), 'install', - '--ignore-installed', '--no-user', '--prefix', prefix.path, - '--no-warn-script-location', - ] # type: List[str] - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append('-v') - for format_control in ('no_binary', 'only_binary'): - formats = getattr(finder.format_control, format_control) - args.extend(('--' + format_control.replace('_', '-'), - ','.join(sorted(formats or {':none:'})))) - if finder.index_urls: - args.extend(['-i', finder.index_urls[0]]) - for extra_index in finder.index_urls[1:]: - args.extend(['--extra-index-url', extra_index]) - else: - args.append('--no-index') - for link in finder.find_links: - args.extend(['--find-links', link]) - for _, host, _ in finder.secure_origins: - args.extend(['--trusted-host', host]) - if finder.allow_all_prereleases: - args.append('--pre') - args.append('--') - args.extend(requirements) - with open_spinner(message) as spinner: - call_subprocess(args, show_stdout=False, spinner=spinner) - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment - """ - - def __init__(self): - pass - - def __enter__(self): - pass - - def __exit__(self, exc_type, exc_val, exc_tb): - pass - - def cleanup(self): - pass - - def install_requirements(self, finder, requirements, prefix, message): - raise NotImplementedError() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py deleted file mode 100644 index eb295c4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cache.py +++ /dev/null @@ -1,224 +0,0 @@ -"""Cache Management -""" - -import errno -import hashlib -import logging -import os - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.download import path_to_url -from pip._internal.models.link import Link -from pip._internal.utils.compat import expanduser -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import InvalidWheelFilename, Wheel - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, List, Any # noqa: F401 - from pip._internal.index import FormatControl # noqa: F401 - -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: An object of FormatControl class 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): - # type: (str, FormatControl, Set[str]) -> None - 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): - # type: (Link) -> List[str] - """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): - # type: (Link, Optional[str]) -> List[Any] - 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 = self.format_control.get_allowed_formats( - 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): - # type: (Link) -> str - """Return a directory to store cached items in for link. - """ - raise NotImplementedError() - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - def _link_for_candidate(self, link, candidate): - # type: (Link, str) -> Link - root = self.get_path_for_link(link) - path = os.path.join(root, candidate) - - return Link(path_to_url(path)) - - def cleanup(self): - # type: () -> None - pass - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs. - """ - - def __init__(self, cache_dir, format_control): - # type: (str, FormatControl) -> None - super(SimpleWheelCache, self).__init__( - cache_dir, format_control, {"binary"} - ) - - def get_path_for_link(self, link): - # type: (Link) -> str - """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): - # type: (Link, Optional[str]) -> Link - 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): - # type: (FormatControl) -> None - 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): - # type: () -> None - 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): - # type: (str, FormatControl) -> None - 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): - # type: (Link) -> str - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link): - # type: (Link) -> str - return self._ephem_cache.get_path_for_link(link) - - def get(self, link, package_name): - # type: (Link, Optional[str]) -> Link - 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): - # type: () -> None - self._wheel_cache.cleanup() - self._ephem_cache.cleanup() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py deleted file mode 100644 index e589bb9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code -""" - -# This file intentionally does not import submodules diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py deleted file mode 100644 index 0a04199..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/autocompletion.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Logic that powers autocompletion installed by ``pip completion``. -""" - -import optparse -import os -import sys - -from pip._internal.cli.main_parser import create_main_parser -from pip._internal.commands import commands_dict, get_summaries -from pip._internal.utils.misc import get_installed_distributions - - -def autocomplete(): - """Entry Point for completion of main and subcommand options. - """ - # 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)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, cword, subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ``<file>``, ``<dir>`` or ``<path>`` - if completion_type: - options = auto_complete_paths(current, completion_type) - options = ((opt, 0) for opt in options) - 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 - - 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) - if current.startswith('-'): - for opt in opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, opts) - if completion_type: - subcommands = auto_complete_paths(current, completion_type) - - print(' '.join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type(cwords, cword, opts): - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith('-'): - return - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split('/'): - if cwords[cword - 2].split('=')[0] == o: - if not opt.metavar or any( - x in ('path', 'file', 'dir') - for x in opt.metavar.split('/')): - return opt.metavar - - -def auto_complete_paths(current, completion_type): - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(`file`, `path` or `dir`)i - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = (x for x in os.listdir(current_path) - if os.path.normcase(x).startswith(filename)) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ``<dir>`` after option - # complete directories when there is ``<file>``, ``<path>`` or - # ``<dir>``after option - if completion_type != 'dir' and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, '') diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py deleted file mode 100644 index 3ceea49..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,341 +0,0 @@ -"""Base Command class, and related routines""" -from __future__ import absolute_import, print_function - -import logging -import logging.config -import optparse -import os -import platform -import sys -import traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.cli.status_codes import ( - ERROR, PREVIOUS_BUILD_DIR_ERROR, SUCCESS, UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -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.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import parse_requirements -from pip._internal.utils.deprecation import deprecated -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import ( - get_prog, normalize_path, redact_password_from_url, -) -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, List, Tuple, Any # noqa: F401 - from optparse import Values # noqa: F401 - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.req.req_set import RequirementSet # noqa: F401 - -__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 - - def __init__(self, isolated=False): - # type: (bool) -> None - 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 run(self, options, args): - # type: (Values, List[Any]) -> Any - raise NotImplementedError - - def _build_session(self, options, retries=None, timeout=None): - # type: (Values, Optional[int], Optional[int]) -> PipSession - 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): - # type: (List[str]) -> Tuple - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args): - # type: (List[str]) -> int - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - if sys.version_info[:2] == (3, 4): - deprecated( - "Python 3.4 support has been deprecated. pip 19.1 will be the " - "last one supporting it. Please upgrade your Python as Python " - "3.4 won't be maintained after March 2019 (cf PEP 429).", - replacement=None, - gone_in='19.2', - ) - elif sys.version_info[:2] == (2, 7): - message = ( - "A future version of pip will drop support for Python 2.7." - ) - if platform.python_implementation() == "CPython": - message = ( - "Python 2.7 will reach the end of its life on January " - "1st, 2020. Please upgrade your Python as Python 2.7 " - "won't be maintained after that date. " - ) + message - deprecated(message, replacement=None, gone_in=None) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - 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) - - 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 BrokenStdoutLoggingError: - # Bypass our logger and write any remaining messages to stderr - # because stdout no longer works. - print('ERROR: Pipe to stdout was broken', file=sys.stderr) - if level_number <= logging.DEBUG: - traceback.print_exc(file=sys.stderr) - - return ERROR - except KeyboardInterrupt: - logger.critical('Operation cancelled by user') - logger.debug('Exception information:', exc_info=True) - - return ERROR - except BaseException: - logger.critical('Exception:', exc_info=True) - - return UNKNOWN_ERROR - finally: - allow_version_check = ( - # Does this command have the index_group options? - hasattr(options, "no_index") and - # Is this command allowed to perform this check? - not (options.disable_pip_version_check or options.no_index) - ) - # Check if we're using the latest version of pip available - if allow_version_check: - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout) - ) - with session: - pip_version_check(session, options) - - # Shutdown the logging module - logging.shutdown() - - return SUCCESS - - -class RequirementCommand(Command): - - @staticmethod - def populate_requirement_set(requirement_set, # type: RequirementSet - args, # type: List[str] - options, # type: Values - finder, # type: PackageFinder - session, # type: PipSession - name, # type: str - wheel_cache # type: Optional[WheelCache] - ): - # type: (...) -> None - """ - 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 = install_req_from_line( - req, None, isolated=options.isolated_mode, - use_pep517=options.use_pep517, - 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 = install_req_from_editable( - req, - isolated=options.isolated_mode, - use_pep517=options.use_pep517, - 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, - use_pep517=options.use_pep517): - 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) - - def _build_package_finder( - self, - options, # type: Values - session, # type: PipSession - platform=None, # type: Optional[str] - python_versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None # type: Optional[str] - ): - # type: (...) -> PackageFinder - """ - 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(redact_password_from_url(url) for url in 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, - session=session, - platform=platform, - versions=python_versions, - abi=abi, - implementation=implementation, - prefer_binary=options.prefer_binary, - ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py deleted file mode 100644 index 5cf5ee9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,809 +0,0 @@ -""" -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 textwrap -import warnings -from distutils.util import strtobool -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup - -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index 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, Callable, Dict, List, Optional, Union # noqa: F401 - from optparse import OptionParser, Values # noqa: F401 - from pip._internal.cli.parser import ConfigOptionParser # noqa: F401 - - -def raise_option_error(parser, option, msg): - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = '{} error: {}'.format(option, msg) - msg = textwrap.fill(' '.join(msg.split())) - parser.error(msg) - - -def make_option_group(group, parser): - # type: (Dict[str, Any], ConfigOptionParser) -> OptionGroup - """ - 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): - # type: (Values, Optional[Values]) -> 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 - control.disallow_binaries() - warnings.warn( - 'Disabling all use of wheels due to the use of --build-options ' - '/ --global-options / --install-options.', stacklevel=2, - ) - - -def check_dist_restriction(options, check_target=False): - # type: (Values, bool) -> None - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any([ - options.python_version, - options.platform, - options.abi, - options.implementation, - ]) - - binary_only = FormatControl(set(), {':all:'}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and - not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # gauranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - 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:)." - ) - - if check_target: - if dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target'" - ) - - -########### -# options # -########### - -help_ = partial( - Option, - '-h', '--help', - dest='help', - action='help', - help='Show help.', -) # type: Callable[..., Option] - -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." - ), -) # type: Callable[..., Option] - -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: Callable[..., Option] - -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.' -) # type: Callable[..., Option] - -no_color = partial( - Option, - '--no-color', - dest='no_color', - action='store_true', - default=False, - help="Suppress colored output", -) # type: Callable[..., Option] - -version = partial( - Option, - '-V', '--version', - dest='version', - action='store_true', - help='Show version and exit.', -) # type: Callable[..., Option] - -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: Callable[..., Option] - -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: Callable[..., Option] - -log = partial( - Option, - "--log", "--log-file", "--local-log", - dest="log", - metavar="path", - help="Path to a verbose appending log." -) # type: Callable[..., Option] - -no_input = partial( - Option, - # Don't ask for input - '--no-input', - dest='no_input', - action='store_true', - default=False, - help=SUPPRESS_HELP -) # type: Callable[..., Option] - -proxy = partial( - Option, - '--proxy', - dest='proxy', - type='str', - default='', - help="Specify a proxy in the form [user:passwd@]proxy.server:port." -) # type: Callable[..., Option] - -retries = partial( - Option, - '--retries', - dest='retries', - type='int', - default=5, - help="Maximum number of retries each connection should attempt " - "(default %default times).", -) # type: Callable[..., Option] - -timeout = partial( - Option, - '--timeout', '--default-timeout', - metavar='sec', - dest='timeout', - type='float', - default=15, - help='Set the socket timeout (default %default seconds).', -) # type: Callable[..., Option] - -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: Callable[..., Option] - - -def exists_action(): - # type: () -> Option - 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: Callable[..., Option] - -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: Callable[..., Option] - -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: Callable[..., Option] - - -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: Callable[..., Option] - - -def find_links(): - # type: () -> Option - 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(): - # type: () -> Option - 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.", - ) - - -def constraints(): - # type: () -> Option - 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(): - # type: () -> Option - 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(): - # type: () -> Option - 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 "<venv path>/src". ' - 'The default for global installs is "<current dir>/src".' -) # type: Callable[..., Option] - - -def _get_format_control(values, option): - # type: (Values, Option) -> Any - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.no_binary, existing.only_binary, - ) - - -def _handle_only_binary(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, existing.only_binary, existing.no_binary, - ) - - -def no_binary(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", dest="format_control", action="callback", - callback=_handle_no_binary, type="str", - default=format_control, - 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(): - # type: () -> Option - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", dest="format_control", action="callback", - callback=_handle_only_binary, type="str", - default=format_control, - 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.", - ) - - -platform = partial( - Option, - '--platform', - dest='platform', - metavar='platform', - default=None, - help=("Only use wheels compatible with <platform>. " - "Defaults to the platform of the running system."), -) # type: Callable[..., Option] - - -python_version = partial( - Option, - '--python-version', - dest='python_version', - metavar='python_version', - default=None, - help=("Only use wheels compatible with Python " - "interpreter version <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."), -) # type: Callable[..., Option] - - -implementation = partial( - Option, - '--implementation', - dest='implementation', - metavar='implementation', - default=None, - help=("Only use wheels compatible with Python " - "implementation <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."), -) # type: Callable[..., Option] - - -abi = partial( - Option, - '--abi', - dest='abi', - metavar='abi', - default=None, - help=("Only use wheels compatible with Python " - "abi <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."), -) # type: Callable[..., Option] - - -def prefer_binary(): - # type: () -> Option - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help="Prefer older binary packages over newer source packages." - ) - - -cache_dir = partial( - Option, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - help="Store the cache data in <dir>." -) # type: Callable[..., Option] - - -def no_cache_dir_callback(option, opt, value, parser): - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=no_cache_dir_callback, - help="Disable the cache.", -) # type: Callable[..., Option] - -no_deps = partial( - Option, - '--no-deps', '--no-dependencies', - dest='ignore_dependencies', - action='store_true', - default=False, - help="Don't install package dependencies.", -) # type: Callable[..., Option] - -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: Callable[..., Option] - -ignore_requires_python = partial( - Option, - '--ignore-requires-python', - dest='ignore_requires_python', - action='store_true', - help='Ignore the Requires-Python information.' -) # type: Callable[..., Option] - -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: Callable[..., Option] - - -def no_use_pep517_callback(option, opt, value, parser): - """ - Process a value provided for the --no-use-pep517 option. - - This is an optparse.Option callback for the no_use_pep517 option. - """ - # Since --no-use-pep517 doesn't accept arguments, the value argument - # will be None if --no-use-pep517 is passed via the command-line. - # However, the value can be non-None if the option is triggered e.g. - # by an environment variable, for example "PIP_NO_USE_PEP517=true". - if value is not None: - msg = """A value was passed for --no-use-pep517, - probably using either the PIP_NO_USE_PEP517 environment variable - or the "no-use-pep517" config file option. Use an appropriate value - of the PIP_USE_PEP517 environment variable or the "use-pep517" - config file option instead. - """ - raise_option_error(parser, option=option, msg=msg) - - # Otherwise, --no-use-pep517 was passed via the command-line. - parser.values.use_pep517 = False - - -use_pep517 = partial( - Option, - '--use-pep517', - dest='use_pep517', - action='store_true', - default=None, - help='Use PEP 517 for building source distributions ' - '(use --no-use-pep517 to force legacy behaviour).' -) # type: Any - -no_use_pep517 = partial( - Option, - '--no-use-pep517', - dest='use_pep517', - action='callback', - callback=no_use_pep517_callback, - default=None, - help=SUPPRESS_HELP -) # 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: Callable[..., Option] - -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: Callable[..., Option] - -no_clean = partial( - Option, - '--no-clean', - action='store_true', - default=False, - help="Don't clean up build directories." -) # type: Callable[..., Option] - -pre = partial( - Option, - '--pre', - action='store_true', - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) # type: Callable[..., Option] - -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: Callable[..., Option] - - -# Deprecated, Remove later -always_unzip = partial( - Option, - '-Z', '--always-unzip', - dest='always_unzip', - action='store_true', - help=SUPPRESS_HELP, -) # type: Callable[..., Option] - - -def _merge_hash(option, opt_str, value, parser): - # type: (Option, str, str, OptionParser) -> None - """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 = {} # type: ignore - 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: Callable[..., Option] - - -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: Callable[..., Option] - - -########## -# 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, - ] -} # type: Dict[str, Any] - -index_group = { - 'name': 'Package Index Options', - 'options': [ - index_url, - extra_index_url, - no_index, - find_links, - ] -} # type: Dict[str, Any] diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py deleted file mode 100644 index b17c749..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,104 +0,0 @@ -"""A single place for constructing and exposing the main parser -""" - -import os -import sys - -from pip import __version__ -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ( - ConfigOptionParser, UpdatingDefaultsHelpFormatter, -) -from pip._internal.commands import ( - commands_dict, get_similar_commands, get_summaries, -) -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_prog -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Tuple, List # noqa: F401 - - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser(): - # type: () -> ConfigOptionParser - """Creates and returns the main parser for pip's CLI - """ - - parser_kw = { - 'usage': '\n%prog <command> [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.abspath(os.path.join( - os.path.dirname(__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) - - # so the help formatter knows - parser.main = True # type: ignore - - # 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 parse_command(args): - # type: (List[str]) -> Tuple[str, List[str]] - 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) # type: ignore - 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py deleted file mode 100644 index e1eaac4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/parser.py +++ /dev/null @@ -1,261 +0,0 @@ -"""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.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.compat import get_terminal_size - -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'): - try: - val = strtobool(val) - except ValueError: - error_msg = invalid_config_error_message( - option.action, key, val - ) - self.error(error_msg) - - 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(UNKNOWN_ERROR, str(err)) - - 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(UNKNOWN_ERROR, "%s\n" % msg) - - -def invalid_config_error_message(action, key, val): - """Returns a better error message when invalid configuration option - is provided.""" - if action in ('store_true', 'store_false'): - return ("{0} is not a valid value for {1} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead.").format(val, key) - - return ("{0} is not a valid value for {1} option, " - "please specify a numerical value like 1/0 " - "instead.").format(val, key) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py deleted file mode 100644 index 275360a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,8 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py deleted file mode 100644 index c7d1da3..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -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 # noqa: F401 - from pip._internal.cli.base_command import Command # noqa: F401 - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py deleted file mode 100644 index 801cecc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/check.py +++ /dev/null @@ -1,41 +0,0 @@ -import logging - -from pip._internal.cli.base_command import Command -from pip._internal.operations.check import ( - check_package_set, create_package_set_from_installed, -) - -logger = logging.getLogger(__name__) - - -class CheckCommand(Command): - """Verify installed packages have compatible dependencies.""" - name = 'check' - usage = """ - %prog [options]""" - summary = 'Verify installed packages have compatible dependencies.' - - def run(self, options, args): - package_set, parsing_probs = create_package_set_from_installed() - missing, conflicting = check_package_set(package_set) - - for project_name in missing: - version = package_set[project_name].version - for dependency in missing[project_name]: - logger.info( - "%s %s requires %s, which is not installed.", - project_name, version, dependency[0], - ) - - for project_name in conflicting: - version = package_set[project_name].version - for dep_name, dep_version, req in conflicting[project_name]: - logger.info( - "%s %s has requirement %s, but you have %s %s.", - project_name, version, req, dep_name, dep_version, - ) - - if missing or conflicting or parsing_probs: - return 1 - else: - logger.info("No broken requirements found.") diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py deleted file mode 100644 index 2fcdd39..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/completion.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import absolute_import - -import sys -import textwrap - -from pip._internal.cli.base_command import Command -from pip._internal.utils.misc import get_prog - -BASE_COMPLETION = """ -# pip %(shell)s completion start%(script)s# pip %(shell)s completion end -""" - -COMPLETION_SCRIPTS = { - 'bash': """ - _pip_completion() - { - COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}" \\ - COMP_CWORD=$COMP_CWORD \\ - PIP_AUTO_COMPLETE=1 $1 ) ) - } - complete -o default -F _pip_completion %(prog)s - """, - 'zsh': """ - function _pip_completion { - local words cword - read -Ac words - read -cn cword - reply=( $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$(( cword-1 )) \\ - PIP_AUTO_COMPLETE=1 $words[1] ) ) - } - compctl -K _pip_completion %(prog)s - """, - 'fish': """ - function __fish_complete_pip - set -lx COMP_WORDS (commandline -o) "" - set -lx COMP_CWORD ( \\ - math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\ - ) - set -lx PIP_AUTO_COMPLETE 1 - string split \\ -- (eval $COMP_WORDS[1]) - end - complete -fa "(__fish_complete_pip)" -c %(prog)s - """, -} - - -class CompletionCommand(Command): - """A helper command to be used for command completion.""" - name = 'completion' - summary = 'A helper command used for command completion.' - ignore_require_venv = True - - def __init__(self, *args, **kw): - super(CompletionCommand, self).__init__(*args, **kw) - - cmd_opts = self.cmd_opts - - cmd_opts.add_option( - '--bash', '-b', - action='store_const', - const='bash', - dest='shell', - help='Emit completion code for bash') - cmd_opts.add_option( - '--zsh', '-z', - action='store_const', - const='zsh', - dest='shell', - help='Emit completion code for zsh') - cmd_opts.add_option( - '--fish', '-f', - action='store_const', - const='fish', - dest='shell', - help='Emit completion code for fish') - - self.parser.insert_option_group(0, cmd_opts) - - def run(self, options, args): - """Prints the completion code of the given shell""" - shells = COMPLETION_SCRIPTS.keys() - shell_options = ['--' + shell for shell in sorted(shells)] - if options.shell in shells: - script = textwrap.dedent( - COMPLETION_SCRIPTS.get(options.shell, '') % { - 'prog': get_prog(), - } - ) - print(BASE_COMPLETION % {'script': script, 'shell': options.shell}) - else: - sys.stderr.write( - 'ERROR: You must pass %s\n' % ' or '.join(shell_options) - ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py deleted file mode 100644 index 826c08d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/configuration.py +++ /dev/null @@ -1,227 +0,0 @@ -import logging -import os -import subprocess - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS -from pip._internal.configuration import Configuration, kinds -from pip._internal.exceptions import PipError -from pip._internal.locations import venv_config_file -from pip._internal.utils.misc import get_prog - -logger = logging.getLogger(__name__) - - -class ConfigurationCommand(Command): - """Manage local and global configuration. - - Subcommands: - - list: List the active configuration (or from the file specified) - edit: Edit the configuration file in an editor - get: Get the value associated with name - set: Set the name=value - unset: Unset the value associated with name - - If none of --user, --global and --venv are passed, a virtual - environment configuration file is used if one is active and the file - exists. Otherwise, all modifications happen on the to the user file by - default. - """ - - name = 'config' - usage = """ - %prog [<file-option>] list - %prog [<file-option>] [--editor <editor-path>] edit - - %prog [<file-option>] get name - %prog [<file-option>] set name value - %prog [<file-option>] 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py deleted file mode 100644 index a57e4bc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/download.py +++ /dev/null @@ -1,176 +0,0 @@ -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -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] <requirement specifier> [package-index-options] ... - %prog [options] -r <requirements file> [package-index-options] ... - %prog [options] <vcs project url> ... - %prog [options] <local project path> ... - %prog [options] <archive url/path> ...""" - - 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.prefer_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(cmdoptions.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - cmd_opts.add_option( - '-d', '--dest', '--destination-dir', '--destination-directory', - dest='download_dir', - metavar='dir', - default=os.curdir, - help=("Download packages into <dir>."), - ) - - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - 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 - - cmdoptions.check_dist_restriction(options) - - 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 RequirementTracker() as req_tracker, 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, - req_tracker=req_tracker, - ) - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py deleted file mode 100644 index dc9c53a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/freeze.py +++ /dev/null @@ -1,96 +0,0 @@ -from __future__ import absolute_import - -import sys - -from pip._internal.cache import WheelCache -from pip._internal.cli.base_command import Command -from pip._internal.models.format_control import FormatControl -from pip._internal.operations.freeze import freeze -from pip._internal.utils.compat import stdlib_pkgs - -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 = 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py deleted file mode 100644 index 423440e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/hash.py +++ /dev/null @@ -1,57 +0,0 @@ -from __future__ import absolute_import - -import hashlib -import logging -import sys - -from pip._internal.cli.base_command import Command -from pip._internal.cli.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] <file> ...' - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py deleted file mode 100644 index 49a81cb..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/help.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import absolute_import - -from pip._internal.cli.base_command import Command -from pip._internal.cli.status_codes import SUCCESS -from pip._internal.exceptions import CommandError - - -class HelpCommand(Command): - """Show help for commands""" - name = 'help' - usage = """ - %prog <command>""" - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py deleted file mode 100644 index 1c244d2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/install.py +++ /dev/null @@ -1,566 +0,0 @@ -from __future__ import absolute_import - -import errno -import logging -import operator -import os -import shutil -from optparse import SUPPRESS_HELP - -from pip._vendor import pkg_resources - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.cli.status_codes import ERROR -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.req.req_tracker import RequirementTracker -from pip._internal.resolve import Resolver -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ( - ensure_dir, get_installed_version, - protect_pip_from_modification_on_windows, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.wheel import WheelBuilder - -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] <requirement specifier> [package-index-options] ... - %prog [options] -r <requirements file> [package-index-options] ... - %prog [options] [-e] <vcs project url> ... - %prog [options] [-e] <local project path> ... - %prog [options] <archive url/path> ...""" - - 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 <dir>. ' - 'By default this will not replace existing files/folders in ' - '<dir>. Use --upgrade to replace existing packages in <dir> ' - 'with new versions.' - ) - cmd_opts.add_option(cmdoptions.platform()) - cmd_opts.add_option(cmdoptions.python_version()) - cmd_opts.add_option(cmdoptions.implementation()) - cmd_opts.add_option(cmdoptions.abi()) - - 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.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - - 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.prefer_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) - - cmdoptions.check_dist_restriction(options, check_target=True) - - if options.python_version: - python_versions = [options.python_version] - else: - python_versions = None - - 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=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)) - 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 RequirementTracker() as req_tracker, TempDirectory( - options.build_dir, delete=build_delete, kind="install" - ) as directory: - requirement_set = RequirementSet( - require_hashes=options.require_hashes, - check_supported_wheels=not options.target_dir, - ) - - 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, - req_tracker=req_tracker, - ) - - 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, - use_pep517=options.use_pep517 - ) - resolver.resolve(requirement_set) - - protect_pip_from_modification_on_windows( - modifying_pip=requirement_set.has_requirement("pip") - ) - - # Consider legacy and PEP517-using requirements separately - legacy_requirements = [] - pep517_requirements = [] - for req in requirement_set.requirements.values(): - if req.use_pep517: - pep517_requirements.append(req) - else: - legacy_requirements.append(req) - - # We don't build wheels for legacy requirements if we - # don't have wheel installed or we don't have a cache dir - try: - import wheel # noqa: F401 - build_legacy = bool(options.cache_dir) - except ImportError: - build_legacy = False - - wb = WheelBuilder( - finder, preparer, wheel_cache, - build_options=[], global_options=[], - ) - - # Always build PEP 517 requirements - build_failures = wb.build( - pep517_requirements, - session=session, autobuilding=True - ) - - if build_legacy: - # We don't care about failures building legacy - # requirements, as we'll fall through to a direct - # install for those. - wb.build( - legacy_requirements, - session=session, autobuilding=True - ) - - # If we're using PEP 517, we cannot do a direct install - # so we fail here. - if build_failures: - raise InstallationError( - "Could not build wheels for {} which use" - " PEP 517 and cannot be installed directly".format( - ", ".join(r.name for r in build_failures))) - - 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, - ) - - 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, - ) - working_set = pkg_resources.WorkingSet(lib_locations) - - reqs = sorted(installed, key=operator.attrgetter('name')) - items = [] - for req in reqs: - item = req.name - try: - installed_version = get_installed_version( - req.name, working_set=working_set - ) - 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): - try: - package_set, _dep_info = check_install_conflicts(to_install) - except Exception: - logger.error("Error checking for conflicts.", exc_info=True) - return - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py deleted file mode 100644 index a640274..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/list.py +++ /dev/null @@ -1,301 +0,0 @@ -from __future__ import absolute_import - -import json -import logging - -from pip._vendor import six -from pip._vendor.six.moves import zip_longest - -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import CommandError -from pip._internal.index import PackageFinder -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=('columns', 'freeze', 'json'), - help="Select the output format among: columns (default), freeze, " - "or json", - ) - - 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 = 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 _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, - session=session, - ) - - def run(self, options, args): - 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, - ) - - # get_not_required must be called firstly in order to find and - # filter out all dependencies correctly. Otherwise a package - # can't be identified as requirement because some parent packages - # could be filtered out before. - if options.not_required: - packages = self.get_not_required(packages, options) - - if options.outdated: - packages = self.get_outdated(packages, options) - elif options.uptodate: - packages = self.get_uptodate(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 = [] - - with self._build_session(options) as session: - finder = self._build_package_finder(options, index_urls, session) - - 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_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)) - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py deleted file mode 100644 index c157a31..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/search.py +++ /dev/null @@ -1,135 +0,0 @@ -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.cli.base_command import Command -from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS -from pip._internal.download import PipXmlrpcTransport -from pip._internal.exceptions import CommandError -from pip._internal.models.index import PyPI -from pip._internal.utils.compat import get_terminal_size -from pip._internal.utils.logging import indent_log - -logger = logging.getLogger(__name__) - - -class SearchCommand(Command): - """Search for PyPI packages whose name or summary contains <query>.""" - name = 'search' - usage = """ - %prog [options] <query>""" - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py deleted file mode 100644 index f92c9bc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/show.py +++ /dev/null @@ -1,168 +0,0 @@ -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.cli.base_command import Command -from pip._internal.cli.status_codes import ERROR, SUCCESS - -logger = logging.getLogger(__name__) - - -class ShowCommand(Command): - """ - Show information about one or more installed packages. - - The output is in RFC-compliant mail header format. - """ - name = 'show' - usage = """ - %prog [options] <package> ...""" - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py deleted file mode 100644 index 0cd6f54..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/uninstall.py +++ /dev/null @@ -1,78 +0,0 @@ -from __future__ import absolute_import - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.base_command import Command -from pip._internal.exceptions import InstallationError -from pip._internal.req import parse_requirements -from pip._internal.req.constructors import install_req_from_line -from pip._internal.utils.misc import protect_pip_from_modification_on_windows - - -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] <package> ... - %prog [options] -r <requirements file> ...""" - 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 = install_req_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) - ) - - protect_pip_from_modification_on_windows( - modifying_pip="pip" in reqs_to_uninstall - ) - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py deleted file mode 100644 index cd72a3d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/commands/wheel.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- coding: utf-8 -*- -from __future__ import absolute_import - -import logging -import os - -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.base_command import RequirementCommand -from pip._internal.exceptions import CommandError, PreviousBuildDirError -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req import RequirementSet -from pip._internal.req.req_tracker import RequirementTracker -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] <requirement specifier> ... - %prog [options] -r <requirements file> ... - %prog [options] [-e] <vcs project url> ... - %prog [options] [-e] <local project path> ... - %prog [options] <archive url/path> ...""" - - 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 <dir>, 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(cmdoptions.prefer_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.use_pep517()) - cmd_opts.add_option(cmdoptions.no_use_pep517()) - 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 RequirementTracker() as req_tracker, 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, - req_tracker=req_tracker, - ) - - 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, - use_pep517=options.use_pep517 - ) - 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, - ) - build_failures = wb.build( - requirement_set.requirements.values(), session=session, - ) - if len(build_failures) != 0: - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py deleted file mode 100644 index fe6df9b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/configuration.py +++ /dev/null @@ -1,387 +0,0 @@ -"""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, ConfigurationFileCouldNotBeLoaded, -) -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 ( # noqa: F401 - 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: - # See https://github.com/pypa/pip/issues/4963 - raise ConfigurationFileCouldNotBeLoaded( - reason="contains invalid {} characters".format( - locale.getpreferredencoding(False) - ), - fname=fname, - ) - except configparser.Error as error: - # See https://github.com/pypa/pip/issues/4893 - raise ConfigurationFileCouldNotBeLoaded(error=error) - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py deleted file mode 100644 index 2bbe176..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/download.py +++ /dev/null @@ -1,971 +0,0 @@ -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.urllib3.util import IS_PYOPENSSL - -import pip -from pip._internal.exceptions import HashMismatch, InstallationError -from pip._internal.locations import write_delete_marker_file -from pip._internal.models.index 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, - split_auth_from_netloc, splitext, unpack_file, -) -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 DownloadProgressProvider -from pip._internal.vcs import vcs - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Tuple, Dict, IO, Text, Union - ) - from pip._internal.models.link import Link # noqa: F401 - from pip._internal.utils.hashes import Hashes # noqa: F401 - from pip._internal.vcs import AuthInfo # noqa: F401 - -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): - # type: (bool) -> None - self.prompting = prompting - self.passwords = {} # type: Dict[str, AuthInfo] - - def __call__(self, req): - parsed = urllib_parse.urlparse(req.url) - - # Split the credentials from the netloc. - netloc, url_user_password = split_auth_from_netloc(parsed.netloc) - - # 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)) - - # Use the credentials embedded in the url if we have none stored - if username is None: - username, password = url_user_password - - # 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) - req.register_hook("response", self.warn_on_401) - - # Send our new request - new_resp = resp.connection.send(req, **kwargs) - new_resp.history.append(resp) - - return new_resp - - def warn_on_401(self, resp, **kwargs): - # warn user that they provided incorrect credentials - if resp.status_code == 401: - logger.warning('401 Error, Credentials not correct for %s', - resp.request.url) - - -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 # type: Optional[int] - - 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): - # type: (str, Optional[str], Optional[PipSession]) -> Tuple[str, Text] - """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): - # type: (Union[str, Text]) -> bool - """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): - # type: (str) -> str - """ - 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): - # type: (Union[str, Text]) -> str - """ - 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): - # type: (str) -> bool - """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): - # type: (Link) -> bool - return bool(_get_used_vcs_backend(link)) - - -def is_file_url(link): - # type: (Link) -> bool - return link.url.lower().startswith('file:') - - -def is_dir_url(link): - # type: (Link) -> bool - """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, # type: Response - link, # type: Link - content_file, # type: IO - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> None - 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, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - 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, # type: Link - location, # type: str - download_dir=None, # type: Optional[str] - hashes=None # type: Optional[Hashes] -): - # type: (...) -> 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, # type: Optional[Link] - location, # type: Optional[str] - download_dir=None, # type: Optional[str] - only_download=False, # type: bool - session=None, # type: Optional[PipSession] - hashes=None, # type: Optional[Hashes] - progress_bar="on" # type: str -): - # type: (...) -> None - """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, # type: Link - session, # type: PipSession - temp_dir, # type: str - hashes, # type: Hashes - progress_bar # type: str -): - # type: (...) -> Tuple[str, str] - """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): - # type: (Link, str, Hashes) -> Optional[str] - """ 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py deleted file mode 100644 index 38ceeea..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/exceptions.py +++ /dev/null @@ -1,274 +0,0 @@ -"""Exceptions used throughout package""" -from __future__ import absolute_import - -from itertools import chain, groupby, repeat - -from pip._vendor.six import iteritems - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - - -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 # type: Optional[InstallRequirement] - 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.""" - - -class ConfigurationFileCouldNotBeLoaded(ConfigurationError): - """When there are errors while loading a configuration file - """ - - def __init__(self, reason="could not be loaded", fname=None, error=None): - super(ConfigurationFileCouldNotBeLoaded, self).__init__(error) - self.reason = reason - self.fname = fname - self.error = error - - def __str__(self): - if self.fname is not None: - message_part = " in {}.".format(self.fname) - else: - assert self.error is not None - message_part = ".\n{}\n".format(self.error.message) - return "Configuration file {}{}".format(self.reason, message_part) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py deleted file mode 100644 index 9eda3a3..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/index.py +++ /dev/null @@ -1,990 +0,0 @@ -"""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 -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 RetryError, 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.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.candidate import InstallationCandidate -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.link import Link -from pip._internal.pep425tags import get_supported -from pip._internal.utils.compat import ipaddress -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, WHEEL_EXTENSION, normalize_path, - redact_password_from_url, -) -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from logging import Logger # noqa: F401 - from typing import ( # noqa: F401 - Tuple, Optional, Any, List, Union, Callable, Set, Sequence, - Iterable, MutableMapping - ) - from pip._vendor.packaging.version import _BaseVersion # noqa: F401 - from pip._vendor.requests import Response # noqa: F401 - from pip._internal.req import InstallRequirement # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - - SecureOrigin = Tuple[str, str, Optional[str]] - BuildTag = Tuple[Any, ...] # either emply tuple or Tuple[int, str] - CandidateSortingKey = Tuple[int, _BaseVersion, BuildTag, Optional[int]] - -__all__ = ['FormatControl', '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", "*", "*"), -] # type: List[SecureOrigin] - - -logger = logging.getLogger(__name__) - - -def _match_vcs_scheme(url): - # type: (str) -> Optional[str] - """Look for VCS schemes in the URL. - - Returns the matched VCS scheme, or None if there's no match. - """ - from pip._internal.vcs import VcsSupport - for scheme in VcsSupport.schemes: - if url.lower().startswith(scheme) and url[len(scheme)] in '+:': - return scheme - return None - - -def _is_url_like_archive(url): - # type: (str) -> bool - """Return whether the URL looks like an archive. - """ - filename = Link(url).filename - for bad_ext in ARCHIVE_EXTENSIONS: - if filename.endswith(bad_ext): - return True - return False - - -class _NotHTML(Exception): - def __init__(self, content_type, request_desc): - # type: (str, str) -> None - super(_NotHTML, self).__init__(content_type, request_desc) - self.content_type = content_type - self.request_desc = request_desc - - -def _ensure_html_header(response): - # type: (Response) -> None - """Check the Content-Type header to ensure the response contains HTML. - - Raises `_NotHTML` if the content type is not text/html. - """ - content_type = response.headers.get("Content-Type", "") - if not content_type.lower().startswith("text/html"): - raise _NotHTML(content_type, response.request.method) - - -class _NotHTTP(Exception): - pass - - -def _ensure_html_response(url, session): - # type: (str, PipSession) -> None - """Send a HEAD request to the URL, and ensure the response contains HTML. - - Raises `_NotHTTP` if the URL is not available for a HEAD request, or - `_NotHTML` if the content type is not text/html. - """ - scheme, netloc, path, query, fragment = urllib_parse.urlsplit(url) - if scheme not in {'http', 'https'}: - raise _NotHTTP() - - resp = session.head(url, allow_redirects=True) - resp.raise_for_status() - - _ensure_html_header(resp) - - -def _get_html_response(url, session): - # type: (str, PipSession) -> Response - """Access an HTML page with GET, and return the response. - - This consists of three parts: - - 1. If the URL looks suspiciously like an archive, send a HEAD first to - check the Content-Type is HTML, to avoid downloading a large file. - Raise `_NotHTTP` if the content type cannot be determined, or - `_NotHTML` if it is not HTML. - 2. Actually perform the request. Raise HTTP exceptions on network failures. - 3. Check the Content-Type header to make sure we got HTML, and raise - `_NotHTML` otherwise. - """ - if _is_url_like_archive(url): - _ensure_html_response(url, session=session) - - logger.debug('Getting page %s', url) - - resp = session.get( - url, - headers={ - "Accept": "text/html", - # We don't want to blindly returned cached data for - # /simple/, because authors generally expecting that - # twine upload && pip install will function, but if - # they've done a pip install in the last ~10 minutes - # it won't. Thus by setting this to zero we will not - # blindly use any cached data, however the benefit of - # using max-age=0 instead of no-cache, is that we will - # still support conditional requests, so we will still - # minimize traffic sent in cases where the page hasn't - # changed at all, we will just always incur the round - # trip for the conditional GET now instead of only - # once per 10 minutes. - # For more information, please see pypa/pip#5670. - "Cache-Control": "max-age=0", - }, - ) - 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. - _ensure_html_header(resp) - - return resp - - -def _handle_get_page_fail( - link, # type: Link - reason, # type: Union[str, Exception] - meth=None # type: Optional[Callable[..., None]] -): - # type: (...) -> None - if meth is None: - meth = logger.debug - meth("Could not fetch URL %s: %s - skipping", link, reason) - - -def _get_html_page(link, session=None): - # type: (Link, Optional[PipSession]) -> Optional[HTMLPage] - if session is None: - raise TypeError( - "_get_html_page() missing 1 required keyword argument: 'session'" - ) - - url = link.url.split('#', 1)[0] - - # Check for VCS schemes that do not support lookup as web pages. - vcs_scheme = _match_vcs_scheme(url) - if vcs_scheme: - logger.debug('Cannot look at %s URL %s', vcs_scheme, link) - return None - - # Tack index.html onto file:// URLs that point to directories - scheme, _, path, _, _, _ = 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) - - try: - resp = _get_html_response(url, session=session) - except _NotHTTP as exc: - logger.debug( - 'Skipping page %s because it looks like an archive, and cannot ' - 'be checked by HEAD.', link, - ) - except _NotHTML as exc: - logger.debug( - 'Skipping page %s because the %s request got Content-Type: %s', - link, exc.request_desc, exc.content_type, - ) - except requests.HTTPError as exc: - _handle_get_page_fail(link, exc) - except RetryError as exc: - _handle_get_page_fail(link, exc) - except SSLError as exc: - reason = "There was a problem confirming the ssl certificate: " - reason += str(exc) - _handle_get_page_fail(link, reason, meth=logger.info) - except requests.ConnectionError as exc: - _handle_get_page_fail(link, "connection error: %s" % exc) - except requests.Timeout: - _handle_get_page_fail(link, "timed out") - else: - return HTMLPage(resp.content, resp.url, resp.headers) - return None - - -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, # type: List[str] - index_urls, # type: List[str] - allow_all_prereleases=False, # type: bool - trusted_hosts=None, # type: Optional[Iterable[str]] - session=None, # type: Optional[PipSession] - format_control=None, # type: Optional[FormatControl] - platform=None, # type: Optional[str] - versions=None, # type: Optional[List[str]] - abi=None, # type: Optional[str] - implementation=None, # type: Optional[str] - prefer_binary=False # type: bool - ): - # type: (...) -> 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 = [] # type: List[str] - 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 - - # These are boring links that have already been logged somehow: - self.logged_links = set() # type: Set[Link] - - 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 []) - ] # type: List[SecureOrigin] - - # Do we want to allow _all_ pre-releases? - self.allow_all_prereleases = allow_all_prereleases - - # 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, - ) - - # Do we prefer old, but valid, binary dist over new source dist - self.prefer_binary = prefer_binary - - # 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): - # type: () -> str - lines = [] - if self.index_urls and self.index_urls != [PyPI.simple_url]: - lines.append( - "Looking in indexes: {}".format(", ".join( - redact_password_from_url(url) for url in self.index_urls)) - ) - if self.find_links: - lines.append( - "Looking in links: {}".format(", ".join(self.find_links)) - ) - return "\n".join(lines) - - @staticmethod - def _sort_locations(locations, expand_dir=False): - # type: (Sequence[str], bool) -> Tuple[List[str], List[str]] - """ - 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) - else: - logger.warning( - "Path '{0}' is ignored: " - "it is a directory.".format(path), - ) - 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): - # type: (InstallationCandidate) -> CandidateSortingKey - """ - 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 - If prefer_binary was set, then all wheels are sorted above sources. - 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() # type: BuildTag - binary_preference = 0 - 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 - ) - if self.prefer_binary: - binary_preference = 1 - 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 (binary_preference, candidate.version, build_tag, pri) - - def _validate_secure_origin(self, logger, location): - # type: (Logger, Link) -> bool - # 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) - # setting secure_origin[1] to proper Union[bytes, str] - # creates problems in other places - else secure_origin[1].decode("utf8") # type: ignore - ) - 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): - # type: (str) -> List[str] - """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): - # type: (str) -> List[Optional[InstallationCandidate]] - """Find all available InstallationCandidate for project_name - - This checks index_urls and find_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, - ) - - file_locations = (Link(url) for url in itertools.chain( - index_file_loc, fl_file_loc, - )) - - # We trust every url that the user has given us whether it was given - # via --index-url or --find-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), - ) - 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 = self.format_control.get_allowed_formats(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.iter_links(), search) - ) - - 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 - - def find_requirement(self, req, upgrade): - # type: (InstallRequirement, bool) -> Optional[Link] - """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): - # type: (Iterable[Link], str) -> Iterable[HTMLPage] - """ - Yields (page, page_url) from the given locations, skipping - locations that have errors. - """ - seen = set() # type: Set[Link] - for location in locations: - if location in seen: - continue - seen.add(location) - - page = _get_html_page(location, session=self.session) - if page is None: - continue - - yield page - - _py_version_re = re.compile(r'-py([123]\.?[0-9]?)$') - - def _sort_links(self, links): - # type: (Iterable[Link]) -> List[Link] - """ - Returns elements of links in order, non-egg links first, egg links - second, while eliminating duplicates - """ - eggs, no_eggs = [], [] - seen = set() # type: Set[Link] - 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, # type: Iterable[Link] - search # type: Search - ): - # type: (...) -> List[Optional[InstallationCandidate]] - 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): - # type: (Link, str) -> None - 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): - # type: (Link, Search) -> Optional[InstallationCandidate] - """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 None - if ext not in SUPPORTED_EXTENSIONS: - self._log_skipped_link( - link, 'unsupported archive format: %s' % ext, - ) - return None - if "binary" not in search.formats and ext == WHEEL_EXTENSION: - self._log_skipped_link( - link, 'No binaries permitted for %s' % search.supplied, - ) - return None - if "macosx10" in link.path and ext == '.zip': - self._log_skipped_link(link, 'macosx10 one') - return None - if ext == WHEEL_EXTENSION: - try: - wheel = Wheel(link.filename) - except InvalidWheelFilename: - self._log_skipped_link(link, 'invalid wheel filename') - return None - if canonicalize_name(wheel.name) != search.canonical: - self._log_skipped_link( - link, 'wrong project name (not %s)' % search.supplied) - return None - - if not wheel.supported(self.valid_tags): - self._log_skipped_link( - link, 'it is not compatible with this Python') - return None - - 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_EXTENSION: - self._log_skipped_link( - link, 'No sources permitted for %s' % search.supplied, - ) - return None - - if not version: - version = _egg_info_matches(egg_info, search.canonical) - if not version: - self._log_skipped_link( - link, 'Missing project version for %s' % search.supplied) - return None - - 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 None - 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 None - logger.debug('Found link %s, version: %s', link, version) - - return InstallationCandidate(search.supplied, version, link) - - -def _find_name_version_sep(egg_info, canonical_name): - # type: (str, str) -> int - """Find the separator's index based on the package's canonical name. - - `egg_info` must be an egg info string for the given package, and - `canonical_name` must be the package's canonical name. - - This function is needed since the canonicalized name does not necessarily - have the same length as the egg info's name part. An example:: - - >>> egg_info = 'foo__bar-1.0' - >>> canonical_name = 'foo-bar' - >>> _find_name_version_sep(egg_info, canonical_name) - 8 - """ - # Project name and version must be separated by one single dash. Find all - # occurrences of dashes; if the string in front of it matches the canonical - # name, this is the one separating the name and version parts. - for i, c in enumerate(egg_info): - if c != "-": - continue - if canonicalize_name(egg_info[:i]) == canonical_name: - return i - raise ValueError("{} does not match {}".format(egg_info, canonical_name)) - - -def _egg_info_matches(egg_info, canonical_name): - # type: (str, str) -> Optional[str] - """Pull the version part out of a string. - - :param egg_info: The string to parse. E.g. foo-2.1 - :param canonical_name: The canonicalized name of the package this - belongs to. - """ - try: - version_start = _find_name_version_sep(egg_info, canonical_name) + 1 - except ValueError: - return None - version = egg_info[version_start:] - if not version: - return None - return version - - -def _determine_base_url(document, page_url): - """Determine the HTML document's base URL. - - This looks for a ``<base>`` tag in the HTML document. If present, its href - attribute denotes the base URL of anchor tags in the document. If there is - no such tag (or if it does not have a valid href attribute), the HTML - file's URL is used as the base URL. - - :param document: An HTML document representation. The current - implementation expects the result of ``html5lib.parse()``. - :param page_url: The URL of the HTML document. - """ - for base in document.findall(".//base"): - href = base.get("href") - if href is not None: - return href - return page_url - - -def _get_encoding_from_headers(headers): - """Determine if we have any encoding information in our headers. - """ - if headers and "Content-Type" in headers: - content_type, params = cgi.parse_header(headers["Content-Type"]) - if "charset" in params: - return params['charset'] - return None - - -_CLEAN_LINK_RE = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I) - - -def _clean_link(url): - # type: (str) -> str - """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 _CLEAN_LINK_RE.sub(lambda match: '%%%2x' % ord(match.group(0)), url) - - -class HTMLPage(object): - """Represents one page, along with its URL""" - - def __init__(self, content, url, headers=None): - # type: (bytes, str, MutableMapping[str, str]) -> None - self.content = content - self.url = url - self.headers = headers - - def __str__(self): - return redact_password_from_url(self.url) - - def iter_links(self): - # type: () -> Iterable[Link] - """Yields all links in the page""" - document = html5lib.parse( - self.content, - transport_encoding=_get_encoding_from_headers(self.headers), - namespaceHTMLElements=False, - ) - base_url = _determine_base_url(document, self.url) - for anchor in document.findall(".//a"): - if anchor.get("href"): - href = anchor.get("href") - url = _clean_link(urllib_parse.urljoin(base_url, href)) - pyrequire = anchor.get('data-requires-python') - pyrequire = unescape(pyrequire) if pyrequire else None - yield Link(url, self.url, requires_python=pyrequire) - - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py deleted file mode 100644 index c6e2a3e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/locations.py +++ /dev/null @@ -1,211 +0,0 @@ -"""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 # type: ignore - -from pip._internal.utils import appdirs -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Union, Dict, List, Optional # noqa: F401 - - -# 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): - # type: (str) -> None - """ - 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(): - # type: () -> bool - """ - 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(): - # type: () -> bool - """ - 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 - else: - return False - - -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") # type: Optional[str] - -# 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): - # type:(str, bool, str, str, bool, str) -> dict - """ - 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} # type: Dict[str, Union[str, List[str]]] - dist_args.update(extra_dist_args) - - d = Distribution(dist_args) - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - d.parse_config_files() - # NOTE: Ignoring type since mypy can't find attributes on 'Command' - i = d.get_command_obj('install', create=True) # type: Any - assert i is not None - # 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 - - # Ignoring, typeshed issue reported python/typeshed/issues/2567 - if 'install_lib' in d.get_option_dict('install'): # type: ignore - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py deleted file mode 100644 index 7855226..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -"""A package that contains models that represent entities. -""" diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py deleted file mode 100644 index 4475458..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/candidate.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.packaging.version import parse as parse_version - -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from pip._vendor.packaging.version import _BaseVersion # noqa: F401 - from pip._internal.models.link import Link # noqa: F401 - from typing import Any, Union # noqa: F401 - - -class InstallationCandidate(KeyBasedCompareMixin): - """Represents a potential "candidate" for installation. - """ - - def __init__(self, project, version, location): - # type: (Any, str, Link) -> None - self.project = project - self.version = parse_version(version) # type: _BaseVersion - self.location = location - - super(InstallationCandidate, self).__init__( - key=(self.project, self.version, self.location), - defining_class=InstallationCandidate - ) - - def __repr__(self): - # type: () -> str - return "<InstallationCandidate({!r}, {!r}, {!r})>".format( - self.project, self.version, self.location, - ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py deleted file mode 100644 index 971a391..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/format_control.py +++ /dev/null @@ -1,73 +0,0 @@ -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Set, FrozenSet # noqa: F401 - - -class FormatControl(object): - """Helper for managing formats from which a package can be installed. - """ - - def __init__(self, no_binary=None, only_binary=None): - # type: (Optional[Set], Optional[Set]) -> None - if no_binary is None: - no_binary = set() - if only_binary is None: - only_binary = set() - - self.no_binary = no_binary - self.only_binary = only_binary - - def __eq__(self, other): - return self.__dict__ == other.__dict__ - - def __ne__(self, other): - return not self.__eq__(other) - - def __repr__(self): - return "{}({}, {})".format( - self.__class__.__name__, - self.no_binary, - self.only_binary - ) - - @staticmethod - def handle_mutual_excludes(value, target, other): - # type: (str, Optional[Set], Optional[Set]) -> None - new = value.split(',') - while ':all:' in new: - other.clear() - target.clear() - target.add(':all:') - del new[:new.index(':all:') + 1] - # Without a none, we want to discard everything as :all: covers it - if ':none:' not in new: - return - for name in new: - if name == ':none:': - target.clear() - continue - name = canonicalize_name(name) - other.discard(name) - target.add(name) - - def get_allowed_formats(self, canonical_name): - # type: (str) -> FrozenSet - result = {"binary", "source"} - if canonical_name in self.only_binary: - result.discard('source') - elif canonical_name in self.no_binary: - result.discard('binary') - elif ':all:' in self.only_binary: - result.discard('source') - elif ':all:' in self.no_binary: - result.discard('binary') - return frozenset(result) - - def disallow_binaries(self): - # type: () -> None - self.handle_mutual_excludes( - ':all:', self.no_binary, self.only_binary, - ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py deleted file mode 100644 index ead1efb..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/index.py +++ /dev/null @@ -1,31 +0,0 @@ -from pip._vendor.six.moves.urllib import parse as urllib_parse - - -class PackageIndex(object): - """Represents a Package Index and provides easier access to endpoints - """ - - def __init__(self, url, file_storage_domain): - # type: (str, str) -> None - super(PackageIndex, self).__init__() - self.url = url - self.netloc = urllib_parse.urlsplit(url).netloc - self.simple_url = self._url_for_path('simple') - self.pypi_url = self._url_for_path('pypi') - - # This is part of a temporary hack used to block installs of PyPI - # packages which depend on external urls only necessary until PyPI can - # block such packages themselves - self.file_storage_domain = file_storage_domain - - def _url_for_path(self, path): - # type: (str) -> str - return urllib_parse.urljoin(self.url, path) - - -PyPI = PackageIndex( - 'https://pypi.org/', file_storage_domain='files.pythonhosted.org' -) -TestPyPI = PackageIndex( - 'https://test.pypi.org/', file_storage_domain='test-files.pythonhosted.org' -) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py deleted file mode 100644 index ad2f93e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/models/link.py +++ /dev/null @@ -1,163 +0,0 @@ -import posixpath -import re - -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 ( - WHEEL_EXTENSION, redact_password_from_url, splitext, -) -from pip._internal.utils.models import KeyBasedCompareMixin -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple, Union, Text # noqa: F401 - from pip._internal.index import HTMLPage # noqa: F401 - - -class Link(KeyBasedCompareMixin): - """Represents a parsed link from a Package Index's simple URL - """ - - def __init__(self, url, comes_from=None, requires_python=None): - # type: (str, Optional[Union[str, HTMLPage]], Optional[str]) -> None - """ - 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 - - super(Link, self).__init__( - key=(self.url), - defining_class=Link - ) - - 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' % (redact_password_from_url(self.url), - self.comes_from, rp) - else: - return redact_password_from_url(str(self.url)) - - def __repr__(self): - return '<Link %s>' % self - - @property - def filename(self): - # type: () -> str - _, 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): - # type: () -> str - return urllib_parse.urlsplit(self.url)[0] - - @property - def netloc(self): - # type: () -> str - return urllib_parse.urlsplit(self.url)[1] - - @property - def path(self): - # type: () -> str - return urllib_parse.unquote(urllib_parse.urlsplit(self.url)[2]) - - def splitext(self): - # type: () -> Tuple[str, str] - return splitext(posixpath.basename(self.path.rstrip('/'))) - - @property - def ext(self): - # type: () -> str - return self.splitext()[1] - - @property - def url_without_fragment(self): - # type: () -> str - 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): - # type: () -> Optional[str] - 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): - # type: () -> Optional[str] - 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): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(2) - return None - - @property - def hash_name(self): - # type: () -> Optional[str] - match = self._hash_re.search(self.url) - if match: - return match.group(1) - return None - - @property - def show_url(self): - # type: () -> Optional[str] - return posixpath.basename(self.url.split('#', 1)[0].split('?', 1)[0]) - - @property - def is_wheel(self): - # type: () -> bool - return self.ext == WHEEL_EXTENSION - - @property - def is_artifact(self): - # type: () -> bool - """ - 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py deleted file mode 100644 index 0b56eda..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/check.py +++ /dev/null @@ -1,155 +0,0 @@ -"""Validation of dependencies of packages -""" - -import logging -from collections import namedtuple - -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.operations.prepare import make_abstract_dist -from pip._internal.utils.misc import get_installed_distributions -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -logger = logging.getLogger(__name__) - -if MYPY_CHECK_RUNNING: - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from typing import ( # noqa: F401 - Any, Callable, Dict, Optional, Set, Tuple, List - ) - - # Shorthands - PackageSet = Dict[str, 'PackageDetails'] - Missing = Tuple[str, Any] - Conflicting = Tuple[str, str, Any] - - MissingDict = Dict[str, List[Missing]] - ConflictingDict = Dict[str, List[Conflicting]] - CheckResult = Tuple[MissingDict, ConflictingDict] - -PackageDetails = namedtuple('PackageDetails', ['version', 'requires']) - - -def create_package_set_from_installed(**kwargs): - # type: (**Any) -> Tuple[PackageSet, bool] - """Converts a list of distributions into a PackageSet. - """ - # Default to using all packages installed on the system - if kwargs == {}: - kwargs = {"local_only": False, "skip": ()} - - package_set = {} - problems = False - for dist in get_installed_distributions(**kwargs): - name = canonicalize_name(dist.project_name) - try: - package_set[name] = PackageDetails(dist.version, dist.requires()) - except RequirementParseError as e: - # Don't crash on broken metadata - logging.warning("Error parsing requirements for %s: %s", name, e) - problems = True - return package_set, problems - - -def check_package_set(package_set, should_ignore=None): - # type: (PackageSet, Optional[Callable[[str], bool]]) -> CheckResult - """Check if a package set is consistent - - If should_ignore is passed, it should be a callable that takes a - package name and returns a boolean. - """ - if should_ignore is None: - def should_ignore(name): - return False - - 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] - - if should_ignore(package_name): - continue - - 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)) - - if missing_deps: - missing[package_name] = sorted(missing_deps, key=str) - if conflicting_deps: - conflicting[package_name] = sorted(conflicting_deps, key=str) - - 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 - package_set, _ = create_package_set_from_installed() - # Install packages - would_be_installed = _simulate_installation_of(to_install, package_set) - - # Only warn about directly-dependent packages; create a whitelist of them - whitelist = _create_whitelist(would_be_installed, package_set) - - return ( - package_set, - check_package_set( - package_set, should_ignore=lambda name: name not in whitelist - ) - ) - - -def _simulate_installation_of(to_install, package_set): - # type: (List[InstallRequirement], PackageSet) -> Set[str] - """Computes the version of packages after installing to_install. - """ - - # Keep track of packages that were installed - installed = set() - - # Modify it as installing requirement_set would (assuming no errors) - for inst_req in to_install: - dist = make_abstract_dist(inst_req).dist() - name = canonicalize_name(dist.key) - package_set[name] = PackageDetails(dist.version, dist.requires()) - - installed.add(name) - - return installed - - -def _create_whitelist(would_be_installed, package_set): - # type: (Set[str], PackageSet) -> Set[str] - packages_affected = set(would_be_installed) - - for package_name in package_set: - if package_name in packages_affected: - continue - - for req in package_set[package_name].requires: - if canonicalize_name(req.name) in packages_affected: - packages_affected.add(package_name) - break - - return packages_affected diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py deleted file mode 100644 index 388bb73..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/freeze.py +++ /dev/null @@ -1,247 +0,0 @@ -from __future__ import absolute_import - -import collections -import logging -import os -import re - -from pip._vendor import six -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.pkg_resources import RequirementParseError - -from pip._internal.exceptions import BadCommand, InstallationError -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.req.req_file import COMMENT_RE -from pip._internal.utils.misc import ( - dist_is_editable, get_installed_distributions, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Iterator, Optional, List, Container, Set, Dict, Tuple, Iterable, Union - ) - from pip._internal.cache import WheelCache # noqa: F401 - from pip._vendor.pkg_resources import ( # noqa: F401 - Distribution, Requirement - ) - - RequirementInfo = Tuple[Optional[Union[str, Requirement]], bool, List[str]] - - -logger = logging.getLogger(__name__) - - -def freeze( - requirement=None, # type: Optional[List[str]] - find_links=None, # type: Optional[List[str]] - local_only=None, # type: Optional[bool] - user_only=None, # type: Optional[bool] - skip_regex=None, # type: Optional[str] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - exclude_editable=False, # type: bool - skip=() # type: Container[str] -): - # type: (...) -> Iterator[str] - find_links = find_links or [] - skip_match = None - - if skip_regex: - skip_match = re.compile(skip_regex).search - - for link in find_links: - yield '-f %s' % link - installations = {} # type: Dict[str, FrozenRequirement] - for dist in get_installed_distributions(local_only=local_only, - skip=(), - user_only=user_only): - try: - req = FrozenRequirement.from_dist(dist) - 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() # type: Set[str] - # 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) # type: Dict[str, List[str]] - 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 = install_req_from_editable( - line, - isolated=isolated, - wheel_cache=wheel_cache, - ) - else: - line_req = install_req_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 " - "package %r is not installed", - req_file_path, - COMMENT_RE.sub('', line).strip(), line_req.name - ) - 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() - - -def get_requirement_info(dist): - # type: (Distribution) -> RequirementInfo - """ - Compute and return values (req, editable, comments) for use in - FrozenRequirement.from_dist(). - """ - if not dist_is_editable(dist): - return (None, False, []) - - location = os.path.normcase(os.path.abspath(dist.location)) - - from pip._internal.vcs import vcs, RemoteNotFoundError - vc_type = vcs.get_backend_type(location) - - if not vc_type: - req = dist.as_requirement() - logger.debug( - 'No VCS found for editable requirement {!r} in: {!r}', req, - location, - ) - comments = [ - '# Editable install with no version control ({})'.format(req) - ] - return (location, True, comments) - - try: - req = vc_type.get_src_requirement(location, dist.project_name) - except RemoteNotFoundError: - req = dist.as_requirement() - comments = [ - '# Editable {} install with no remote ({})'.format( - vc_type.__name__, req, - ) - ] - return (location, True, comments) - - except BadCommand: - logger.warning( - 'cannot determine version of editable source in %s ' - '(%s command not found in path)', - location, - vc_type.name, - ) - return (None, True, []) - - except InstallationError as exc: - logger.warning( - "Error when trying to get requirement for VCS system %s, " - "falling back to uneditable format", exc - ) - else: - if req is not None: - return (req, True, []) - - logger.warning( - 'Could not determine repository location of %s', location - ) - comments = ['## !! Could not determine repository location'] - - return (None, False, comments) - - -class FrozenRequirement(object): - def __init__(self, name, req, editable, comments=()): - # type: (str, Union[str, Requirement], bool, Iterable[str]) -> None - self.name = name - self.req = req - self.editable = editable - self.comments = comments - - @classmethod - def from_dist(cls, dist): - # type: (Distribution) -> FrozenRequirement - req, editable, comments = get_requirement_info(dist) - if req is None: - req = dist.as_requirement() - - return cls(dist.project_name, req, editable, comments=comments) - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py deleted file mode 100644 index 4f31dd5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/operations/prepare.py +++ /dev/null @@ -1,413 +0,0 @@ -"""Prepares a distribution for installation -""" - -import logging -import os - -from pip._vendor import pkg_resources, requests - -from pip._internal.build_env import BuildEnvironment -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.utils.compat import expanduser -from pip._internal.utils.hashes import MissingHashes -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import display_path, normalize_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.vcs import vcs - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - from pip._internal.req.req_tracker import RequirementTracker # noqa: F401 - -logger = logging.getLogger(__name__) - - -def make_abstract_dist(req): - # type: (InstallRequirement) -> DistAbstraction - """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) - - -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): - # type: (InstallRequirement) -> None - self.req = req # type: InstallRequirement - - def dist(self): - # type: () -> Any - """Return a setuptools Dist object.""" - raise NotImplementedError - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - """Ensure that we can get a Dist for this requirement.""" - raise NotImplementedError - - -class IsWheel(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return list(pkg_resources.find_distributions( - self.req.source_dir))[0] - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - # FIXME:https://github.com/pypa/pip/issues/1112 - pass - - -class IsSDist(DistAbstraction): - - def dist(self): - return self.req.get_dist() - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> None - # Prepare for building. We need to: - # 1. Load pyproject.toml (if it exists) - # 2. Set up the build environment - - self.req.load_pyproject_toml() - should_isolate = self.req.use_pep517 and build_isolation - - def _raise_conflicts(conflicting_with, conflicting_reqs): - raise InstallationError( - "Some build dependencies for %s conflict with %s: %s." % ( - self.req, conflicting_with, ', '.join( - '%s is incompatible with %s' % (installed, wanted) - for installed, wanted in sorted(conflicting)))) - - if should_isolate: - # Isolate in a BuildEnvironment and install the build-time - # requirements. - self.req.build_env = BuildEnvironment() - self.req.build_env.install_requirements( - finder, self.req.pyproject_requires, 'overlay', - "Installing build dependencies" - ) - conflicting, missing = self.req.build_env.check_requirements( - self.req.requirements_to_check - ) - if conflicting: - _raise_conflicts("PEP 517/518 supported requirements", - conflicting) - if missing: - logger.warning( - "Missing build requirements in pyproject.toml for %s.", - self.req, - ) - logger.warning( - "The project does not specify a build backend, and " - "pip cannot fall back to setuptools without %s.", - " and ".join(map(repr, sorted(missing))) - ) - # Install any extra build dependencies that the backend requests. - # This must be done in a second pass, as the pyproject.toml - # dependencies must be installed before we can call the backend. - with self.req.build_env: - # We need to have the env active when calling the hook. - self.req.spin_message = "Getting requirements to build wheel" - reqs = self.req.pep517_backend.get_requires_for_build_wheel() - conflicting, missing = self.req.build_env.check_requirements(reqs) - if conflicting: - _raise_conflicts("the backend dependencies", conflicting) - self.req.build_env.install_requirements( - finder, missing, 'normal', - "Installing backend dependencies" - ) - - self.req.prepare_metadata() - self.req.assert_source_matches_version() - - -class Installed(DistAbstraction): - - def dist(self): - # type: () -> pkg_resources.Distribution - return self.req.satisfied_by - - def prep_for_dist(self, finder, build_isolation): - # type: (PackageFinder, bool) -> Any - pass - - -class RequirementPreparer(object): - """Prepares a Requirement - """ - - def __init__( - self, - build_dir, # type: str - download_dir, # type: Optional[str] - src_dir, # type: str - wheel_download_dir, # type: Optional[str] - progress_bar, # type: str - build_isolation, # type: bool - req_tracker # type: RequirementTracker - ): - # type: (...) -> None - super(RequirementPreparer, self).__init__() - - self.src_dir = src_dir - self.build_dir = build_dir - self.req_tracker = req_tracker - - # 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): - # type: () -> bool - # 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, # type: InstallRequirement - session, # type: PipSession - finder, # type: PackageFinder - upgrade_allowed, # type: bool - require_hashes # type: bool - ): - # type: (...) -> DistAbstraction - """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) - with self.req_tracker.track(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, # type: InstallRequirement - require_hashes, # type: bool - use_user_site, # type: bool - finder # type: PackageFinder - ): - # type: (...) -> DistAbstraction - """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) - with self.req_tracker.track(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): - # type: (InstallRequirement, bool, Optional[str]) -> DistAbstraction - """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py deleted file mode 100644 index 1e782d1..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pep425tags.py +++ /dev/null @@ -1,381 +0,0 @@ -"""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 -from pip._internal.utils.compat import get_extension_suffixes -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Tuple, Callable, List, Optional, Union, Dict - ) - - Pep425Tag = Tuple[str, str, str] - -logger = logging.getLogger(__name__) - -_osx_arch_pat = re.compile(r'(.+)_(\d+)_(\d+)_(.+)') - - -def get_config_var(var): - # type: (str) -> Optional[str] - try: - return sysconfig.get_config_var(var) - except IOError as e: # Issue #1074 - warnings.warn("{}".format(e), RuntimeWarning) - return None - - -def get_abbr_impl(): - # type: () -> str - """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(): - # type: () -> str - """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(): - # type: () -> Tuple[int, ...] - """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 - # attrs exist only on pypy - return (sys.version_info[0], - sys.pypy_version_info.major, # type: ignore - sys.pypy_version_info.minor) # type: ignore - else: - return sys.version_info[0], sys.version_info[1] - - -def get_impl_tag(): - # type: () -> str - """ - Returns the Tag for this specific implementation. - """ - return "{}{}".format(get_abbr_impl(), get_impl_ver()) - - -def get_flag(var, fallback, expected=True, warn=True): - # type: (str, Callable[..., bool], Union[bool, int], bool) -> bool - """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(): - # type: () -> Optional[str] - """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(): - # type: () -> bool - return sys.maxsize == 2147483647 - - -def get_platform(): - # type: () -> str - """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(): - # type: () -> bool - # 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 is_manylinux2010_compatible(): - # type: () -> bool - # 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.manylinux2010_compatible) - except (ImportError, AttributeError): - # Fall through to heuristic check below - pass - - # Check glibc version. CentOS 6 uses glibc 2.12. - return pip._internal.utils.glibc.have_compatible_glibc(2, 12) - - -def get_darwin_arches(major, minor, machine): - # type: (int, int, str) -> List[str] - """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): - # type: (int, int, str) -> bool - # 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")), - ]) # type: Dict[str, Tuple[str, ...]] - - 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_all_minor_versions_as_strings(version_info): - # type: (Tuple[int, ...]) -> List[str] - versions = [] - 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,)))) - return versions - - -def get_supported( - versions=None, # type: Optional[List[str]] - noarch=False, # type: bool - platform=None, # type: Optional[str] - impl=None, # type: Optional[str] - abi=None # type: Optional[str] -): - # type: (...) -> List[Pep425Tag] - """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: - version_info = get_impl_version_info() - versions = get_all_minor_versions_as_strings(version_info) - - impl = impl or get_abbr_impl() - - abis = [] # type: List[str] - - abi = abi or get_abi_tag() - if abi: - abis[0:0] = [abi] - - abi3s = set() - for suffix in get_extension_suffixes(): - if suffix.startswith('.abi'): - abi3s.add(suffix.split('.', 2)[1]) - - abis.extend(sorted(list(abi3s))) - - abis.append('none') - - if not noarch: - arch = platform or get_platform() - arch_prefix, arch_sep, arch_suffix = arch.partition('_') - 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 arch_prefix == 'manylinux2010': - # manylinux1 wheels run on most manylinux2010 systems with the - # exception of wheels depending on ncurses. PEP 571 states - # manylinux1 wheels should be considered manylinux2010 wheels: - # https://www.python.org/dev/peps/pep-0571/#backwards-compatibility-with-manylinux1-wheels - arches = [arch, 'manylinux1' + arch_sep + arch_suffix] - elif platform is None: - arches = [] - if is_manylinux2010_compatible(): - arches.append('manylinux2010' + arch_sep + arch_suffix) - if is_manylinux1_compatible(): - arches.append('manylinux1' + arch_sep + arch_suffix) - arches.append(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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py deleted file mode 100644 index 8d739a6..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/pyproject.py +++ /dev/null @@ -1,171 +0,0 @@ -from __future__ import absolute_import - -import io -import os -import sys - -from pip._vendor import pytoml, six - -from pip._internal.exceptions import InstallationError -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Tuple, Optional, List # noqa: F401 - - -def _is_list_of_str(obj): - # type: (Any) -> bool - return ( - isinstance(obj, list) and - all(isinstance(item, six.string_types) for item in obj) - ) - - -def make_pyproject_path(setup_py_dir): - # type: (str) -> str - path = os.path.join(setup_py_dir, 'pyproject.toml') - - # Python2 __file__ should not be unicode - if six.PY2 and isinstance(path, six.text_type): - path = path.encode(sys.getfilesystemencoding()) - - return path - - -def load_pyproject_toml( - use_pep517, # type: Optional[bool] - pyproject_toml, # type: str - setup_py, # type: str - req_name # type: str -): - # type: (...) -> Optional[Tuple[List[str], str, List[str]]] - """Load the pyproject.toml file. - - Parameters: - use_pep517 - Has the user requested PEP 517 processing? None - means the user hasn't explicitly specified. - pyproject_toml - Location of the project's pyproject.toml file - setup_py - Location of the project's setup.py file - req_name - The name of the requirement we're processing (for - error reporting) - - Returns: - None if we should use the legacy code path, otherwise a tuple - ( - requirements from pyproject.toml, - name of PEP 517 backend, - requirements we should check are installed after setting - up the build environment - ) - """ - has_pyproject = os.path.isfile(pyproject_toml) - has_setup = os.path.isfile(setup_py) - - if has_pyproject: - with io.open(pyproject_toml, encoding="utf-8") as f: - pp_toml = pytoml.load(f) - build_system = pp_toml.get("build-system") - else: - build_system = None - - # The following cases must use PEP 517 - # We check for use_pep517 being non-None and falsey because that means - # the user explicitly requested --no-use-pep517. The value 0 as - # opposed to False can occur when the value is provided via an - # environment variable or config file option (due to the quirk of - # strtobool() returning an integer in pip's configuration code). - if has_pyproject and not has_setup: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project does not have a setup.py" - ) - use_pep517 = True - elif build_system and "build-backend" in build_system: - if use_pep517 is not None and not use_pep517: - raise InstallationError( - "Disabling PEP 517 processing is invalid: " - "project specifies a build backend of {} " - "in pyproject.toml".format( - build_system["build-backend"] - ) - ) - use_pep517 = True - - # If we haven't worked out whether to use PEP 517 yet, - # and the user hasn't explicitly stated a preference, - # we do so if the project has a pyproject.toml file. - elif use_pep517 is None: - use_pep517 = has_pyproject - - # At this point, we know whether we're going to use PEP 517. - assert use_pep517 is not None - - # If we're using the legacy code path, there is nothing further - # for us to do here. - if not use_pep517: - return None - - if build_system is None: - # Either the user has a pyproject.toml with no build-system - # section, or the user has no pyproject.toml, but has opted in - # explicitly via --use-pep517. - # In the absence of any explicit backend specification, we - # assume the setuptools backend that most closely emulates the - # traditional direct setup.py execution, and require wheel and - # a version of setuptools that supports that backend. - - build_system = { - "requires": ["setuptools>=40.8.0", "wheel"], - "build-backend": "setuptools.build_meta:__legacy__", - } - - # If we're using PEP 517, we have build system information (either - # from pyproject.toml, or defaulted by the code above). - # Note that at this point, we do not know if the user has actually - # specified a backend, though. - assert build_system is not None - - # Ensure that the build-system section in pyproject.toml conforms - # to PEP 518. - error_template = ( - "{package} has a pyproject.toml file that does not comply " - "with PEP 518: {reason}" - ) - - # Specifying the build-system table but not the requires key is invalid - if "requires" not in build_system: - raise InstallationError( - error_template.format(package=req_name, reason=( - "it has a 'build-system' table but not " - "'build-system.requires' which is mandatory in the table" - )) - ) - - # Error out if requires is not a list of strings - requires = build_system["requires"] - if not _is_list_of_str(requires): - raise InstallationError(error_template.format( - package=req_name, - reason="'build-system.requires' is not a list of strings.", - )) - - backend = build_system.get("build-backend") - check = [] # type: List[str] - if backend is None: - # If the user didn't specify a backend, we assume they want to use - # the setuptools backend. But we can't be sure they have included - # a version of setuptools which supplies the backend, or wheel - # (which is needed by the backend) in their requirements. So we - # make a note to check that those requirements are present once - # we have set up the environment. - # This is quite a lot of work to check for a very specific case. But - # the problem is, that case is potentially quite common - projects that - # adopted PEP 518 early for the ability to specify requirements to - # execute setup.py, but never considered needing to mention the build - # tools themselves. The original PEP 518 code had a similar check (but - # implemented in a different way). - backend = "setuptools.build_meta:__legacy__" - check = ["setuptools>=40.8.0", "wheel"] - - return (requires, backend, check) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py deleted file mode 100644 index 5e4eb92..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -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 -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Sequence # noqa: F401 - -__all__ = [ - "RequirementSet", "InstallRequirement", - "parse_requirements", "install_given_reqs", -] - -logger = logging.getLogger(__name__) - - -def install_given_reqs( - to_install, # type: List[InstallRequirement] - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - *args, **kwargs -): - # type: (...) -> List[InstallRequirement] - """ - 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 Exception: - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py deleted file mode 100644 index 1eed1dd..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/constructors.py +++ /dev/null @@ -1,339 +0,0 @@ -"""Backing implementation for InstallRequirement's various constructors - -The idea here is that these formed a major chunk of InstallRequirement's size -so, moving them and support code dedicated to them outside of that class -helps creates for better understandability for the rest of the code. - -These are meant to be used elsewhere within pip to create instances of -InstallRequirement. -""" - -import logging -import os -import re - -from pip._vendor.packaging.markers import Marker -from pip._vendor.packaging.requirements import InvalidRequirement, Requirement -from pip._vendor.packaging.specifiers import Specifier -from pip._vendor.pkg_resources import RequirementParseError, parse_requirements - -from pip._internal.download import ( - is_archive_file, is_url, path_to_url, url_to_path, -) -from pip._internal.exceptions import InstallationError -from pip._internal.models.index import PyPI, TestPyPI -from pip._internal.models.link import Link -from pip._internal.pyproject import make_pyproject_path -from pip._internal.req.req_install import InstallRequirement -from pip._internal.utils.misc import is_installable_dir -from pip._internal.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.vcs import vcs -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Tuple, Set, Any, Union, Text, Dict, - ) - from pip._internal.cache import WheelCache # noqa: F401 - - -__all__ = [ - "install_req_from_editable", "install_req_from_line", - "parse_editable" -] - -logger = logging.getLogger(__name__) -operators = Specifier._operators.keys() - - -def _strip_extras(path): - # type: (str) -> Tuple[str, Optional[str]] - 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 - - -def parse_editable(editable_req): - # type: (str) -> Tuple[Optional[str], str, Optional[Set[str]]] - """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] - """ - - 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')): - msg = ( - 'File "setup.py" not found. Directory cannot be installed ' - 'in editable mode: {}'.format(os.path.abspath(url_no_extras)) - ) - pyproject_path = make_pyproject_path(url_no_extras) - if os.path.isfile(pyproject_path): - msg += ( - '\n(A "pyproject.toml" file was found, but editable ' - 'mode currently requires a setup.py based build.)' - ) - raise InstallationError(msg) - - # 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 package_name, url, None - - -def deduce_helpful_msg(req): - # type: (str) -> str - """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=True) - else: - msg += " File '%s' does not exist." % (req) - return msg - - -# ---- The actual constructors follow ---- - - -def install_req_from_editable( - editable_req, # type: str - comes_from=None, # type: Optional[str] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - 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 InstallRequirement( - req, comes_from, source_dir=source_dir, - editable=True, - link=Link(url), - constraint=constraint, - use_pep517=use_pep517, - isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - extras=extras_override or (), - ) - - -def install_req_from_line( - name, # type: str - comes_from=None, # type: Optional[Union[str, InstallRequirement]] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False # type: bool -): - # type: (...) -> InstallRequirement - """Creates an InstallRequirement from a name, which might be a - requirement, directory containing 'setup.py', filename, or URL. - """ - if is_url(name): - marker_sep = '; ' - else: - marker_sep = ';' - if marker_sep in name: - name, markers_as_string = name.split(marker_sep, 1) - markers_as_string = markers_as_string.strip() - if not markers_as_string: - markers = None - else: - markers = Marker(markers_as_string) - else: - markers = None - name = name.strip() - req_as_string = None - path = os.path.normpath(os.path.abspath(name)) - link = None - extras_as_string = None - - if is_url(name): - link = Link(name) - else: - p, extras_as_string = _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. Neither 'setup.py' " - "nor 'pyproject.toml' 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_as_string = "%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_as_string = link.egg_fragment - - # a requirement specifier - else: - req_as_string = name - - if extras_as_string: - extras = Requirement("placeholder" + extras_as_string.lower()).extras - else: - extras = () - if req_as_string is not None: - try: - req = Requirement(req_as_string) - except InvalidRequirement: - if os.path.sep in req_as_string: - add_msg = "It looks like a path." - add_msg += deduce_helpful_msg(req_as_string) - elif ('=' in req_as_string and - not any(op in req_as_string for op in operators)): - add_msg = "= is not a valid operator. Did you mean == ?" - else: - add_msg = "" - raise InstallationError( - "Invalid requirement: '%s'\n%s" % (req_as_string, add_msg) - ) - else: - req = None - - return InstallRequirement( - req, comes_from, link=link, markers=markers, - use_pep517=use_pep517, isolated=isolated, - options=options if options else {}, - wheel_cache=wheel_cache, - constraint=constraint, - extras=extras, - ) - - -def install_req_from_req_string( - req_string, # type: str - comes_from=None, # type: Optional[InstallRequirement] - isolated=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> InstallRequirement - try: - req = Requirement(req_string) - except InvalidRequirement: - raise InstallationError("Invalid requirement: '%s'" % req) - - domains_not_allowed = [ - PyPI.file_storage_domain, - TestPyPI.file_storage_domain, - ] - if req.url and comes_from.link.netloc in domains_not_allowed: - # Explicitly disallow pypi packages that depend on external urls - raise InstallationError( - "Packages installed from PyPI cannot depend on packages " - "which are not also hosted on PyPI.\n" - "%s depends on %s " % (comes_from.name, req) - ) - - return InstallRequirement( - req, comes_from, isolated=isolated, wheel_cache=wheel_cache, - use_pep517=use_pep517 - ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py deleted file mode 100644 index 726f2f6..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_file.py +++ /dev/null @@ -1,382 +0,0 @@ -""" -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.cli import cmdoptions -from pip._internal.download import get_file_content -from pip._internal.exceptions import RequirementsFileParseError -from pip._internal.req.constructors import ( - install_req_from_editable, install_req_from_line, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Iterator, Tuple, Optional, List, Callable, Text - ) - from pip._internal.req import InstallRequirement # noqa: F401 - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - - ReqFileLines = Iterator[Tuple[int, Text]] - -__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<var>\$\{(?P<name>[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.trusted_host, - cmdoptions.require_hashes, -] # type: List[Callable[..., optparse.Option]] - -# options to be passed to requirements -SUPPORTED_OPTIONS_REQ = [ - cmdoptions.install_options, - cmdoptions.global_options, - cmdoptions.hash, -] # type: List[Callable[..., optparse.Option]] - -# the 'dest' string values -SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] - - -def parse_requirements( - filename, # type: str - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - constraint=False, # type: bool - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None # type: Optional[bool] -): - # type: (...) -> Iterator[InstallRequirement] - """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 - :param use_pep517: Value of the --use-pep517 option. - """ - 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, - use_pep517=use_pep517, constraint=constraint) - for req in req_iter: - yield req - - -def preprocess(content, options): - # type: (Text, Optional[optparse.Values]) -> ReqFileLines - """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) # type: ReqFileLines - 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, # type: Text - filename, # type: str - line_number, # type: int - finder=None, # type: Optional[PackageFinder] - comes_from=None, # type: Optional[str] - options=None, # type: Optional[optparse.Values] - session=None, # type: Optional[PipSession] - wheel_cache=None, # type: Optional[WheelCache] - use_pep517=None, # type: Optional[bool] - constraint=False # type: bool -): - # type: (...) -> Iterator[InstallRequirement] - """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: - defaults.format_control = finder.format_control - args_str, options_str = break_args_options(line) - # Prior to 2.7.3, shlex cannot deal with unicode entries - if sys.version_info < (2, 7, 3): - # https://github.com/python/mypy/issues/1174 - options_str = options_str.encode('utf8') # type: ignore - # https://github.com/python/mypy/issues/1174 - opts, _ = parser.parse_args( - shlex.split(options_str), defaults) # type: ignore - - # 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 install_req_from_line( - args_str, line_comes_from, constraint=constraint, - use_pep517=use_pep517, - 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 install_req_from_editable( - opts.editables[0], comes_from=line_comes_from, - use_pep517=use_pep517, - 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? - parsed_reqs = parse_requirements( - req_path, finder, comes_from, options, session, - constraint=nested_constraint, wheel_cache=wheel_cache - ) - for req in parsed_reqs: - 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.trusted_hosts: - finder.secure_origins.extend( - ("*", host, "*") for host in opts.trusted_hosts) - - -def break_args_options(line): - # type: (Text) -> Tuple[str, Text] - """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) # type: ignore - - -def build_parser(line): - # type: (Text) -> optparse.OptionParser - """ - 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) - # NOTE: mypy disallows assigning to a method - # https://github.com/python/mypy/issues/2427 - parser.exit = parser_exit # type: ignore - - return parser - - -def join_lines(lines_enum): - # type: (ReqFileLines) -> ReqFileLines - """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 = [] # type: List[Text] - 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): - # type: (ReqFileLines) -> ReqFileLines - """ - 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): - # type: (ReqFileLines, Optional[optparse.Values]) -> ReqFileLines - """ - 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): - # type: (ReqFileLines) -> ReqFileLines - """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 <https://github.com/pypa/pip/pull/3514>`_. - - Valid characters in variable names follow the `POSIX standard - <http://pubs.opengroup.org/onlinepubs/9699919799/>`_ 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py deleted file mode 100644 index a4834b0..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_install.py +++ /dev/null @@ -1,1021 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import shutil -import sys -import sysconfig -import zipfile -from distutils.util import change_root - -from pip._vendor import pkg_resources, six -from pip._vendor.packaging.requirements import Requirement -from pip._vendor.packaging.utils import canonicalize_name -from pip._vendor.packaging.version import Version -from pip._vendor.packaging.version import parse as parse_version -from pip._vendor.pep517.wrappers import Pep517HookCaller - -from pip._internal import wheel -from pip._internal.build_env import NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError -from pip._internal.locations import ( - PIP_DELETE_MARKER_FILENAME, running_under_virtualenv, -) -from pip._internal.models.link import Link -from pip._internal.pyproject import load_pyproject_toml, make_pyproject_path -from pip._internal.req.req_uninstall import UninstallPathSet -from pip._internal.utils.compat import native_str -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, redact_password_from_url, rmtree, -) -from pip._internal.utils.packaging import get_metadata -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 -from pip._internal.vcs import vcs -from pip._internal.wheel import move_wheel_files - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Iterable, List, Union, Any, Text, Sequence, Dict - ) - from pip._internal.build_env import BuildEnvironment # noqa: F401 - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._vendor.pkg_resources import Distribution # noqa: F401 - from pip._vendor.packaging.specifiers import SpecifierSet # noqa: F401 - from pip._vendor.packaging.markers import Marker # noqa: F401 - - -logger = logging.getLogger(__name__) - - -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, # type: Optional[Requirement] - comes_from, # type: Optional[Union[str, InstallRequirement]] - source_dir=None, # type: Optional[str] - editable=False, # type: bool - link=None, # type: Optional[Link] - update=True, # type: bool - markers=None, # type: Optional[Marker] - use_pep517=None, # type: Optional[bool] - isolated=False, # type: bool - options=None, # type: Optional[Dict[str, Any]] - wheel_cache=None, # type: Optional[WheelCache] - constraint=False, # type: bool - extras=() # type: Iterable[str] - ): - # type: (...) -> None - 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 None and req and req.url: - # PEP 508 URL requirement - link = Link(req.url) - self.link = self.original_link = link - - 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 None and req: - markers = req.marker - self.markers = markers - - self._egg_info_path = None # type: Optional[str] - # 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 # type: Optional[str] - # True if the editable should be updated: - self.update = update - # Set to True after successful installation - self.install_succeeded = None # type: Optional[bool] - # 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 = NoOpBuildEnvironment() # type: BuildEnvironment - - # For PEP 517, the directory where we request the project metadata - # gets stored. We need this to pass to build_wheel, so the backend - # can ensure that the wheel matches the metadata (see the PEP for - # details). - self.metadata_directory = None # type: Optional[str] - - # The static build requirements (from pyproject.toml) - self.pyproject_requires = None # type: Optional[List[str]] - - # Build requirements that we will check are available - self.requirements_to_check = [] # type: List[str] - - # The PEP 517 backend we should use to build the project - self.pep517_backend = None # type: Optional[Pep517HookCaller] - - # Are we using PEP 517 for this requirement? - # After pyproject.toml has been loaded, the only valid values are True - # and False. Before loading, None is valid (meaning "use the default"). - # Setting an explicit value before loading pyproject.toml is supported, - # but after loading this flag should be treated as read only. - self.use_pep517 = use_pep517 - - def __str__(self): - if self.req: - s = str(self.req) - if self.link: - s += ' from %s' % redact_password_from_url(self.link.url) - elif self.link: - s = redact_password_from_url(self.link.url) - else: - s = '<InstallRequirement>' - 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): - # type: (PackageFinder, bool, bool) -> None - """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) - - # Things that are valid for all kinds of requirements? - @property - def name(self): - # type: () -> Optional[str] - if self.req is None: - return None - return native_str(pkg_resources.safe_name(self.req.name)) - - @property - def specifier(self): - # type: () -> SpecifierSet - return self.req.specifier - - @property - def is_pinned(self): - # type: () -> bool - """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 {'==', '==='}) - - @property - def installed_version(self): - return get_installed_version(self.name) - - def match_markers(self, extras_requested=None): - # type: (Optional[Iterable[str]]) -> bool - 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 - - @property - def has_hash_options(self): - # type: () -> bool - """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): - # type: (bool) -> Hashes - """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 from_path(self): - # type: () -> Optional[str] - """Format a nice indicator to show where this "comes from" - """ - 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): - # type: (str) -> Optional[str] - 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): - # type: () -> None - """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.run_egg_info 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 is not None and - self._ideal_build_dir.path) # type: ignore - 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 - - # Correct the metadata directory, if it exists - if self.metadata_directory: - old_meta = self.metadata_directory - rel = os.path.relpath(old_meta, start=old_location) - new_meta = os.path.join(new_location, rel) - new_meta = os.path.normpath(os.path.abspath(new_meta)) - self.metadata_directory = new_meta - - def remove_temporary_source(self): - # type: () -> None - """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 check_if_exists(self, use_user_site): - # type: (bool) -> bool - """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 - - # Things valid for wheels - @property - def is_wheel(self): - # type: () -> bool - if not self.link: - return False - return self.link.is_wheel - - def move_wheel_files( - self, - wheeldir, # type: str - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - 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, - ) - - # Things valid for sdists - @property - def setup_py_dir(self): - # type: () -> str - return os.path.join( - self.source_dir, - self.link and self.link.subdirectory_fragment or '') - - @property - def setup_py(self): - # type: () -> str - 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): - # type: () -> str - assert self.source_dir, "No source dir for %s" % self - - return make_pyproject_path(self.setup_py_dir) - - def load_pyproject_toml(self): - # type: () -> None - """Load the pyproject.toml file. - - After calling this routine, all of the attributes related to PEP 517 - processing for this requirement have been set. In particular, the - use_pep517 attribute can be used to determine whether we should - follow the PEP 517 or legacy (setup.py) code path. - """ - pep517_data = load_pyproject_toml( - self.use_pep517, - self.pyproject_toml, - self.setup_py, - str(self) - ) - - if pep517_data is None: - self.use_pep517 = False - else: - self.use_pep517 = True - requires, backend, check = pep517_data - self.requirements_to_check = check - self.pyproject_requires = requires - self.pep517_backend = Pep517HookCaller(self.setup_py_dir, backend) - - # Use a custom function to call subprocesses - self.spin_message = "" - - def runner(cmd, cwd=None, extra_environ=None): - with open_spinner(self.spin_message) as spinner: - call_subprocess( - cmd, - cwd=cwd, - extra_environ=extra_environ, - show_stdout=False, - spinner=spinner - ) - self.spin_message = "" - - self.pep517_backend._subprocess_runner = runner - - def prepare_metadata(self): - # type: () -> None - """Ensure that project metadata is available. - - Under PEP 517, call the backend hook to prepare the metadata. - Under legacy processing, call setup.py egg-info. - """ - assert self.source_dir - - with indent_log(): - if self.use_pep517: - self.prepare_pep517_metadata() - else: - self.run_egg_info() - - if not self.req: - if isinstance(parse_version(self.metadata["Version"]), Version): - op = "==" - else: - op = "===" - self.req = Requirement( - "".join([ - self.metadata["Name"], - op, - self.metadata["Version"], - ]) - ) - self._correct_build_location() - else: - metadata_name = canonicalize_name(self.metadata["Name"]) - if canonicalize_name(self.req.name) != metadata_name: - logger.warning( - 'Generating metadata for package %s ' - 'produced metadata for project name %s. Fix your ' - '#egg=%s fragments.', - self.name, metadata_name, self.name - ) - self.req = Requirement(metadata_name) - - def prepare_pep517_metadata(self): - # type: () -> None - assert self.pep517_backend is not None - - metadata_dir = os.path.join( - self.setup_py_dir, - 'pip-wheel-metadata' - ) - ensure_dir(metadata_dir) - - with self.build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - backend = self.pep517_backend - self.spin_message = "Preparing wheel metadata" - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir - ) - - self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) - - def run_egg_info(self): - # type: () -> None - 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, - ) - 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 = [] # type: List[str] - 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') - - @property - def egg_info_path(self): - # type: () -> str - 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( - "Files/directories not found in %s" % base - ) - # 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 self._egg_info_path - - @property - def metadata(self): - if not hasattr(self, '_metadata'): - self._metadata = get_metadata(self.get_dist()) - - return self._metadata - - def get_dist(self): - # type: () -> Distribution - """Return a pkg_resources.Distribution for this requirement""" - if self.metadata_directory: - base_dir, distinfo = os.path.split(self.metadata_directory) - metadata = pkg_resources.PathMetadata( - base_dir, self.metadata_directory - ) - dist_name = os.path.splitext(distinfo)[0] - typ = pkg_resources.DistInfoDistribution - else: - 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] - # https://github.com/python/mypy/issues/1174 - typ = pkg_resources.Distribution # type: ignore - - return typ( - base_dir, - project_name=dist_name, - metadata=metadata, - ) - - def assert_source_matches_version(self): - # type: () -> None - assert self.source_dir - version = self.metadata['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, - ) - - # For both source distributions and editables - def ensure_has_source_dir(self, parent_dir): - # type: (str) -> str - """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 - - # For editable installations - def install_editable( - self, - install_options, # type: List[str] - global_options=(), # type: Sequence[str] - prefix=None # type: Optional[str] - ): - # type: (...) -> 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 update_editable(self, obtain=True): - # type: (bool) -> None - 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)) - - # Top-level Actions - def uninstall(self, auto_confirm=False, verbose=False, - use_user_site=False): - # type: (bool, bool, bool) -> Optional[UninstallPathSet] - """ - 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 None - dist = self.satisfied_by or self.conflicts_with - - uninstalled_pathset = UninstallPathSet.from_dist(dist) - uninstalled_pathset.remove(auto_confirm, verbose) - return uninstalled_pathset - - def _clean_zip_name(self, name, prefix): # only used by archive. - 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 _get_archive_name(self, path, parentdir, rootdir): - # type: (str, str, str) -> str - path = os.path.join(parentdir, path) - name = self._clean_zip_name(path, rootdir) - return self.name + '/' + name - - # TODO: Investigate if this should be kept in InstallRequirement - # Seems to be used only when VCS + downloads - def archive(self, build_dir): - # type: (str) -> None - assert self.source_dir - create_archive = True - archive_name = '%s-%s.zip' % (self.name, self.metadata["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: - dir_arcname = self._get_archive_name(dirname, - parentdir=dirpath, - rootdir=dir) - zipdir = zipfile.ZipInfo(dir_arcname + '/') - zipdir.external_attr = 0x1ED << 16 # 0o755 - zip.writestr(zipdir, '') - for filename in filenames: - if filename == PIP_DELETE_MARKER_FILENAME: - continue - file_arcname = self._get_archive_name(filename, - parentdir=dirpath, - rootdir=dir) - filename = os.path.join(dirpath, filename) - zip.write(filename, file_arcname) - zip.close() - logger.info('Saved %s', display_path(archive_path)) - - def install( - self, - install_options, # type: List[str] - global_options=None, # type: Optional[Sequence[str]] - root=None, # type: Optional[str] - home=None, # type: Optional[str] - prefix=None, # type: Optional[str] - warn_script_location=True, # type: bool - use_user_site=False, # type: bool - pycompile=True # type: bool - ): - # type: (...) -> None - 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: - # https://github.com/python/mypy/issues/1174 - global_options = global_options + ["--no-user-cfg"] # type: ignore - - 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 get_install_args( - self, - global_options, # type: Sequence[str] - record_filename, # type: str - root, # type: Optional[str] - prefix, # type: Optional[str] - pycompile # type: bool - ): - # type: (...) -> List[str] - 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py deleted file mode 100644 index d1410e9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_set.py +++ /dev/null @@ -1,197 +0,0 @@ -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.utils.typing import MYPY_CHECK_RUNNING -from pip._internal.wheel import Wheel - -if MYPY_CHECK_RUNNING: - from typing import Optional, List, Tuple, Dict, Iterable # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - - -logger = logging.getLogger(__name__) - - -class RequirementSet(object): - - def __init__(self, require_hashes=False, check_supported_wheels=True): - # type: (bool, bool) -> None - """Create a RequirementSet. - """ - - self.requirements = OrderedDict() # type: Dict[str, InstallRequirement] # noqa: E501 - self.require_hashes = require_hashes - self.check_supported_wheels = check_supported_wheels - - # Mapping of alias: real_name - self.requirement_aliases = {} # type: Dict[str, str] - self.unnamed_requirements = [] # type: List[InstallRequirement] - self.successfully_downloaded = [] # type: List[InstallRequirement] - self.reqs_to_cleanup = [] # type: List[InstallRequirement] - - 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, # type: InstallRequirement - parent_req_name=None, # type: Optional[str] - extras_requested=None # type: Optional[Iterable[str]] - ): - # type: (...) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]] # noqa: E501 - """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 the markers do not match, ignore this requirement. - if not install_req.match_markers(extras_requested): - logger.info( - "Ignoring %s: markers '%s' don't match your environment", - name, install_req.markers, - ) - return [], None - - # If the wheel is not supported, raise an error. - # Should check this after filtering out based on environment markers to - # allow specifying different wheels based on the environment/OS, in a - # single requirements file. - if install_req.link and install_req.link.is_wheel: - wheel = Wheel(install_req.link.filename) - if self.check_supported_wheels and 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" - ) - - # Unnamed requirements are scanned again and the requirement won't be - # added as a dependency until after scanning. - if not name: - # url or path requirement w/o an egg fragment - self.unnamed_requirements.append(install_req) - return [install_req], None - - try: - existing_req = self.get_requirement(name) - except KeyError: - existing_req = None - - has_conflicting_requirement = ( - parent_req_name is None and - existing_req and - not existing_req.constraint and - existing_req.extras == install_req.extras and - existing_req.req.specifier != install_req.req.specifier - ) - if has_conflicting_requirement: - raise InstallationError( - "Double requirement given: %s (already in %s, name=%r)" - % (install_req, existing_req, name) - ) - - # When no existing requirement exists, add the requirement as a - # dependency and it will be scanned again after. - if not existing_req: - self.requirements[name] = install_req - # FIXME: what about other normalizations? E.g., _ vs. -? - if name.lower() != name: - self.requirement_aliases[name.lower()] = name - # We'd want to rescan this requirements later - return [install_req], install_req - - # Assume there's no need to scan, and that we've already - # encountered this for scanning. - if install_req.constraint or not existing_req.constraint: - return [], existing_req - - does_not_satisfy_constraint = ( - install_req.link and - not ( - existing_req.link and - install_req.link.path == existing_req.link.path - ) - ) - if does_not_satisfy_constraint: - 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) | set(install_req.extras) - )) - logger.debug( - "Setting %s extras to: %s", - existing_req, existing_req.extras, - ) - # Return the existing requirement for addition to the parent and - # scanning again. - return [existing_req], existing_req - - def has_requirement(self, project_name): - # type: (str) -> bool - 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): - # type: () -> List[InstallRequirement] - return list(req for req in self.requirements.values() if not - req.constraint) or self.unnamed_requirements - - def get_requirement(self, project_name): - # type: (str) -> InstallRequirement - 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): - # type: () -> None - """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py deleted file mode 100644 index 82e084a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_tracker.py +++ /dev/null @@ -1,88 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import hashlib -import logging -import os - -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Set, Iterator # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.models.link import Link # noqa: F401 - -logger = logging.getLogger(__name__) - - -class RequirementTracker(object): - - def __init__(self): - # type: () -> None - self._root = os.environ.get('PIP_REQ_TRACKER') - if self._root is None: - self._temp_dir = TempDirectory(delete=False, kind='req-tracker') - self._temp_dir.create() - self._root = os.environ['PIP_REQ_TRACKER'] = self._temp_dir.path - logger.debug('Created requirements tracker %r', self._root) - else: - self._temp_dir = None - logger.debug('Re-using requirements tracker %r', self._root) - self._entries = set() # type: Set[InstallRequirement] - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.cleanup() - - def _entry_path(self, link): - # type: (Link) -> str - hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() - return os.path.join(self._root, hashed) - - def add(self, req): - # type: (InstallRequirement) -> None - link = req.link - info = str(req) - entry_path = self._entry_path(link) - try: - with open(entry_path) as fp: - # Error, these's already a build in progress. - raise LookupError('%s is already being built: %s' - % (link, fp.read())) - except IOError as e: - if e.errno != errno.ENOENT: - raise - assert req not in self._entries - with open(entry_path, 'w') as fp: - fp.write(info) - self._entries.add(req) - logger.debug('Added %s to build tracker %r', req, self._root) - - def remove(self, req): - # type: (InstallRequirement) -> None - link = req.link - self._entries.remove(req) - os.unlink(self._entry_path(link)) - logger.debug('Removed %s from build tracker %r', req, self._root) - - def cleanup(self): - # type: () -> None - for req in set(self._entries): - self.remove(req) - remove = self._temp_dir is not None - if remove: - self._temp_dir.cleanup() - logger.debug('%s build tracker %r', - 'Removed' if remove else 'Cleaned', - self._root) - - @contextlib.contextmanager - def track(self, req): - # type: (InstallRequirement) -> Iterator[None] - self.add(req) - yield - self.remove(req) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py deleted file mode 100644 index c80959e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/req/req_uninstall.py +++ /dev/null @@ -1,596 +0,0 @@ -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.exceptions import UninstallationError -from pip._internal.locations import bin_py, bin_user -from pip._internal.utils.compat import WINDOWS, cache_from_source, uses_pycache -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, rmtree, -) -from pip._internal.utils.temp_dir import AdjacentTempDirectory, 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-.py[co] - - Yield paths to all the files in RECORD. For each .py file in RECORD, add - the .pyc and .pyo in the same directory. - - UninstallPathSet.add() takes care of the __pycache__ .py[co]. - """ - 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 - path = os.path.join(dn, base + '.pyo') - 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_skip = any( - path.startswith(shortpath.rstrip("*")) and - path[len(shortpath.rstrip("*").rstrip(sep))] == sep - for shortpath in short_paths - ) - if not should_skip: - short_paths.add(path) - return short_paths - - -def compress_for_rename(paths): - """Returns a set containing the paths that need to be renamed. - - This set may include directories when the original sequence of paths - included every file on disk. - """ - case_map = dict((os.path.normcase(p), p) for p in paths) - remaining = set(case_map) - unchecked = sorted(set(os.path.split(p)[0] - for p in case_map.values()), key=len) - wildcards = set() - - def norm_join(*a): - return os.path.normcase(os.path.join(*a)) - - for root in unchecked: - if any(os.path.normcase(root).startswith(w) - for w in wildcards): - # This directory has already been handled. - continue - - all_files = set() - all_subdirs = set() - for dirname, subdirs, files in os.walk(root): - all_subdirs.update(norm_join(root, dirname, d) - for d in subdirs) - all_files.update(norm_join(root, dirname, f) - for f in files) - # If all the files we found are in our remaining set of files to - # remove, then remove them from the latter set and add a wildcard - # for the directory. - if not (all_files - remaining): - remaining.difference_update(all_files) - wildcards.add(root + os.sep) - - return set(map(case_map.__getitem__, remaining)) | wildcards - - -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) - - _normcased_files = set(map(os.path.normcase, files)) - - 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.join(dirpath, fname) - if (os.path.isfile(file_) and - os.path.normcase(file_) not in _normcased_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 StashedUninstallPathSet(object): - """A set of file rename operations to stash files while - tentatively uninstalling them.""" - def __init__(self): - # Mapping from source file root to [Adjacent]TempDirectory - # for files under that directory. - self._save_dirs = {} - # (old path, new path) tuples for each move that may need - # to be undone. - self._moves = [] - - def _get_directory_stash(self, path): - """Stashes a directory. - - Directories are stashed adjacent to their original location if - possible, or else moved/copied into the user's temp dir.""" - - try: - save_dir = AdjacentTempDirectory(path) - save_dir.create() - except OSError: - save_dir = TempDirectory(kind="uninstall") - save_dir.create() - self._save_dirs[os.path.normcase(path)] = save_dir - - return save_dir.path - - def _get_file_stash(self, path): - """Stashes a file. - - If no root has been provided, one will be created for the directory - in the user's temp directory.""" - path = os.path.normcase(path) - head, old_head = os.path.dirname(path), None - save_dir = None - - while head != old_head: - try: - save_dir = self._save_dirs[head] - break - except KeyError: - pass - head, old_head = os.path.dirname(head), head - else: - # Did not find any suitable root - head = os.path.dirname(path) - save_dir = TempDirectory(kind='uninstall') - save_dir.create() - self._save_dirs[head] = save_dir - - relpath = os.path.relpath(path, head) - if relpath and relpath != os.path.curdir: - return os.path.join(save_dir.path, relpath) - return save_dir.path - - def stash(self, path): - """Stashes the directory or file and returns its new location. - """ - if os.path.isdir(path): - new_path = self._get_directory_stash(path) - else: - new_path = self._get_file_stash(path) - - self._moves.append((path, new_path)) - if os.path.isdir(path) and os.path.isdir(new_path): - # If we're moving a directory, we need to - # remove the destination first or else it will be - # moved to inside the existing directory. - # We just created new_path ourselves, so it will - # be removable. - os.rmdir(new_path) - renames(path, new_path) - return new_path - - def commit(self): - """Commits the uninstall by removing stashed files.""" - for _, save_dir in self._save_dirs.items(): - save_dir.cleanup() - self._moves = [] - self._save_dirs = {} - - def rollback(self): - """Undoes the uninstall by moving stashed files back.""" - for p in self._moves: - logging.info("Moving to %s\n from %s", *p) - - for new_path, path in self._moves: - try: - logger.debug('Replacing %s from %s', new_path, path) - if os.path.isfile(new_path): - os.unlink(new_path) - elif os.path.isdir(new_path): - rmtree(new_path) - renames(path, new_path) - except OSError as ex: - logger.error("Failed to restore %s", new_path) - logger.debug("Exception: %s", ex) - - self.commit() - - @property - def can_rollback(self): - return bool(self._moves) - - -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._moved_paths = StashedUninstallPathSet() - - 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 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): - moved = self._moved_paths - - for_rename = compress_for_rename(self.paths) - - for path in sorted(compact(for_rename)): - moved.stash(path) - logger.debug('Removing file or directory %s', 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) - if verbose: - _display('Will actually move:', compress_for_rename(self.paths)) - - return ask('Proceed (y/n)? ', ('y', 'n')) == 'y' - - def rollback(self): - """Rollback the changes previously made by remove().""" - if not self._moved_paths.can_rollback: - 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) - self._moved_paths.rollback() - for pth in self.pth.values(): - pth.rollback() - - def commit(self): - """Remove temporary save dir: rollback will no longer be possible.""" - self._moved_paths.commit() - - @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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py deleted file mode 100644 index 33f572f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/resolve.py +++ /dev/null @@ -1,393 +0,0 @@ -"""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.constructors import install_req_from_req_string -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 -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, DefaultDict, List, Set # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.index import PackageFinder # noqa: F401 - from pip._internal.req.req_set import RequirementSet # noqa: F401 - from pip._internal.operations.prepare import ( # noqa: F401 - DistAbstraction, RequirementPreparer - ) - from pip._internal.cache import WheelCache # noqa: F401 - -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, # type: RequirementPreparer - session, # type: PipSession - finder, # type: PackageFinder - wheel_cache, # type: Optional[WheelCache] - use_user_site, # type: bool - ignore_dependencies, # type: bool - ignore_installed, # type: bool - ignore_requires_python, # type: bool - force_reinstall, # type: bool - isolated, # type: bool - upgrade_strategy, # type: str - use_pep517=None # type: Optional[bool] - ): - # type: (...) -> None - 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 - - # This is set in resolve - self.require_hashes = None # type: Optional[bool] - - 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.use_pep517 = use_pep517 - - self._discovered_dependencies = \ - defaultdict(list) # type: DefaultDict[str, List] - - def resolve(self, requirement_set): - # type: (RequirementSet) -> None - """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 = [] # type: List[InstallRequirement] - 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): - # type: (InstallRequirement) -> bool - 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): - # type: (InstallRequirement) -> None - """ - 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): - # type: (InstallRequirement) -> Optional[str] - """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 'already satisfied, skipping upgrade' - 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): - # type: (InstallRequirement) -> DistAbstraction - """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, # type: RequirementSet - req_to_install # type: InstallRequirement - ): - # type: (...) -> List[InstallRequirement] - """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() - try: - check_dist_requires_python(dist) - except UnsupportedPythonVersion as err: - if self.ignore_requires_python: - logger.warning(err.args[0]) - else: - raise - - more_reqs = [] # type: List[InstallRequirement] - - def add_req(subreq, extras_requested): - sub_install_req = install_req_from_req_string( - str(subreq), - req_to_install, - isolated=self.isolated, - wheel_cache=self.wheel_cache, - use_pep517=self.use_pep517 - ) - 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): - # type: (RequirementSet) -> List[InstallRequirement] - """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() # type: Set[InstallRequirement] - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py deleted file mode 100644 index 9af9fa7..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/appdirs.py +++ /dev/null @@ -1,270 +0,0 @@ -""" -This code was taken from https://github.com/ActiveState/appdirs and modified -to suit our purposes. -""" -from __future__ import absolute_import - -import os -import sys - -from pip._vendor.six import PY2, text_type - -from pip._internal.utils.compat import WINDOWS, expanduser -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - List, Union - ) - - -def user_cache_dir(appname): - # type: (str) -> str - r""" - Return full path to the user-specific cache dir for this application. - - "appname" is the name of application. - - Typical user cache directories are: - macOS: ~/Library/Caches/<AppName> - Unix: ~/.cache/<AppName> (XDG default) - Windows: C:\Users\<username>\AppData\Local\<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`). 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. - """ - 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): - # type: (str, bool) -> str - 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 - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - macOS: ~/Library/Application Support/<AppName> - if it exists, else ~/.config/<AppName> - Unix: ~/.local/share/<AppName> # or in - $XDG_DATA_HOME, if defined - Win XP (not roaming): C:\Documents and Settings\<username>\ ... - ...Application Data\<AppName> - Win XP (roaming): C:\Documents and Settings\<username>\Local ... - ...Settings\Application Data\<AppName> - Win 7 (not roaming): C:\\Users\<username>\AppData\Local\<AppName> - Win 7 (roaming): C:\\Users\<username>\AppData\Roaming\<AppName> - - For Unix, we follow the XDG spec and support $XDG_DATA_HOME. - That means, by default "~/.local/share/<AppName>". - """ - 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): - # type: (str, bool) -> str - """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 - <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx> - for a discussion of issues. - - Typical user data directories are: - macOS: same as user_data_dir - Unix: ~/.config/<AppName> - 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 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 <https://github.com/pypa/pip/issues/1733> -def site_config_dirs(appname): - # type: (str) -> List[str] - 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/<AppName>/ - Unix: /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in - $XDG_CONFIG_DIRS - Win XP: C:\Documents and Settings\All Users\Application ... - ...Data\<AppName>\ - Vista: (Fail! "C:\ProgramData" is a hidden *system* directory - on Vista.) - Win 7: Hidden, but writeable on Win 7: - C:\ProgramData\<AppName>\ - """ - 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): - # type: (str) -> str - """ - 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): - # type: (str) -> str - 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 - - -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 - <https://github.com/pypa/pip/issues/3463>. - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py deleted file mode 100644 index 2d8b3bf..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/compat.py +++ /dev/null @@ -1,264 +0,0 @@ -"""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 - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Tuple, Text # noqa: F401 - -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 # type: ignore - ipaddress.ip_network = ipaddress.IPNetwork # type: ignore - - -__all__ = [ - "ipaddress", "uses_pycache", "console_to_str", "native_str", - "get_path_uid", "stdlib_pkgs", "WINDOWS", "samefile", "get_terminal_size", - "get_extension_suffixes", -] - - -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): - # type: (bytes) -> Text - """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: - decoded_data = data.decode(encoding) - except UnicodeDecodeError: - logger.warning( - "Subprocess output does not appear to be encoded as %s", - encoding, - ) - decoded_data = 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: - output_encoded = decoded_data.encode( - output_encoding, - errors="backslashreplace" - ) - decoded_data = output_encoded.decode(output_encoding) - - return decoded_data - - -if sys.version_info >= (3,): - def native_str(s, replace=False): - # type: (str, bool) -> str - if isinstance(s, bytes): - return s.decode('utf-8', 'replace' if replace else 'strict') - return s - -else: - def native_str(s, replace=False): - # type: (str, bool) -> str - # 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): - # type: (str) -> int - """ - 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 - - -if sys.version_info >= (3, 4): - from importlib.machinery import EXTENSION_SUFFIXES - - def get_extension_suffixes(): - return EXTENSION_SUFFIXES -else: - from imp import get_suffixes - - def get_extension_suffixes(): - return [suffix[0] for suffix in get_suffixes()] - - -def expanduser(path): - # type: (str) -> str - """ - Expand ~ and ~user constructions. - - Includes a workaround for https://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): - # type: (str, str) -> bool - """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(): - # type: () -> Tuple[int, int] - """ - 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()) # type: ignore -else: - def get_terminal_size(): - # type: () -> Tuple[int, int] - """ - 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 Exception: - 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 Exception: - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py deleted file mode 100644 index 0beaf74..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/deprecation.py +++ /dev/null @@ -1,90 +0,0 @@ -""" -A module that implements tooling to enable easy warnings about deprecations. -""" -from __future__ import absolute_import - -import logging -import warnings - -from pip._vendor.packaging.version import parse - -from pip import __version__ as current_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Any, Optional # noqa: F401 - - -class PipDeprecationWarning(Warning): - pass - - -_original_showwarning = None # type: Any - - -# Warnings <-> Logging Integration -def _showwarning(message, category, filename, lineno, file=None, line=None): - if file is not None: - if _original_showwarning is not None: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - elif 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") - logger.warning(message) - else: - _original_showwarning( - message, category, filename, lineno, file, line, - ) - - -def install_warning_logger(): - # type: () -> None - # Enable our Deprecation Warnings - warnings.simplefilter("default", PipDeprecationWarning, append=True) - - global _original_showwarning - - if _original_showwarning is None: - _original_showwarning = warnings.showwarning - warnings.showwarning = _showwarning - - -def deprecated(reason, replacement, gone_in, issue=None): - # type: (str, Optional[str], Optional[str], Optional[int]) -> None - """Helper to deprecate existing functionality. - - reason: - Textual reason shown to the user about why this functionality has - been deprecated. - replacement: - Textual suggestion shown to the user about what alternative - functionality they can use. - gone_in: - The version of pip does this functionality should get removed in. - Raises errors if pip's current version is greater than or equal to - this. - issue: - Issue number on the tracker that would serve as a useful place for - users to find related discussion and provide feedback. - - Always pass replacement, gone_in and issue as keyword arguments for clarity - at the call site. - """ - - # Construct a nice message. - # This is purposely eagerly formatted as we want it to appear as if someone - # typed this entire message out. - message = "DEPRECATION: " + reason - if replacement is not None: - message += " A possible replacement is {}.".format(replacement) - if issue is not None: - url = "https://github.com/pypa/pip/issues/" + str(issue) - message += " You can find discussion regarding this at {}.".format(url) - - # Raise as an error if it has to be removed. - if gone_in is not None and parse(current_version) >= parse(gone_in): - raise PipDeprecationWarning(message) - warnings.warn(message, category=PipDeprecationWarning, stacklevel=2) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py deleted file mode 100644 index d36defa..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/encoding.py +++ /dev/null @@ -1,39 +0,0 @@ -import codecs -import locale -import re -import sys - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import List, Tuple, Text # noqa: F401 - -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'), -] # type: List[Tuple[bytes, Text]] - -ENCODING_RE = re.compile(br'coding[:=]\s*([-\w.]+)') - - -def auto_decode(data): - # type: (bytes) -> Text - """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py deleted file mode 100644 index 1e6b033..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/filesystem.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -import os.path - -from pip._internal.utils.compat import get_path_uid - - -def check_path_owner(path): - # type: (str) -> bool - # 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) - return False # assume we don't own the path diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py deleted file mode 100644 index 8a51f69..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/glibc.py +++ /dev/null @@ -1,93 +0,0 @@ -from __future__ import absolute_import - -import ctypes -import re -import warnings - -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional, Tuple # noqa: F401 - - -def glibc_version_string(): - # type: () -> Optional[str] - "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): - # type: (str, int, int) -> bool - # 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): - # type: (int, int) -> bool - version_str = glibc_version_string() # type: Optional[str] - 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(): - # type: () -> Tuple[str, str] - """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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py deleted file mode 100644 index c6df7a1..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/hashes.py +++ /dev/null @@ -1,115 +0,0 @@ -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 -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Dict, List, BinaryIO, NoReturn, Iterator - ) - from pip._vendor.six import PY3 - if PY3: - from hashlib import _Hash # noqa: F401 - else: - from hashlib import _hash as _Hash # noqa: F401 - - -# 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): - # type: (Dict[str, List[str]]) -> 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): - # type: (Iterator[bytes]) -> None - """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): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMismatch(self._allowed, gots) - - def check_against_file(self, file): - # type: (BinaryIO) -> None - """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): - # type: (str) -> None - with open(path, 'rb') as file: - return self.check_against_file(file) - - def __nonzero__(self): - # type: () -> bool - """Return whether I know any known-good hashes.""" - return bool(self._allowed) - - def __bool__(self): - # type: () -> bool - 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): - # type: () -> None - """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): - # type: (Dict[str, _Hash]) -> NoReturn - raise HashMissing(gots[FAVORITE_HASH].hexdigest()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py deleted file mode 100644 index 579d696..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/logging.py +++ /dev/null @@ -1,318 +0,0 @@ -from __future__ import absolute_import - -import contextlib -import errno -import logging -import logging.handlers -import os -import sys - -from pip._vendor.six import PY2 - -from pip._internal.utils.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 - - -class BrokenStdoutLoggingError(Exception): - """ - Raised if BrokenPipeError occurs for the stdout stream while logging. - """ - pass - - -# BrokenPipeError does not exist in Python 2 and, in addition, manifests -# differently in Windows and non-Windows. -if WINDOWS: - # In Windows, a broken pipe can show up as EINVAL rather than EPIPE: - # https://bugs.python.org/issue19612 - # https://bugs.python.org/issue30418 - if PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and - exc.errno in (errno.EINVAL, errno.EPIPE)) - else: - # In Windows, a broken pipe IOError became OSError in Python 3. - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return ((exc_class is BrokenPipeError) or # noqa: F821 - (exc_class is OSError and - exc.errno in (errno.EINVAL, errno.EPIPE))) -elif PY2: - def _is_broken_pipe_error(exc_class, exc): - """See the docstring for non-Windows Python 3 below.""" - return (exc_class is IOError and exc.errno == errno.EPIPE) -else: - # Then we are in the non-Windows Python 3 case. - def _is_broken_pipe_error(exc_class, exc): - """ - Return whether an exception is a broken pipe error. - - Args: - exc_class: an exception class. - exc: an exception instance. - """ - return (exc_class is BrokenPipeError) # noqa: F821 - - -@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 __init__(self, *args, **kwargs): - """ - A logging.Formatter obeying containing indent_log contexts. - - :param add_timestamp: A bool indicating output lines should be prefixed - with their record's timestamp. - """ - self.add_timestamp = kwargs.pop("add_timestamp", False) - super(IndentingFormatter, self).__init__(*args, **kwargs) - - def format(self, record): - """ - Calls the standard formatter, but will indent all of the log messages - by our current indentation level. - """ - formatted = super(IndentingFormatter, self).format(record) - prefix = '' - if self.add_timestamp: - prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") - prefix += " " * get_indentation() - formatted = "".join([ - prefix + 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 _using_stdout(self): - """ - Return whether the handler is using sys.stdout. - """ - if WINDOWS and colorama: - # Then self.stream is an AnsiToWin32 object. - return self.stream.wrapped is sys.stdout - - return self.stream is sys.stdout - - 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 ANSI 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 - - # The logging module says handleError() can be customized. - def handleError(self, record): - exc_class, exc = sys.exc_info()[:2] - # If a broken pipe occurred while calling write() or flush() on the - # stdout stream in logging's Handler.emit(), then raise our special - # exception so we can handle it in main() instead of logging the - # broken pipe error and continuing. - if (exc_class and self._using_stdout() and - _is_broken_pipe_error(exc_class, exc)): - raise BrokenStdoutLoggingError() - - return super(ColorizedStreamHandler, self).handleError(record) - - -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 - - -def setup_logging(verbosity, no_color, user_log_file): - """Configures and sets up all of the logging - - Returns the requested logging level, as its integer value. - """ - - # Determine the level to be logging at. - if verbosity >= 1: - level = "DEBUG" - elif verbosity == -1: - level = "WARNING" - elif verbosity == -2: - level = "ERROR" - elif verbosity <= -3: - level = "CRITICAL" - else: - level = "INFO" - - level_number = getattr(logging, level) - - # The "root" logger should match the "console" level *unless* we also need - # to log to a user log file. - include_user_log = user_log_file is not None - if include_user_log: - additional_log_file = user_log_file - root_level = "DEBUG" - else: - additional_log_file = "/dev/null" - root_level = level - - # Disable any logging besides WARNING unless we have DEBUG level logging - # enabled for vendored libraries. - vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG" - - # Shorthands for clarity - log_streams = { - "stdout": "ext://sys.stdout", - "stderr": "ext://sys.stderr", - } - handler_classes = { - "stream": "pip._internal.utils.logging.ColorizedStreamHandler", - "file": "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", - }, - "indent_with_timestamp": { - "()": IndentingFormatter, - "format": "%(message)s", - "add_timestamp": True, - }, - }, - "handlers": { - "console": { - "level": level, - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stdout"], - "filters": ["exclude_warnings"], - "formatter": "indent", - }, - "console_errors": { - "level": "WARNING", - "class": handler_classes["stream"], - "no_color": no_color, - "stream": log_streams["stderr"], - "formatter": "indent", - }, - "user_log": { - "level": "DEBUG", - "class": handler_classes["file"], - "filename": additional_log_file, - "delay": True, - "formatter": "indent_with_timestamp", - }, - }, - "root": { - "level": root_level, - "handlers": ["console", "console_errors"] + ( - ["user_log"] if include_user_log else [] - ), - }, - "loggers": { - "pip._vendor": { - "level": vendored_log_level - } - }, - }) - - return level_number diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py deleted file mode 100644 index 84605ee..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/misc.py +++ /dev/null @@ -1,1040 +0,0 @@ -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._vendor.six.moves.urllib import parse as urllib_parse -from pip._vendor.six.moves.urllib.parse import unquote as urllib_unquote - -from pip._internal.exceptions import CommandError, InstallationError -from pip._internal.locations import ( - running_under_virtualenv, site_packages, user_site, virtualenv_no_global, - write_delete_marker_file, -) -from pip._internal.utils.compat import ( - WINDOWS, console_to_str, expanduser, stdlib_pkgs, -) -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if PY2: - from io import BytesIO as StringIO -else: - from io import StringIO - -if MYPY_CHECK_RUNNING: - from typing import ( # noqa: F401 - Optional, Tuple, Iterable, List, Match, Union, Any, Mapping, Text, - AnyStr, Container - ) - from pip._vendor.pkg_resources import Distribution # noqa: F401 - from pip._internal.models.link import Link # noqa: F401 - from pip._internal.utils.ui import SpinnerInterface # noqa: F401 - - -__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', 'WHEEL_EXTENSION', - 'get_installed_version', 'remove_auth_from_url'] - - -logger = std_logging.getLogger(__name__) - -WHEEL_EXTENSION = '.whl' -BZ2_EXTENSIONS = ('.tar.bz2', '.tbz') -XZ_EXTENSIONS = ('.tar.xz', '.txz', '.tlz', '.tar.lz', '.tar.lzma') -ZIP_EXTENSIONS = ('.zip', WHEEL_EXTENSION) -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 ensure_dir(path): - # type: (AnyStr) -> None - """os.path.makedirs without EEXIST.""" - try: - os.makedirs(path) - except OSError as e: - if e.errno != errno.EEXIST: - raise - - -def get_prog(): - # type: () -> str - 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): - # type: (str, bool) -> None - 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): - # type: (Union[str, Text]) -> str - """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'): - # type: (str, str) -> str - """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): - # type: (str, Iterable[str]) -> str - for action in os.environ.get('PIP_EXISTS_ACTION', '').split(): - if action in options: - return action - return ask(message, options) - - -def ask(message, options): - # type: (str, Iterable[str]) -> str - """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): - # type: (float) -> str - 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): - # type: (str) -> bool - """Is path is a directory containing setup.py or pyproject.toml? - """ - if not os.path.isdir(path): - return False - setup_py = os.path.join(path, 'setup.py') - if os.path.isfile(setup_py): - return True - pyproject_toml = os.path.join(path, 'pyproject.toml') - if os.path.isfile(pyproject_toml): - return True - return False - - -def is_svn_page(html): - # type: (Union[str, Text]) -> Optional[Match[Union[str, Text]]] - """ - Returns true if the page appears to be the index page of an svn repository - """ - return (re.search(r'<title>[^<]*Revision \d+:', html) and - re.search(r'Powered by (?:<a[^>]*?>)?Subversion', html, re.I)) - - -def file_contents(filename): - # type: (str) -> Text - 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): - # type: (Union[str, Text]) -> List[Union[str, Text]] - 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): - # type: (Iterable[Union[str, Text]]) -> bool - """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): - # type: (str, bool) -> str - """ - 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): - # type: (str) -> Tuple[str, str] - """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): - # type: (str, str) -> None - """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): - # type: (str) -> bool - """ - 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): - # type: (Distribution) -> bool - """ - 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): - # type: (Distribution) -> bool - """ - 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): - # type: (Distribution) -> bool - """ - 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): - # type: (Distribution) -> bool - """ - Return True if given Distribution is 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): - # type: (bool, Container[str], bool, bool, bool) -> List[Distribution] - """ - 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 - - # because of pkg_resources vendoring, mypy cannot find stub in typeshed - return [d for d in pkg_resources.working_set # type: ignore - 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): - # type: (Distribution) -> Optional[str] - """ - 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 - return None - - -def dist_location(dist): - # type: (Distribution) -> str - """ - 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): - # type: (str, str, bool) -> None - """ - 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 - 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) - # Don't use read() to avoid allocating an arbitrarily large - # chunk of memory for the file's content - fp = zip.open(name) - try: - with open(fn, 'wb') as destfp: - shutil.copyfileobj(fp, destfp) - 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): - # type: (str, str) -> None - """ - 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: - leading = has_leading_dir([ - member.name for member in tar.getmembers() - ]) - for member in tar.getmembers(): - fn = member.name - if leading: - # https://github.com/python/mypy/issues/1174 - fn = split_leading_dir(fn)[1] # type: ignore - path = os.path.join(location, fn) - if member.isdir(): - ensure_dir(path) - elif member.issym(): - try: - # https://github.com/python/typeshed/issues/2673 - tar._extract_member(member, path) # type: ignore - 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) - # https://github.com/python/typeshed/issues/2673 - tar.utime(member, path) # type: ignore - # 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, # type: str - location, # type: str - content_type, # type: Optional[str] - link # type: Optional[Link] -): - # type: (...) -> None - 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, # type: List[str] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - unset_environ=None, # type: Optional[Iterable[str]] - spinner=None # type: Optional[SpinnerInterface] -): - # type: (...) -> Optional[Text] - """ - Args: - extra_ok_returncodes: an iterable of integer return codes that are - acceptable, in addition to 0. Defaults to None, which means []. - unset_environ: an iterable of environment variable names to unset - prior to calling subprocess.Popen(). - """ - if extra_ok_returncodes is None: - extra_ok_returncodes = [] - 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 and proc.returncode not in extra_ok_returncodes: - 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) - return None - - -def read_text_file(filename): - # type: (str) -> str - """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: - # https://github.com/python/mypy/issues/1174 - data = data.decode(enc) # type: ignore - except UnicodeDecodeError: - continue - break - - assert not isinstance(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') - - -def captured_stderr(): - """ - See captured_stdout(). - """ - return captured_output('stderr') - - -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, working_set=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) - - if working_set is None: - # We want to avoid having this cached, so we need to construct a new - # working set each time. - working_set = pkg_resources.WorkingSet() - - # 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) - - -def make_vcs_requirement_url(repo_url, rev, project_name, subdir=None): - """ - Return the URL for a VCS requirement. - - Args: - repo_url: the remote VCS url, with any needed VCS prefix (e.g. "git+"). - project_name: the (unescaped) project name. - """ - egg_project_name = pkg_resources.to_filename(project_name) - req = '{}@{}#egg={}'.format(repo_url, rev, egg_project_name) - if subdir: - req += '&subdirectory={}'.format(subdir) - - return req - - -def split_auth_from_netloc(netloc): - """ - Parse out and remove the auth information from a netloc. - - Returns: (netloc, (username, password)). - """ - if '@' not in netloc: - return netloc, (None, None) - - # Split from the right because that's how urllib.parse.urlsplit() - # behaves if more than one @ is present (which can be checked using - # the password attribute of urlsplit()'s return value). - auth, netloc = netloc.rsplit('@', 1) - if ':' in auth: - # Split from the left because that's how urllib.parse.urlsplit() - # behaves if more than one : is present (which again can be checked - # using the password attribute of the return value) - user_pass = auth.split(':', 1) - else: - user_pass = auth, None - - user_pass = tuple( - None if x is None else urllib_unquote(x) for x in user_pass - ) - - return netloc, user_pass - - -def redact_netloc(netloc): - # type: (str) -> str - """ - Replace the password in a netloc with "****", if it exists. - - For example, "user:pass@example.com" returns "user:****@example.com". - """ - netloc, (user, password) = split_auth_from_netloc(netloc) - if user is None: - return netloc - password = '' if password is None else ':****' - return '{user}{password}@{netloc}'.format(user=urllib_parse.quote(user), - password=password, - netloc=netloc) - - -def _transform_url(url, transform_netloc): - purl = urllib_parse.urlsplit(url) - netloc = transform_netloc(purl.netloc) - # stripped url - url_pieces = ( - purl.scheme, netloc, purl.path, purl.query, purl.fragment - ) - surl = urllib_parse.urlunsplit(url_pieces) - return surl - - -def _get_netloc(netloc): - return split_auth_from_netloc(netloc)[0] - - -def remove_auth_from_url(url): - # type: (str) -> str - # 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. - return _transform_url(url, _get_netloc) - - -def redact_password_from_url(url): - # type: (str) -> str - """Replace the password in a given url with ****.""" - return _transform_url(url, redact_netloc) - - -def protect_pip_from_modification_on_windows(modifying_pip): - """Protection of pip.exe from modification on Windows - - On Windows, any operation modifying pip should be run as: - python -m pip ... - """ - pip_names = [ - "pip.exe", - "pip{}.exe".format(sys.version_info[0]), - "pip{}.{}.exe".format(*sys.version_info[:2]) - ] - - # See https://github.com/pypa/pip/issues/1299 for more discussion - should_show_use_python_msg = ( - modifying_pip and - WINDOWS and - os.path.basename(sys.argv[0]) in pip_names - ) - - 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)) - ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py deleted file mode 100644 index d5cb80a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/models.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Utilities for defining models -""" - -import operator - - -class KeyBasedCompareMixin(object): - """Provides comparision capabilities that is based on a key - """ - - def __init__(self, key, defining_class): - self._compare_key = key - self._defining_class = defining_class - - def __hash__(self): - return hash(self._compare_key) - - def __lt__(self, other): - return self._compare(other, operator.__lt__) - - def __le__(self, other): - return self._compare(other, operator.__le__) - - def __gt__(self, other): - return self._compare(other, operator.__gt__) - - def __ge__(self, other): - return self._compare(other, operator.__ge__) - - def __eq__(self, other): - return self._compare(other, operator.__eq__) - - def __ne__(self, other): - return self._compare(other, operator.__ne__) - - def _compare(self, other, method): - if not isinstance(other, self._defining_class): - return NotImplemented - - return method(self._compare_key, other._compare_key) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py deleted file mode 100644 index 37c47a4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/outdated.py +++ /dev/null @@ -1,164 +0,0 @@ -from __future__ import absolute_import - -import datetime -import json -import logging -import os.path -import sys - -from pip._vendor import lockfile, pkg_resources -from pip._vendor.packaging import version as packaging_version - -from pip._internal.index import PackageFinder -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.misc import ensure_dir, get_installed_version -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - import optparse # noqa: F401 - from typing import Any, Dict # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - - -SELFCHECK_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" - - -logger = logging.getLogger(__name__) - - -class SelfCheckState(object): - def __init__(self, cache_dir): - # type: (str) -> None - self.state = {} # type: Dict[str, Any] - self.statefile_path = None - - # Try to load the existing state - if cache_dir: - self.statefile_path = os.path.join(cache_dir, "selfcheck.json") - try: - with open(self.statefile_path) as statefile: - self.state = json.load(statefile)[sys.prefix] - except (IOError, ValueError, KeyError): - # Explicitly suppressing exceptions, since we don't want to - # error out if the cache file is invalid. - pass - - def save(self, pypi_version, current_time): - # type: (str, datetime.datetime) -> None - # If we do not have a path to cache in, don't bother saving. - if not self.statefile_path: - return - - # 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 was_installed_by_pip(pkg): - # type: (str) -> bool - """Checks whether pkg was installed by pip - - This is used not to display the upgrade message when pip is in fact - installed by system package manager, such as dnf on Fedora. - """ - try: - dist = pkg_resources.get_distribution(pkg) - return (dist.has_metadata('INSTALLER') and - 'pip' in dist.get_metadata_lines('INSTALLER')) - except pkg_resources.DistributionNotFound: - return False - - -def pip_version_check(session, options): - # type: (PipSession, optparse.Values) -> None - """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 = SelfCheckState(cache_dir=options.cache_dir) - - 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, - 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 and - was_installed_by_pip('pip')): - # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py deleted file mode 100644 index 7aaf7b5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/packaging.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import absolute_import - -import logging -import sys -from email.parser import FeedParser - -from pip._vendor import pkg_resources -from pip._vendor.packaging import specifiers, version - -from pip._internal import exceptions -from pip._internal.utils.misc import display_path -from pip._internal.utils.typing import MYPY_CHECK_RUNNING - -if MYPY_CHECK_RUNNING: - from typing import Optional # noqa: F401 - from email.message import Message # noqa: F401 - from pip._vendor.pkg_resources import Distribution # noqa: F401 - - -logger = logging.getLogger(__name__) - - -def check_requires_python(requires_python): - # type: (Optional[str]) -> bool - """ - 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): - # type: (Distribution) -> Message - if (isinstance(dist, pkg_resources.DistInfoDistribution) and - dist.has_metadata('METADATA')): - metadata = dist.get_metadata('METADATA') - elif dist.has_metadata('PKG-INFO'): - metadata = dist.get_metadata('PKG-INFO') - else: - logger.warning("No metadata found in %s", display_path(dist.location)) - metadata = '' - - feed_parser = FeedParser() - feed_parser.feed(metadata) - return feed_parser.close() - - -def check_dist_requires_python(dist): - pkg_info_dict = get_metadata(dist) - 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): - # type: (Distribution) -> str - if dist.has_metadata('INSTALLER'): - for line in dist.get_metadata_lines('INSTALLER'): - if line.strip(): - return line.strip() - return '' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py deleted file mode 100644 index 03973e9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/setuptools_build.py +++ /dev/null @@ -1,8 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py deleted file mode 100644 index 2c81ad5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/temp_dir.py +++ /dev/null @@ -1,155 +0,0 @@ -from __future__ import absolute_import - -import errno -import itertools -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 its 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 - - -class AdjacentTempDirectory(TempDirectory): - """Helper class that creates a temporary directory adjacent to a real one. - - Attributes: - original - The original directory to create a temp directory for. - path - After calling create() or entering, contains the full - path to the temporary directory. - delete - Whether the directory should be deleted when exiting - (when used as a contextmanager) - - """ - # The characters that may be used to name the temp directory - # We always prepend a ~ and then rotate through these until - # a usable name is found. - # pkg_resources raises a different error for .dist-info folder - # with leading '-' and invalid metadata - LEADING_CHARS = "-~.=%0123456789" - - def __init__(self, original, delete=None): - super(AdjacentTempDirectory, self).__init__(delete=delete) - self.original = original.rstrip('/\\') - - @classmethod - def _generate_names(cls, name): - """Generates a series of temporary names. - - The algorithm replaces the leading characters in the name - with ones that are valid filesystem characters, but are not - valid package names (for both Python and pip definitions of - package). - """ - for i in range(1, len(name)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i - 1): - new_name = '~' + ''.join(candidate) + name[i:] - if new_name != name: - yield new_name - - # If we make it this far, we will have to make a longer name - for i in range(len(cls.LEADING_CHARS)): - for candidate in itertools.combinations_with_replacement( - cls.LEADING_CHARS, i): - new_name = '~' + ''.join(candidate) + name - if new_name != name: - yield new_name - - def create(self): - root, name = os.path.split(self.original) - for candidate in self._generate_names(name): - path = os.path.join(root, candidate) - try: - os.mkdir(path) - except OSError as ex: - # Continue if the name exists already - if ex.errno != errno.EEXIST: - raise - else: - self.path = os.path.realpath(path) - break - - if not self.path: - # Final fallback on the default behavior. - self.path = os.path.realpath( - tempfile.mkdtemp(prefix="pip-{}-".format(self.kind)) - ) - logger.debug("Created temporary directory: {}".format(self.path)) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py deleted file mode 100644 index e085cdf..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/typing.py +++ /dev/null @@ -1,29 +0,0 @@ -"""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._internal.utils.typing import MYPY_CHECK_RUNNING - - if MYPY_CHECK_RUNNING: - from typing import ... # noqa: F401 - -Ref: https://github.com/python/mypy/issues/3216 -""" - -MYPY_CHECK_RUNNING = False diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py deleted file mode 100644 index 433675d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/utils/ui.py +++ /dev/null @@ -1,441 +0,0 @@ -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.utils.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, Iterator, IO # noqa: F401 - -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): - 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): - # type: (IO) -> Iterator[None] - # 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): - # type: (float) -> None - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update = 0 # type: float - - def ready(self): - # type: () -> bool - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self): - # type: () -> None - self._last_update = time.time() - - -class SpinnerInterface(object): - def spin(self): - # type: () -> None - raise NotImplementedError() - - def finish(self, final_status): - # type: (str) -> None - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - 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): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status): - # type: (str) -> None - 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(SpinnerInterface): - def __init__(self, message, min_update_interval_seconds=60): - # type: (str, float) -> None - 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): - # type: () -> None - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status): - # type: (str) -> None - if self._finished: - return - self._update("finished with status '%s'" % (final_status,)) - self._finished = True - - -@contextlib.contextmanager -def open_spinner(message): - # type: (str) -> Iterator[SpinnerInterface] - # 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) # type: SpinnerInterface - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py deleted file mode 100644 index 9cba764..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/__init__.py +++ /dev/null @@ -1,534 +0,0 @@ -"""Handles all VCS (version control) support""" -from __future__ import absolute_import - -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 ( # noqa: F401 - Any, Dict, Iterable, List, Mapping, Optional, Text, Tuple, Type - ) - from pip._internal.utils.ui import SpinnerInterface # noqa: F401 - - AuthInfo = Tuple[Optional[str], Optional[str]] - -__all__ = ['vcs'] - - -logger = logging.getLogger(__name__) - - -class RemoteNotFoundError(Exception): - pass - - -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): - # type: (VersionControl, Optional[str], Optional[List[str]]) -> 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): - # type: () -> Optional[str] - if self.rev is None: - return self.vcs.default_arg_rev - - return self.rev - - def to_args(self): - # type: () -> List[str] - """ - Return the VCS-specific command arguments. - """ - args = [] # type: List[str] - 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): - # type: () -> str - if not self.rev: - return '' - - return ' (to revision {})'.format(self.rev) - - def make_new(self, rev): - # type: (str) -> RevOptions - """ - 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, Type[VersionControl]] - schemes = ['ssh', 'git', 'hg', 'bzr', 'sftp', 'svn'] - - def __init__(self): - # type: () -> None - # 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): - # type: () -> List[Type[VersionControl]] - return list(self._registry.values()) - - @property - def dirnames(self): - # type: () -> List[str] - return [backend.dirname for backend in self.backends] - - @property - def all_schemes(self): - # type: () -> List[str] - schemes = [] # type: List[str] - for backend in self.backends: - schemes.extend(backend.schemes) - return schemes - - def register(self, cls): - # type: (Type[VersionControl]) -> None - 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): - # type: (Optional[Type[VersionControl]], Optional[str]) -> 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_type(self, location): - # type: (str) -> Optional[Type[VersionControl]] - """ - Return the type of the version control backend if found at given - location, e.g. vcs.get_backend_type('/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 - return None - - def get_backend(self, name): - # type: (str) -> Optional[Type[VersionControl]] - name = name.lower() - if name in self._registry: - return self._registry[name] - return None - - -vcs = VcsSupport() - - -class VersionControl(object): - name = '' - dirname = '' - repo_name = '' - # 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): - # type: (Optional[str], Optional[List[str]]) -> RevOptions - """ - 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) - - @classmethod - def _is_local_repository(cls, repo): - # type: (str) -> bool - """ - 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 bool(drive) - - 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_netloc_and_auth(self, netloc, scheme): - """ - Parse the repository URL's netloc, and return the new netloc to use - along with auth information. - - Args: - netloc: the original repository URL netloc. - scheme: the repository URL's scheme without the vcs prefix. - - This is mainly for the Subversion class to override, so that auth - information can be provided via the --username and --password options - instead of through the URL. For other subclasses like Git without - such an option, auth information must stay in the URL. - - Returns: (netloc, (username, password)). - """ - return netloc, (None, None) - - def get_url_rev_and_auth(self, url): - # type: (str) -> Tuple[str, Optional[str], AuthInfo] - """ - Parse the repository URL to use, and return the URL, revision, - and auth info to use. - - Returns: (url, rev, (username, password)). - """ - scheme, netloc, path, query, frag = urllib_parse.urlsplit(url) - if '+' not in scheme: - raise ValueError( - "Sorry, {!r} is a malformed VCS url. " - "The format is <vcs>+<protocol>://<url>, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) - ) - # Remove the vcs prefix. - scheme = scheme.split('+', 1)[1] - netloc, user_pass = self.get_netloc_and_auth(netloc, scheme) - rev = None - if '@' in path: - path, rev = path.rsplit('@', 1) - url = urllib_parse.urlunsplit((scheme, netloc, path, query, '')) - return url, rev, user_pass - - def make_rev_args(self, username, password): - """ - Return the RevOptions "extra arguments" to use in obtain(). - """ - return [] - - def get_url_rev_options(self, url): - # type: (str) -> Tuple[str, RevOptions] - """ - Return the URL and RevOptions object to use in obtain() and in - some cases export(), as a tuple (url, rev_options). - """ - url, rev, user_pass = self.get_url_rev_and_auth(url) - username, password = user_pass - extra_args = self.make_rev_args(username, password) - rev_options = self.make_rev_options(rev, extra_args=extra_args) - - return url, rev_options - - def normalize_url(self, url): - # type: (str) -> str - """ - 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): - # type: (str, str) -> bool - """ - Compare two repo URLs for identity, ignoring incidental differences. - """ - return (self.normalize_url(url1) == self.normalize_url(url2)) - - def fetch_new(self, dest, url, rev_options): - """ - Fetch a revision from a repository, in the case that this is the - first fetch from the repository. - - Args: - dest: the directory to fetch the repository to. - rev_options: a RevOptions object. - """ - 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, url, 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 obtain(self, dest): - # type: (str) -> None - """ - Install or update in editable mode the package represented by this - VersionControl object. - - Args: - dest: the repository directory in which to install or update. - """ - url, rev_options = self.get_url_rev_options(self.url) - - if not os.path.exists(dest): - self.fetch_new(dest, url, rev_options) - return - - rev_display = rev_options.to_display() - if self.is_repository_directory(dest): - existing_url = self.get_remote_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, url, rev_options) - else: - logger.info('Skipping because already up-to-date.') - return - - 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, - ) - # https://github.com/python/mypy/issues/1174 - prompt = ('(i)gnore, (w)ipe, (b)ackup ', # type: ignore - ('i', 'w', 'b')) - - 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 == 'a': - sys.exit(-1) - - if response == 'w': - logger.warning('Deleting %s', display_path(dest)) - rmtree(dest) - self.fetch_new(dest, url, rev_options) - return - - if response == 'b': - dest_dir = backup_dir(dest) - logger.warning( - 'Backing up %s to %s', display_path(dest), dest_dir, - ) - shutil.move(dest, dest_dir) - self.fetch_new(dest, url, rev_options) - return - - # Do nothing if the response is "i". - 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) - - def unpack(self, location): - # type: (str) -> None - """ - Clean up current location and download the url repository - (and vcs infos) into location - """ - if os.path.exists(location): - rmtree(location) - self.obtain(location) - - @classmethod - def get_src_requirement(cls, location, project_name): - """ - 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 - - @classmethod - def get_remote_url(cls, location): - """ - Return the url used at location - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - raise NotImplementedError - - @classmethod - def get_revision(cls, location): - """ - Return the current commit id of the files at the given location. - """ - raise NotImplementedError - - @classmethod - def run_command( - cls, - cmd, # type: List[str] - show_stdout=True, # type: bool - cwd=None, # type: Optional[str] - on_returncode='raise', # type: str - extra_ok_returncodes=None, # type: Optional[Iterable[int]] - command_desc=None, # type: Optional[str] - extra_environ=None, # type: Optional[Mapping[str, Any]] - spinner=None # type: Optional[SpinnerInterface] - ): - # type: (...) -> Optional[Text] - """ - 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 = [cls.name] + cmd - try: - return call_subprocess(cmd, show_stdout, cwd, - on_returncode=on_returncode, - extra_ok_returncodes=extra_ok_returncodes, - command_desc=command_desc, - extra_environ=extra_environ, - unset_environ=cls.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?' % (cls.name, cls.name)) - else: - raise # re-raise exception if a different error occurred - - @classmethod - def is_repository_directory(cls, path): - # type: (str) -> bool - """ - Return whether a directory path is a repository directory. - """ - logger.debug('Checking in %s for %s (%s)...', - path, cls.dirname, cls.name) - return os.path.exists(os.path.join(path, cls.dirname)) - - @classmethod - def controls_location(cls, location): - # type: (str) -> bool - """ - Check if a location is controlled by the vcs. - It is meant to be overridden to implement smarter detection - mechanisms for specific vcs. - - This can do more than is_repository_directory() alone. For example, - the Git override checks that Git is actually available. - """ - return cls.is_repository_directory(location) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py deleted file mode 100644 index 4c6ac79..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/bazaar.py +++ /dev/null @@ -1,114 +0,0 @@ -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, make_vcs_requirement_url, 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 fetch_new(self, 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 switch(self, dest, url, rev_options): - self.run_command(['switch', url], cwd=dest) - - def update(self, dest, url, rev_options): - cmd_args = ['pull', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - def get_url_rev_and_auth(self, url): - # hotfix the URL scheme after removing bzr+ from bzr+ssh:// readd it - url, rev, user_pass = super(Bazaar, self).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'bzr+' + url - return url, rev, user_pass - - @classmethod - def get_remote_url(cls, location): - urls = cls.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 cls._is_local_repository(repo): - return path_to_url(repo) - return repo - return None - - @classmethod - def get_revision(cls, location): - revision = cls.run_command( - ['revno'], show_stdout=False, cwd=location, - ) - return revision.splitlines()[-1] - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if not repo: - return None - if not repo.lower().startswith('bzr:'): - repo = 'bzr+' + repo - current_rev = cls.get_revision(location) - return make_vcs_requirement_url(repo, current_rev, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py deleted file mode 100644 index dd2bd61..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/git.py +++ /dev/null @@ -1,369 +0,0 @@ -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.exceptions import BadCommand -from pip._internal.utils.compat import samefile -from pip._internal.utils.misc import ( - display_path, make_vcs_requirement_url, redact_password_from_url, -) -from pip._internal.utils.temp_dir import TempDirectory -from pip._internal.vcs import RemoteNotFoundError, 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 https://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 get_current_branch(self, location): - """ - Return the current branch, or None if HEAD isn't at a branch - (e.g. detached HEAD). - """ - # git-symbolic-ref exits with empty stdout if "HEAD" is a detached - # HEAD rather than a symbolic ref. In addition, the -q causes the - # command to exit with status code 1 instead of 128 in this case - # and to suppress the message to stderr. - args = ['symbolic-ref', '-q', 'HEAD'] - output = self.run_command( - args, extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - ref = output.strip() - - if ref.startswith('refs/heads/'): - return ref[len('refs/heads/'):] - - return None - - 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 (sha_or_none, is_branch), where sha_or_none is a commit hash - if the revision names a remote branch or tag, otherwise 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) - - sha = refs.get(branch_ref) - if sha is not None: - return (sha, True) - - sha = refs.get(tag_ref) - - return (sha, False) - - def resolve_revision(self, dest, url, rev_options): - """ - Resolve a revision to a new RevOptions object with the SHA1 of the - branch, tag, or ref if found. - - Args: - rev_options: a RevOptions object. - """ - rev = rev_options.arg_rev - sha, is_branch = self.get_revision_sha(dest, rev) - - if sha is not None: - rev_options = rev_options.make_new(sha) - rev_options.branch_name = rev if is_branch else None - - return rev_options - - # 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, - ) - - if not rev.startswith('refs/'): - return rev_options - - # If it looks like a ref, we have to fetch it explicitly. - self.run_command( - ['fetch', '-q', url] + rev_options.to_args(), - cwd=dest, - ) - # Change the revision to the SHA of the ref we fetched - sha = self.get_revision(dest, rev='FETCH_HEAD') - rev_options = rev_options.make_new(sha) - - 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 fetch_new(self, dest, url, rev_options): - rev_display = rev_options.to_display() - logger.info( - 'Cloning %s%s to %s', redact_password_from_url(url), - rev_display, display_path(dest), - ) - self.run_command(['clone', '-q', url, dest]) - - if rev_options.rev: - # Then a specific revision was requested. - rev_options = self.resolve_revision(dest, url, rev_options) - branch_name = getattr(rev_options, 'branch_name', None) - if branch_name is None: - # 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): - cmd_args = ['checkout', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - elif self.get_current_branch(dest) != branch_name: - # Then a specific branch was requested, and that branch - # is not yet checked out. - track_branch = 'origin/{}'.format(branch_name) - cmd_args = [ - 'checkout', '-b', branch_name, '--track', track_branch, - ] - self.run_command(cmd_args, cwd=dest) - - #: repo may contain submodules - self.update_submodules(dest) - - 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, url, 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.resolve_revision(dest, url, rev_options) - cmd_args = ['reset', '--hard', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - #: update submodules - self.update_submodules(dest) - - @classmethod - def get_remote_url(cls, location): - """ - Return URL of the first remote encountered. - - Raises RemoteNotFoundError if the repository does not have a remote - url configured. - """ - # We need to pass 1 for extra_ok_returncodes since the command - # exits with return code 1 if there are no matching lines. - stdout = cls.run_command( - ['config', '--get-regexp', r'remote\..*\.url'], - extra_ok_returncodes=(1, ), show_stdout=False, cwd=location, - ) - remotes = stdout.splitlines() - try: - found_remote = remotes[0] - except IndexError: - raise RemoteNotFoundError - - for remote in remotes: - if remote.startswith('remote.origin.url '): - found_remote = remote - break - url = found_remote.split(' ')[1] - return url.strip() - - @classmethod - def get_revision(cls, location, rev=None): - if rev is None: - rev = 'HEAD' - current_rev = cls.run_command( - ['rev-parse', rev], show_stdout=False, cwd=location, - ) - return current_rev.strip() - - @classmethod - def _get_subdirectory(cls, location): - """Return the relative path of setup.py to the git repo root.""" - # find the repo root - git_dir = cls.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) - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if not repo.lower().startswith('git:'): - repo = 'git+' + repo - current_rev = cls.get_revision(location) - subdir = cls._get_subdirectory(location) - req = make_vcs_requirement_url(repo, current_rev, project_name, - subdir=subdir) - - return req - - def get_url_rev_and_auth(self, url): - """ - Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'. - That's required because although they use SSH they sometimes don'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 url: - assert 'file:' not in url - url = url.replace('git+', 'git+ssh://') - url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) - url = url.replace('ssh://', '') - else: - url, rev, user_pass = super(Git, self).get_url_rev_and_auth(url) - - return url, rev, user_pass - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py deleted file mode 100644 index 26e75de..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/mercurial.py +++ /dev/null @@ -1,103 +0,0 @@ -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, make_vcs_requirement_url -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 fetch_new(self, 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 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, url, rev_options): - self.run_command(['pull', '-q'], cwd=dest) - cmd_args = ['update', '-q'] + rev_options.to_args() - self.run_command(cmd_args, cwd=dest) - - @classmethod - def get_remote_url(cls, location): - url = cls.run_command( - ['showconfig', 'paths.default'], - show_stdout=False, cwd=location).strip() - if cls._is_local_repository(url): - url = path_to_url(url) - return url.strip() - - @classmethod - def get_revision(cls, location): - current_revision = cls.run_command( - ['parents', '--template={rev}'], - show_stdout=False, cwd=location).strip() - return current_revision - - @classmethod - def get_revision_hash(cls, location): - current_rev_hash = cls.run_command( - ['parents', '--template={node}'], - show_stdout=False, cwd=location).strip() - return current_rev_hash - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if not repo.lower().startswith('hg:'): - repo = 'hg+' + repo - current_rev_hash = cls.get_revision_hash(location) - return make_vcs_requirement_url(repo, current_rev_hash, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py deleted file mode 100644 index 42ac5ac..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/vcs/subversion.py +++ /dev/null @@ -1,200 +0,0 @@ -from __future__ import absolute_import - -import logging -import os -import re - -from pip._internal.utils.logging import indent_log -from pip._internal.utils.misc import ( - display_path, make_vcs_requirement_url, rmtree, split_auth_from_netloc, -) -from pip._internal.vcs import VersionControl, vcs - -_svn_xml_url_re = re.compile('url="([^"]+)"') -_svn_rev_re = re.compile(r'committed-rev="(\d+)"') -_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 export(self, location): - """Export the svn repository at the url to the destination location""" - url, rev_options = self.get_url_rev_options(self.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 fetch_new(self, 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 switch(self, dest, url, rev_options): - cmd_args = ['switch'] + rev_options.to_args() + [url, dest] - self.run_command(cmd_args) - - def update(self, dest, url, rev_options): - cmd_args = ['update'] + rev_options.to_args() + [dest] - self.run_command(cmd_args) - - @classmethod - def get_revision(cls, 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 cls.dirname not in dirs: - dirs[:] = [] - continue # no sense walking uncontrolled subdirs - dirs.remove(cls.dirname) - entries_fn = os.path.join(base, cls.dirname, 'entries') - if not os.path.exists(entries_fn): - # FIXME: should we warn? - continue - - dirurl, localrev = cls._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_netloc_and_auth(self, netloc, scheme): - """ - This override allows the auth information to be passed to svn via the - --username and --password options instead of via the URL. - """ - if scheme == 'ssh': - # The --username and --password options can't be used for - # svn+ssh URLs, so keep the auth information in the URL. - return super(Subversion, self).get_netloc_and_auth( - netloc, scheme) - - return split_auth_from_netloc(netloc) - - def get_url_rev_and_auth(self, url): - # hotfix the URL scheme after removing svn+ from svn+ssh:// readd it - url, rev, user_pass = super(Subversion, self).get_url_rev_and_auth(url) - if url.startswith('ssh://'): - url = 'svn+' + url - return url, rev, user_pass - - def make_rev_args(self, username, password): - extra_args = [] - if username: - extra_args += ['--username', username] - if password: - extra_args += ['--password', password] - - return extra_args - - @classmethod - def get_remote_url(cls, 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 cls._get_svn_url_rev(location)[0] - - @classmethod - def _get_svn_url_rev(cls, location): - from pip._internal.exceptions import InstallationError - - entries_path = os.path.join(location, cls.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 = cls.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 - - @classmethod - def get_src_requirement(cls, location, project_name): - repo = cls.get_remote_url(location) - if repo is None: - return None - repo = 'svn+' + repo - rev = cls.get_revision(location) - return make_vcs_requirement_url(repo, rev, project_name) - - def is_commit_id_equal(self, dest, name): - """Always assume the versions don't match""" - return False - - -vcs.register(Subversion) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py deleted file mode 100644 index 67bcc7f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_internal/wheel.py +++ /dev/null @@ -1,1095 +0,0 @@ -""" -Support for installing and building the "wheel" binary package format. -""" -from __future__ import absolute_import - -import collections -import compileall -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.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.models.link import Link -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 ( # noqa: F401 - Dict, List, Optional, Sequence, Mapping, Tuple, IO, Text, Any, - Union, Iterable - ) - from pip._vendor.packaging.requirements import Requirement # noqa: F401 - from pip._internal.req.req_install import InstallRequirement # noqa: F401 - from pip._internal.download import PipSession # noqa: F401 - from pip._internal.index import FormatControl, PackageFinder # noqa: F401 - from pip._internal.operations.prepare import ( # noqa: F401 - RequirementPreparer - ) - from pip._internal.cache import WheelCache # noqa: F401 - from pip._internal.pep425tags import Pep425Tag # noqa: F401 - - InstalledCSVRow = Tuple[str, ...] - - -VERSION_COMPATIBLE = (1, 0) - - -logger = logging.getLogger(__name__) - - -def normpath(src, p): - return os.path.relpath(src, p).replace(os.path.sep, '/') - - -def rehash(path, blocksize=1 << 20): - # type: (str, int) -> Tuple[str, str] - """Return (hash, length) for path using hashlib.sha256()""" - h = hashlib.sha256() - 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('=') - # unicode/str python2 issues - return (digest, str(length)) # type: ignore - - -def open_for_csv(name, mode): - # type: (str, Text) -> IO - if sys.version_info[0] < 3: - nl = {} # type: Dict[str, Any] - bin = 'b' - else: - nl = {'newline': ''} # type: Dict[str, Any] - bin = '' - return open(name, mode + bin, **nl) - - -def replace_python_tag(wheelname, new_tag): - # type: (str, str) -> str - """Replace the Python tag in a wheel file name with a new value. - """ - parts = wheelname.split('-') - parts[-3] = new_tag - return '-'.join(parts) - - -def fix_script(path): - # type: (str) -> Optional[bool] - """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 - return None - - -dist_info_re = re.compile(r"""^(?P<namever>(?P<name>.+?)(-(?P<ver>.+?))?) - \.dist-info$""", re.VERBOSE) - - -def root_is_purelib(name, wheeldir): - # type: (str, str) -> bool - """ - 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): - # type: (str) -> Tuple[Dict[str, str], Dict[str, str]] - 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: (Sequence[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).rstrip(os.sep) for i in - os.environ.get("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 sorted_outrows(outrows): - # type: (Iterable[InstalledCSVRow]) -> List[InstalledCSVRow] - """ - Return the given rows of a RECORD file in sorted order. - - Each row is a 3-tuple (path, hash, size) and corresponds to a record of - a RECORD file (see PEP 376 and PEP 427 for details). For the rows - passed to this function, the size can be an integer as an int or string, - or the empty string. - """ - # Normally, there should only be one row per path, in which case the - # second and third elements don't come into play when sorting. - # However, in cases in the wild where a path might happen to occur twice, - # we don't want the sort operation to trigger an error (but still want - # determinism). Since the third element can be an int or string, we - # coerce each element to a string to avoid a TypeError in this case. - # For additional background, see-- - # https://github.com/pypa/pip/issues/5868 - return sorted(outrows, key=lambda row: tuple(str(x) for x in row)) - - -def get_csv_rows_for_installed( - old_csv_rows, # type: Iterable[List[str]] - installed, # type: Dict[str, str] - changed, # type: set - generated, # type: List[str] - lib_dir, # type: str -): - # type: (...) -> List[InstalledCSVRow] - """ - :param installed: A map from archive RECORD path to installation RECORD - path. - """ - installed_rows = [] # type: List[InstalledCSVRow] - for row in old_csv_rows: - if len(row) > 3: - logger.warning( - 'RECORD line has more than three elements: {}'.format(row) - ) - # Make a copy because we are mutating the row. - row = list(row) - old_path = row[0] - new_path = installed.pop(old_path, old_path) - row[0] = new_path - if new_path in changed: - digest, length = rehash(new_path) - row[1] = digest - row[2] = length - installed_rows.append(tuple(row)) - for f in generated: - digest, length = rehash(f) - installed_rows.append((normpath(f, lib_dir), digest, str(length))) - for f in installed: - installed_rows.append((installed[f], '', '')) - return installed_rows - - -def move_wheel_files( - name, # type: str - req, # type: Requirement - wheeldir, # type: str - user=False, # type: bool - home=None, # type: Optional[str] - root=None, # type: Optional[str] - pycompile=True, # type: bool - scheme=None, # type: Optional[Mapping[str, str]] - isolated=False, # type: bool - prefix=None, # type: Optional[str] - warn_script_location=True # type: bool -): - # type: (...) -> None - """Install a wheel""" - # TODO: Investigate and break this up. - # TODO: Look into moving this into a dedicated class for representing an - # installation. - - 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 = [] # type: List[str] - 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 = {} # type: Dict[str, str] - changed = set() - generated = [] # type: List[str] - - # 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 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) - - # copyfile (called below) truncates the destination if it - # exists and then writes the new contents. This is fine in most - # cases, but can cause a segfault if pip has loaded a shared - # object (e.g. from pyopenssl through its vendored urllib3) - # Since the shared object is mmap'd an attempt to call a - # symbol in it will then cause a segfault. Unlinking the file - # allows writing of new contents while allowing the process to - # continue to use the old copy. - if os.path.exists(destfile): - os.unlink(destfile) - - # 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, - } - # ignore type, because mypy disallows assigning to a method, - # see https://github.com/python/mypy/issues/2427 - maker._get_script_text = _get_script_text # type: ignore - 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.warning(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) - outrows = get_csv_rows_for_installed( - reader, installed=installed, changed=changed, - generated=generated, lib_dir=lib_dir, - ) - writer = csv.writer(record_out) - # Sort to simplify testing. - for row in sorted_outrows(outrows): - writer.writerow(row) - shutil.move(temp_record, record) - - -def wheel_version(source_dir): - # type: (Optional[str]) -> Optional[Tuple[int, ...]] - """ - Return the Wheel-Version of an extracted wheel, if possible. - - Otherwise, return None 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 Exception: - return None - - -def check_compatibility(version, name): - # type: (Optional[Tuple[int, ...]], str) -> None - """ - 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 class into the models sub-package - # 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): - # type: (str) -> None - """ - :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): - # type: (Optional[List[Pep425Tag]]) -> Optional[int] - """ - 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): - # type: (Optional[List[Pep425Tag]]) -> bool - """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)) - - -def _contains_egg_info( - s, _egg_info_re=re.compile(r'([a-z0-9_.]+)-([a-z0-9_.!+-]+)', re.I)): - """Determine whether the string looks like an egg_info. - - :param s: The string to parse. E.g. foo-2.1 - """ - return bool(_egg_info_re.search(s)) - - -def should_use_ephemeral_cache( - req, # type: InstallRequirement - format_control, # type: FormatControl - autobuilding, # type: bool - cache_available # type: bool -): - # type: (...) -> Optional[bool] - """ - Return whether to build an InstallRequirement object using the - ephemeral cache. - - :param cache_available: whether a cache directory is available for the - autobuilding=True case. - - :return: True or False to build the requirement with ephem_cache=True - or False, respectively; or None not to build the requirement. - """ - if req.constraint: - return None - if req.is_wheel: - if not autobuilding: - logger.info( - 'Skipping %s, due to already being wheel.', req.name, - ) - return None - if not autobuilding: - return False - - if req.editable or not req.source_dir: - return None - - if req.link and not req.link.is_artifact: - # VCS checkout. Build wheel just for this run. - return True - - if "binary" not in format_control.get_allowed_formats( - canonicalize_name(req.name)): - logger.info( - "Skipping bdist_wheel for %s, due to binaries " - "being disabled for it.", req.name, - ) - return None - - link = req.link - base, ext = link.splitext() - if cache_available and _contains_egg_info(base): - return False - - # Otherwise, build the wheel just for this run using the ephemeral - # cache since we are either in the case of e.g. a local directory, or - # no cache directory is available to use. - return True - - -def format_command( - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> str - """ - Format command information for logging. - """ - text = 'Command arguments: {}\n'.format(command_args) - - if not command_output: - text += 'Command output: None' - elif logger.getEffectiveLevel() > logging.DEBUG: - text += 'Command output: [use --verbose to show]' - else: - if not command_output.endswith('\n'): - command_output += '\n' - text += ( - 'Command output:\n{}' - '-----------------------------------------' - ).format(command_output) - - return text - - -def get_legacy_build_wheel_path( - names, # type: List[str] - temp_dir, # type: str - req, # type: InstallRequirement - command_args, # type: List[str] - command_output, # type: str -): - # type: (...) -> Optional[str] - """ - Return the path to the wheel in the temporary build directory. - """ - # Sort for determinism. - names = sorted(names) - if not names: - msg = ( - 'Legacy build of wheel for {!r} created no files.\n' - ).format(req.name) - msg += format_command(command_args, command_output) - logger.warning(msg) - return None - - if len(names) > 1: - msg = ( - 'Legacy build of wheel for {!r} created more than one file.\n' - 'Filenames (choosing first): {}\n' - ).format(req.name, names) - msg += format_command(command_args, command_output) - logger.warning(msg) - - return os.path.join(temp_dir, names[0]) - - -class WheelBuilder(object): - """Build wheels from a RequirementSet.""" - - def __init__( - self, - finder, # type: PackageFinder - preparer, # type: RequirementPreparer - wheel_cache, # type: WheelCache - build_options=None, # type: Optional[List[str]] - global_options=None, # type: Optional[List[str]] - no_clean=False # type: bool - ): - # type: (...) -> None - 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 req.use_pep517: - builder = self._build_one_pep517 - else: - builder = self._build_one_legacy - wheel_path = builder(req, temp_dir.path, python_tag=python_tag) - if wheel_path is not None: - wheel_name = os.path.basename(wheel_path) - dest_path = os.path.join(output_dir, wheel_name) - try: - shutil.move(wheel_path, dest_path) - logger.info('Stored in directory: %s', output_dir) - return dest_path - except Exception: - 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_pep517(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the PEP 517 build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - assert req.metadata_directory is not None - try: - req.spin_message = 'Building wheel for %s (PEP 517)' % (req.name,) - logger.debug('Destination directory: %s', tempd) - wheel_name = req.pep517_backend.build_wheel( - tempd, - metadata_directory=req.metadata_directory - ) - if python_tag: - # General PEP 517 backends don't necessarily support - # a "--python-tag" option, so we rename the wheel - # file directly. - new_name = replace_python_tag(wheel_name, python_tag) - os.rename( - os.path.join(tempd, wheel_name), - os.path.join(tempd, new_name) - ) - # Reassign to simplify the return at the end of function - wheel_name = new_name - except Exception: - logger.error('Failed building wheel for %s', req.name) - return None - return os.path.join(tempd, wheel_name) - - def _build_one_legacy(self, req, tempd, python_tag=None): - """Build one InstallRequirement using the "legacy" build process. - - Returns path to wheel if successfully built. Otherwise, returns None. - """ - base_args = self._base_setup_args(req) - - spin_message = 'Building wheel for %s (setup.py)' % (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: - output = call_subprocess(wheel_args, cwd=req.setup_py_dir, - show_stdout=False, spinner=spinner) - except Exception: - spinner.finish("error") - logger.error('Failed building wheel for %s', req.name) - return None - names = os.listdir(tempd) - wheel_path = get_legacy_build_wheel_path( - names=names, - temp_dir=tempd, - req=req, - command_args=wheel_args, - command_output=output, - ) - return wheel_path - - 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 Exception: - logger.error('Failed cleaning build dir for %s', req.name) - return False - - def build( - self, - requirements, # type: Iterable[InstallRequirement] - session, # type: PipSession - autobuilding=False # type: bool - ): - # type: (...) -> List[InstallRequirement] - """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. - """ - buildset = [] - format_control = self.finder.format_control - # Whether a cache directory is available for autobuilding=True. - cache_available = bool(self._wheel_dir or self.wheel_cache.cache_dir) - - for req in requirements: - ephem_cache = should_use_ephemeral_cache( - req, format_control=format_control, autobuilding=autobuilding, - cache_available=cache_available, - ) - if ephem_cache is None: - continue - - buildset.append((req, ephem_cache)) - - if not buildset: - return [] - - # Is any wheel build not using the ephemeral cache? - if any(not ephem_cache for _, ephem_cache in buildset): - have_directory_for_build = self._wheel_dir or ( - autobuilding and self.wheel_cache.cache_dir - ) - assert have_directory_for_build - - # TODO by @pradyunsg - # Should break up this method into 2 separate methods. - - # 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 = 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 a list of requirements that failed to build - return build_failure diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py deleted file mode 100644 index b919b54..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/__init__.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -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("pep517") - 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") - vendored("urllib3") diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py deleted file mode 100644 index 2bd3911..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/appdirs.py +++ /dev/null @@ -1,604 +0,0 @@ -#!/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py deleted file mode 100644 index 8fdee66..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""CacheControl import Interface. - -Make it easy to import from cachecontrol without long namespaces. -""" -__author__ = "Eric Larson" -__email__ = "eric@ionrock.org" -__version__ = "0.12.5" - -from .wrapper import CacheControl -from .adapter import CacheControlAdapter -from .controller import CacheController diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py deleted file mode 100644 index f1e0ad9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/_cmd.py +++ /dev/null @@ -1,57 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py deleted file mode 100644 index 780eb28..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/adapter.py +++ /dev/null @@ -1,133 +0,0 @@ -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 = {"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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py deleted file mode 100644 index 94e0773..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/cache.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -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 NotImplementedError() - - def set(self, key, value): - raise NotImplementedError() - - def delete(self, key): - raise NotImplementedError() - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py deleted file mode 100644 index 0e1658f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .file_cache import FileCache # noqa -from .redis_cache import RedisCache # noqa diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py deleted file mode 100644 index 1ba0080..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/file_cache.py +++ /dev/null @@ -1,146 +0,0 @@ -import hashlib -import os -from textwrap import dedent - -from ..cache import BaseCache -from ..controller import CacheController - -try: - FileNotFoundError -except NameError: - # py2.X - FileNotFoundError = (IOError, 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) - try: - with open(name, "rb") as fh: - return fh.read() - - except FileNotFoundError: - return None - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py deleted file mode 100644 index ed705ce..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/caches/redis_cache.py +++ /dev/null @@ -1,33 +0,0 @@ -from __future__ import division - -from datetime import datetime -from pip._vendor.cachecontrol.cache import BaseCache - - -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, int(expires.total_seconds()), 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py deleted file mode 100644 index 33b5aed..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/compat.py +++ /dev/null @@ -1,29 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py deleted file mode 100644 index 1b2b943..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/controller.py +++ /dev/null @@ -1,367 +0,0 @@ -""" -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(","): - if not cc_directive.strip(): - continue - - 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 no_store: - return - - # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py deleted file mode 100644 index 30ed4c5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/filewrapper.py +++ /dev/null @@ -1,80 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py deleted file mode 100644 index 6c0e979..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/heuristics.py +++ /dev/null @@ -1,135 +0,0 @@ -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 = { - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py deleted file mode 100644 index ec43ff2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/serialize.py +++ /dev/null @@ -1,186 +0,0 @@ -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 = text_type(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{}".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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py deleted file mode 100644 index 265bfc8..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/cachecontrol/wrapper.py +++ /dev/null @@ -1,29 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py deleted file mode 100644 index ef71f3a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from .core import where - -__version__ = "2018.11.29" diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py deleted file mode 100644 index ae2aff5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/__main__.py +++ /dev/null @@ -1,2 +0,0 @@ -from pip._vendor.certifi import where -print(where()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem deleted file mode 100644 index db68797..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/cacert.pem +++ /dev/null @@ -1,4512 +0,0 @@ - -# 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=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=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=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----- -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 ------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----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 146587175971765017618439757810265552097 -# MD5 Fingerprint: 82:1a:ef:d4:d2:4a:f2:9f:e2:3d:97:06:14:70:72:85 -# SHA1 Fingerprint: e1:c9:50:e6:ef:22:f8:4c:56:45:72:8b:92:20:60:d7:d5:a7:a3:e8 -# SHA256 Fingerprint: 2a:57:54:71:e3:13:40:bc:21:58:1c:bd:2c:f1:3e:15:84:63:20:3e:ce:94:bc:f9:d3:cc:19:6b:f0:9a:54:72 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxUtHDA3sM9CJuRz04TANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM -f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vX -mX7wCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7 -zUjwTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0P -fyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtc -vfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4 -Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUsp -zBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOO -Rc92wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYW -k70paDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+ -DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgF -lQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBADiW -Cu49tJYeX++dnAsznyvgyv3SjgofQXSlfKqE1OXyHuY3UjKcC9FhHb8owbZEKTV1 -d5iyfNm9dKyKaOOpMQkpAWBz40d8U6iQSifvS9efk+eCNs6aaAyC58/UEBZvXw6Z -XPYfcX3v73svfuo21pdwCxXu11xWajOl40k4DLh9+42FpLFZXvRq4d2h9mREruZR -gyFmxhE+885H7pwoHyXa/6xmld01D1zvICxi/ZG6qcz8WpyTgYMpl0p8WnK0OdC3 -d8t5/Wk6kjftbjhlRn7pYL15iJdfOBL07q9bgsiG1eGZbYwE8na6SfZu6W0eX6Dv -J4J2QPim01hcDyxC2kLGe4g0x8HYRZvBPsVhHdljUEn2NIVq4BjFbkerQUIpm/Zg -DdIx02OYI5NaAIFItO/Nis3Jz5nu2Z6qNuFoS3FJFDYoOj0dzpqPJeaAcWErtXvM -+SUWgeExX6GjfhaknBZqlxi9dnKlC54dNuYvoS++cJEPqOba+MSSQGwlfnuzCdyy -F62ARPBopY+Udf90WuioAnwMCeKpSwughQtiue+hMZL77/ZRBIls6Kl0obsXs7X9 -SQ98POyDGCBDTtWTurQ0sR8WNh8M5mQ5Fkzc4P4dyKliPUDqysU0ArSuiYgzNdws -E3PYJ/HQcu51OyLemGhmW/HGY0dVHLqlCFF1pkgl ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R2 O=Google Trust Services LLC -# Subject: CN=GTS Root R2 O=Google Trust Services LLC -# Label: "GTS Root R2" -# Serial: 146587176055767053814479386953112547951 -# MD5 Fingerprint: 44:ed:9a:0e:a4:09:3b:00:f2:ae:4c:a3:c6:61:b0:8b -# SHA1 Fingerprint: d2:73:96:2a:2a:5e:39:9f:73:3f:e1:c7:1e:64:3f:03:38:34:fc:4d -# SHA256 Fingerprint: c4:5d:7b:b0:8e:6d:67:e6:2e:42:35:11:0b:56:4e:5f:78:fd:92:ef:05:8c:84:0a:ea:4e:64:55:d7:58:5c:60 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQbkepxlqz5yDFMJo/aFLybzANBgkqhkiG9w0BAQwFADBH -MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM -QzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIy -MDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNl -cnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv -CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3Kg -GjSY6Dlo7JUle3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9Bu -XvAuMC6C/Pq8tBcKSOWIm8Wba96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOd -re7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS+LFjKBC4swm4VndAoiaYecb+3yXu -PuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7MkogwTZq9TwtImoS1 -mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJGr61K -8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqj -x5RWIr9qS34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsR -nTKaG73VululycslaVNVJ1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0 -kzCqgc7dGtxRcw1PcOnlthYhGXmy5okLdWTK1au8CcEYof/UVKGFPP0UJAOyh9Ok -twIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQADggIBALZp -8KZ3/p7uC4Gt4cCpx/k1HUCCq+YEtN/L9x0Pg/B+E02NjO7jMyLDOfxA325BS0JT -vhaI8dI4XsRomRyYUpOM52jtG2pzegVATX9lO9ZY8c6DR2Dj/5epnGB3GFW1fgiT -z9D2PGcDFWEJ+YF59exTpJ/JjwGLc8R3dtyDovUMSRqodt6Sm2T4syzFJ9MHwAiA -pJiS4wGWAqoC7o87xdFtCjMwc3i5T1QWvwsHoaRc5svJXISPD+AVdyx+Jn7axEvb -pxZ3B7DNdehyQtaVhJ2Gg/LkkM0JR9SLA3DaWsYDQvTtN6LwG1BUSw7YhN4ZKJmB -R64JGz9I0cNv4rBgF/XuIwKl2gBbbZCr7qLpGzvpx0QnRY5rn/WkhLx3+WuXrD5R -RaIRpsyF7gpo8j5QOHokYh4XIDdtak23CZvJ/KRY9bb7nE4Yu5UC56GtmwfuNmsk -0jmGwZODUNKBRqhfYlcsu2xkiAhu7xNUX90txGdj08+JN7+dIPT7eoOboB6BAFDC -5AwiWVIQ7UNWhwD4FFKnHYuTjKJNRn8nxnGbJN7k2oaLDX5rIMHAnuFl2GqjpuiF -izoHCBy69Y9Vmhh1fuXsgWbRIXOhNUQLgD1bnF5vKheW0YMjiGZt5obicDIvUiLn -yOd/xCxgXS/Dr55FBcOEArf9LAhST4Ldo/DUhgkC ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 146587176140553309517047991083707763997 -# MD5 Fingerprint: 1a:79:5b:6b:04:52:9c:5d:c7:74:33:1b:25:9a:f9:25 -# SHA1 Fingerprint: 30:d4:24:6f:07:ff:db:91:89:8a:0b:e9:49:66:11:eb:8c:5e:46:e5 -# SHA256 Fingerprint: 15:d5:b8:77:46:19:ea:7d:54:ce:1c:a6:d0:b0:c4:03:e0:37:a9:17:f1:31:e8:a0:4e:1e:6b:7a:71:ba:bc:e5 ------BEGIN CERTIFICATE----- -MIICDDCCAZGgAwIBAgIQbkepx2ypcyRAiQ8DVd2NHTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout -736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2A -DDL24CejQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEAgFuk -fCPAlaUs3L6JbyO5o91lAFJekazInXJ0glMLfalAvWhgxeG4VDvBNhcl2MG9AjEA -njWSdIUlUfUk7GRSJFClH9voy8l27OyCbvWFGFPouOOaKaqW04MjyaR7YbPMAuhd ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 146587176229350439916519468929765261721 -# MD5 Fingerprint: 5d:b6:6a:c4:60:17:24:6a:1a:99:a8:4b:ee:5e:b4:26 -# SHA1 Fingerprint: 2a:1d:60:27:d9:4a:b1:0a:1c:4d:91:5c:cd:33:a0:cb:3e:2d:54:cb -# SHA256 Fingerprint: 71:cc:a5:39:1f:9e:79:4b:04:80:25:30:b3:63:e1:21:da:8a:30:43:bb:26:66:2f:ea:4d:ca:7f:c9:51:a4:bd ------BEGIN CERTIFICATE----- -MIICCjCCAZGgAwIBAgIQbkepyIuUtui7OyrYorLBmTAKBggqhkjOPQQDAzBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu -hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/l -xKvRHYqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNnADBkAjBqUFJ0 -CMRw3J5QdCHojXohw0+WbhXRIjVhLfoIN+4Zba3bssx9BzT1YBkstTTZbyACMANx -sbqjYAuG7ZoIapVon+Kz4ZNkfF6Tpt95LY2F45TPI11xzPKwTdb+mciUqXWi4w== ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py deleted file mode 100644 index 2d02ea4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/certifi/core.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem. -""" -import os - - -def where(): - f = os.path.dirname(__file__) - - return os.path.join(f, 'cacert.pem') - - -if __name__ == '__main__': - print(where()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py deleted file mode 100644 index 0f9f820..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py deleted file mode 100644 index 38f3251..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5freq.py +++ /dev/null @@ -1,386 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py deleted file mode 100644 index 98f9970..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/big5prober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py deleted file mode 100644 index c0395f4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/chardistribution.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py deleted file mode 100644 index 8b3738e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetgroupprober.py +++ /dev/null @@ -1,106 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py deleted file mode 100644 index eac4e59..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/charsetprober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py deleted file mode 100644 index c61136b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cli/chardetect.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py deleted file mode 100644 index 68fba44..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/codingstatemachine.py +++ /dev/null @@ -1,88 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py deleted file mode 100644 index ddd7468..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/compat.py +++ /dev/null @@ -1,34 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py deleted file mode 100644 index efd793a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/cp949prober.py +++ /dev/null @@ -1,49 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py deleted file mode 100644 index 0451207..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/enums.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py deleted file mode 100644 index c70493f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escprober.py +++ /dev/null @@ -1,101 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py deleted file mode 100644 index 0069523..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/escsm.py +++ /dev/null @@ -1,246 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py deleted file mode 100644 index 20ce8f7..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/eucjpprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py deleted file mode 100644 index b68078c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrfreq.py +++ /dev/null @@ -1,195 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py deleted file mode 100644 index 345a060..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euckrprober.py +++ /dev/null @@ -1,47 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py deleted file mode 100644 index ed7a995..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwfreq.py +++ /dev/null @@ -1,387 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py deleted file mode 100644 index 35669cc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/euctwprober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py deleted file mode 100644 index 697837b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312freq.py +++ /dev/null @@ -1,283 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py deleted file mode 100644 index 8446d2d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/gb2312prober.py +++ /dev/null @@ -1,46 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py deleted file mode 100644 index b0e1bf4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/hebrewprober.py +++ /dev/null @@ -1,292 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py deleted file mode 100644 index 83fc082..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jisfreq.py +++ /dev/null @@ -1,325 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py deleted file mode 100644 index 20044e4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/jpcntx.py +++ /dev/null @@ -1,233 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py deleted file mode 100644 index 2aa4fb2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langbulgarianmodel.py +++ /dev/null @@ -1,228 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py deleted file mode 100644 index e5f9a1f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langcyrillicmodel.py +++ /dev/null @@ -1,333 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py deleted file mode 100644 index 5332221..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langgreekmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py deleted file mode 100644 index 58f4c87..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhebrewmodel.py +++ /dev/null @@ -1,200 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py deleted file mode 100644 index bb7c095..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langhungarianmodel.py +++ /dev/null @@ -1,225 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py deleted file mode 100644 index 15f94c2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langthaimodel.py +++ /dev/null @@ -1,199 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py deleted file mode 100644 index a427a45..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/langturkishmodel.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py deleted file mode 100644 index 7d1e8c2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/latin1prober.py +++ /dev/null @@ -1,145 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py deleted file mode 100644 index 6256ecf..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcharsetprober.py +++ /dev/null @@ -1,91 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py deleted file mode 100644 index 530abe7..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcsgroupprober.py +++ /dev/null @@ -1,54 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py deleted file mode 100644 index 8360d0f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/mbcssm.py +++ /dev/null @@ -1,572 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py deleted file mode 100644 index 0adb51d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcharsetprober.py +++ /dev/null @@ -1,132 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py deleted file mode 100644 index 98e95dc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sbcsgroupprober.py +++ /dev/null @@ -1,73 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py deleted file mode 100644 index 9e29623..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/sjisprober.py +++ /dev/null @@ -1,92 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py deleted file mode 100644 index 7b4e92d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/universaldetector.py +++ /dev/null @@ -1,286 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py deleted file mode 100644 index 6c3196c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/utf8prober.py +++ /dev/null @@ -1,82 +0,0 @@ -######################## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py deleted file mode 100644 index bb2a34a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/chardet/version.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py deleted file mode 100644 index 2a3bf47..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# 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.4.1' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py deleted file mode 100644 index 7877658..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansi.py +++ /dev/null @@ -1,102 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py deleted file mode 100644 index 359c92b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/ansitowin32.py +++ /dev/null @@ -1,257 +0,0 @@ -# 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() - - -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 __enter__(self, *args, **kwargs): - # special method lookup bypasses __getattr__/__getattribute__, see - # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit - # thus, contextlib magic methods are not proxied via __getattr__ - return self.__wrapped.__enter__(*args, **kwargs) - - def __exit__(self, *args, **kwargs): - return self.__wrapped.__exit__(*args, **kwargs) - - def write(self, text): - self.__convertor.write(text) - - def isatty(self): - stream = self.__wrapped - if 'PYCHARM_HOSTED' in os.environ: - if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__): - return True - try: - stream_isatty = stream.isatty - except AttributeError: - return False - else: - return stream_isatty() - - @property - def closed(self): - stream = self.__wrapped - try: - return stream.closed - except AttributeError: - return True - - -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 self.stream.closed and not self.stream.isatty()) - self.strip = strip - - # should we should convert ANSI sequences into win32 calls? - if convert is None: - convert = conversion_supported and not self.stream.closed and self.stream.isatty() - 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 self.stream.closed: - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py deleted file mode 100644 index 430d066..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/initialise.py +++ /dev/null @@ -1,80 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py deleted file mode 100644 index c2d8360..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/win32.py +++ /dev/null @@ -1,152 +0,0 @@ -# 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 - - 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 - (_GetStdHandle(STDOUT), _GetStdHandle(STDERR))) - - def GetConsoleScreenBufferInfo(stream_id=STDOUT): - handle = _GetStdHandle(stream_id) - csbi = CONSOLE_SCREEN_BUFFER_INFO() - success = _GetConsoleScreenBufferInfo( - handle, byref(csbi)) - return csbi - - def SetConsoleTextAttribute(stream_id, attrs): - handle = _GetStdHandle(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 = _GetStdHandle(stream_id) - return _SetConsoleCursorPosition(handle, adjusted_position) - - def FillConsoleOutputCharacter(stream_id, char, length, start): - handle = _GetStdHandle(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 = _GetStdHandle(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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py deleted file mode 100644 index 0fdb4ec..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/colorama/winterm.py +++ /dev/null @@ -1,169 +0,0 @@ -# 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) - self._light = 0 - - 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 - elif 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 - else: - # invalid mode - return - # 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 - elif 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 - else: - # invalid mode - return - # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py deleted file mode 100644 index a786b4d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- 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.8' - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py deleted file mode 100644 index f7dbf4c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py deleted file mode 100644 index cfb318d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/misc.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py deleted file mode 100644 index 159e49e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/shutil.py +++ /dev/null @@ -1,761 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg deleted file mode 100644 index 1746bd0..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.cfg +++ /dev/null @@ -1,84 +0,0 @@ -[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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py deleted file mode 100644 index 1df3aba..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/sysconfig.py +++ /dev/null @@ -1,788 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py deleted file mode 100644 index d66d856..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/_backport/tarfile.py +++ /dev/null @@ -1,2607 +0,0 @@ -#------------------------------------------------------------------- -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py deleted file mode 100644 index ff328c8..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/compat.py +++ /dev/null @@ -1,1120 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py deleted file mode 100644 index b13cdac..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/database.py +++ /dev/null @@ -1,1339 +0,0 @@ -# -*- 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, - LEGACY_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, - LEGACY_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py deleted file mode 100644 index 2406be2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/index.py +++ /dev/null @@ -1,516 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py deleted file mode 100644 index 5c655c3..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/locators.py +++ /dev/null @@ -1,1295 +0,0 @@ -# -*- 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 not is_compatible(wheel, self.wheel_tags): - logger.debug('Wheel not compatible: %s', path) - else: - 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() - self.platform_check = False # See issue #112 - - 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.platform_check and 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py deleted file mode 100644 index ca0fe44..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/manifest.py +++ /dev/null @@ -1,393 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py deleted file mode 100644 index ee1f3e2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/markers.py +++ /dev/null @@ -1,131 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py deleted file mode 100644 index 77eed7f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/metadata.py +++ /dev/null @@ -1,1094 +0,0 @@ -# -*- 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') - -# See issue #106: Sometimes 'Requires' occurs wrongly in the metadata. Include -# it in the tuple literal below to allow it (for now) -_566_FIELDS = _426_FIELDS + ('Description-Content-Type', 'Requires') - -_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' -LEGACY_METADATA_FILENAME = 'METADATA' - - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py deleted file mode 100644 index 1884016..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/resources.py +++ /dev/null @@ -1,355 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py deleted file mode 100644 index 8e22cb9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/scripts.py +++ /dev/null @@ -1,417 +0,0 @@ -# -*- 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 shebang.endswith(linesep): - shebang += linesep - if not use_launcher: - script_bytes = shebang + 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 + 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t32.exe deleted file mode 100644 index a09d926872d84ae22a617dfe9ebb560d420b37de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92672 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/t64.exe deleted file mode 100644 index 9da9b40de922fb203df6b9a1d0ad4139af536850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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�vlnW`{LoXpTySn$@;x8yoz96jn?+Kk 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�?dYNUd4WaURX_A__M4W}D0!0n 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py deleted file mode 100644 index 9d4bfd3..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/util.py +++ /dev/null @@ -1,1756 +0,0 @@ -# -# 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: - if os.path.exists(path): - os.remove(path) - with open(path, 'wb') as f: - f.write(data) - self.record_as_written(path) - - def write_text_file(self, path, data, encoding): - self.write_binary_file(path, data.encode(encoding)) - - 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, hashed_invalidation=False): - 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):] - compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): - compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py deleted file mode 100644 index 3eebe18..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/version.py +++ /dev/null @@ -1,736 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w32.exe deleted file mode 100644 index 732215a9d34ccb7b417d637a7646d9b843ecafa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/w64.exe deleted file mode 100644 index c41bd0a011fd760ce20ba795d9e535e0d2c39876..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99328 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 B=L-M; diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py deleted file mode 100644 index b04bfae..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distlib/wheel.py +++ /dev/null @@ -1,988 +0,0 @@ -# -*- 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. If kwarg ``bytecode_hashed_invalidation`` is True, written - bytecode will try to use file-hash based invalidation (PEP-552) on - supported interpreter versions (CPython 2.7+). - - 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) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', 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, - hashed_invalidation=bc_hashed_invalidation) - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py deleted file mode 100644 index aa4defc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/distro.py +++ /dev/null @@ -1,1197 +0,0 @@ -# Copyright 2015,2016,2017 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 OS 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 OS 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 OS 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 OS distributions. - """ - return _distro.linux_distribution(full_distribution_name) - - -def id(): - """ - Return the distro ID of the current distribution, as a - machine-readable string. - - For a number of OS 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 - "openbsd" OpenBSD - "netbsd" NetBSD - "freebsd" FreeBSD - ============== ========================================= - - 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS 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 OS - 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 OS 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 OS 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 OS distribution. - - See `distro release file`_ for details about these information items. - """ - return _distro.distro_release_info() - - -def uname_info(): - """ - Return a dictionary containing key-value pairs for the information items - from the distro release file data source of the current OS distribution. - """ - return _distro.uname_info() - - -def os_release_attr(attribute): - """ - Return a single named information item from the os-release file data source - of the current OS 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 OS 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 OS 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) - - -def uname_attr(attribute): - """ - Return a single named information item from the distro release file - data source of the current OS 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. - """ - return _distro.uname_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 OS 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 OS 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='', - include_uname=True): - """ - 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. - - * ``include_name`` (bool): Controls whether uname command output is - included as a data source. If the uname command is not available in - the program execution path the data source for the uname command 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. - - * ``include_uname`` (bool): The result of the ``include_uname`` - parameter. This controls whether the uname 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 - self.include_uname = include_uname - - 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}, " \ - "include_uname={self.include_uname!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}, " \ - "_uname_info={self._uname_info!r})".format( - self=self) - - def linux_distribution(self, full_distribution_name=True): - """ - Return information about the OS 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 OS 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) - - distro_id = self.uname_attr('id') - if distro_id: - return normalize(distro_id, NORMALIZED_DISTRO_ID) - - return '' - - def name(self, pretty=False): - """ - Return the name of the OS 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') \ - or self.uname_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') \ - or self.uname_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 OS 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', ''), - self.uname_attr('release') - ] - 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 OS 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 current 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 current 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 OS distribution. - - For details, see :func:`distro.like`. - """ - return self.os_release_attr('id_like') or '' - - def codename(self): - """ - Return the codename of the OS 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 OS - 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 OS 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 OS - 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 OS - distribution. - - For details, see :func:`distro.distro_release_info`. - """ - return self._distro_release_info - - def uname_info(self): - """ - Return a dictionary containing key-value pairs for the information - items from the uname command data source of the OS distribution. - - For details, see :func:`distro.uname_info`. - """ - - def os_release_attr(self, attribute): - """ - Return a single named information item from the os-release file data - source of the OS 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 OS 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 OS distribution. - - For details, see :func:`distro.distro_release_attr`. - """ - return self._distro_release_info.get(attribute, '') - - def uname_attr(self, attribute): - """ - Return a single named information item from the uname command - output data source of the OS distribution. - - For details, see :func:`distro.uname_release_attr`. - """ - return self._uname_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 _uname_info(self): - with open(os.devnull, 'w') as devnull: - try: - cmd = ('uname', '-rs') - stdout = subprocess.check_output(cmd, stderr=devnull) - except OSError: - return {} - content = stdout.decode(sys.getfilesystemencoding()).splitlines() - return self._parse_uname_content(content) - - @staticmethod - def _parse_uname_content(lines): - props = {} - match = re.search(r'^([^\s]+)\s+([\d\.]+)', lines[0].strip()) - if match: - name, version = match.groups() - - # This is to prevent the Linux kernel version from - # appearing as the 'best' version on otherwise - # identifiable distributions. - if name == 'Linux': - return {} - props['id'] = name.lower() - props['name'] = name - props['release'] = version - 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="OS 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py deleted file mode 100644 index 0491234..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py deleted file mode 100644 index 4c77717..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_ihatexml.py +++ /dev/null @@ -1,288 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py deleted file mode 100644 index a65e55f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_inputstream.py +++ /dev/null @@ -1,923 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py deleted file mode 100644 index 178f6e7..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_tokenizer.py +++ /dev/null @@ -1,1721 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py deleted file mode 100644 index a5ba4bf..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py deleted file mode 100644 index a1158bb..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/_base.py +++ /dev/null @@ -1,37 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py deleted file mode 100644 index e2e5f86..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/datrie.py +++ /dev/null @@ -1,44 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py deleted file mode 100644 index c178b21..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_trie/py.py +++ /dev/null @@ -1,67 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py deleted file mode 100644 index 0703afb..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/_utils.py +++ /dev/null @@ -1,124 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py deleted file mode 100644 index 1ff8041..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/constants.py +++ /dev/null @@ -1,2947 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py deleted file mode 100644 index 5ba926e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/alphabeticalattributes.py +++ /dev/null @@ -1,29 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py deleted file mode 100644 index c7dbaed..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/base.py +++ /dev/null @@ -1,12 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py deleted file mode 100644 index aefb5c8..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/inject_meta_charset.py +++ /dev/null @@ -1,73 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py deleted file mode 100644 index fcc07ee..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/lint.py +++ /dev/null @@ -1,93 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py deleted file mode 100644 index 4a86501..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/optionaltags.py +++ /dev/null @@ -1,207 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py deleted file mode 100644 index af8e77b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/sanitizer.py +++ /dev/null @@ -1,896 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py deleted file mode 100644 index 0d12584..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/filters/whitespace.py +++ /dev/null @@ -1,38 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py deleted file mode 100644 index ae41a13..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/html5parser.py +++ /dev/null @@ -1,2791 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py deleted file mode 100644 index 53f4d44..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/serializer.py +++ /dev/null @@ -1,409 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py deleted file mode 100644 index 7ef5959..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py deleted file mode 100644 index 61d5fb6..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/genshi.py +++ /dev/null @@ -1,54 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py deleted file mode 100644 index f4ccea5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treeadapters/sax.py +++ /dev/null @@ -1,50 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py deleted file mode 100644 index d44447e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py deleted file mode 100644 index 73973db..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/base.py +++ /dev/null @@ -1,417 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py deleted file mode 100644 index dcfac22..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/dom.py +++ /dev/null @@ -1,236 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py deleted file mode 100644 index 0dedf44..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree.py +++ /dev/null @@ -1,340 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py deleted file mode 100644 index ca12a99..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treebuilders/etree_lxml.py +++ /dev/null @@ -1,366 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py deleted file mode 100644 index 9bec207..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/__init__.py +++ /dev/null @@ -1,154 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py deleted file mode 100644 index 80c474c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/base.py +++ /dev/null @@ -1,252 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py deleted file mode 100644 index b0c89b0..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/dom.py +++ /dev/null @@ -1,43 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py deleted file mode 100644 index 95fc0c1..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree.py +++ /dev/null @@ -1,130 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py deleted file mode 100644 index e81ddf3..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/etree_lxml.py +++ /dev/null @@ -1,213 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py deleted file mode 100644 index 7483be2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/html5lib/treewalkers/genshi.py +++ /dev/null @@ -1,69 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py deleted file mode 100644 index 847bf93..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from .package_data import __version__ -from .core import * diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py deleted file mode 100644 index 98c65ea..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/codec.py +++ /dev/null @@ -1,118 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py deleted file mode 100644 index 4d47f33..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/compat.py +++ /dev/null @@ -1,12 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py deleted file mode 100644 index 104624a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/core.py +++ /dev/null @@ -1,396 +0,0 @@ -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): - v = unicodedata.combining(unichr(cp)) - if v == 0: - if not unicodedata.name(unichr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - -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 - 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']): - try: - 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))) - except ValueError: - raise IDNAError('Unknown codepoint adjacent to joiner {0} 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') - ulabel(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 not std3_rules and replacement is None)): - output += char - elif replacement is not None and (status == "M" or - (status == "3" and not 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) - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if labels[-1] == '': - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty 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'.') - if not labels or labels == ['']: - raise IDNAError('Empty domain') - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - s = ulabel(label) - if s: - result.append(s) - else: - raise IDNAError('Empty label') - if trailing_dot: - result.append(u'') - return u'.'.join(result) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py deleted file mode 100644 index a80c959..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/idnadata.py +++ /dev/null @@ -1,1979 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "11.0.0" -scripts = { - 'Greek': ( - 0x37000000374, - 0x37500000378, - 0x37a0000037e, - 0x37f00000380, - 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, - 0xab650000ab66, - 0x101400001018f, - 0x101a0000101a1, - 0x1d2000001d246, - ), - 'Han': ( - 0x2e8000002e9a, - 0x2e9b00002ef4, - 0x2f0000002fd6, - 0x300500003006, - 0x300700003008, - 0x30210000302a, - 0x30380000303c, - 0x340000004db6, - 0x4e0000009ff0, - 0xf9000000fa6e, - 0xfa700000fada, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - 0x2f8000002fa1e, - ), - 'Hebrew': ( - 0x591000005c8, - 0x5d0000005eb, - 0x5ef000005f5, - 0xfb1d0000fb37, - 0xfb380000fb3d, - 0xfb3e0000fb3f, - 0xfb400000fb42, - 0xfb430000fb45, - 0xfb460000fb50, - ), - 'Hiragana': ( - 0x304100003097, - 0x309d000030a0, - 0x1b0010001b11f, - 0x1f2000001f201, - ), - 'Katakana': ( - 0x30a1000030fb, - 0x30fd00003100, - 0x31f000003200, - 0x32d0000032ff, - 0x330000003358, - 0xff660000ff70, - 0xff710000ff9e, - 0x1b0000001b001, - ), -} -joining_types = { - 0x600: 85, - 0x601: 85, - 0x602: 85, - 0x603: 85, - 0x604: 85, - 0x605: 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, - 0x70f: 84, - 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: 82, - 0x848: 68, - 0x849: 82, - 0x84a: 68, - 0x84b: 68, - 0x84c: 68, - 0x84d: 68, - 0x84e: 68, - 0x84f: 68, - 0x850: 68, - 0x851: 68, - 0x852: 68, - 0x853: 68, - 0x854: 82, - 0x855: 68, - 0x856: 85, - 0x857: 85, - 0x858: 85, - 0x860: 68, - 0x861: 85, - 0x862: 68, - 0x863: 68, - 0x864: 68, - 0x865: 68, - 0x866: 85, - 0x867: 82, - 0x868: 68, - 0x869: 82, - 0x86a: 82, - 0x8a0: 68, - 0x8a1: 68, - 0x8a2: 68, - 0x8a3: 68, - 0x8a4: 68, - 0x8a5: 68, - 0x8a6: 68, - 0x8a7: 68, - 0x8a8: 68, - 0x8a9: 68, - 0x8aa: 82, - 0x8ab: 82, - 0x8ac: 82, - 0x8ad: 85, - 0x8ae: 82, - 0x8af: 68, - 0x8b0: 68, - 0x8b1: 82, - 0x8b2: 82, - 0x8b3: 68, - 0x8b4: 68, - 0x8b6: 68, - 0x8b7: 68, - 0x8b8: 68, - 0x8b9: 82, - 0x8ba: 68, - 0x8bb: 68, - 0x8bc: 68, - 0x8bd: 68, - 0x8e2: 85, - 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, - 0x1878: 68, - 0x1880: 85, - 0x1881: 85, - 0x1882: 85, - 0x1883: 85, - 0x1884: 85, - 0x1885: 84, - 0x1886: 84, - 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, - 0x202f: 85, - 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, - 0x10ac0: 68, - 0x10ac1: 68, - 0x10ac2: 68, - 0x10ac3: 68, - 0x10ac4: 68, - 0x10ac5: 82, - 0x10ac6: 85, - 0x10ac7: 82, - 0x10ac8: 85, - 0x10ac9: 82, - 0x10aca: 82, - 0x10acb: 85, - 0x10acc: 85, - 0x10acd: 76, - 0x10ace: 82, - 0x10acf: 82, - 0x10ad0: 82, - 0x10ad1: 82, - 0x10ad2: 82, - 0x10ad3: 68, - 0x10ad4: 68, - 0x10ad5: 68, - 0x10ad6: 68, - 0x10ad7: 76, - 0x10ad8: 68, - 0x10ad9: 68, - 0x10ada: 68, - 0x10adb: 68, - 0x10adc: 68, - 0x10add: 82, - 0x10ade: 68, - 0x10adf: 68, - 0x10ae0: 68, - 0x10ae1: 82, - 0x10ae2: 85, - 0x10ae3: 85, - 0x10ae4: 82, - 0x10aeb: 68, - 0x10aec: 68, - 0x10aed: 68, - 0x10aee: 68, - 0x10aef: 82, - 0x10b80: 68, - 0x10b81: 82, - 0x10b82: 68, - 0x10b83: 82, - 0x10b84: 82, - 0x10b85: 82, - 0x10b86: 68, - 0x10b87: 68, - 0x10b88: 68, - 0x10b89: 82, - 0x10b8a: 68, - 0x10b8b: 68, - 0x10b8c: 82, - 0x10b8d: 68, - 0x10b8e: 82, - 0x10b8f: 82, - 0x10b90: 68, - 0x10b91: 82, - 0x10ba9: 82, - 0x10baa: 82, - 0x10bab: 82, - 0x10bac: 82, - 0x10bad: 68, - 0x10bae: 68, - 0x10baf: 85, - 0x10d00: 76, - 0x10d01: 68, - 0x10d02: 68, - 0x10d03: 68, - 0x10d04: 68, - 0x10d05: 68, - 0x10d06: 68, - 0x10d07: 68, - 0x10d08: 68, - 0x10d09: 68, - 0x10d0a: 68, - 0x10d0b: 68, - 0x10d0c: 68, - 0x10d0d: 68, - 0x10d0e: 68, - 0x10d0f: 68, - 0x10d10: 68, - 0x10d11: 68, - 0x10d12: 68, - 0x10d13: 68, - 0x10d14: 68, - 0x10d15: 68, - 0x10d16: 68, - 0x10d17: 68, - 0x10d18: 68, - 0x10d19: 68, - 0x10d1a: 68, - 0x10d1b: 68, - 0x10d1c: 68, - 0x10d1d: 68, - 0x10d1e: 68, - 0x10d1f: 68, - 0x10d20: 68, - 0x10d21: 68, - 0x10d22: 82, - 0x10d23: 68, - 0x10f30: 68, - 0x10f31: 68, - 0x10f32: 68, - 0x10f33: 82, - 0x10f34: 68, - 0x10f35: 68, - 0x10f36: 68, - 0x10f37: 68, - 0x10f38: 68, - 0x10f39: 68, - 0x10f3a: 68, - 0x10f3b: 68, - 0x10f3c: 68, - 0x10f3d: 68, - 0x10f3e: 68, - 0x10f3f: 68, - 0x10f40: 68, - 0x10f41: 68, - 0x10f42: 68, - 0x10f43: 68, - 0x10f44: 68, - 0x10f45: 85, - 0x10f51: 68, - 0x10f52: 68, - 0x10f53: 68, - 0x10f54: 82, - 0x110bd: 85, - 0x110cd: 85, - 0x1e900: 68, - 0x1e901: 68, - 0x1e902: 68, - 0x1e903: 68, - 0x1e904: 68, - 0x1e905: 68, - 0x1e906: 68, - 0x1e907: 68, - 0x1e908: 68, - 0x1e909: 68, - 0x1e90a: 68, - 0x1e90b: 68, - 0x1e90c: 68, - 0x1e90d: 68, - 0x1e90e: 68, - 0x1e90f: 68, - 0x1e910: 68, - 0x1e911: 68, - 0x1e912: 68, - 0x1e913: 68, - 0x1e914: 68, - 0x1e915: 68, - 0x1e916: 68, - 0x1e917: 68, - 0x1e918: 68, - 0x1e919: 68, - 0x1e91a: 68, - 0x1e91b: 68, - 0x1e91c: 68, - 0x1e91d: 68, - 0x1e91e: 68, - 0x1e91f: 68, - 0x1e920: 68, - 0x1e921: 68, - 0x1e922: 68, - 0x1e923: 68, - 0x1e924: 68, - 0x1e925: 68, - 0x1e926: 68, - 0x1e927: 68, - 0x1e928: 68, - 0x1e929: 68, - 0x1e92a: 68, - 0x1e92b: 68, - 0x1e92c: 68, - 0x1e92d: 68, - 0x1e92e: 68, - 0x1e92f: 68, - 0x1e930: 68, - 0x1e931: 68, - 0x1e932: 68, - 0x1e933: 68, - 0x1e934: 68, - 0x1e935: 68, - 0x1e936: 68, - 0x1e937: 68, - 0x1e938: 68, - 0x1e939: 68, - 0x1e93a: 68, - 0x1e93b: 68, - 0x1e93c: 68, - 0x1e93d: 68, - 0x1e93e: 68, - 0x1e93f: 68, - 0x1e940: 68, - 0x1e941: 68, - 0x1e942: 68, - 0x1e943: 68, -} -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, - 0x5290000052a, - 0x52b0000052c, - 0x52d0000052e, - 0x52f00000530, - 0x5590000055a, - 0x56000000587, - 0x58800000589, - 0x591000005be, - 0x5bf000005c0, - 0x5c1000005c3, - 0x5c4000005c6, - 0x5c7000005c8, - 0x5d0000005eb, - 0x5ef000005f3, - 0x6100000061b, - 0x62000000640, - 0x64100000660, - 0x66e00000675, - 0x679000006d4, - 0x6d5000006dd, - 0x6df000006e9, - 0x6ea000006f0, - 0x6fa00000700, - 0x7100000074b, - 0x74d000007b2, - 0x7c0000007f6, - 0x7fd000007fe, - 0x8000000082e, - 0x8400000085c, - 0x8600000086b, - 0x8a0000008b5, - 0x8b6000008be, - 0x8d3000008e2, - 0x8e300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098d, - 0x98f00000991, - 0x993000009a9, - 0x9aa000009b1, - 0x9b2000009b3, - 0x9b6000009ba, - 0x9bc000009c5, - 0x9c7000009c9, - 0x9cb000009cf, - 0x9d7000009d8, - 0x9e0000009e4, - 0x9e6000009f2, - 0x9fc000009fd, - 0x9fe000009ff, - 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, - 0xaf900000b00, - 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, - 0xc0000000c0d, - 0xc0e00000c11, - 0xc1200000c29, - 0xc2a00000c3a, - 0xc3d00000c45, - 0xc4600000c49, - 0xc4a00000c4e, - 0xc5500000c57, - 0xc5800000c5b, - 0xc6000000c64, - 0xc6600000c70, - 0xc8000000c84, - 0xc8500000c8d, - 0xc8e00000c91, - 0xc9200000ca9, - 0xcaa00000cb4, - 0xcb500000cba, - 0xcbc00000cc5, - 0xcc600000cc9, - 0xcca00000cce, - 0xcd500000cd7, - 0xcde00000cdf, - 0xce000000ce4, - 0xce600000cf0, - 0xcf100000cf3, - 0xd0000000d04, - 0xd0500000d0d, - 0xd0e00000d11, - 0xd1200000d45, - 0xd4600000d49, - 0xd4a00000d4f, - 0xd5400000d58, - 0xd5f00000d64, - 0xd6600000d70, - 0xd7a00000d80, - 0xd8200000d84, - 0xd8500000d97, - 0xd9a00000db2, - 0xdb300000dbc, - 0xdbd00000dbe, - 0xdc000000dc7, - 0xdca00000dcb, - 0xdcf00000dd5, - 0xdd600000dd7, - 0xdd800000de0, - 0xde600000df0, - 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, - 0x13a0000013f6, - 0x14010000166d, - 0x166f00001680, - 0x16810000169b, - 0x16a0000016eb, - 0x16f1000016f9, - 0x17000000170d, - 0x170e00001715, - 0x172000001735, - 0x174000001754, - 0x17600000176d, - 0x176e00001771, - 0x177200001774, - 0x1780000017b4, - 0x17b6000017d4, - 0x17d7000017d8, - 0x17dc000017de, - 0x17e0000017ea, - 0x18100000181a, - 0x182000001879, - 0x1880000018ab, - 0x18b0000018f6, - 0x19000000191f, - 0x19200000192c, - 0x19300000193c, - 0x19460000196e, - 0x197000001975, - 0x1980000019ac, - 0x19b0000019ca, - 0x19d0000019da, - 0x1a0000001a1c, - 0x1a2000001a5f, - 0x1a6000001a7d, - 0x1a7f00001a8a, - 0x1a9000001a9a, - 0x1aa700001aa8, - 0x1ab000001abe, - 0x1b0000001b4c, - 0x1b5000001b5a, - 0x1b6b00001b74, - 0x1b8000001bf4, - 0x1c0000001c38, - 0x1c4000001c4a, - 0x1c4d00001c7e, - 0x1cd000001cd3, - 0x1cd400001cfa, - 0x1d0000001d2c, - 0x1d2f00001d30, - 0x1d3b00001d3c, - 0x1d4e00001d4f, - 0x1d6b00001d78, - 0x1d7900001d9b, - 0x1dc000001dfa, - 0x1dfb00001e00, - 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, - 0x310500003130, - 0x31a0000031bb, - 0x31f000003200, - 0x340000004db6, - 0x4e0000009ff0, - 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, - 0xa6990000a69a, - 0xa69b0000a69c, - 0xa69e0000a6e6, - 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, - 0xa78e0000a790, - 0xa7910000a792, - 0xa7930000a796, - 0xa7970000a798, - 0xa7990000a79a, - 0xa79b0000a79c, - 0xa79d0000a79e, - 0xa79f0000a7a0, - 0xa7a10000a7a2, - 0xa7a30000a7a4, - 0xa7a50000a7a6, - 0xa7a70000a7a8, - 0xa7a90000a7aa, - 0xa7af0000a7b0, - 0xa7b50000a7b6, - 0xa7b70000a7b8, - 0xa7b90000a7ba, - 0xa7f70000a7f8, - 0xa7fa0000a828, - 0xa8400000a874, - 0xa8800000a8c6, - 0xa8d00000a8da, - 0xa8e00000a8f8, - 0xa8fb0000a8fc, - 0xa8fd0000a92e, - 0xa9300000a954, - 0xa9800000a9c1, - 0xa9cf0000a9da, - 0xa9e00000a9ff, - 0xaa000000aa37, - 0xaa400000aa4e, - 0xaa500000aa5a, - 0xaa600000aa77, - 0xaa7a0000aac3, - 0xaadb0000aade, - 0xaae00000aaf0, - 0xaaf20000aaf7, - 0xab010000ab07, - 0xab090000ab0f, - 0xab110000ab17, - 0xab200000ab27, - 0xab280000ab2f, - 0xab300000ab5b, - 0xab600000ab66, - 0xabc00000abeb, - 0xabec0000abee, - 0xabf00000abfa, - 0xac000000d7a4, - 0xfa0e0000fa10, - 0xfa110000fa12, - 0xfa130000fa15, - 0xfa1f0000fa20, - 0xfa210000fa22, - 0xfa230000fa25, - 0xfa270000fa2a, - 0xfb1e0000fb1f, - 0xfe200000fe30, - 0xfe730000fe74, - 0x100000001000c, - 0x1000d00010027, - 0x100280001003b, - 0x1003c0001003e, - 0x1003f0001004e, - 0x100500001005e, - 0x10080000100fb, - 0x101fd000101fe, - 0x102800001029d, - 0x102a0000102d1, - 0x102e0000102e1, - 0x1030000010320, - 0x1032d00010341, - 0x103420001034a, - 0x103500001037b, - 0x103800001039e, - 0x103a0000103c4, - 0x103c8000103d0, - 0x104280001049e, - 0x104a0000104aa, - 0x104d8000104fc, - 0x1050000010528, - 0x1053000010564, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1080000010806, - 0x1080800010809, - 0x1080a00010836, - 0x1083700010839, - 0x1083c0001083d, - 0x1083f00010856, - 0x1086000010877, - 0x108800001089f, - 0x108e0000108f3, - 0x108f4000108f6, - 0x1090000010916, - 0x109200001093a, - 0x10980000109b8, - 0x109be000109c0, - 0x10a0000010a04, - 0x10a0500010a07, - 0x10a0c00010a14, - 0x10a1500010a18, - 0x10a1900010a36, - 0x10a3800010a3b, - 0x10a3f00010a40, - 0x10a6000010a7d, - 0x10a8000010a9d, - 0x10ac000010ac8, - 0x10ac900010ae7, - 0x10b0000010b36, - 0x10b4000010b56, - 0x10b6000010b73, - 0x10b8000010b92, - 0x10c0000010c49, - 0x10cc000010cf3, - 0x10d0000010d28, - 0x10d3000010d3a, - 0x10f0000010f1d, - 0x10f2700010f28, - 0x10f3000010f51, - 0x1100000011047, - 0x1106600011070, - 0x1107f000110bb, - 0x110d0000110e9, - 0x110f0000110fa, - 0x1110000011135, - 0x1113600011140, - 0x1114400011147, - 0x1115000011174, - 0x1117600011177, - 0x11180000111c5, - 0x111c9000111cd, - 0x111d0000111db, - 0x111dc000111dd, - 0x1120000011212, - 0x1121300011238, - 0x1123e0001123f, - 0x1128000011287, - 0x1128800011289, - 0x1128a0001128e, - 0x1128f0001129e, - 0x1129f000112a9, - 0x112b0000112eb, - 0x112f0000112fa, - 0x1130000011304, - 0x113050001130d, - 0x1130f00011311, - 0x1131300011329, - 0x1132a00011331, - 0x1133200011334, - 0x113350001133a, - 0x1133b00011345, - 0x1134700011349, - 0x1134b0001134e, - 0x1135000011351, - 0x1135700011358, - 0x1135d00011364, - 0x113660001136d, - 0x1137000011375, - 0x114000001144b, - 0x114500001145a, - 0x1145e0001145f, - 0x11480000114c6, - 0x114c7000114c8, - 0x114d0000114da, - 0x11580000115b6, - 0x115b8000115c1, - 0x115d8000115de, - 0x1160000011641, - 0x1164400011645, - 0x116500001165a, - 0x11680000116b8, - 0x116c0000116ca, - 0x117000001171b, - 0x1171d0001172c, - 0x117300001173a, - 0x118000001183b, - 0x118c0000118ea, - 0x118ff00011900, - 0x11a0000011a3f, - 0x11a4700011a48, - 0x11a5000011a84, - 0x11a8600011a9a, - 0x11a9d00011a9e, - 0x11ac000011af9, - 0x11c0000011c09, - 0x11c0a00011c37, - 0x11c3800011c41, - 0x11c5000011c5a, - 0x11c7200011c90, - 0x11c9200011ca8, - 0x11ca900011cb7, - 0x11d0000011d07, - 0x11d0800011d0a, - 0x11d0b00011d37, - 0x11d3a00011d3b, - 0x11d3c00011d3e, - 0x11d3f00011d48, - 0x11d5000011d5a, - 0x11d6000011d66, - 0x11d6700011d69, - 0x11d6a00011d8f, - 0x11d9000011d92, - 0x11d9300011d99, - 0x11da000011daa, - 0x11ee000011ef7, - 0x120000001239a, - 0x1248000012544, - 0x130000001342f, - 0x1440000014647, - 0x1680000016a39, - 0x16a4000016a5f, - 0x16a6000016a6a, - 0x16ad000016aee, - 0x16af000016af5, - 0x16b0000016b37, - 0x16b4000016b44, - 0x16b5000016b5a, - 0x16b6300016b78, - 0x16b7d00016b90, - 0x16e6000016e80, - 0x16f0000016f45, - 0x16f5000016f7f, - 0x16f8f00016fa0, - 0x16fe000016fe2, - 0x17000000187f2, - 0x1880000018af3, - 0x1b0000001b11f, - 0x1b1700001b2fc, - 0x1bc000001bc6b, - 0x1bc700001bc7d, - 0x1bc800001bc89, - 0x1bc900001bc9a, - 0x1bc9d0001bc9f, - 0x1da000001da37, - 0x1da3b0001da6d, - 0x1da750001da76, - 0x1da840001da85, - 0x1da9b0001daa0, - 0x1daa10001dab0, - 0x1e0000001e007, - 0x1e0080001e019, - 0x1e01b0001e022, - 0x1e0230001e025, - 0x1e0260001e02b, - 0x1e8000001e8c5, - 0x1e8d00001e8d7, - 0x1e9220001e94b, - 0x1e9500001e95a, - 0x200000002a6d7, - 0x2a7000002b735, - 0x2b7400002b81e, - 0x2b8200002cea2, - 0x2ceb00002ebe1, - ), - 'CONTEXTJ': ( - 0x200c0000200e, - ), - 'CONTEXTO': ( - 0xb7000000b8, - 0x37500000376, - 0x5f3000005f5, - 0x6600000066a, - 0x6f0000006fa, - 0x30fb000030fc, - ), -} diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py deleted file mode 100644 index fa8a735..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/intranges.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py deleted file mode 100644 index 257e898..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/package_data.py +++ /dev/null @@ -1,2 +0,0 @@ -__version__ = '2.8' - diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py deleted file mode 100644 index a68ed4c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/idna/uts46data.py +++ /dev/null @@ -1,8205 +0,0 @@ -# This file is automatically generated by tools/idna-data -# vim: set fileencoding=utf-8 : - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "11.0.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, 'M', u'ϳ'), - (0x380, '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'ђ'), - ] - -def _seg_7(): - return [ - (0x403, 'M', u'ѓ'), - (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'), - ] - -def _seg_8(): - return [ - (0x49E, 'M', u'ҟ'), - (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'ԃ'), - ] - -def _seg_9(): - return [ - (0x503, 'V'), - (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, 'M', u'ԩ'), - (0x529, 'V'), - (0x52A, 'M', u'ԫ'), - (0x52B, 'V'), - (0x52C, 'M', u'ԭ'), - (0x52D, 'V'), - (0x52E, 'M', u'ԯ'), - (0x52F, 'V'), - (0x530, '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'), - (0x587, 'M', u'եւ'), - (0x588, 'V'), - (0x58B, 'X'), - (0x58D, 'V'), - (0x590, 'X'), - (0x591, 'V'), - (0x5C8, 'X'), - (0x5D0, 'V'), - (0x5EB, 'X'), - (0x5EF, 'V'), - (0x5F5, 'X'), - (0x606, 'V'), - (0x61C, 'X'), - (0x61E, 'V'), - ] - -def _seg_10(): - return [ - (0x675, 'M', u'اٴ'), - (0x676, 'M', u'وٴ'), - (0x677, 'M', u'ۇٴ'), - (0x678, 'M', u'يٴ'), - (0x679, 'V'), - (0x6DD, 'X'), - (0x6DE, 'V'), - (0x70E, 'X'), - (0x710, 'V'), - (0x74B, 'X'), - (0x74D, 'V'), - (0x7B2, 'X'), - (0x7C0, 'V'), - (0x7FB, 'X'), - (0x7FD, 'V'), - (0x82E, 'X'), - (0x830, 'V'), - (0x83F, 'X'), - (0x840, 'V'), - (0x85C, 'X'), - (0x85E, 'V'), - (0x85F, 'X'), - (0x860, 'V'), - (0x86B, 'X'), - (0x8A0, 'V'), - (0x8B5, 'X'), - (0x8B6, 'V'), - (0x8BE, 'X'), - (0x8D3, 'V'), - (0x8E2, 'X'), - (0x8E3, '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'), - (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'), - (0x9FF, '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'ਜ਼'), - ] - -def _seg_11(): - return [ - (0xA5C, 'V'), - (0xA5D, 'X'), - (0xA5E, 'M', u'ਫ਼'), - (0xA5F, 'X'), - (0xA66, 'V'), - (0xA77, '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'), - (0xAF9, 'V'), - (0xB00, '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'), - (0xC00, 'V'), - (0xC0D, 'X'), - (0xC0E, 'V'), - (0xC11, 'X'), - (0xC12, 'V'), - ] - -def _seg_12(): - return [ - (0xC29, 'X'), - (0xC2A, 'V'), - (0xC3A, 'X'), - (0xC3D, 'V'), - (0xC45, 'X'), - (0xC46, 'V'), - (0xC49, 'X'), - (0xC4A, 'V'), - (0xC4E, 'X'), - (0xC55, 'V'), - (0xC57, 'X'), - (0xC58, 'V'), - (0xC5B, 'X'), - (0xC60, 'V'), - (0xC64, 'X'), - (0xC66, 'V'), - (0xC70, 'X'), - (0xC78, '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'), - (0xD00, 'V'), - (0xD04, 'X'), - (0xD05, 'V'), - (0xD0D, 'X'), - (0xD0E, 'V'), - (0xD11, 'X'), - (0xD12, 'V'), - (0xD45, 'X'), - (0xD46, 'V'), - (0xD49, 'X'), - (0xD4A, 'V'), - (0xD50, 'X'), - (0xD54, 'V'), - (0xD64, 'X'), - (0xD66, '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'), - (0xDE6, 'V'), - (0xDF0, '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'), - (0xE89, 'X'), - (0xE8A, 'V'), - (0xE8B, 'X'), - (0xE8D, 'V'), - (0xE8E, 'X'), - (0xE94, 'V'), - ] - -def _seg_13(): - return [ - (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'), - (0x1259, 'X'), - (0x125A, 'V'), - (0x125E, 'X'), - (0x1260, 'V'), - (0x1289, 'X'), - (0x128A, 'V'), - ] - -def _seg_14(): - return [ - (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'), - (0x13F6, 'X'), - (0x13F8, 'M', u'Ᏸ'), - (0x13F9, 'M', u'Ᏹ'), - (0x13FA, 'M', u'Ᏺ'), - (0x13FB, 'M', u'Ᏻ'), - (0x13FC, 'M', u'Ᏼ'), - (0x13FD, 'M', u'Ᏽ'), - (0x13FE, 'X'), - (0x1400, 'V'), - (0x1680, 'X'), - (0x1681, 'V'), - (0x169D, 'X'), - (0x16A0, 'V'), - (0x16F9, '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'), - (0x1879, 'X'), - (0x1880, 'V'), - (0x18AB, 'X'), - (0x18B0, 'V'), - (0x18F6, 'X'), - (0x1900, 'V'), - (0x191F, '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'), - ] - -def _seg_15(): - return [ - (0x1A9A, 'X'), - (0x1AA0, 'V'), - (0x1AAE, 'X'), - (0x1AB0, 'V'), - (0x1ABF, 'X'), - (0x1B00, 'V'), - (0x1B4C, 'X'), - (0x1B50, 'V'), - (0x1B7D, 'X'), - (0x1B80, 'V'), - (0x1BF4, 'X'), - (0x1BFC, 'V'), - (0x1C38, 'X'), - (0x1C3B, 'V'), - (0x1C4A, 'X'), - (0x1C4D, 'V'), - (0x1C80, 'M', u'в'), - (0x1C81, 'M', u'д'), - (0x1C82, 'M', u'о'), - (0x1C83, 'M', u'с'), - (0x1C84, 'M', u'т'), - (0x1C86, 'M', u'ъ'), - (0x1C87, 'M', u'ѣ'), - (0x1C88, 'M', u'ꙋ'), - (0x1C89, 'X'), - (0x1CC0, 'V'), - (0x1CC8, 'X'), - (0x1CD0, 'V'), - (0x1CFA, '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'ð'), - ] - -def _seg_16(): - return [ - (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'ɭ'), - (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'), - (0x1DFA, 'X'), - (0x1DFB, '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'), - ] - -def _seg_17(): - return [ - (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'ṋ'), - (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'ẩ'), - ] - -def _seg_18(): - return [ - (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'), - (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'ἒ'), - ] - -def _seg_19(): - return [ - (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'ἥ'), - (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'ὣι'), - ] - -def _seg_20(): - return [ - (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'ὦι'), - (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'‵‵‵'), - ] - -def _seg_21(): - return [ - (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'), - (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'), - (0x20C0, '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'), - ] - -def _seg_22(): - return [ - (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'א'), - (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, 'V'), - (0x218C, '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'), - (0x2427, 'X'), - (0x2440, 'V'), - (0x244B, 'X'), - (0x2460, 'M', u'1'), - (0x2461, 'M', u'2'), - ] - -def _seg_23(): - return [ - (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'), - (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'), - ] - -def _seg_24(): - return [ - (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'), - (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'), - (0x2A0C, 'M', u'∫∫∫∫'), - (0x2A0D, 'V'), - (0x2A74, '3', u'::='), - (0x2A75, '3', u'=='), - (0x2A76, '3', u'==='), - (0x2A77, 'V'), - (0x2ADC, 'M', u'⫝̸'), - (0x2ADD, 'V'), - (0x2B74, 'X'), - (0x2B76, 'V'), - (0x2B96, 'X'), - (0x2B98, 'V'), - (0x2BC9, 'X'), - (0x2BCA, 'V'), - (0x2BFF, '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'ɒ'), - ] - -def _seg_25(): - return [ - (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'ⲃ'), - (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'ⳛ'), - ] - -def _seg_26(): - return [ - (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'ⳮ'), - (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'), - (0x2E4F, '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'山'), - ] - -def _seg_27(): - return [ - (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'彐'), - (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'襾'), - ] - -def _seg_28(): - return [ - (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'身'), - (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'), - (0x3130, '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'ᄄ'), - ] - -def _seg_29(): - return [ - (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'ᄡ'), - (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'天'), - ] - -def _seg_30(): - return [ - (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'(ᄆ)'), - (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'ᄅ'), - ] - -def _seg_31(): - return [ - (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'나'), - (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月'), - ] - -def _seg_32(): - return [ - (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'エ'), - (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'パーセント'), - ] - -def _seg_33(): - return [ - (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'ペソ'), - (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'), - ] - -def _seg_34(): - return [ - (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'), - (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日'), - ] - -def _seg_35(): - return [ - (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'), - (0x3400, 'V'), - (0x4DB6, 'X'), - (0x4DC0, 'V'), - (0x9FF0, '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, 'M', u'ꚙ'), - (0xA699, 'V'), - (0xA69A, 'M', u'ꚛ'), - (0xA69B, 'V'), - (0xA69C, 'M', u'ъ'), - (0xA69D, 'M', u'ь'), - (0xA69E, 'V'), - (0xA6F8, 'X'), - ] - -def _seg_36(): - return [ - (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'), - (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'), - (0xA790, 'M', u'ꞑ'), - (0xA791, 'V'), - ] - -def _seg_37(): - return [ - (0xA792, 'M', u'ꞓ'), - (0xA793, 'V'), - (0xA796, 'M', u'ꞗ'), - (0xA797, 'V'), - (0xA798, 'M', u'ꞙ'), - (0xA799, 'V'), - (0xA79A, 'M', u'ꞛ'), - (0xA79B, 'V'), - (0xA79C, 'M', u'ꞝ'), - (0xA79D, 'V'), - (0xA79E, 'M', u'ꞟ'), - (0xA79F, 'V'), - (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, 'M', u'ɜ'), - (0xA7AC, 'M', u'ɡ'), - (0xA7AD, 'M', u'ɬ'), - (0xA7AE, 'M', u'ɪ'), - (0xA7AF, 'V'), - (0xA7B0, 'M', u'ʞ'), - (0xA7B1, 'M', u'ʇ'), - (0xA7B2, 'M', u'ʝ'), - (0xA7B3, 'M', u'ꭓ'), - (0xA7B4, 'M', u'ꞵ'), - (0xA7B5, 'V'), - (0xA7B6, 'M', u'ꞷ'), - (0xA7B7, 'V'), - (0xA7B8, 'X'), - (0xA7B9, 'V'), - (0xA7BA, 'X'), - (0xA7F7, 'V'), - (0xA7F8, 'M', u'ħ'), - (0xA7F9, 'M', u'œ'), - (0xA7FA, 'V'), - (0xA82C, 'X'), - (0xA830, 'V'), - (0xA83A, 'X'), - (0xA840, 'V'), - (0xA878, 'X'), - (0xA880, 'V'), - (0xA8C6, 'X'), - (0xA8CE, 'V'), - (0xA8DA, 'X'), - (0xA8E0, 'V'), - (0xA954, 'X'), - (0xA95F, 'V'), - (0xA97D, 'X'), - (0xA980, 'V'), - (0xA9CE, 'X'), - (0xA9CF, 'V'), - (0xA9DA, 'X'), - (0xA9DE, 'V'), - (0xA9FF, 'X'), - (0xAA00, 'V'), - (0xAA37, 'X'), - (0xAA40, 'V'), - (0xAA4E, 'X'), - (0xAA50, 'V'), - (0xAA5A, 'X'), - (0xAA5C, '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'), - (0xAB30, 'V'), - (0xAB5C, 'M', u'ꜧ'), - (0xAB5D, 'M', u'ꬷ'), - (0xAB5E, 'M', u'ɫ'), - (0xAB5F, 'M', u'ꭒ'), - (0xAB60, 'V'), - (0xAB66, 'X'), - (0xAB70, 'M', u'Ꭰ'), - (0xAB71, 'M', u'Ꭱ'), - (0xAB72, 'M', u'Ꭲ'), - (0xAB73, 'M', u'Ꭳ'), - (0xAB74, 'M', u'Ꭴ'), - (0xAB75, 'M', u'Ꭵ'), - (0xAB76, 'M', u'Ꭶ'), - (0xAB77, 'M', u'Ꭷ'), - (0xAB78, 'M', u'Ꭸ'), - (0xAB79, 'M', u'Ꭹ'), - (0xAB7A, 'M', u'Ꭺ'), - ] - -def _seg_38(): - return [ - (0xAB7B, 'M', u'Ꭻ'), - (0xAB7C, 'M', u'Ꭼ'), - (0xAB7D, 'M', u'Ꭽ'), - (0xAB7E, 'M', u'Ꭾ'), - (0xAB7F, 'M', u'Ꭿ'), - (0xAB80, 'M', u'Ꮀ'), - (0xAB81, 'M', u'Ꮁ'), - (0xAB82, 'M', u'Ꮂ'), - (0xAB83, 'M', u'Ꮃ'), - (0xAB84, 'M', u'Ꮄ'), - (0xAB85, 'M', u'Ꮅ'), - (0xAB86, 'M', u'Ꮆ'), - (0xAB87, 'M', u'Ꮇ'), - (0xAB88, 'M', u'Ꮈ'), - (0xAB89, 'M', u'Ꮉ'), - (0xAB8A, 'M', u'Ꮊ'), - (0xAB8B, 'M', u'Ꮋ'), - (0xAB8C, 'M', u'Ꮌ'), - (0xAB8D, 'M', u'Ꮍ'), - (0xAB8E, 'M', u'Ꮎ'), - (0xAB8F, 'M', u'Ꮏ'), - (0xAB90, 'M', u'Ꮐ'), - (0xAB91, 'M', u'Ꮑ'), - (0xAB92, 'M', u'Ꮒ'), - (0xAB93, 'M', u'Ꮓ'), - (0xAB94, 'M', u'Ꮔ'), - (0xAB95, 'M', u'Ꮕ'), - (0xAB96, 'M', u'Ꮖ'), - (0xAB97, 'M', u'Ꮗ'), - (0xAB98, 'M', u'Ꮘ'), - (0xAB99, 'M', u'Ꮙ'), - (0xAB9A, 'M', u'Ꮚ'), - (0xAB9B, 'M', u'Ꮛ'), - (0xAB9C, 'M', u'Ꮜ'), - (0xAB9D, 'M', u'Ꮝ'), - (0xAB9E, 'M', u'Ꮞ'), - (0xAB9F, 'M', u'Ꮟ'), - (0xABA0, 'M', u'Ꮠ'), - (0xABA1, 'M', u'Ꮡ'), - (0xABA2, 'M', u'Ꮢ'), - (0xABA3, 'M', u'Ꮣ'), - (0xABA4, 'M', u'Ꮤ'), - (0xABA5, 'M', u'Ꮥ'), - (0xABA6, 'M', u'Ꮦ'), - (0xABA7, 'M', u'Ꮧ'), - (0xABA8, 'M', u'Ꮨ'), - (0xABA9, 'M', u'Ꮩ'), - (0xABAA, 'M', u'Ꮪ'), - (0xABAB, 'M', u'Ꮫ'), - (0xABAC, 'M', u'Ꮬ'), - (0xABAD, 'M', u'Ꮭ'), - (0xABAE, 'M', u'Ꮮ'), - (0xABAF, 'M', u'Ꮯ'), - (0xABB0, 'M', u'Ꮰ'), - (0xABB1, 'M', u'Ꮱ'), - (0xABB2, 'M', u'Ꮲ'), - (0xABB3, 'M', u'Ꮳ'), - (0xABB4, 'M', u'Ꮴ'), - (0xABB5, 'M', u'Ꮵ'), - (0xABB6, 'M', u'Ꮶ'), - (0xABB7, 'M', u'Ꮷ'), - (0xABB8, 'M', u'Ꮸ'), - (0xABB9, 'M', u'Ꮹ'), - (0xABBA, 'M', u'Ꮺ'), - (0xABBB, 'M', u'Ꮻ'), - (0xABBC, 'M', u'Ꮼ'), - (0xABBD, 'M', u'Ꮽ'), - (0xABBE, 'M', u'Ꮾ'), - (0xABBF, 'M', u'Ꮿ'), - (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'洛'), - ] - -def _seg_39(): - return [ - (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'來'), - (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'凉'), - ] - -def _seg_40(): - return [ - (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'撚'), - (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'利'), - ] - -def _seg_41(): - return [ - (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'淋'), - (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'渚'), - ] - -def _seg_42(): - return [ - (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'著'), - (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'窱'), - ] - -def _seg_43(): - return [ - (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'醙'), - (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'), - ] - -def _seg_44(): - return [ - (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'ڍ'), - (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'طح'), - ] - -def _seg_45(): - return [ - (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'كي'), - (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'نر'), - ] - -def _seg_46(): - return [ - (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'تح'), - (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'نم'), - ] - -def _seg_47(): - return [ - (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'صي'), - (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'شجي'), - ] - -def _seg_48(): - return [ - (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'محم'), - (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','), - ] - -def _seg_49(): - return [ - (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'), - (0xFE30, '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'》'), - (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'ص'), - ] - -def _seg_50(): - return [ - (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'"'), - (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'), - ] - -def _seg_51(): - return [ - (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'ヲ'), - (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'ᄇ'), - ] - -def _seg_52(): - return [ - (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'ᅪ'), - (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'), - (0x1018F, 'X'), - (0x10190, 'V'), - (0x1019C, 'X'), - (0x101A0, 'V'), - (0x101A1, 'X'), - (0x101D0, 'V'), - (0x101FE, 'X'), - (0x10280, 'V'), - (0x1029D, 'X'), - (0x102A0, 'V'), - (0x102D1, 'X'), - (0x102E0, 'V'), - (0x102FC, 'X'), - (0x10300, 'V'), - (0x10324, 'X'), - (0x1032D, 'V'), - (0x1034B, 'X'), - (0x10350, 'V'), - (0x1037B, 'X'), - (0x10380, 'V'), - (0x1039E, 'X'), - (0x1039F, 'V'), - (0x103C4, 'X'), - (0x103C8, 'V'), - (0x103D6, 'X'), - (0x10400, 'M', u'𐐨'), - (0x10401, 'M', u'𐐩'), - ] - -def _seg_53(): - return [ - (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'𐑅'), - (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'), - (0x104B0, 'M', u'𐓘'), - (0x104B1, 'M', u'𐓙'), - (0x104B2, 'M', u'𐓚'), - (0x104B3, 'M', u'𐓛'), - (0x104B4, 'M', u'𐓜'), - (0x104B5, 'M', u'𐓝'), - (0x104B6, 'M', u'𐓞'), - (0x104B7, 'M', u'𐓟'), - (0x104B8, 'M', u'𐓠'), - (0x104B9, 'M', u'𐓡'), - (0x104BA, 'M', u'𐓢'), - (0x104BB, 'M', u'𐓣'), - (0x104BC, 'M', u'𐓤'), - (0x104BD, 'M', u'𐓥'), - (0x104BE, 'M', u'𐓦'), - (0x104BF, 'M', u'𐓧'), - (0x104C0, 'M', u'𐓨'), - (0x104C1, 'M', u'𐓩'), - (0x104C2, 'M', u'𐓪'), - (0x104C3, 'M', u'𐓫'), - (0x104C4, 'M', u'𐓬'), - (0x104C5, 'M', u'𐓭'), - (0x104C6, 'M', u'𐓮'), - (0x104C7, 'M', u'𐓯'), - (0x104C8, 'M', u'𐓰'), - (0x104C9, 'M', u'𐓱'), - (0x104CA, 'M', u'𐓲'), - (0x104CB, 'M', u'𐓳'), - (0x104CC, 'M', u'𐓴'), - (0x104CD, 'M', u'𐓵'), - (0x104CE, 'M', u'𐓶'), - (0x104CF, 'M', u'𐓷'), - (0x104D0, 'M', u'𐓸'), - (0x104D1, 'M', u'𐓹'), - (0x104D2, 'M', u'𐓺'), - (0x104D3, 'M', u'𐓻'), - (0x104D4, 'X'), - (0x104D8, 'V'), - (0x104FC, 'X'), - (0x10500, 'V'), - (0x10528, 'X'), - (0x10530, 'V'), - (0x10564, 'X'), - (0x1056F, 'V'), - (0x10570, 'X'), - (0x10600, 'V'), - (0x10737, 'X'), - (0x10740, 'V'), - (0x10756, 'X'), - (0x10760, 'V'), - (0x10768, 'X'), - (0x10800, 'V'), - (0x10806, 'X'), - (0x10808, 'V'), - (0x10809, 'X'), - (0x1080A, 'V'), - (0x10836, 'X'), - (0x10837, 'V'), - ] - -def _seg_54(): - return [ - (0x10839, 'X'), - (0x1083C, 'V'), - (0x1083D, 'X'), - (0x1083F, 'V'), - (0x10856, 'X'), - (0x10857, 'V'), - (0x1089F, 'X'), - (0x108A7, 'V'), - (0x108B0, 'X'), - (0x108E0, 'V'), - (0x108F3, 'X'), - (0x108F4, 'V'), - (0x108F6, 'X'), - (0x108FB, 'V'), - (0x1091C, 'X'), - (0x1091F, 'V'), - (0x1093A, 'X'), - (0x1093F, 'V'), - (0x10940, 'X'), - (0x10980, 'V'), - (0x109B8, 'X'), - (0x109BC, 'V'), - (0x109D0, 'X'), - (0x109D2, 'V'), - (0x10A04, 'X'), - (0x10A05, 'V'), - (0x10A07, 'X'), - (0x10A0C, 'V'), - (0x10A14, 'X'), - (0x10A15, 'V'), - (0x10A18, 'X'), - (0x10A19, 'V'), - (0x10A36, 'X'), - (0x10A38, 'V'), - (0x10A3B, 'X'), - (0x10A3F, 'V'), - (0x10A49, 'X'), - (0x10A50, 'V'), - (0x10A59, 'X'), - (0x10A60, 'V'), - (0x10AA0, 'X'), - (0x10AC0, 'V'), - (0x10AE7, 'X'), - (0x10AEB, 'V'), - (0x10AF7, 'X'), - (0x10B00, 'V'), - (0x10B36, 'X'), - (0x10B39, 'V'), - (0x10B56, 'X'), - (0x10B58, 'V'), - (0x10B73, 'X'), - (0x10B78, 'V'), - (0x10B92, 'X'), - (0x10B99, 'V'), - (0x10B9D, 'X'), - (0x10BA9, 'V'), - (0x10BB0, 'X'), - (0x10C00, 'V'), - (0x10C49, 'X'), - (0x10C80, 'M', u'𐳀'), - (0x10C81, 'M', u'𐳁'), - (0x10C82, 'M', u'𐳂'), - (0x10C83, 'M', u'𐳃'), - (0x10C84, 'M', u'𐳄'), - (0x10C85, 'M', u'𐳅'), - (0x10C86, 'M', u'𐳆'), - (0x10C87, 'M', u'𐳇'), - (0x10C88, 'M', u'𐳈'), - (0x10C89, 'M', u'𐳉'), - (0x10C8A, 'M', u'𐳊'), - (0x10C8B, 'M', u'𐳋'), - (0x10C8C, 'M', u'𐳌'), - (0x10C8D, 'M', u'𐳍'), - (0x10C8E, 'M', u'𐳎'), - (0x10C8F, 'M', u'𐳏'), - (0x10C90, 'M', u'𐳐'), - (0x10C91, 'M', u'𐳑'), - (0x10C92, 'M', u'𐳒'), - (0x10C93, 'M', u'𐳓'), - (0x10C94, 'M', u'𐳔'), - (0x10C95, 'M', u'𐳕'), - (0x10C96, 'M', u'𐳖'), - (0x10C97, 'M', u'𐳗'), - (0x10C98, 'M', u'𐳘'), - (0x10C99, 'M', u'𐳙'), - (0x10C9A, 'M', u'𐳚'), - (0x10C9B, 'M', u'𐳛'), - (0x10C9C, 'M', u'𐳜'), - (0x10C9D, 'M', u'𐳝'), - (0x10C9E, 'M', u'𐳞'), - (0x10C9F, 'M', u'𐳟'), - (0x10CA0, 'M', u'𐳠'), - (0x10CA1, 'M', u'𐳡'), - (0x10CA2, 'M', u'𐳢'), - (0x10CA3, 'M', u'𐳣'), - (0x10CA4, 'M', u'𐳤'), - (0x10CA5, 'M', u'𐳥'), - (0x10CA6, 'M', u'𐳦'), - (0x10CA7, 'M', u'𐳧'), - (0x10CA8, 'M', u'𐳨'), - ] - -def _seg_55(): - return [ - (0x10CA9, 'M', u'𐳩'), - (0x10CAA, 'M', u'𐳪'), - (0x10CAB, 'M', u'𐳫'), - (0x10CAC, 'M', u'𐳬'), - (0x10CAD, 'M', u'𐳭'), - (0x10CAE, 'M', u'𐳮'), - (0x10CAF, 'M', u'𐳯'), - (0x10CB0, 'M', u'𐳰'), - (0x10CB1, 'M', u'𐳱'), - (0x10CB2, 'M', u'𐳲'), - (0x10CB3, 'X'), - (0x10CC0, 'V'), - (0x10CF3, 'X'), - (0x10CFA, 'V'), - (0x10D28, 'X'), - (0x10D30, 'V'), - (0x10D3A, 'X'), - (0x10E60, 'V'), - (0x10E7F, 'X'), - (0x10F00, 'V'), - (0x10F28, 'X'), - (0x10F30, 'V'), - (0x10F5A, 'X'), - (0x11000, 'V'), - (0x1104E, 'X'), - (0x11052, 'V'), - (0x11070, 'X'), - (0x1107F, 'V'), - (0x110BD, 'X'), - (0x110BE, 'V'), - (0x110C2, 'X'), - (0x110D0, 'V'), - (0x110E9, 'X'), - (0x110F0, 'V'), - (0x110FA, 'X'), - (0x11100, 'V'), - (0x11135, 'X'), - (0x11136, 'V'), - (0x11147, 'X'), - (0x11150, 'V'), - (0x11177, 'X'), - (0x11180, 'V'), - (0x111CE, 'X'), - (0x111D0, 'V'), - (0x111E0, 'X'), - (0x111E1, 'V'), - (0x111F5, 'X'), - (0x11200, 'V'), - (0x11212, 'X'), - (0x11213, 'V'), - (0x1123F, 'X'), - (0x11280, 'V'), - (0x11287, 'X'), - (0x11288, 'V'), - (0x11289, 'X'), - (0x1128A, 'V'), - (0x1128E, 'X'), - (0x1128F, 'V'), - (0x1129E, 'X'), - (0x1129F, 'V'), - (0x112AA, 'X'), - (0x112B0, 'V'), - (0x112EB, 'X'), - (0x112F0, 'V'), - (0x112FA, 'X'), - (0x11300, 'V'), - (0x11304, 'X'), - (0x11305, 'V'), - (0x1130D, 'X'), - (0x1130F, 'V'), - (0x11311, 'X'), - (0x11313, 'V'), - (0x11329, 'X'), - (0x1132A, 'V'), - (0x11331, 'X'), - (0x11332, 'V'), - (0x11334, 'X'), - (0x11335, 'V'), - (0x1133A, 'X'), - (0x1133B, 'V'), - (0x11345, 'X'), - (0x11347, 'V'), - (0x11349, 'X'), - (0x1134B, 'V'), - (0x1134E, 'X'), - (0x11350, 'V'), - (0x11351, 'X'), - (0x11357, 'V'), - (0x11358, 'X'), - (0x1135D, 'V'), - (0x11364, 'X'), - (0x11366, 'V'), - (0x1136D, 'X'), - (0x11370, 'V'), - (0x11375, 'X'), - (0x11400, 'V'), - (0x1145A, 'X'), - (0x1145B, 'V'), - (0x1145C, 'X'), - (0x1145D, 'V'), - ] - -def _seg_56(): - return [ - (0x1145F, 'X'), - (0x11480, 'V'), - (0x114C8, 'X'), - (0x114D0, 'V'), - (0x114DA, 'X'), - (0x11580, 'V'), - (0x115B6, 'X'), - (0x115B8, 'V'), - (0x115DE, 'X'), - (0x11600, 'V'), - (0x11645, 'X'), - (0x11650, 'V'), - (0x1165A, 'X'), - (0x11660, 'V'), - (0x1166D, 'X'), - (0x11680, 'V'), - (0x116B8, 'X'), - (0x116C0, 'V'), - (0x116CA, 'X'), - (0x11700, 'V'), - (0x1171B, 'X'), - (0x1171D, 'V'), - (0x1172C, 'X'), - (0x11730, 'V'), - (0x11740, 'X'), - (0x11800, 'V'), - (0x1183C, 'X'), - (0x118A0, 'M', u'𑣀'), - (0x118A1, 'M', u'𑣁'), - (0x118A2, 'M', u'𑣂'), - (0x118A3, 'M', u'𑣃'), - (0x118A4, 'M', u'𑣄'), - (0x118A5, 'M', u'𑣅'), - (0x118A6, 'M', u'𑣆'), - (0x118A7, 'M', u'𑣇'), - (0x118A8, 'M', u'𑣈'), - (0x118A9, 'M', u'𑣉'), - (0x118AA, 'M', u'𑣊'), - (0x118AB, 'M', u'𑣋'), - (0x118AC, 'M', u'𑣌'), - (0x118AD, 'M', u'𑣍'), - (0x118AE, 'M', u'𑣎'), - (0x118AF, 'M', u'𑣏'), - (0x118B0, 'M', u'𑣐'), - (0x118B1, 'M', u'𑣑'), - (0x118B2, 'M', u'𑣒'), - (0x118B3, 'M', u'𑣓'), - (0x118B4, 'M', u'𑣔'), - (0x118B5, 'M', u'𑣕'), - (0x118B6, 'M', u'𑣖'), - (0x118B7, 'M', u'𑣗'), - (0x118B8, 'M', u'𑣘'), - (0x118B9, 'M', u'𑣙'), - (0x118BA, 'M', u'𑣚'), - (0x118BB, 'M', u'𑣛'), - (0x118BC, 'M', u'𑣜'), - (0x118BD, 'M', u'𑣝'), - (0x118BE, 'M', u'𑣞'), - (0x118BF, 'M', u'𑣟'), - (0x118C0, 'V'), - (0x118F3, 'X'), - (0x118FF, 'V'), - (0x11900, 'X'), - (0x11A00, 'V'), - (0x11A48, 'X'), - (0x11A50, 'V'), - (0x11A84, 'X'), - (0x11A86, 'V'), - (0x11AA3, 'X'), - (0x11AC0, 'V'), - (0x11AF9, 'X'), - (0x11C00, 'V'), - (0x11C09, 'X'), - (0x11C0A, 'V'), - (0x11C37, 'X'), - (0x11C38, 'V'), - (0x11C46, 'X'), - (0x11C50, 'V'), - (0x11C6D, 'X'), - (0x11C70, 'V'), - (0x11C90, 'X'), - (0x11C92, 'V'), - (0x11CA8, 'X'), - (0x11CA9, 'V'), - (0x11CB7, 'X'), - (0x11D00, 'V'), - (0x11D07, 'X'), - (0x11D08, 'V'), - (0x11D0A, 'X'), - (0x11D0B, 'V'), - (0x11D37, 'X'), - (0x11D3A, 'V'), - (0x11D3B, 'X'), - (0x11D3C, 'V'), - (0x11D3E, 'X'), - (0x11D3F, 'V'), - (0x11D48, 'X'), - (0x11D50, 'V'), - (0x11D5A, 'X'), - (0x11D60, 'V'), - ] - -def _seg_57(): - return [ - (0x11D66, 'X'), - (0x11D67, 'V'), - (0x11D69, 'X'), - (0x11D6A, 'V'), - (0x11D8F, 'X'), - (0x11D90, 'V'), - (0x11D92, 'X'), - (0x11D93, 'V'), - (0x11D99, 'X'), - (0x11DA0, 'V'), - (0x11DAA, 'X'), - (0x11EE0, 'V'), - (0x11EF9, 'X'), - (0x12000, 'V'), - (0x1239A, 'X'), - (0x12400, 'V'), - (0x1246F, 'X'), - (0x12470, 'V'), - (0x12475, 'X'), - (0x12480, 'V'), - (0x12544, 'X'), - (0x13000, 'V'), - (0x1342F, 'X'), - (0x14400, 'V'), - (0x14647, 'X'), - (0x16800, 'V'), - (0x16A39, 'X'), - (0x16A40, 'V'), - (0x16A5F, 'X'), - (0x16A60, 'V'), - (0x16A6A, 'X'), - (0x16A6E, 'V'), - (0x16A70, 'X'), - (0x16AD0, 'V'), - (0x16AEE, 'X'), - (0x16AF0, 'V'), - (0x16AF6, 'X'), - (0x16B00, 'V'), - (0x16B46, 'X'), - (0x16B50, 'V'), - (0x16B5A, 'X'), - (0x16B5B, 'V'), - (0x16B62, 'X'), - (0x16B63, 'V'), - (0x16B78, 'X'), - (0x16B7D, 'V'), - (0x16B90, 'X'), - (0x16E60, 'V'), - (0x16E9B, 'X'), - (0x16F00, 'V'), - (0x16F45, 'X'), - (0x16F50, 'V'), - (0x16F7F, 'X'), - (0x16F8F, 'V'), - (0x16FA0, 'X'), - (0x16FE0, 'V'), - (0x16FE2, 'X'), - (0x17000, 'V'), - (0x187F2, 'X'), - (0x18800, 'V'), - (0x18AF3, 'X'), - (0x1B000, 'V'), - (0x1B11F, 'X'), - (0x1B170, 'V'), - (0x1B2FC, 'X'), - (0x1BC00, 'V'), - (0x1BC6B, 'X'), - (0x1BC70, 'V'), - (0x1BC7D, 'X'), - (0x1BC80, 'V'), - (0x1BC89, 'X'), - (0x1BC90, 'V'), - (0x1BC9A, 'X'), - (0x1BC9C, 'V'), - (0x1BCA0, 'I'), - (0x1BCA4, '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'), - (0x1D1E9, 'X'), - (0x1D200, 'V'), - ] - -def _seg_58(): - return [ - (0x1D246, 'X'), - (0x1D2E0, 'V'), - (0x1D2F4, 'X'), - (0x1D300, 'V'), - (0x1D357, 'X'), - (0x1D360, 'V'), - (0x1D379, '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'), - (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'), - ] - -def _seg_59(): - return [ - (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'), - (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'), - ] - -def _seg_60(): - return [ - (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'), - (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'), - ] - -def _seg_61(): - return [ - (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'), - (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'), - ] - -def _seg_62(): - return [ - (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'), - (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'), - ] - -def _seg_63(): - return [ - (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'), - (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'), - ] - -def _seg_64(): - return [ - (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'), - (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'τ'), - ] - -def _seg_65(): - return [ - (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'ε'), - (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'ζ'), - ] - -def _seg_66(): - return [ - (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'ρ'), - (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'ψ'), - ] - -def _seg_67(): - return [ - (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'), - (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'), - ] - -def _seg_68(): - return [ - (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, 'V'), - (0x1DA8C, 'X'), - (0x1DA9B, 'V'), - (0x1DAA0, 'X'), - (0x1DAA1, 'V'), - (0x1DAB0, 'X'), - (0x1E000, 'V'), - (0x1E007, 'X'), - (0x1E008, 'V'), - (0x1E019, 'X'), - (0x1E01B, 'V'), - (0x1E022, 'X'), - (0x1E023, 'V'), - (0x1E025, 'X'), - (0x1E026, 'V'), - (0x1E02B, 'X'), - (0x1E800, 'V'), - (0x1E8C5, 'X'), - (0x1E8C7, 'V'), - (0x1E8D7, 'X'), - (0x1E900, 'M', u'𞤢'), - (0x1E901, 'M', u'𞤣'), - (0x1E902, 'M', u'𞤤'), - (0x1E903, 'M', u'𞤥'), - (0x1E904, 'M', u'𞤦'), - (0x1E905, 'M', u'𞤧'), - (0x1E906, 'M', u'𞤨'), - (0x1E907, 'M', u'𞤩'), - (0x1E908, 'M', u'𞤪'), - (0x1E909, 'M', u'𞤫'), - (0x1E90A, 'M', u'𞤬'), - (0x1E90B, 'M', u'𞤭'), - (0x1E90C, 'M', u'𞤮'), - (0x1E90D, 'M', u'𞤯'), - (0x1E90E, 'M', u'𞤰'), - (0x1E90F, 'M', u'𞤱'), - (0x1E910, 'M', u'𞤲'), - (0x1E911, 'M', u'𞤳'), - (0x1E912, 'M', u'𞤴'), - (0x1E913, 'M', u'𞤵'), - (0x1E914, 'M', u'𞤶'), - (0x1E915, 'M', u'𞤷'), - (0x1E916, 'M', u'𞤸'), - (0x1E917, 'M', u'𞤹'), - (0x1E918, 'M', u'𞤺'), - (0x1E919, 'M', u'𞤻'), - (0x1E91A, 'M', u'𞤼'), - (0x1E91B, 'M', u'𞤽'), - (0x1E91C, 'M', u'𞤾'), - (0x1E91D, 'M', u'𞤿'), - (0x1E91E, 'M', u'𞥀'), - (0x1E91F, 'M', u'𞥁'), - (0x1E920, 'M', u'𞥂'), - (0x1E921, 'M', u'𞥃'), - (0x1E922, 'V'), - (0x1E94B, 'X'), - (0x1E950, 'V'), - (0x1E95A, 'X'), - (0x1E95E, 'V'), - (0x1E960, 'X'), - (0x1EC71, 'V'), - (0x1ECB5, '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'ش'), - ] - -def _seg_69(): - return [ - (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'ق'), - (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'د'), - ] - -def _seg_70(): - return [ - (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'), - (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'), - (0x1F0C0, 'X'), - (0x1F0C1, 'V'), - (0x1F0D0, 'X'), - (0x1F0D1, 'V'), - (0x1F0F6, '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, 'V'), - (0x1F10D, '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)'), - ] - -def _seg_71(): - return [ - (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, 'V'), - (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'), - (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'), - (0x1F1AD, '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, 'M', u'配'), - ] - -def _seg_72(): - return [ - (0x1F23C, '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'), - (0x1F260, 'V'), - (0x1F266, 'X'), - (0x1F300, 'V'), - (0x1F6D5, 'X'), - (0x1F6E0, 'V'), - (0x1F6ED, 'X'), - (0x1F6F0, 'V'), - (0x1F6FA, 'X'), - (0x1F700, 'V'), - (0x1F774, 'X'), - (0x1F780, 'V'), - (0x1F7D9, 'X'), - (0x1F800, 'V'), - (0x1F80C, 'X'), - (0x1F810, 'V'), - (0x1F848, 'X'), - (0x1F850, 'V'), - (0x1F85A, 'X'), - (0x1F860, 'V'), - (0x1F888, 'X'), - (0x1F890, 'V'), - (0x1F8AE, 'X'), - (0x1F900, 'V'), - (0x1F90C, 'X'), - (0x1F910, 'V'), - (0x1F93F, 'X'), - (0x1F940, 'V'), - (0x1F971, 'X'), - (0x1F973, 'V'), - (0x1F977, 'X'), - (0x1F97A, 'V'), - (0x1F97B, 'X'), - (0x1F97C, 'V'), - (0x1F9A3, 'X'), - (0x1F9B0, 'V'), - (0x1F9BA, 'X'), - (0x1F9C0, 'V'), - (0x1F9C3, 'X'), - (0x1F9D0, 'V'), - (0x1FA00, 'X'), - (0x1FA60, 'V'), - (0x1FA6E, 'X'), - (0x20000, 'V'), - (0x2A6D7, 'X'), - (0x2A700, 'V'), - (0x2B735, 'X'), - (0x2B740, 'V'), - (0x2B81E, 'X'), - (0x2B820, 'V'), - (0x2CEA2, 'X'), - (0x2CEB0, 'V'), - (0x2EBE1, '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'剆'), - ] - -def _seg_73(): - return [ - (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'圗'), - (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'𢆃'), - ] - -def _seg_74(): - return [ - (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'扝'), - (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'次'), - ] - -def _seg_75(): - return [ - (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'災'), - (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'𥛅'), - ] - -def _seg_76(): - return [ - (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'聰'), - (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'蛢'), - ] - -def _seg_77(): - return [ - (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'郱'), - (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'), - ] - -def _seg_78(): - return [ - (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() - + _seg_73() - + _seg_74() - + _seg_75() - + _seg_76() - + _seg_77() - + _seg_78() -) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py deleted file mode 100644 index f2d0766..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/ipaddress.py +++ /dev/null @@ -1,2419 +0,0 @@ -# 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.22' - -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py deleted file mode 100644 index a6f44a5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/__init__.py +++ /dev/null @@ -1,347 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py deleted file mode 100644 index 2ca9be0..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/linklockfile.py +++ /dev/null @@ -1,73 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py deleted file mode 100644 index 05a8c96..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/mkdirlockfile.py +++ /dev/null @@ -1,84 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py deleted file mode 100644 index 069e85b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/pidlockfile.py +++ /dev/null @@ -1,190 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py deleted file mode 100644 index f997e24..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/sqlitelockfile.py +++ /dev/null @@ -1,156 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py deleted file mode 100644 index 23b41f5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/lockfile/symlinklockfile.py +++ /dev/null @@ -1,70 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py deleted file mode 100644 index 2afca5a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py deleted file mode 100644 index d28f0de..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/_version.py +++ /dev/null @@ -1 +0,0 @@ -version = (0, 5, 6) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py deleted file mode 100644 index 9766881..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/exceptions.py +++ /dev/null @@ -1,41 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py deleted file mode 100644 index 9418421..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/msgpack/fallback.py +++ /dev/null @@ -1,977 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py deleted file mode 100644 index 7481c9e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__about__.py +++ /dev/null @@ -1,27 +0,0 @@ -# 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__ = "19.0" - -__author__ = "Donald Stufft and individual contributors" -__email__ = "donald@stufft.io" - -__license__ = "BSD or Apache License, Version 2.0" -__copyright__ = "Copyright 2014-2019 %s" % __author__ diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py deleted file mode 100644 index a0cf67d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py deleted file mode 100644 index 25da473..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_compat.py +++ /dev/null @@ -1,31 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py deleted file mode 100644 index 68dcca6..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/_structures.py +++ /dev/null @@ -1,68 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py deleted file mode 100644 index 5482476..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/markers.py +++ /dev/null @@ -1,296 +0,0 @@ -# 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") - | L("sys.platform") # PEP-345 - | L("platform.version") # PEP-345 - | L("platform.machine") # PEP-345 - | L("platform.python_implementation") # PEP-345 - | L("python_implementation") # PEP-345 - | L("extra") # undocumented setuptools legacy -) -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py deleted file mode 100644 index dbc5f11..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/requirements.py +++ /dev/null @@ -1,138 +0,0 @@ -# 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( - 'Parse error at "{0!r}": {1}'.format( - requirement_string[e.loc : e.loc + 8], e.msg - ) - ) - - self.name = req.name - if req.url: - parsed_url = urlparse.urlparse(req.url) - if parsed_url.scheme == "file": - if urlparse.urlunparse(parsed_url) != req.url: - raise InvalidRequirement("Invalid URL given") - elif not (parsed_url.scheme and parsed_url.netloc) or ( - not parsed_url.scheme and not parsed_url.netloc - ): - raise InvalidRequirement("Invalid URL: {0}".format(req.url)) - 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(" ") - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py deleted file mode 100644 index 743576a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/specifiers.py +++ /dev/null @@ -1,749 +0,0 @@ -# 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 technically 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py deleted file mode 100644 index 8841878..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/utils.py +++ /dev/null @@ -1,57 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py deleted file mode 100644 index 95157a1..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/packaging/version.py +++ /dev/null @@ -1,420 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py deleted file mode 100644 index 9c1a098..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Wrappers to build Python packages using PEP 517 hooks -""" - -__version__ = '0.5.0' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py deleted file mode 100644 index d6524b6..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/_in_process.py +++ /dev/null @@ -1,207 +0,0 @@ -"""This is invoked in a subprocess to call the build backend hooks. - -It expects: -- Command line args: hook_name, control_dir -- Environment variable: PEP517_BUILD_BACKEND=entry.point:spec -- control_dir/input.json: - - {"kwargs": {...}} - -Results: -- control_dir/output.json - - {"return_val": ...} -""" -from glob import glob -from importlib import import_module -import os -from os.path import join as pjoin -import re -import shutil -import sys - -# This is run as a script, not a module, so it can't do a relative import -import compat - - -class BackendUnavailable(Exception): - """Raised if we cannot import the backend""" - - -def _build_backend(): - """Find and load the build backend""" - ep = os.environ['PEP517_BUILD_BACKEND'] - mod_path, _, obj_path = ep.partition(':') - try: - obj = import_module(mod_path) - except ImportError: - raise BackendUnavailable - if obj_path: - for path_part in obj_path.split('.'): - obj = getattr(obj, path_part) - return obj - - -def get_requires_for_build_wheel(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_wheel - except AttributeError: - return [] - else: - return hook(config_settings) - - -def prepare_metadata_for_build_wheel(metadata_directory, config_settings): - """Invoke optional prepare_metadata_for_build_wheel - - Implements a fallback by building a wheel if the hook isn't defined. - """ - backend = _build_backend() - try: - hook = backend.prepare_metadata_for_build_wheel - except AttributeError: - return _get_wheel_metadata_from_wheel(backend, metadata_directory, - config_settings) - else: - return hook(metadata_directory, config_settings) - - -WHEEL_BUILT_MARKER = 'PEP517_ALREADY_BUILT_WHEEL' - - -def _dist_info_files(whl_zip): - """Identify the .dist-info folder inside a wheel ZipFile.""" - res = [] - for path in whl_zip.namelist(): - m = re.match(r'[^/\\]+-[^/\\]+\.dist-info/', path) - if m: - res.append(path) - if res: - return res - raise Exception("No .dist-info folder found in wheel") - - -def _get_wheel_metadata_from_wheel( - backend, metadata_directory, config_settings): - """Build a wheel and extract the metadata from it. - - Fallback for when the build backend does not - define the 'get_wheel_metadata' hook. - """ - from zipfile import ZipFile - whl_basename = backend.build_wheel(metadata_directory, config_settings) - with open(os.path.join(metadata_directory, WHEEL_BUILT_MARKER), 'wb'): - pass # Touch marker file - - whl_file = os.path.join(metadata_directory, whl_basename) - with ZipFile(whl_file) as zipf: - dist_info = _dist_info_files(zipf) - zipf.extractall(path=metadata_directory, members=dist_info) - return dist_info[0].split('/')[0] - - -def _find_already_built_wheel(metadata_directory): - """Check for a wheel already built during the get_wheel_metadata hook. - """ - if not metadata_directory: - return None - metadata_parent = os.path.dirname(metadata_directory) - if not os.path.isfile(pjoin(metadata_parent, WHEEL_BUILT_MARKER)): - return None - - whl_files = glob(os.path.join(metadata_parent, '*.whl')) - if not whl_files: - print('Found wheel built marker, but no .whl files') - return None - if len(whl_files) > 1: - print('Found multiple .whl files; unspecified behaviour. ' - 'Will call build_wheel.') - return None - - # Exactly one .whl file - return whl_files[0] - - -def build_wheel(wheel_directory, config_settings, metadata_directory=None): - """Invoke the mandatory build_wheel hook. - - If a wheel was already built in the - prepare_metadata_for_build_wheel fallback, this - will copy it rather than rebuilding the wheel. - """ - prebuilt_whl = _find_already_built_wheel(metadata_directory) - if prebuilt_whl: - shutil.copy2(prebuilt_whl, wheel_directory) - return os.path.basename(prebuilt_whl) - - return _build_backend().build_wheel(wheel_directory, config_settings, - metadata_directory) - - -def get_requires_for_build_sdist(config_settings): - """Invoke the optional get_requires_for_build_wheel hook - - Returns [] if the hook is not defined. - """ - backend = _build_backend() - try: - hook = backend.get_requires_for_build_sdist - except AttributeError: - return [] - else: - return hook(config_settings) - - -class _DummyException(Exception): - """Nothing should ever raise this exception""" - - -class GotUnsupportedOperation(Exception): - """For internal use when backend raises UnsupportedOperation""" - - -def build_sdist(sdist_directory, config_settings): - """Invoke the mandatory build_sdist hook.""" - backend = _build_backend() - try: - return backend.build_sdist(sdist_directory, config_settings) - except getattr(backend, 'UnsupportedOperation', _DummyException): - raise GotUnsupportedOperation - - -HOOK_NAMES = { - 'get_requires_for_build_wheel', - 'prepare_metadata_for_build_wheel', - 'build_wheel', - 'get_requires_for_build_sdist', - 'build_sdist', -} - - -def main(): - if len(sys.argv) < 3: - sys.exit("Needs args: hook_name, control_dir") - hook_name = sys.argv[1] - control_dir = sys.argv[2] - if hook_name not in HOOK_NAMES: - sys.exit("Unknown hook: %s" % hook_name) - hook = globals()[hook_name] - - hook_input = compat.read_json(pjoin(control_dir, 'input.json')) - - json_out = {'unsupported': False, 'return_val': None} - try: - json_out['return_val'] = hook(**hook_input['kwargs']) - except BackendUnavailable: - json_out['no_backend'] = True - except GotUnsupportedOperation: - json_out['unsupported'] = True - - compat.write_json(json_out, pjoin(control_dir, 'output.json'), indent=2) - - -if __name__ == '__main__': - main() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py deleted file mode 100644 index ac6c949..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/build.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Build a project using PEP 517 hooks. -""" -import argparse -import logging -import os -import contextlib -from pip._vendor import pytoml -import shutil -import errno -import tempfile - -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -@contextlib.contextmanager -def tempdir(): - td = tempfile.mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -def _do_build(hooks, env, dist, dest): - get_requires_name = 'get_requires_for_build_{dist}'.format(**locals()) - get_requires = getattr(hooks, get_requires_name) - reqs = get_requires({}) - log.info('Got build requires: %s', reqs) - - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - - with tempdir() as td: - log.info('Trying to build %s in %s', dist, td) - build_name = 'build_{dist}'.format(**locals()) - build = getattr(hooks, build_name) - filename = build(td, {}) - source = os.path.join(td, filename) - shutil.move(source, os.path.join(dest, os.path.basename(filename))) - - -def mkdir_p(*args, **kwargs): - """Like `mkdir`, but does not raise an exception if the - directory already exists. - """ - try: - return os.mkdir(*args, **kwargs) - except OSError as exc: - if exc.errno != errno.EEXIST: - raise - - -def build(source_dir, dist, dest=None): - pyproject = os.path.join(source_dir, 'pyproject.toml') - dest = os.path.join(source_dir, dest or 'dist') - mkdir_p(dest) - - with open(pyproject) as f: - pyproject_data = pytoml.load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - _do_build(hooks, env, dist, dest) - - -parser = argparse.ArgumentParser() -parser.add_argument( - 'source_dir', - help="A directory containing pyproject.toml", -) -parser.add_argument( - '--binary', '-b', - action='store_true', - default=False, -) -parser.add_argument( - '--source', '-s', - action='store_true', - default=False, -) -parser.add_argument( - '--out-dir', '-o', - help="Destination in which to save the builds relative to source dir", -) - - -def main(args): - # determine which dists to build - dists = list(filter(None, ( - 'sdist' if args.source or not args.binary else None, - 'wheel' if args.binary or not args.source else None, - ))) - - for dist in dists: - build(args.source_dir, dist, args.out_dir) - - -if __name__ == '__main__': - main(parser.parse_args()) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py deleted file mode 100644 index f4cdc6b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/check.py +++ /dev/null @@ -1,202 +0,0 @@ -"""Check a project and backend by attempting to build using PEP 517 hooks. -""" -import argparse -import logging -import os -from os.path import isfile, join as pjoin -from pip._vendor.pytoml import TomlError, load as toml_load -import shutil -from subprocess import CalledProcessError -import sys -import tarfile -from tempfile import mkdtemp -import zipfile - -from .colorlog import enable_colourful_output -from .envbuild import BuildEnvironment -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def check_build_sdist(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_sdist({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build sdist in %s', td) - try: - try: - filename = hooks.build_sdist(td, {}) - log.info('build_sdist returned %r', filename) - except Exception: - log.info('Failure in build_sdist', exc_info=True) - return False - - if not filename.endswith('.tar.gz'): - log.error( - "Filename %s doesn't have .tar.gz extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if tarfile.is_tarfile(path): - log.info("Output file is a tar file") - else: - log.error("Output file is not a tar file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check_build_wheel(hooks, build_sys_requires): - with BuildEnvironment() as env: - try: - env.pip_install(build_sys_requires) - log.info('Installed static build dependencies') - except CalledProcessError: - log.error('Failed to install static build dependencies') - return False - - try: - reqs = hooks.get_requires_for_build_wheel({}) - log.info('Got build requires: %s', reqs) - except Exception: - log.error('Failure in get_requires_for_build_sdist', exc_info=True) - return False - - try: - env.pip_install(reqs) - log.info('Installed dynamic build dependencies') - except CalledProcessError: - log.error('Failed to install dynamic build dependencies') - return False - - td = mkdtemp() - log.info('Trying to build wheel in %s', td) - try: - try: - filename = hooks.build_wheel(td, {}) - log.info('build_wheel returned %r', filename) - except Exception: - log.info('Failure in build_wheel', exc_info=True) - return False - - if not filename.endswith('.whl'): - log.error("Filename %s doesn't have .whl extension", filename) - return False - - path = pjoin(td, filename) - if isfile(path): - log.info("Output file %s exists", path) - else: - log.error("Output file %s does not exist", path) - return False - - if zipfile.is_zipfile(path): - log.info("Output file is a zip file") - else: - log.error("Output file is not a zip file") - return False - - finally: - shutil.rmtree(td) - - return True - - -def check(source_dir): - pyproject = pjoin(source_dir, 'pyproject.toml') - if isfile(pyproject): - log.info('Found pyproject.toml') - else: - log.error('Missing pyproject.toml') - return False - - try: - with open(pyproject) as f: - pyproject_data = toml_load(f) - # Ensure the mandatory data can be loaded - buildsys = pyproject_data['build-system'] - requires = buildsys['requires'] - backend = buildsys['build-backend'] - log.info('Loaded pyproject.toml') - except (TomlError, KeyError): - log.error("Invalid pyproject.toml", exc_info=True) - return False - - hooks = Pep517HookCaller(source_dir, backend) - - sdist_ok = check_build_sdist(hooks, requires) - wheel_ok = check_build_wheel(hooks, requires) - - if not sdist_ok: - log.warning('Sdist checks failed; scroll up to see') - if not wheel_ok: - log.warning('Wheel checks failed') - - return sdist_ok - - -def main(argv=None): - ap = argparse.ArgumentParser() - ap.add_argument( - 'source_dir', - help="A directory containing pyproject.toml") - args = ap.parse_args(argv) - - enable_colourful_output() - - ok = check(args.source_dir) - - if ok: - print(ansi('Checks passed', 'green')) - else: - print(ansi('Checks failed', 'red')) - sys.exit(1) - - -ansi_codes = { - 'reset': '\x1b[0m', - 'bold': '\x1b[1m', - 'red': '\x1b[31m', - 'green': '\x1b[32m', -} - - -def ansi(s, attr): - if os.name != 'nt' and sys.stdout.isatty(): - return ansi_codes[attr] + str(s) + ansi_codes['reset'] - else: - return str(s) - - -if __name__ == '__main__': - main() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py deleted file mode 100644 index 69c8a59..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/colorlog.py +++ /dev/null @@ -1,115 +0,0 @@ -"""Nicer log formatting with colours. - -Code copied from Tornado, Apache licensed. -""" -# Copyright 2012 Facebook -# -# 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 logging -import sys - -try: - import curses -except ImportError: - curses = None - - -def _stderr_supports_color(): - color = False - if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): - try: - curses.setupterm() - if curses.tigetnum("colors") > 0: - color = True - except Exception: - pass - return color - - -class LogFormatter(logging.Formatter): - """Log formatter with colour support - """ - DEFAULT_COLORS = { - logging.INFO: 2, # Green - logging.WARNING: 3, # Yellow - logging.ERROR: 1, # Red - logging.CRITICAL: 1, - } - - def __init__(self, color=True, datefmt=None): - r""" - :arg bool color: Enables color support. - :arg string fmt: Log message format. - It will be applied to the attributes dict of log records. The - text between ``%(color)s`` and ``%(end_color)s`` will be colored - depending on the level if color support is on. - :arg dict colors: color mappings from logging level to terminal color - code - :arg string datefmt: Datetime format. - Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. - .. versionchanged:: 3.2 - Added ``fmt`` and ``datefmt`` arguments. - """ - logging.Formatter.__init__(self, datefmt=datefmt) - self._colors = {} - if color and _stderr_supports_color(): - # The curses module has some str/bytes confusion in - # python3. Until version 3.2.3, most methods return - # bytes, but only accept strings. In addition, we want to - # output these strings with the logging module, which - # works with unicode strings. The explicit calls to - # unicode() below are harmless in python2 but will do the - # right conversion in python 3. - fg_color = (curses.tigetstr("setaf") or - curses.tigetstr("setf") or "") - if (3, 0) < sys.version_info < (3, 2, 3): - fg_color = str(fg_color, "ascii") - - for levelno, code in self.DEFAULT_COLORS.items(): - self._colors[levelno] = str( - curses.tparm(fg_color, code), "ascii") - self._normal = str(curses.tigetstr("sgr0"), "ascii") - - scr = curses.initscr() - self.termwidth = scr.getmaxyx()[1] - curses.endwin() - else: - self._normal = '' - # Default width is usually 80, but too wide is - # worse than too narrow - self.termwidth = 70 - - def formatMessage(self, record): - mlen = len(record.message) - right_text = '{initial}-{name}'.format(initial=record.levelname[0], - name=record.name) - if mlen + len(right_text) < self.termwidth: - space = ' ' * (self.termwidth - (mlen + len(right_text))) - else: - space = ' ' - - if record.levelno in self._colors: - start_color = self._colors[record.levelno] - end_color = self._normal - else: - start_color = end_color = '' - - return record.message + space + start_color + right_text + end_color - - -def enable_colourful_output(level=logging.INFO): - handler = logging.StreamHandler() - handler.setFormatter(LogFormatter()) - logging.root.addHandler(handler) - logging.root.setLevel(level) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py deleted file mode 100644 index 01c66fc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/compat.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Handle reading and writing JSON in UTF-8, on Python 3 and 2.""" -import json -import sys - -if sys.version_info[0] >= 3: - # Python 3 - def write_json(obj, path, **kwargs): - with open(path, 'w', encoding='utf-8') as f: - json.dump(obj, f, **kwargs) - - def read_json(path): - with open(path, 'r', encoding='utf-8') as f: - return json.load(f) - -else: - # Python 2 - def write_json(obj, path, **kwargs): - with open(path, 'wb') as f: - json.dump(obj, f, encoding='utf-8', **kwargs) - - def read_json(path): - with open(path, 'rb') as f: - return json.load(f) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py deleted file mode 100644 index f7ac5f4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/envbuild.py +++ /dev/null @@ -1,158 +0,0 @@ -"""Build wheels/sdists by installing build deps to a temporary environment. -""" - -import os -import logging -from pip._vendor import pytoml -import shutil -from subprocess import check_call -import sys -from sysconfig import get_paths -from tempfile import mkdtemp - -from .wrappers import Pep517HookCaller - -log = logging.getLogger(__name__) - - -def _load_pyproject(source_dir): - with open(os.path.join(source_dir, 'pyproject.toml')) as f: - pyproject_data = pytoml.load(f) - buildsys = pyproject_data['build-system'] - return buildsys['requires'], buildsys['build-backend'] - - -class BuildEnvironment(object): - """Context manager to install build deps in a simple temporary environment - - Based on code I wrote for pip, which is MIT licensed. - """ - # 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. - - path = None - - def __init__(self, cleanup=True): - self._cleanup = cleanup - - def __enter__(self): - self.path = mkdtemp(prefix='pep517-build-env-') - log.info('Temporary build environment: %s', self.path) - - self.save_path = os.environ.get('PATH', None) - self.save_pythonpath = os.environ.get('PYTHONPATH', 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 - - if install_dirs['purelib'] == install_dirs['platlib']: - lib_dirs = install_dirs['purelib'] - else: - lib_dirs = install_dirs['purelib'] + os.pathsep + \ - install_dirs['platlib'] - if self.save_pythonpath: - os.environ['PYTHONPATH'] = lib_dirs + os.pathsep + \ - self.save_pythonpath - else: - os.environ['PYTHONPATH'] = lib_dirs - - return self - - def pip_install(self, reqs): - """Install dependencies into this env by calling pip in a subprocess""" - if not reqs: - return - log.info('Calling pip to install %s', reqs) - check_call([ - sys.executable, '-m', 'pip', 'install', '--ignore-installed', - '--prefix', self.path] + list(reqs)) - - def __exit__(self, exc_type, exc_val, exc_tb): - needs_cleanup = ( - self._cleanup and - self.path is not None and - os.path.isdir(self.path) - ) - if needs_cleanup: - shutil.rmtree(self.path) - - if self.save_path is None: - os.environ.pop('PATH', None) - else: - os.environ['PATH'] = self.save_path - - if self.save_pythonpath is None: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = self.save_pythonpath - - -def build_wheel(source_dir, wheel_dir, config_settings=None): - """Build a wheel from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str wheel_dir: Target directory to create wheel in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_wheel(config_settings) - env.pip_install(reqs) - return hooks.build_wheel(wheel_dir, config_settings) - - -def build_sdist(source_dir, sdist_dir, config_settings=None): - """Build an sdist from a source directory using PEP 517 hooks. - - :param str source_dir: Source directory containing pyproject.toml - :param str sdist_dir: Target directory to place sdist in - :param dict config_settings: Options to pass to build backend - - This is a blocking function which will run pip in a subprocess to install - build requirements. - """ - if config_settings is None: - config_settings = {} - requires, backend = _load_pyproject(source_dir) - hooks = Pep517HookCaller(source_dir, backend) - - with BuildEnvironment() as env: - env.pip_install(requires) - reqs = hooks.get_requires_for_build_sdist(config_settings) - env.pip_install(reqs) - return hooks.build_sdist(sdist_dir, config_settings) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py deleted file mode 100644 index b14b899..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pep517/wrappers.py +++ /dev/null @@ -1,163 +0,0 @@ -from contextlib import contextmanager -import os -from os.path import dirname, abspath, join as pjoin -import shutil -from subprocess import check_call -import sys -from tempfile import mkdtemp - -from . import compat - -_in_proc_script = pjoin(dirname(abspath(__file__)), '_in_process.py') - - -@contextmanager -def tempdir(): - td = mkdtemp() - try: - yield td - finally: - shutil.rmtree(td) - - -class BackendUnavailable(Exception): - """Will be raised if the backend cannot be imported in the hook process.""" - - -class UnsupportedOperation(Exception): - """May be raised by build_sdist if the backend indicates that it can't.""" - - -def default_subprocess_runner(cmd, cwd=None, extra_environ=None): - """The default method of calling the wrapper subprocess.""" - env = os.environ.copy() - if extra_environ: - env.update(extra_environ) - - check_call(cmd, cwd=cwd, env=env) - - -class Pep517HookCaller(object): - """A wrapper around a source directory to be built with a PEP 517 backend. - - source_dir : The path to the source directory, containing pyproject.toml. - backend : The build backend spec, as per PEP 517, from pyproject.toml. - """ - def __init__(self, source_dir, build_backend): - self.source_dir = abspath(source_dir) - self.build_backend = build_backend - self._subprocess_runner = default_subprocess_runner - - # TODO: Is this over-engineered? Maybe frontends only need to - # set this when creating the wrapper, not on every call. - @contextmanager - def subprocess_runner(self, runner): - prev = self._subprocess_runner - self._subprocess_runner = runner - yield - self._subprocess_runner = prev - - def get_requires_for_build_wheel(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["wheel >= 0.25", "setuptools"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_wheel', { - 'config_settings': config_settings - }) - - def prepare_metadata_for_build_wheel( - self, metadata_directory, config_settings=None): - """Prepare a *.dist-info folder with metadata for this project. - - Returns the name of the newly created folder. - - If the build backend defines a hook with this name, it will be called - in a subprocess. If not, the backend will be asked to build a wheel, - and the dist-info extracted from that. - """ - return self._call_hook('prepare_metadata_for_build_wheel', { - 'metadata_directory': abspath(metadata_directory), - 'config_settings': config_settings, - }) - - def build_wheel( - self, wheel_directory, config_settings=None, - metadata_directory=None): - """Build a wheel from this project. - - Returns the name of the newly created file. - - In general, this will call the 'build_wheel' hook in the backend. - However, if that was previously called by - 'prepare_metadata_for_build_wheel', and the same metadata_directory is - used, the previously built wheel will be copied to wheel_directory. - """ - if metadata_directory is not None: - metadata_directory = abspath(metadata_directory) - return self._call_hook('build_wheel', { - 'wheel_directory': abspath(wheel_directory), - 'config_settings': config_settings, - 'metadata_directory': metadata_directory, - }) - - def get_requires_for_build_sdist(self, config_settings=None): - """Identify packages required for building a wheel - - Returns a list of dependency specifications, e.g.: - ["setuptools >= 26"] - - This does not include requirements specified in pyproject.toml. - It returns the result of calling the equivalently named hook in a - subprocess. - """ - return self._call_hook('get_requires_for_build_sdist', { - 'config_settings': config_settings - }) - - def build_sdist(self, sdist_directory, config_settings=None): - """Build an sdist from this project. - - Returns the name of the newly created file. - - This calls the 'build_sdist' backend hook in a subprocess. - """ - return self._call_hook('build_sdist', { - 'sdist_directory': abspath(sdist_directory), - 'config_settings': config_settings, - }) - - def _call_hook(self, hook_name, kwargs): - # On Python 2, pytoml returns Unicode values (which is correct) but the - # environment passed to check_call needs to contain string values. We - # convert here by encoding using ASCII (the backend can only contain - # letters, digits and _, . and : characters, and will be used as a - # Python identifier, so non-ASCII content is wrong on Python 2 in - # any case). - if sys.version_info[0] == 2: - build_backend = self.build_backend.encode('ASCII') - else: - build_backend = self.build_backend - - with tempdir() as td: - compat.write_json({'kwargs': kwargs}, pjoin(td, 'input.json'), - indent=2) - - # Run the hook in a subprocess - self._subprocess_runner( - [sys.executable, _in_proc_script, hook_name, td], - cwd=self.source_dir, - extra_environ={'PEP517_BUILD_BACKEND': build_backend} - ) - - data = compat.read_json(pjoin(td, 'output.json')) - if data.get('unsupported'): - raise UnsupportedOperation - if data.get('no_backend'): - raise BackendUnavailable - return data['return_val'] diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py deleted file mode 100644 index 9c4fd8e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/__init__.py +++ /dev/null @@ -1,3171 +0,0 @@ -# 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 - -try: - FileExistsError -except NameError: - FileExistsError = OSError - -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') - - -__metaclass__ = type - - -if (3, 0) < sys.version_info < (3, 4): - raise RuntimeError("Python 3.4 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', - - # Warnings - 'PkgResourcesDeprecationWarning', - - # 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. - """ - from sysconfig 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: - """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). - """ - return ( - entry - for dist in self - for entry in dist.get_entry_map(group).values() - if name is None or name == entry.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: - """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.6'``); - 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_names = 'SourceFileLoader', 'SourcelessFileLoader', - for name in loader_names: - loader_cls = getattr(importlib_machinery, name, 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 - - # capture warnings due to #1111 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - 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))) - - new_path = sorted(orig_path, key=position_in_sys_path) - new_path = [_normalize_cached(p) for p in new_path] - - if isinstance(module.__path__, list): - module.__path__[:] = new_path - else: - module.__path__ = new_path - - -def declare_namespace(packageName): - """Declare that package 'packageName' is a namespace package""" - - _imp.acquire_lock() - try: - if packageName in _namespace_packages: - return - - path = sys.path - parent, _, _ = packageName.rpartition('.') - - if parent: - 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 or None, []).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(os.path.normpath(_cygwin_patch(filename)))) - - -def _cygwin_patch(filename): # pragma: nocover - """ - Contrary to POSIX 2008, on Cygwin, getcwd (3) contains - symlink components. Using - os.path.abspath() works around this limitation. A fix in os.getcwd() - would probably better, in Cygwin even more so, except - that this seems to be by design... - """ - return os.path.abspath(filename) if sys.platform == 'cygwin' else 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 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.", - PkgResourcesDeprecationWarning, - 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: - """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) - - def __dir__(self): - return list( - set(super(Distribution, self).__dir__()) - | set( - attr for attr in self._provider.__dir__() - if not attr.startswith('_') - ) - ) - - if not hasattr(object, '__dir__'): - # python 2.7 not supported - del __dir__ - - @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) - try: - mkdir(dirname, 0o755) - except FileExistsError: - pass - - -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()) - -class PkgResourcesDeprecationWarning(Warning): - """ - Base class for warning about deprecations in ``pkg_resources`` - - This class is not derived from ``DeprecationWarning``, and as such is - visible by default. - """ diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py deleted file mode 100644 index a2d3007..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pkg_resources/py31compat.py +++ /dev/null @@ -1,23 +0,0 @@ -import os -import errno -import sys - -from pip._vendor import six - - -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 = ( - six.PY2 or - (3, 4) <= sys.version_info < (3, 4, 1) -) -makedirs = _makedirs_31 if needs_makedirs else os.makedirs diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py deleted file mode 100644 index a41f65d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/__init__.py +++ /dev/null @@ -1,127 +0,0 @@ -# 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.4' - - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py deleted file mode 100644 index 025e61c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/bar.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- 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 - -import sys - -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): - if sys.platform.startswith('win'): - phases = (u' ', u'▌', u'█') - else: - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py deleted file mode 100644 index 6b45a1e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/counter.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py deleted file mode 100644 index 0cde44e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/helpers.py +++ /dev/null @@ -1,91 +0,0 @@ -# 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 and 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 and 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 and 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 and self.file.isatty() and self.hide_cursor: - print(HIDE_CURSOR, end='', file=self.file) - - def clearln(self): - if self.file and self.file.isatty(): - print('\r\x1b[K', end='', file=self.file) - - def writeln(self, line): - if self.file and self.file.isatty(): - self.clearln() - print(line, end='', file=self.file) - self.file.flush() - - def finish(self): - if self.file and 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py deleted file mode 100644 index 464c7b2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/progress/spinner.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py deleted file mode 100644 index bea4d9c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pyparsing.py +++ /dev/null @@ -1,6452 +0,0 @@ -#-*- coding: utf-8 -*- -# module pyparsing.py -# -# Copyright (c) 2003-2019 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 -``"<salutation>, <addressee>!"``), built up using :class:`Word`, -:class:`Literal`, and :class:`And` elements -(the :class:`'+'<ParserElement.__add__>` operators create :class:`And` expressions, -and the strings are auto-converted to :class:`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 :class:`ParseResults` object returned from -:class:`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 - - -Getting Started - ------------------ -Visit the classes :class:`ParserElement` and :class:`ParseResults` to -see the base classes that most other pyparsing -classes inherit from. Use the docstrings for examples of how to: - - - construct literal match expressions from :class:`Literal` and - :class:`CaselessLiteral` classes - - construct character word-group expressions using the :class:`Word` - class - - see how to create repetitive expressions using :class:`ZeroOrMore` - and :class:`OneOrMore` classes - - use :class:`'+'<And>`, :class:`'|'<MatchFirst>`, :class:`'^'<Or>`, - and :class:`'&'<Each>` operators to combine simple expressions into - more complex ones - - associate names with your parsed results using - :class:`ParserElement.setResultsName` - - find some helpful expression short-cuts like :class:`delimitedList` - and :class:`oneOf` - - find more useful common expressions in the :class:`pyparsing_common` - namespace class -""" - -__version__ = "2.3.1" -__versionTime__ = "09 Jan 2019 23:26 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: - # Python 3 - from itertools import filterfalse -except ImportError: - from itertools import ifilterfalse as filterfalse - -try: - from _thread import RLock -except ImportError: - from threading import RLock - -try: - # Python 3 - from collections.abc import Iterable - from collections.abc import MutableMapping -except ImportError: - # Python 2.7 - from collections import Iterable - from collections import MutableMapping - -try: - from collections import OrderedDict as _OrderedDict -except ImportError: - try: - from ordereddict import OrderedDict as _OrderedDict - except ImportError: - _OrderedDict = None - -try: - from types import SimpleNamespace -except ImportError: - class SimpleNamespace: pass - - -#~ 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', -'PrecededBy', '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', 'Char', -'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', 'pyparsing_unicode', 'unicode_set', -] - -system_version = tuple(sys.version_info)[:3] -PY_3 = system_version[0] == 3 -if PY_3: - _MAX_INT = sys.maxsize - basestring = str - unichr = chr - unicode = str - _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 - -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 - - """ - - @staticmethod - def explain(exc, depth=16): - """ - Method to take an exception and translate the Python internal traceback into a list - of the pyparsing expressions that caused the exception to be raised. - - Parameters: - - - exc - exception raised during parsing (need not be a ParseException, in support - of Python exceptions that might be raised in a parse action) - - depth (default=16) - number of levels back in the stack trace to list expression - and function names; if None, the full stack trace names will be listed; if 0, only - the failing input line, marker, and exception string will be shown - - Returns a multi-line string listing the ParserElements and/or function names in the - exception's stack trace. - - Note: the diagnostic output will include string representations of the expressions - that failed to parse. These representations will be more helpful if you use `setName` to - give identifiable names to your expressions. Otherwise they will use the default string - forms, which may be cryptic to read. - - explain() is only supported under Python 3. - """ - import inspect - - if depth is None: - depth = sys.getrecursionlimit() - ret = [] - if isinstance(exc, ParseBaseException): - ret.append(exc.line) - ret.append(' ' * (exc.col - 1) + '^') - ret.append("{0}: {1}".format(type(exc).__name__, exc)) - - if depth > 0: - callers = inspect.getinnerframes(exc.__traceback__, context=depth) - seen = set() - for i, ff in enumerate(callers[-depth:]): - frm = ff.frame - - f_self = frm.f_locals.get('self', None) - if isinstance(f_self, ParserElement): - if frm.f_code.co_name not in ('parseImpl', '_parseNoCache'): - continue - if f_self in seen: - continue - seen.add(f_self) - - self_type = type(f_self) - ret.append("{0}.{1} - {2}".format(self_type.__module__, - self_type.__name__, - f_self)) - elif f_self is not None: - self_type = type(f_self) - ret.append("{0}.{1}".format(self_type.__module__, - self_type.__name__)) - else: - code = frm.f_code - if code.co_name in ('wrapper', '<module>'): - continue - - ret.append("{0}".format(code.co_name)) - - depth -= 1 - if not depth: - break - - return '\n'.join(ret) - - -class ParseFatalException(ParseBaseException): - """user-throwable exception thrown when inconsistent parse content - is found; stops all parsing immediately""" - pass - -class ParseSyntaxException(ParseFatalException): - """just like :class:`ParseFatalException`, but thrown internally - when an :class:`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 :class:`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 (``len(results)``) - - by list index (``results[0], results[1]``, etc.) - - by attribute (``results.<resultsName>`` - see :class:`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(ParseResults(toklist.__toklist), 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.""" - - values = _itervalues - """Returns an iterator of all named result values.""" - - items = _iteritems - """Returns an iterator of all named result key-value tuples.""" - - 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= ``last``). - Supports both ``list`` and ``dict`` semantics for ``pop()``. If - passed no argument or an integer argument, it will use ``list`` - semantics and pop tokens from the list of parsed tokens. If passed - a non-integer argument (most likely a string), it will use ``dict`` - semantics and pop the corresponding value from any defined results - names. A second default return value argument is supported, just as in - ``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 ``defaultValue`` or ``None`` if no - ``defaultValue`` is specified. - - Similar to ``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 ``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 :class:`ParseResults` object. - """ - ret = ParseResults( self.__toklist ) - ret.__tokdict = dict(self.__tokdict.items()) - 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 :class:`ParseResults`. Accepts an optional ``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 - `pprint <https://docs.python.org/3/library/pprint.html>`_ module. - Accepts additional positional or keyword args as defined for - `pprint.pprint <https://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())) - -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 - :class:`ParserElement.parseString` for more - information on parsing strings containing ``<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 :class:`ParserElement.parseString` - for more information on parsing strings containing ``<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[:2]] - def extract_tb(tb, limit=0): - frames = traceback.extract_tb(tb, limit=limit) - frame_summary = frames[-1] - return [frame_summary[:2]] - 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 = set(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 :class:`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 ``expr.copy()`` is just ``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 :class:`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, - ``expr("name")`` in place of ``expr.setResultsName("name")`` - - see :class:`__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 ``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 ``fn(s,loc,toks)`` , - ``fn(loc,toks)`` , ``fn(toks)`` , or just ``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 :class:`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= ``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 :class:`parseString for more - information on parsing strings containing ``<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 :class:`setParseAction`. - - See examples in :class:`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 - :class:`setParseAction` for function call signatures. Unlike ``setParseAction``, - functions passed to ``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: - fn = _trim_arity(fn) - def pa(s,l,t): - if not bool(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 - ``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 :class:`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 preloc >= 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: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - 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: - try: - tokens = fn( instring, tokensStart, retTokens ) - except IndexError as parse_action_exc: - exc = ParseException("exception raised in parse action") - exc.__cause__ = parse_action_exc - raise exc - - if tokens is not None and tokens is not retTokens: - 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= ``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 :class:`ParserElement.enablePackrat`. - For best results, call ``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 ``parseAll`` to True (equivalent to ending - the grammar with ``StringEnd()``). - - Note: ``parseString`` implicitly calls ``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 ``loc`` argument to index into the - string being parsed, you can ensure you have a consistent view of the input - string by: - - - calling ``parseWithTabs`` on your grammar before calling ``parseString`` - (see :class:`parseWithTabs`) - - define your parse action using the full ``(s,loc,toks)`` signature, and - reference the input string using the parse action's ``s`` argument - - explictly expand the tabs in your input string before calling - ``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 - ``maxMatches`` argument, to clip scanning after 'n' matches are found. If - ``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 :class:`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 :class:`scanString`, to modify matching text with modified tokens that may - be returned from a parse action. To use ``transformString``, define a grammar and - attach a parse action to it that modifies the returned token list. - Invoking ``transformString()`` on a target string will then scan for matches, - and replace the matched text patterns according to the logic in the parse - action. ``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 :class:`scanString`, simplifying the access to the tokens found - to match the given parse expression. May be called with optional - ``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 ``maxsplit`` argument, to limit the number of splits; - and the optional ``includeSeparators`` argument (default= ``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 :class:`And`. Adding strings to a ParserElement - converts them to :class:`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 :class:`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 :class:`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 :class:`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 ``expr * 3`` in place of - ``expr + expr + expr``. Expressions may also me multiplied by a 2-integer - tuple, similar to ``{min,max}`` multipliers in regular expressions. Tuples - may also include ``None`` as in: - - ``expr*(n,None)`` or ``expr*(n,)`` is equivalent - to ``expr*n + ZeroOrMore(expr)`` - (read as "at least n instances of ``expr``") - - ``expr*(None,n)`` is equivalent to ``expr*(0,n)`` - (read as "0 to n instances of ``expr``") - - ``expr*(None,None)`` is equivalent to ``ZeroOrMore(expr)`` - - ``expr*(1,None)`` is equivalent to ``OneOrMore(expr)`` - - Note that ``expr*(None,n)`` does not raise an exception if - more than n exprs exist in the input stream; that is, - ``expr*(None,n)`` does not enforce a maximum number of expr - occurrences. If this behavior is desired, then write - ``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 :class:`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 :class:`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 :class:`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 :class:`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 :class:`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 :class:`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 :class:`NotAny` - """ - return NotAny( self ) - - def __call__(self, name=None): - """ - Shortcut for :class:`setResultsName`, with ``listAllMatches=False``. - - If ``name`` is given with a trailing ``'*'`` character, then ``listAllMatches`` will be - passed as ``True``. - - If ``name` is omitted, same as calling :class:`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 :class:`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 - :class:`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 ``<TAB>``s to spaces before parsing the input string. - Must be called before ``parseString`` when the input grammar contains elements that - match ``<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 ``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 :class:`setDebugActions`. Prior to attempting - to match the ``wd`` expression, the debugging message ``"Match <exprname> at loc <n>(<line>,<col>)"`` - is shown. Then if the parse succeeds, a ``"Matched"`` message is shown, or an ``"Exception raised"`` - message is shown. Also note the use of :class:`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 :class:`Word` expression without calling ``setName`` is ``"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= ``True``) - flag to pass to :class:`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, postParse=None): - """ - 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= ``True``) - flag to pass to :class:`parseString` when running tests - - comment - (default= ``'#'``) - expression for indicating embedded comments in the test - string; pass None to disable comment filtering - - fullDump - (default= ``True``) - dump results as list followed by results names in nested outline; - if False, only dump nested list - - printResults - (default= ``True``) prints test output to stdout - - failureTests - (default= ``False``) indicates if these tests are expected to fail parsing - - postParse - (default= ``None``) optional callback for successful parse results; called as - `fn(test_string, parse_results)` and returns a string to be added to the test output - - Returns: a (success, results) tuple, where success indicates that all tests succeeded - (or failed if ``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: - # convert newline marks to actual newlines, and strip leading BOM if present - t = t.replace(r'\n','\n').lstrip('\ufeff') - result = self.parseString(t, parseAll=parseAll) - out.append(result.dump(full=fullDump)) - success = success and not failureTests - if postParse is not None: - try: - pp_value = postParse(t, result) - if pp_value is not None: - out.append(str(pp_value)) - except Exception as e: - out.append("{0} failed: {1}: {2}".format(postParse.__name__, type(e).__name__, e)) - 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 :class:`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 :class:`CaselessLiteral`. - - For keyword matching (force word break before and after the matched string), - use :class:`Keyword` or :class:`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 :class:`Literal`: - - - ``Literal("if")`` will match the leading ``'if'`` in - ``'ifAndOnlyIf'``. - - ``Keyword("if")`` will not; it will only match the leading - ``'if'`` in ``'if x=1'``, or ``'if(y==2)'`` - - Accepts two optional constructor arguments in addition to the - keyword string: - - - ``identChars`` is a string of characters that would be valid - identifier characters, defaulting to all alphanumerics + "_" and - "$" - - ``caseless`` allows case-insensitive matching, default is ``False``. - - Example:: - - Keyword("start").parseString("start") # -> ['start'] - Keyword("start").parseString("starting") # -> Exception - - For case-insensitive matching, use :class:`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 :class:`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 :class:`Keyword`. - - Example:: - - OneOrMore(CaselessKeyword("CMD")).parseString("cmd CMD Cmd10") # -> ['CMD', 'CMD'] - - (Contrast with example for :class:`CaselessLiteral`.) - """ - def __init__( self, matchString, identChars=None ): - super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) - -class CloseMatch(Token): - """A variation on :class:`Literal` which matches "close" matches, - that is, strings with at most 'n' mismatching characters. - :class:`CloseMatch` takes parameters: - - - ``match_string`` - string to be matched - - ``maxMismatches`` - (``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: - - - ``mismatches`` - a list of the positions within the - match_string where mismatches were found - - ``original`` - the original match_string used to compare - against the input string - - If ``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 ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``exact`` are 0, meaning no maximum or exact - length restriction. An optional ``excludeChars`` parameter can - list characters that might be found in the input ``bodyChars`` - string; useful to define a word of all printables except for one or - two characters, for instance. - - :class:`srange` is useful for defining custom character set strings - for defining ``Word`` expressions, using range notation from - regular expression character sets. - - A common mistake is to use :class:`Word` to match a specific literal - string, as in ``Word("Address")``. Remember that :class:`Word` - uses the string argument to define *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 :class:`Literal` or :class:`Keyword`. - - pyparsing includes helper strings for building Words: - - - :class:`alphas` - - :class:`nums` - - :class:`alphanums` - - :class:`hexnums` - - :class:`alphas8bit` (alphabetic characters in ASCII range 128-255 - - accented, tilded, umlauted, etc.) - - :class:`punc8bit` (non-alphabetic characters in ASCII range - 128-255 - currency, symbols, superscripts, diacriticals, etc.) - - :class:`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 Char(Word): - """A short-cut class for defining ``Word(characters, exact=1)``, - when defining a match of any single character in a string of - characters. - """ - def __init__(self, charset): - super(Char, self).__init__(charset, exact=1) - self.reString = "[%s]" % _escapeRegexRangeChars(self.initCharsOrig) - self.re = re.compile( self.reString ) - - -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 stdlib Python `re module <https://docs.python.org/3/library/re.html>`_. - If the given regex contains named groups (defined using ``(?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: https://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?{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, asGroupList=False, asMatch=False): - """The parameters ``pattern`` and ``flags`` are passed - to the ``re.compile()`` function as-is. See the Python - `re module <https://docs.python.org/3/library/re.html>`_ 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 - self.asGroupList = asGroupList - self.asMatch = asMatch - - 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() - if self.asMatch: - ret = result - elif self.asGroupList: - ret = result.groups() - else: - ret = ParseResults(result.group()) - d = result.groupdict() - if d: - for k, v in d.items(): - ret[k] = v - 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 - - def sub(self, repl): - """ - Return Regex with an attached parse action to transform the parsed - result as if called using `re.sub(expr, repl, string) <https://docs.python.org/3/library/re.html#re.sub>`_. - - Example:: - - make_html = Regex(r"(\w+):(.*?):").sub(r"<\1>\2</\1>") - print(make_html.transformString("h1:main title:")) - # prints "<h1>main title</h1>" - """ - if self.asGroupList: - warnings.warn("cannot use sub() with Regex(asGroupList=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch and callable(repl): - warnings.warn("cannot use sub() with a callable with Regex(asMatch=True)", - SyntaxWarning, stacklevel=2) - raise SyntaxError() - - if self.asMatch: - def pa(tokens): - return tokens[0].expand(repl) - else: - def pa(tokens): - return self.re.sub(repl, tokens[0]) - return self.addParseAction(pa) - -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= ``None`` ) - - escQuote - special quote sequence to escape an embedded quote - string (such as SQL's ``""`` to escape an embedded ``"``) - (default= ``None`` ) - - multiline - boolean indicating whether quotes can span - multiple lines (default= ``False`` ) - - unquoteResults - boolean indicating whether the matched text - should be unquoted (default= ``True`` ) - - endQuoteChar - string of one or more characters defining the - end of the quote delimited string (default= ``None`` => same as - quoteChar) - - convertWhitespaceEscapes - convert escaped whitespace - (``'\t'``, ``'\n'``, etc.) to actual whitespace - (default= ``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 *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 ``min`` is - 1 (a minimum value < 1 is not valid); the default values for - ``max`` and ``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 ``" \\t\\r\\n"``. Also takes optional ``min``, - ``max``, and ``exact`` arguments, as defined for the - :class:`Word` class. - """ - whiteStrs = { - ' ' : '<SP>', - '\t': '<TAB>', - '\n': '<LF>', - '\r': '<CR>', - '\f': '<FF>', - 'u\00A0': '<NBSP>', - 'u\1680': '<OGHAM_SPACE_MARK>', - 'u\180E': '<MONGOLIAN_VOWEL_SEPARATOR>', - 'u\2000': '<EN_QUAD>', - 'u\2001': '<EM_QUAD>', - 'u\2002': '<EN_SPACE>', - 'u\2003': '<EM_SPACE>', - 'u\2004': '<THREE-PER-EM_SPACE>', - 'u\2005': '<FOUR-PER-EM_SPACE>', - 'u\2006': '<SIX-PER-EM_SPACE>', - 'u\2007': '<FIGURE_SPACE>', - 'u\2008': '<PUNCTUATION_SPACE>', - 'u\2009': '<THIN_SPACE>', - 'u\200A': '<HAIR_SPACE>', - 'u\200B': '<ZERO_WIDTH_SPACE>', - 'u\202F': '<NNBSP>', - 'u\205F': '<MMSP>', - 'u\3000': '<IDEOGRAPHIC_SPACE>', - } - 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 - ``wordChars`` (default= ``printables``). To emulate the - ``\b`` behavior of regular expressions, use - ``WordStart(alphanums)``. ``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 ``wordChars`` - (default= ``printables``). To emulate the ``\b`` behavior of - regular expressions, use ``WordEnd(alphanums)``. ``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, 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 ``leaveWhitespace`` defined in base class, and also invokes ``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 :class:`ParseExpression` s to be found in the given order. - Expressions may be separated by whitespace. - May be constructed using the ``'+'`` operator. - May also be constructed using the ``'-'`` 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 streamline(self): - super(And, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - 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 :class:`ParseExpression` is found. If - two expressions match, the expression that matches the longest - string will be used. May be constructed using the ``'^'`` - 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 streamline(self): - super(Or, self).streamline() - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - 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 :class:`ParseExpression` is found. If - two expressions match, the first one listed is the one that will - match. May be constructed using the ``'|'`` 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) - # self.saveAsList = any(e.saveAsList for e in self.exprs) - else: - self.mayReturnEmpty = True - - def streamline(self): - super(MatchFirst, self).streamline() - self.saveAsList = any(e.saveAsList for e in self.exprs) - return self - - 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 :class:`ParseExpression` s to be found, but in - any order. Expressions may be separated by whitespace. - - May be constructed using the ``'&'`` 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 - self.saveAsList = True - - def streamline(self): - super(Each, self).streamline() - self.mayReturnEmpty = all(e.mayReturnEmpty for e in self.exprs) - return self - - 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 :class:`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. - ``FollowedBy`` does *not* advance the parsing position within - the input string, it only verifies that the specified parse - expression matches at the current position. ``FollowedBy`` - always returns a null token list. If any results names are defined - in the lookahead expression, those *will* be returned for access by - name. - - 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 ): - _, ret = self.expr._parse(instring, loc, doActions=doActions) - del ret[:] - return loc, ret - - -class PrecededBy(ParseElementEnhance): - """Lookbehind matching of the given parse expression. - ``PrecededBy`` does not advance the parsing position within the - input string, it only verifies that the specified parse expression - matches prior to the current position. ``PrecededBy`` always - returns a null token list, but if a results name is defined on the - given expression, it is returned. - - Parameters: - - - expr - expression that must match prior to the current parse - location - - retreat - (default= ``None``) - (int) maximum number of characters - to lookbehind prior to the current parse location - - If the lookbehind expression is a string, Literal, Keyword, or - a Word or CharsNotIn with a specified exact or maximum length, then - the retreat parameter is not required. Otherwise, retreat must be - specified to give a maximum number of characters to look back from - the current parse position for a lookbehind match. - - Example:: - - # VB-style variable names with type prefixes - int_var = PrecededBy("#") + pyparsing_common.identifier - str_var = PrecededBy("$") + pyparsing_common.identifier - - """ - def __init__(self, expr, retreat=None): - super(PrecededBy, self).__init__(expr) - self.expr = self.expr().leaveWhitespace() - self.mayReturnEmpty = True - self.mayIndexError = False - self.exact = False - if isinstance(expr, str): - retreat = len(expr) - self.exact = True - elif isinstance(expr, (Literal, Keyword)): - retreat = expr.matchLen - self.exact = True - elif isinstance(expr, (Word, CharsNotIn)) and expr.maxLen != _MAX_INT: - retreat = expr.maxLen - self.exact = True - elif isinstance(expr, _PositionToken): - retreat = 0 - self.exact = True - self.retreat = retreat - self.errmsg = "not preceded by " + str(expr) - self.skipWhitespace = False - - def parseImpl(self, instring, loc=0, doActions=True): - if self.exact: - if loc < self.retreat: - raise ParseException(instring, loc, self.errmsg) - start = loc - self.retreat - _, ret = self.expr._parse(instring, start) - else: - # retreat specified a maximum lookbehind window, iterate - test_expr = self.expr + StringEnd() - instring_slice = instring[:loc] - last_expr = ParseException(instring, loc, self.errmsg) - for offset in range(1, min(loc, self.retreat+1)): - try: - _, ret = test_expr._parse(instring_slice, loc-offset) - except ParseBaseException as pbe: - last_expr = pbe - else: - break - else: - raise last_expr - # return empty list of tokens, but preserve any defined results names - del ret[:] - return loc, ret - - -class NotAny(ParseElementEnhance): - """Lookahead to disallow matching with the given parse expression. - ``NotAny`` does *not* advance the parsing position within the - input string, it only verifies that the specified parse expression - does *not* match at the current position. Also, ``NotAny`` does - *not* skip over leading whitespace. ``NotAny`` always returns - a null token list. May be constructed using the '~' operator. - - Example:: - - AND, OR, NOT = map(CaselessKeyword, "AND OR NOT".split()) - - # take care not to mistake keywords for identifiers - ident = ~(AND | OR | NOT) + Word(alphas) - boolean_term = Optional(NOT) + ident - - # very crude boolean expression - to support parenthesis groups and - # operation hierarchy, use infixNotation - boolean_expr = boolean_term + ZeroOrMore((AND | OR) + boolean_term) - - # integers that are followed by "." are actually floats - integer = Word(nums) + ~Char(".") - """ - 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= ``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= ``None``) - expression for a terminating sentinel - (only required if the sentinel would ordinarily match the repetition - expression) - - Example: similar to :class:`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= ``False``) if True, the target expression is also parsed - (the skipped text and target expression are returned as a 2-element list). - - ignore - (default= ``None``) used to define grammars (typically quoted strings and - comments) that might contain false matches to the target expression - - failOn - (default= ``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.saveAsList = 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 ``Forward`` - variable using the '<<' operator. - - Note: take care when assigning to ``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 ``Forward``:: - - fwdExpr << (a | b | c) - - Converting to use the '<<=' operator instead will avoid this problem. - - See :class:`ParseResults.pprint` for an example of a recursive - parser created using ``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 :class:`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 - ``'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 :class:`ZeroOrMore` and :class:`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 = expr.saveAsList - - 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 :class:`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 :class:`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 - ``">> entering method-name(line:<current_source_line>, <parse_location>, <matched_tokens>)"``. - When the parse action completes, the decorator will print - ``"<<"`` 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 ``combine=True`` in the constructor. If - ``combine`` is set to ``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 ``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 ``"1:1"``, but not ``"1:2"``. Because this - matches a previous literal, will also match the leading - ``"1:1"`` in ``"1:10"``. If this is not desired, use - :class:`matchPreviousExpr`. Do *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 ``"1:1"``, but not ``"1:2"``. Because this - matches by expressions, will *not* match the leading ``"1:1"`` - in ``"1:10"``; the expressions are evaluated first, and then - compared, so ``"1"`` is compared with ``"10"``. Do *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 :class:`MatchFirst` for best performance. - - Parameters: - - - strs - a string of space-delimited literals, or a collection of - string literals - - caseless - (default= ``False``) - treat all literals as - caseless - - useRegex - (default= ``True``) - as an optimization, will - generate a Regex object; otherwise, will generate - a :class:`MatchFirst` object (if ``caseless=True``, or if - creating a :class:`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, 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 :class:`Dict`, :class:`ZeroOrMore`, and - :class:`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 :class:`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(OneOrMore(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 ``asString`` argument is passed as - ``False``, then the return value is - a :class:`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 - :class:`originalTextFor` contains expressions with defined - results names, you must set ``asString`` to ``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 ``<TAB>`` characters, you - may want to call :class:`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 | CharsNotIn(r'\]', exact=1) -_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 ``\-`` - or ``\]``) - - an escaped hex character with a leading ``'\x'`` - (``\x21``, which is a ``'!'`` character) (``\0x##`` - is also supported for backwards compatibility) - - an escaped octal character with a leading ``'\0'`` - (``\041``, which is a ``'!'`` character) - - a range of any of the above, separated by a dash (``'a-z'``, - etc.) - - any combination of the above (``'aeiouy'``, - ``'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 - :class:`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 - ``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 :class:`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 :class:`pyparsing_common.upcaseTokens`""" - -downcaseTokens = tokenMap(lambda t: _ustr(t).lower()) -"""(Deprecated) Helper parse action to convert tokens to lower case. -Deprecated in favor of :class:`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="https://github.com/pyparsing/pyparsing/wiki">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 -> https://github.com/pyparsing/pyparsing/wiki - """ - 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 :class:`makeHTMLTags` - """ - return _makeTags( tagStr, True ) - -def withAttribute(*args,**attrDict): - """Helper to create a validating parse action to be used with start - tags created with :class:`makeXMLTags` or - :class:`makeHTMLTags`. Use ``withAttribute`` to qualify - a starting tag with a required attribute value, to avoid false - matches on common tags such as ``<TD>`` or ``<DIV>``. - - Call ``withAttribute`` with a series of attribute names and - values. Specify the list of filter attributes names and values as: - - - keyword arguments, as in ``(align="right")``, or - - as an explicit dict with ``**`` operator, when an attribute - name is also a Python reserved word, as in ``**{"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 ``class`` (with or without a namespace), use - :class:`withClass`. - - To verify that the attribute exists, but without specifying a value, - pass ``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 :class:`withAttribute` when - matching on a div class - made difficult because ``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 = SimpleNamespace() -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 - :class:`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 - ``opAssoc.RIGHT`` and ``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 - ``setParseAction(*fn)`` - (:class:`ParserElement.setParseAction`) - - lpar - expression for matching left-parentheses - (default= ``Suppress('(')``) - - rpar - expression for matching right-parentheses - (default= ``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]]] - """ - # captive version of FollowedBy that does not do parse actions or capture results names - class _FB(FollowedBy): - def parseImpl(self, instring, loc, doActions=True): - self.expr.tryParse(instring, loc) - return loc, [] - - 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 = _FB(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) - else: - matchExpr = _FB(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) - elif arity == 3: - matchExpr = _FB(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 = _FB(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) - elif arity == 2: - if opExpr is not None: - matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) - else: - matchExpr = _FB(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) - elif arity == 3: - matchExpr = _FB(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 :class:`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= ``"("``); can also be a pyparsing expression - - closer - closing character for a nested list - (default= ``")"``); can also be a pyparsing expression - - content - expression for items within the nested lists - (default= ``None``) - - ignoreExpr - expression for ignoring opening and closing - delimiters (default= :class:`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 ``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 - :class:`Or` or :class:`MatchFirst`. The default is - :class:`quotedString`, but if no expressions are to be ignored, then - pass ``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= ``True``) - - A valid block must contain at least one ``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 ``/* ... */``" - -htmlComment = Regex(r"<!--[\s\S]*?-->").setName("HTML comment") -"Comment of the form ``<!-- ... -->``" - -restOfLine = Regex(r".*").leaveWhitespace().setName("rest of line") -dblSlashComment = Regex(r"//(?:\\\n|[^\n])*").setName("// comment") -"Comment of the form ``// ... (to end of line)``" - -cppStyleComment = Combine(Regex(r"/\*(?:[^*]|\*(?!/))*") + '*/'| dblSlashComment).setName("C++ style comment") -"Comment of either form :class:`cStyleComment` or :class:`dblSlashComment`" - -javaStyleComment = cppStyleComment -"Same as :class:`cppStyleComment`" - -pythonStyleComment = Regex(r"#.*").setName("Python style comment") -"Comment of the form ``# ... (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 :class:`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 (:class:`integers<integer>`, :class:`reals<real>`, - :class:`scientific notation<sci_real>`) - - common :class:`programming identifiers<identifier>` - - network addresses (:class:`MAC<mac_address>`, - :class:`IPv4<ipv4_address>`, :class:`IPv6<ipv6_address>`) - - ISO8601 :class:`dates<iso8601_date>` and - :class:`datetime<iso8601_datetime>` - - :class:`UUID<uuid>` - - :class:`comma-separated list<comma_separated_list>` - - Parse actions: - - - :class:`convertToInteger` - - :class:`convertToFloat` - - :class:`convertToDate` - - :class:`convertToDatetime` - - :class:`stripHTMLTags` - - :class:`upcaseTokens` - - :class:`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 (``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= ``"%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= ``"%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 (``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 (``yyyy-mm-ddThh:mm:ss.s(Z|+-00:00)``) - trailing seconds, milliseconds, and timezone optional; accepts separating ``'T'`` or ``' '``" - - uuid = Regex(r'[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}').setName("UUID") - "UUID (``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="https://github.com/pyparsing/pyparsing/wiki">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) - - Prints:: - - 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.""" - - -class _lazyclassproperty(object): - def __init__(self, fn): - self.fn = fn - self.__doc__ = fn.__doc__ - self.__name__ = fn.__name__ - - def __get__(self, obj, cls): - if cls is None: - cls = type(obj) - if not hasattr(cls, '_intern') or any(cls._intern is getattr(superclass, '_intern', []) for superclass in cls.__mro__[1:]): - cls._intern = {} - attrname = self.fn.__name__ - if attrname not in cls._intern: - cls._intern[attrname] = self.fn(cls) - return cls._intern[attrname] - - -class unicode_set(object): - """ - A set of Unicode characters, for language-specific strings for - ``alphas``, ``nums``, ``alphanums``, and ``printables``. - A unicode_set is defined by a list of ranges in the Unicode character - set, in a class attribute ``_ranges``, such as:: - - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - A unicode set can also be defined using multiple inheritance of other unicode sets:: - - class CJK(Chinese, Japanese, Korean): - pass - """ - _ranges = [] - - @classmethod - def _get_chars_for_ranges(cls): - ret = [] - for cc in cls.__mro__: - if cc is unicode_set: - break - for rr in cc._ranges: - ret.extend(range(rr[0], rr[-1]+1)) - return [unichr(c) for c in sorted(set(ret))] - - @_lazyclassproperty - def printables(cls): - "all non-whitespace characters in this range" - return u''.join(filterfalse(unicode.isspace, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphas(cls): - "all alphabetic characters in this range" - return u''.join(filter(unicode.isalpha, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def nums(cls): - "all numeric digit characters in this range" - return u''.join(filter(unicode.isdigit, cls._get_chars_for_ranges())) - - @_lazyclassproperty - def alphanums(cls): - "all alphanumeric characters in this range" - return cls.alphas + cls.nums - - -class pyparsing_unicode(unicode_set): - """ - A namespace class for defining common language unicode_sets. - """ - _ranges = [(32, sys.maxunicode)] - - class Latin1(unicode_set): - "Unicode set for Latin-1 Unicode Character Range" - _ranges = [(0x0020, 0x007e), (0x00a0, 0x00ff),] - - class LatinA(unicode_set): - "Unicode set for Latin-A Unicode Character Range" - _ranges = [(0x0100, 0x017f),] - - class LatinB(unicode_set): - "Unicode set for Latin-B Unicode Character Range" - _ranges = [(0x0180, 0x024f),] - - class Greek(unicode_set): - "Unicode set for Greek Unicode Character Ranges" - _ranges = [ - (0x0370, 0x03ff), (0x1f00, 0x1f15), (0x1f18, 0x1f1d), (0x1f20, 0x1f45), (0x1f48, 0x1f4d), - (0x1f50, 0x1f57), (0x1f59,), (0x1f5b,), (0x1f5d,), (0x1f5f, 0x1f7d), (0x1f80, 0x1fb4), (0x1fb6, 0x1fc4), - (0x1fc6, 0x1fd3), (0x1fd6, 0x1fdb), (0x1fdd, 0x1fef), (0x1ff2, 0x1ff4), (0x1ff6, 0x1ffe), - ] - - class Cyrillic(unicode_set): - "Unicode set for Cyrillic Unicode Character Range" - _ranges = [(0x0400, 0x04ff)] - - class Chinese(unicode_set): - "Unicode set for Chinese Unicode Character Range" - _ranges = [(0x4e00, 0x9fff), (0x3000, 0x303f), ] - - class Japanese(unicode_set): - "Unicode set for Japanese Unicode Character Range, combining Kanji, Hiragana, and Katakana ranges" - _ranges = [ ] - - class Kanji(unicode_set): - "Unicode set for Kanji Unicode Character Range" - _ranges = [(0x4E00, 0x9Fbf), (0x3000, 0x303f), ] - - class Hiragana(unicode_set): - "Unicode set for Hiragana Unicode Character Range" - _ranges = [(0x3040, 0x309f), ] - - class Katakana(unicode_set): - "Unicode set for Katakana Unicode Character Range" - _ranges = [(0x30a0, 0x30ff), ] - - class Korean(unicode_set): - "Unicode set for Korean Unicode Character Range" - _ranges = [(0xac00, 0xd7af), (0x1100, 0x11ff), (0x3130, 0x318f), (0xa960, 0xa97f), (0xd7b0, 0xd7ff), (0x3000, 0x303f), ] - - class CJK(Chinese, Japanese, Korean): - "Unicode set for combined Chinese, Japanese, and Korean (CJK) Unicode Character Range" - pass - - class Thai(unicode_set): - "Unicode set for Thai Unicode Character Range" - _ranges = [(0x0e01, 0x0e3a), (0x0e3f, 0x0e5b), ] - - class Arabic(unicode_set): - "Unicode set for Arabic Unicode Character Range" - _ranges = [(0x0600, 0x061b), (0x061e, 0x06ff), (0x0700, 0x077f), ] - - class Hebrew(unicode_set): - "Unicode set for Hebrew Unicode Character Range" - _ranges = [(0x0590, 0x05ff), ] - - class Devanagari(unicode_set): - "Unicode set for Devanagari Unicode Character Range" - _ranges = [(0x0900, 0x097f), (0xa8e0, 0xa8ff)] - -pyparsing_unicode.Japanese._ranges = (pyparsing_unicode.Japanese.Kanji._ranges - + pyparsing_unicode.Japanese.Hiragana._ranges - + pyparsing_unicode.Japanese.Katakana._ranges) - -# define ranges in language character sets -if PY_3: - setattr(pyparsing_unicode, "العربية", pyparsing_unicode.Arabic) - setattr(pyparsing_unicode, "中文", pyparsing_unicode.Chinese) - setattr(pyparsing_unicode, "кириллица", pyparsing_unicode.Cyrillic) - setattr(pyparsing_unicode, "Ελληνικά", pyparsing_unicode.Greek) - setattr(pyparsing_unicode, "עִברִית", pyparsing_unicode.Hebrew) - setattr(pyparsing_unicode, "日本語", pyparsing_unicode.Japanese) - setattr(pyparsing_unicode.Japanese, "漢字", pyparsing_unicode.Japanese.Kanji) - setattr(pyparsing_unicode.Japanese, "カタカナ", pyparsing_unicode.Japanese.Katakana) - setattr(pyparsing_unicode.Japanese, "ひらがな", pyparsing_unicode.Japanese.Hiragana) - setattr(pyparsing_unicode, "한국어", pyparsing_unicode.Korean) - setattr(pyparsing_unicode, "ไทย", pyparsing_unicode.Thai) - setattr(pyparsing_unicode, "देवनागरी", pyparsing_unicode.Devanagari) - - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py deleted file mode 100644 index 8ed060f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import TomlError -from .parser import load, loads -from .test import translate_to_test -from .writer import dump, dumps \ No newline at end of file diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py deleted file mode 100644 index c182734..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/core.py +++ /dev/null @@ -1,13 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py deleted file mode 100644 index 3493aa6..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/parser.py +++ /dev/null @@ -1,341 +0,0 @@ -import string, re, sys, datetime -from .core import TomlError -from .utils import rfc3339_re, parse_rfc3339_re - -if sys.version_info[0] == 2: - _chr = unichr -else: - _chr = chr - -def load(fin, translate=lambda t, x, v: v, object_pairs_hook=dict): - return loads(fin.read(), translate=translate, object_pairs_hook=object_pairs_hook, filename=getattr(fin, 'name', repr(fin))) - -def loads(s, filename='<string>', translate=lambda t, x, v: v, object_pairs_hook=dict): - if isinstance(s, bytes): - s = s.decode('utf-8') - - s = s.replace('\r\n', '\n') - - root = object_pairs_hook() - tables = object_pairs_hook() - scope = root - - src = _Source(s, filename=filename) - ast = _p_toml(src, object_pairs_hook=object_pairs_hook) - - def error(msg): - raise TomlError(msg, pos[0], pos[1], filename) - - def process_value(v, object_pairs_hook): - 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, object_pairs_hook=object_pairs_hook) for item in value] - elif kind == 'table': - value = object_pairs_hook([(k, process_value(value[k], object_pairs_hook=object_pairs_hook)) 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, object_pairs_hook=object_pairs_hook) - 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, object_pairs_hook())) - - scope = object_pairs_hook() - name = value[-1] - if name not in cur: - if is_table_array: - cur[name] = [(scope, object_pairs_hook())] - else: - cur[name] = (scope, object_pairs_hook()) - elif isinstance(cur[name], list): - if not is_table_array: - error('table_type_mismatch') - cur[name].append((scope, object_pairs_hook())) - 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 = object_pairs_hook() - 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(r'[btnfr\"\\]') -_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): - v = int(s.last().group(1), 16) - if 0xd800 <= v < 0xe000: - s.fail() - res.append(_chr(v)) - 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)*))?') - -_basicstr_ml_re = re.compile(r'(?:""?(?!")|[^"\\\000-\011\013-\037])*') -_litstr_re = re.compile(r"[^'\000\010\012-\037]*") -_litstr_ml_re = re.compile(r"(?:(?:|'|'')(?:[^'\000-\010\013-\037]))*") -def _p_value(s, object_pairs_hook): - 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(rfc3339_re): - m = s.last() - return 'datetime', m.group(0), parse_rfc3339_re(m), 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, object_pairs_hook=object_pairs_hook)) - 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 = object_pairs_hook() - if not s.consume('}'): - k = _p_key(s) - _p_ws(s) - s.expect('=') - _p_ws(s) - items[k] = _p_value(s, object_pairs_hook=object_pairs_hook) - _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, object_pairs_hook=object_pairs_hook) - _p_ws(s) - s.expect('}') - return 'table', None, items, pos - - s.fail() - -def _p_stmt(s, object_pairs_hook): - 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, object_pairs_hook=object_pairs_hook) - return 'kv', (key, value), pos - -_stmtsep_re = re.compile(r'(?:[ \t]*(?:#[^\n]*)?\n)+[ \t]*') -def _p_toml(s, object_pairs_hook): - stmts = [] - _p_ews(s) - with s: - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - while True: - s.commit() - s.expect_re(_stmtsep_re) - stmts.append(_p_stmt(s, object_pairs_hook=object_pairs_hook)) - _p_ews(s) - s.expect_eof() - return stmts diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py deleted file mode 100644 index ec8abfc..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/test.py +++ /dev/null @@ -1,30 +0,0 @@ -import datetime -from .utils import format_rfc3339 - -try: - _string_types = (str, unicode) - _int_types = (int, long) -except NameError: - _string_types = str - _int_types = int - -def translate_to_test(v): - if isinstance(v, dict): - return { k: translate_to_test(v) for k, v in v.items() } - if isinstance(v, list): - a = [translate_to_test(x) for x in v] - if v and isinstance(v[0], dict): - return a - else: - return {'type': 'array', 'value': a} - if isinstance(v, datetime.datetime): - return {'type': 'datetime', 'value': format_rfc3339(v)} - if isinstance(v, bool): - return {'type': 'bool', 'value': 'true' if v else 'false'} - if isinstance(v, _int_types): - return {'type': 'integer', 'value': str(v)} - if isinstance(v, float): - return {'type': 'float', 'value': '{:.17}'.format(v)} - if isinstance(v, _string_types): - return {'type': 'string', 'value': v} - raise RuntimeError('unexpected value: {!r}'.format(v)) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py deleted file mode 100644 index 636a680..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/utils.py +++ /dev/null @@ -1,67 +0,0 @@ -import datetime -import re - -rfc3339_re = re.compile(r'(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(\.\d+)?(?:Z|([+-]\d{2}):(\d{2}))') - -def parse_rfc3339(v): - m = rfc3339_re.match(v) - if not m or m.group(0) != v: - return None - return parse_rfc3339_re(m) - -def parse_rfc3339_re(m): - 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 - return datetime.datetime(y, m, d, H, M, S, int(micro * 1000000), tz) - - -def format_rfc3339(v): - offs = v.utcoffset() - offs = int(offs.total_seconds()) // 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 - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py deleted file mode 100644 index 73b5089..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/pytoml/writer.py +++ /dev/null @@ -1,106 +0,0 @@ -from __future__ import unicode_literals -import io, datetime, math, string, sys - -from .utils import format_rfc3339 - -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) + '"' - - -_key_chars = string.digits + string.ascii_letters + '-_' -def _escape_id(s): - if any(c not in _key_chars for c in s): - return _escape_string(s) - return s - - -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): - return format_rfc3339(v) - elif isinstance(v, list): - return '[{0}]'.format(', '.join(_format_value(obj) for obj in v)) - elif isinstance(v, dict): - return '{{{0}}}'.format(', '.join('{} = {}'.format(_escape_id(k), _format_value(obj)) for k, obj in v.items())) - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py deleted file mode 100644 index 80c4ce1..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__init__.py +++ /dev/null @@ -1,133 +0,0 @@ -# -*- 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('https://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.24 - assert major == 1 - assert minor >= 21 - assert minor <= 24 - - # 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 - - -def _check_cryptography(cryptography_version): - # cryptography < 1.3.4 - try: - cryptography_version = list(map(int, cryptography_version.split('.'))) - except ValueError: - return - - if cryptography_version < [1, 3, 4]: - warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version) - warnings.warn(warning, RequestsDependencyWarning) - -# Check imported dependencies for compatibility. -try: - check_compatibility(urllib3.__version__, chardet.__version__) -except (AssertionError, ValueError): - warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported " - "version!".format(urllib3.__version__, chardet.__version__), - RequestsDependencyWarning) - -# Attempt to enable urllib3's SNI support, if possible -from pip._internal.utils.compat import WINDOWS -if not WINDOWS: - try: - from pip._vendor.urllib3.contrib import pyopenssl - pyopenssl.inject_into_urllib3() - - # Check cryptography version - from cryptography import __version__ as cryptography_version - _check_cryptography(cryptography_version) - 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 -from logging import NullHandler - -logging.getLogger(__name__).addHandler(NullHandler()) - -# FileModeWarnings go off per the default. -warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py deleted file mode 100644 index f5b5d03..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/__version__.py +++ /dev/null @@ -1,14 +0,0 @@ -# .-. .-. .-. . . .-. .-. .-. .-. -# |( |- |.| | | |- `-. | `-. -# ' ' `-' `-`.`-' `-' `-' ' `-' - -__title__ = 'requests' -__description__ = 'Python HTTP for Humans.' -__url__ = 'http://python-requests.org' -__version__ = '2.21.0' -__build__ = 0x022100 -__author__ = 'Kenneth Reitz' -__author_email__ = 'me@kennethreitz.org' -__license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2018 Kenneth Reitz' -__cake__ = u'\u2728 \U0001f370 \u2728' diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py deleted file mode 100644 index 759d9a5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/_internal_utils.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py deleted file mode 100644 index c30e7c9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/adapters.py +++ /dev/null @@ -1,533 +0,0 @@ -# -*- 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 parse_url -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 pip._vendor.urllib3.exceptions import LocationValueError - -from .models import Response -from .compat import urlparse, basestring -from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths, - 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, InvalidProxyURL, - InvalidURL) -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 {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 = extract_zipped_paths(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: {}".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: {}".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: {}".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_url = parse_url(proxy) - if not proxy_url.host: - raise InvalidProxyURL("Please check proxy URL. It is malformed" - " and could be missing the host.") - 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 proxy: 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 - """ - - try: - conn = self.get_connection(request.url, proxies) - except LocationValueError as e: - raise InvalidURL(e, request=request) - - self.cert_verify(conn, request.url, verify, cert) - url = self.request_url(request, proxies) - self.add_headers(request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) - - 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 {}. 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, use buffering of HTTP responses - r = low_conn.getresponse(buffering=True) - except TypeError: - # For compatibility with Python 3.3+ - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py deleted file mode 100644 index abada96..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/api.py +++ /dev/null @@ -1,158 +0,0 @@ -# -*- 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, list of tuples or bytes to send - in the body of the :class:`Request`. - :param data: (optional) Dictionary, list of tuples, bytes, or file-like - object to send in the body of the :class:`Request`. - :param json: (optional) A JSON serializable Python object 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', 'https://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, list of tuples or bytes to send - in the body of 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, list of tuples, 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, list of tuples, 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, list of tuples, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py deleted file mode 100644 index bdde51c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/auth.py +++ /dev/null @@ -1,305 +0,0 @@ -# -*- 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 ({!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 ({!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 - elif _algorithm == 'SHA-256': - def sha256_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha256(x).hexdigest() - hash_utf8 = sha256_utf8 - elif _algorithm == 'SHA-512': - def sha512_utf8(x): - if isinstance(x, str): - x = x.encode('utf-8') - return hashlib.sha512(x).hexdigest() - hash_utf8 = sha512_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py deleted file mode 100644 index 06a594e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/certs.py +++ /dev/null @@ -1,18 +0,0 @@ -#!/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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py deleted file mode 100644 index 6a86893..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/compat.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- 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 collections import Callable, Mapping, MutableMapping, 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 - from collections.abc import Callable, Mapping, MutableMapping - - builtin_str = str - str = str - bytes = bytes - basestring = (str, bytes) - numeric_types = (int, float) - integer_types = (int,) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py deleted file mode 100644 index 56fccd9..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/cookies.py +++ /dev/null @@ -1,549 +0,0 @@ -# -*- 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 - -from ._internal_utils import to_native_string -from .compat import cookielib, urlparse, urlunparse, Morsel, MutableMapping - -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, 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.set_policy(self.get_policy()) - new_cj.update(self) - return new_cj - - def get_policy(self): - """Return the CookiePolicy instance used.""" - return self._policy - - -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 = { - '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. - :rtype: CookieJar - """ - 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. - :rtype: CookieJar - """ - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py deleted file mode 100644 index a91e1fd..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/exceptions.py +++ /dev/null @@ -1,126 +0,0 @@ -# -*- 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 InvalidProxyURL(InvalidURL): - """The proxy URL provided is 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py deleted file mode 100644 index 3c3072b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/help.py +++ /dev/null @@ -1,119 +0,0 @@ -"""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 pip._vendor.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__', ''), - } - - system_ssl = ssl.OPENSSL_VERSION_NUMBER - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py deleted file mode 100644 index 7a51f21..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/hooks.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- 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 {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 {} - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py deleted file mode 100644 index 0839957..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/models.py +++ /dev/null @@ -1,953 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.models -~~~~~~~~~~~~~~~ - -This module contains the primary objects that power Requests. -""" - -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 ( - Callable, Mapping, - 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 - elif hasattr(fp, 'read'): - fdata = fp.read() - elif fp is None: - continue - else: - fdata = fp - - 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, Callable): - self.hooks[event].append(hook) - elif hasattr(hook, '__iter__'): - self.hooks[event].extend(h for h in hook if isinstance(h, 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 or - list of tuples ``[(key, value)]`` 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: URL parameters to append to the URL. If a dictionary or - list of tuples ``[(key, value)]`` is provided, form-encoding will - take place. - :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', 'https://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', 'https://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, 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 {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, False if not. - - 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=False, 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 = b''.join(self.iter_content(CONTENT_CHUNK_SIZE)) or b'' - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py deleted file mode 100644 index 9582fa7..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/packages.py +++ /dev/null @@ -1,16 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py deleted file mode 100644 index d73d700..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/sessions.py +++ /dev/null @@ -1,770 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.session -~~~~~~~~~~~~~~~~ - -This module provides a Session object to manage and persist settings across -requests (cookies, auth, proxies). -""" -import os -import sys -import time -from datetime import timedelta - -from .auth import _basic_auth_str -from .compat import cookielib, is_py3, OrderedDict, urljoin, urlparse, Mapping -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, DEFAULT_PORTS -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 sys.platform == 'win32': - try: # Python 3.4+ - 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 should_strip_auth(self, old_url, new_url): - """Decide whether Authorization header should be removed when redirecting""" - old_parsed = urlparse(old_url) - new_parsed = urlparse(new_url) - if old_parsed.hostname != new_parsed.hostname: - return True - # Special case: allow http -> https redirect when using the standard - # ports. This isn't specified by RFC 7235, but is kept to avoid - # breaking backwards compatibility with older versions of requests - # that allowed any redirects on the same host. - if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) - and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): - return False - - # Handle default port usage corresponding to scheme. - changed_port = old_parsed.port != new_parsed.port - changed_scheme = old_parsed.scheme != new_parsed.scheme - default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) - if (not changed_scheme and old_parsed.port in default_port - and new_parsed.port in default_port): - return False - - # Standard case: root URI must match - return changed_port or changed_scheme - - 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) - previous_fragment = urlparse(req.url).fragment - 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) - - # Normalize url case and attach previous fragment if needed (RFC 7231 7.1.2) - parsed = urlparse(url) - if parsed.fragment == '' and previous_fragment: - parsed = parsed._replace(fragment=previous_fragment) - elif parsed.fragment: - previous_fragment = parsed.fragment - 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 and self.should_strip_auth(response.request.url, url): - # If we get redirected to a new host, we should strip out any - # authentication headers. - 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 - - # https://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('https://httpbin.org/get') - <Response [200]> - - Or as a context manager:: - - >>> with requests.Session() as s: - >>> s.get('https://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, list of tuples, 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, list of tuples, 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, list of tuples, 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, list of tuples, 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.lower()): - 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 = {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. - - .. deprecated:: 1.0.0 - - This method has been deprecated since version 1.0.0 and is only kept for - backwards compatibility. New code should use :class:`~requests.sessions.Session` - to create a session. This may be removed at a future date. - - :rtype: Session - """ - return Session() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py deleted file mode 100644 index 813e8c4..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/status_codes.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- - -r""" -The ``codes`` object defines a mapping from common names for HTTP statuses -to their numerical codes, accessible either as attributes or as dictionary -items. - ->>> requests.codes['temporary_redirect'] -307 ->>> requests.codes.teapot -418 ->>> requests.codes['\o/'] -200 - -Some codes have multiple names, and both upper- and lower-case versions of -the names are allowed. For example, ``codes.ok``, ``codes.OK``, and -``codes.okay`` all correspond to the HTTP status code 200. -""" - -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') - -def _init(): - for code, titles in _codes.items(): - for title in titles: - setattr(codes, title, code) - if not title.startswith(('\\', '/')): - setattr(codes, title.upper(), code) - - def doc(code): - names = ', '.join('``%s``' % n for n in _codes[code]) - return '* %d: %s' % (code, names) - - global __doc__ - __doc__ = (__doc__ + '\n' + - '\n'.join(doc(code) for code in sorted(_codes)) - if __doc__ is not None else None) - -_init() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py deleted file mode 100644 index da930e2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/structures.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.structures -~~~~~~~~~~~~~~~~~~~ - -Data structures that power Requests. -""" - -from .compat import OrderedDict, Mapping, MutableMapping - - -class CaseInsensitiveDict(MutableMapping): - """A case-insensitive ``dict``-like object. - - Implements all methods and operations of - ``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, 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py deleted file mode 100644 index 8170a8d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/requests/utils.py +++ /dev/null @@ -1,977 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -requests.utils -~~~~~~~~~~~~~~ - -This module provides utility functions that are used within Requests -that are also useful for external consumption. -""" - -import codecs -import contextlib -import io -import os -import re -import socket -import struct -import sys -import tempfile -import warnings -import zipfile - -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, Mapping) -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() - -DEFAULT_PORTS = {'http': 80, 'https': 443} - - -if sys.platform == 'win32': - # provide a proxy_bypass version on Windows without DNS lookups - - def proxy_bypass_registry(host): - try: - if is_py3: - import winreg - else: - import _winreg as winreg - except ImportError: - return False - - try: - internetSettings = winreg.OpenKey(winreg.HKEY_CURRENT_USER, - r'Software\Microsoft\Windows\CurrentVersion\Internet Settings') - # ProxyEnable could be REG_SZ or REG_DWORD, normalizing it - proxyEnable = int(winreg.QueryValueEx(internetSettings, - 'ProxyEnable')[0]) - # ProxyOverride is almost always a string - 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('~/{}'.format(f)) - except KeyError: - # os.path.expanduser can fail when $HOME is undefined and - # getpwuid fails. See https://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 extract_zipped_paths(path): - """Replace nonexistent paths that look like they refer to a member of a zip - archive with the location of an extracted copy of the target, or else - just return the provided path unchanged. - """ - if os.path.exists(path): - # this is already a valid path, no need to do anything further - return path - - # find the first valid part of the provided path and treat that as a zip archive - # assume the rest of the path is the name of a member in the archive - archive, member = os.path.split(path) - while archive and not os.path.exists(archive): - archive, prefix = os.path.split(archive) - member = '/'.join([prefix, member]) - - if not zipfile.is_zipfile(archive): - return path - - zip_file = zipfile.ZipFile(archive) - if member not in zip_file.namelist(): - return path - - # we have a valid zip archive and a valid member of that archive - tmp = tempfile.gettempdir() - extracted_path = os.path.join(tmp, *member.split('/')) - if not os.path.exists(extracted_path): - extracted_path = zip_file.extract(member, path=tmp) - - return extracted_path - - -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: cannot encode objects that are not 2-tuples - >>> 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, 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 _parse_content_type_header(header): - """Returns content type and parameters from given header - - :param header: string - :return: tuple containing content type and dictionary of - parameters - """ - - tokens = header.split(';') - content_type, params = tokens[0].strip(), tokens[1:] - params_dict = {} - items_to_strip = "\"' " - - for param in params: - param = param.strip() - if param: - key, value = param, True - index_of_equals = param.find("=") - if index_of_equals != -1: - key = param[:index_of_equals].strip(items_to_strip) - value = param[index_of_equals + 1:].strip(items_to_strip) - params_dict[key.lower()] = value - return content_type, params_dict - - -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 = _parse_content_type_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 - """ - # Prioritize lowercase environment variables over uppercase - # to keep a consistent behaviour with other http projects (curl, wget). - 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') - parsed = urlparse(url) - - if parsed.hostname is None: - # URLs don't always have hostnames, e.g. file:/// urls. - return True - - if no_proxy: - # We need to check whether we match here. We need to see if we match - # the end of the hostname, both with and without the port. - no_proxy = ( - host for host in no_proxy.replace(' ', '').split(',') if host - ) - - if is_ipv4_address(parsed.hostname): - for proxy_ip in no_proxy: - if is_valid_cidr(proxy_ip): - if address_in_network(parsed.hostname, proxy_ip): - return True - elif parsed.hostname == 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: - host_with_port = parsed.hostname - if parsed.port: - host_with_port += ':{}'.format(parsed.port) - - for host in no_proxy: - if parsed.hostname.endswith(host) or host_with_port.endswith(host): - # The URL does match something in no_proxy, so we don't want - # to apply the proxies on this URL. - return True - - with set_environ('no_proxy', no_proxy_arg): - # parsed.hostname can be `None` in cases such as a file URI. - try: - bypass = proxy_bypass(parsed.hostname) - 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 list 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 = ' \'"' - - value = value.strip(replace_chars) - if not value: - return links - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py deleted file mode 100644 index 6d1e627..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/retrying.py +++ /dev/null @@ -1,267 +0,0 @@ -## 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py deleted file mode 100644 index 89b2188..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/six.py +++ /dev/null @@ -1,952 +0,0 @@ -# Copyright (c) 2010-2018 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.12.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) - if hasattr(cls, '__qualname__'): - orig_vars['__qualname__'] = cls.__qualname__ - return metaclass(cls.__name__, cls.__bases__, orig_vars) - return wrapper - - -def ensure_binary(s, encoding='utf-8', errors='strict'): - """Coerce **s** to six.binary_type. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> encoded to `bytes` - - `bytes` -> `bytes` - """ - if isinstance(s, text_type): - return s.encode(encoding, errors) - elif isinstance(s, binary_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - -def ensure_str(s, encoding='utf-8', errors='strict'): - """Coerce *s* to `str`. - - For Python 2: - - `unicode` -> encoded to `str` - - `str` -> `str` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if not isinstance(s, (text_type, binary_type)): - raise TypeError("not expecting type '%s'" % type(s)) - if PY2 and isinstance(s, text_type): - s = s.encode(encoding, errors) - elif PY3 and isinstance(s, binary_type): - s = s.decode(encoding, errors) - return s - - -def ensure_text(s, encoding='utf-8', errors='strict'): - """Coerce *s* to six.text_type. - - For Python 2: - - `unicode` -> `unicode` - - `str` -> `unicode` - - For Python 3: - - `str` -> `str` - - `bytes` -> decoded to `str` - """ - if isinstance(s, binary_type): - return s.decode(encoding, errors) - elif isinstance(s, text_type): - return s - else: - raise TypeError("not expecting type '%s'" % type(s)) - - - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py deleted file mode 100644 index 148a9c3..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/__init__.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -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 -from logging import NullHandler - -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = '1.24.1' - -__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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py deleted file mode 100644 index 34f2381..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/_collections.py +++ /dev/null @@ -1,329 +0,0 @@ -from __future__ import absolute_import -try: - from collections.abc import Mapping, MutableMapping -except ImportError: - 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 - - -from collections import OrderedDict -from .exceptions import InvalidHeader -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. - obs_fold_continued_leaders = (' ', '\t') - headers = [] - - for line in message.headers: - if line.startswith(obs_fold_continued_leaders): - if not headers: - # We received a header line that starts with OWS as described - # in RFC-7230 S3.2.4. This indicates a multiline header, but - # there exists no previous header to which we can attach it. - raise InvalidHeader( - 'Header continuation with no previous header: %s' % line - ) - else: - key, value = headers[-1] - headers[-1] = (key, value + ' ' + line.strip()) - continue - - key, value = line.split(':', 1) - headers.append((key, value.strip())) - - return cls(headers) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py deleted file mode 100644 index 02b3665..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connection.py +++ /dev/null @@ -1,391 +0,0 @@ -from __future__ import absolute_import -import datetime -import logging -import os -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 not less than 6 months ago. -# Example: if Today is 2018-01-01, then RECENT_DATE should be any date on or -# after 2016-01-01 (today - 2 years) AND before 2017-07-01 (today - 6 months) -RECENT_DATE = datetime.date(2017, 6, 30) - - -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. - - ``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. - self.source_address = kw.get('source_address') - - #: 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) - - _HTTPConnection.__init__(self, *args, **kw) - - @property - def host(self): - """ - Getter method to remove any trailing dots that indicate the hostname is an FQDN. - - In general, SSL certificates don't include the trailing dot indicating a - fully-qualified domain name, and thus, they don't validate properly when - checked against a domain name that includes the dot. In addition, some - servers may not expect to receive the trailing dot when provided. - - However, the hostname with trailing dot is critical to DNS resolution; doing a - lookup with the trailing dot will properly only resolve the appropriate FQDN, - whereas a lookup without a trailing dot will search the system's search domain - list. Thus, it's important to keep the original host around for use only in - those cases where it's appropriate (i.e., when doing DNS lookup to establish the - actual TCP connection across which we're going to send HTTP requests). - """ - return self._dns_host.rstrip('.') - - @host.setter - def host(self, value): - """ - Setter for the `host` property. - - We assume that only urllib3 uses the _dns_host attribute; httplib itself - only uses `host`, and it seems reasonable that other libraries follow suit. - """ - self._dns_host = value - - 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._dns_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 - if self._tunnel_host: - # 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 + (bytes,) - if isinstance(body, stringish_types): - body = (body,) - for chunk in body: - if not chunk: - continue - if not isinstance(chunk, bytes): - 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, server_hostname=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 - self.server_hostname = server_hostname - - # 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, - server_hostname=self.server_hostname - ) - - -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 self._tunnel_host: - 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 - - server_hostname = hostname - if self.server_hostname is not None: - server_hostname = self.server_hostname - - 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=server_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 server_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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py deleted file mode 100644 index f7a8f19..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/connectionpool.py +++ /dev/null @@ -1,896 +0,0 @@ -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, NORMALIZABLE_SCHEMES -from .util.queue import LifoQueue - - -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 = LifoQueue - - def __init__(self, host, port=None): - if not host: - raise LocationValueError("No host specified.") - - self.host = _ipv6_host(host, self.scheme) - 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 = {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:%s", - self.num_connections, self.host, self.port or "80") - - 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.7.4 - 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 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. - """ - if self.pool is None: - return - # 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, self.scheme) - - # 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. - """ - conn.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:%s", - self.num_connections, self.host, self.port or "443") - - 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, scheme): - """ - 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('[]') - if scheme in NORMALIZABLE_SCHEMES: - host = host.lower() - return host diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py deleted file mode 100644 index f3e0094..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_appengine_environ.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -This module provides means to detect the App Engine environment. -""" - -import os - - -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py deleted file mode 100644 index bcf41c0..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +++ /dev/null @@ -1,593 +0,0 @@ -""" -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py deleted file mode 100644 index b13cd9e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +++ /dev/null @@ -1,346 +0,0 @@ -""" -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. - """ - # Normalize the PEM bundle's line endings. - pem_bundle = pem_bundle.replace(b"\r\n", b"\n") - - 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.b16encode(random_bytes[:8]).decode('utf-8') - password = base64.b16encode(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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py deleted file mode 100644 index 9b42952..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/appengine.py +++ /dev/null @@ -1,289 +0,0 @@ -""" -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 io -import logging -import warnings -from ..packages.six.moves.urllib.parse import urljoin - -from ..exceptions import ( - HTTPError, - HTTPWarning, - MaxRetryError, - ProtocolError, - TimeoutError, - SSLError -) - -from ..request import RequestMethods -from ..response import HTTPResponse -from ..util.timeout import Timeout -from ..util.retry import Retry -from . import _appengine_environ - -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) - - original_response = HTTPResponse( - # In order for decoding to work, we must present the content as - # a file-like object. - body=io.BytesIO(urlfetch_resp.content), - msg=urlfetch_resp.header_msg, - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - **response_kw - ) - - return HTTPResponse( - body=io.BytesIO(urlfetch_resp.content), - headers=urlfetch_resp.headers, - status=urlfetch_resp.status_code, - original_response=original_response, - **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 - - -# Alias methods from _appengine_environ to maintain public API interface. - -is_appengine = _appengine_environ.is_appengine -is_appengine_sandbox = _appengine_environ.is_appengine_sandbox -is_local_appengine = _appengine_environ.is_local_appengine -is_prod_appengine = _appengine_environ.is_prod_appengine -is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py deleted file mode 100644 index 8ea127c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/ntlmpool.py +++ /dev/null @@ -1,111 +0,0 @@ -""" -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 = {'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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py deleted file mode 100644 index 363667c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/pyopenssl.py +++ /dev/null @@ -1,466 +0,0 @@ -""" -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 -try: - from cryptography.x509 import UnsupportedExtension -except ImportError: - # UnsupportedExtension is gone in cryptography >= 2.1.0 - class UnsupportedExtension(Exception): - pass - -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). - - If the name cannot be idna-encoded then we return None signalling that - the name given should be skipped. - """ - 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 - - try: - for prefix in [u'*.', u'.']: - if name.startswith(prefix): - name = name[len(prefix):] - return prefix.encode('ascii') + idna.encode(name) - return idna.encode(name) - except idna.core.IDNAError: - return None - - name = idna_encode(name) - if name is None: - return None - elif 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, 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. - # We also want to skip over names which cannot be idna encoded. - names = [ - ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName)) - if name is not None - ] - 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: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - 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: - if not util.wait_for_read(self.socket, self.socket.gettimeout()): - 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: - if not util.wait_for_write(self.socket, self.socket.gettimeout()): - 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_chain_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: - if not util.wait_for_read(sock, sock.gettimeout()): - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py deleted file mode 100644 index 77cb59e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/securetransport.py +++ /dev/null @@ -1,804 +0,0 @@ -""" -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 - -__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 because 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 - - try: - while read_count < requested_length: - if timeout is None or timeout >= 0: - if not util.wait_for_read(base_socket, timeout): - raise socket.error(errno.EAGAIN, 'timed out') - - remaining = requested_length - read_count - buffer = (ctypes.c_char * remaining).from_address( - data_buffer + read_count - ) - chunk_size = base_socket.recv_into(buffer, remaining) - 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: - data_length_pointer[0] = read_count - if error == errno.ECONNRESET or error == errno.EPIPE: - 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: - if not util.wait_for_write(base_socket, timeout): - 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: - data_length_pointer[0] = sent - if error == errno.ECONNRESET or error == errno.EPIPE: - 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 not 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py deleted file mode 100644 index 811e312..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/contrib/socks.py +++ /dev/null @@ -1,192 +0,0 @@ -# -*- 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 username is None and password is None and parsed.auth is not None: - split = parsed.auth.split(':') - if len(split) == 2: - username, password = split - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py deleted file mode 100644 index 7bbaa98..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/exceptions.py +++ /dev/null @@ -1,246 +0,0 @@ -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 performing 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py deleted file mode 100644 index 37fe64a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/fields.py +++ /dev/null @@ -1,178 +0,0 @@ -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) tuples 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py deleted file mode 100644 index 78f1e19..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/filepost.py +++ /dev/null @@ -1,98 +0,0 @@ -from __future__ import absolute_import -import binascii -import codecs -import os - -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. - """ - boundary = binascii.hexlify(os.urandom(16)) - if six.PY3: - boundary = boundary.decode('ascii') - return boundary - - -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:`urllib3.filepost.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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py deleted file mode 100644 index 170e974..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from __future__ import absolute_import - -from . import ssl_match_hostname - -__all__ = ('ssl_match_hostname', ) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py deleted file mode 100644 index 740db37..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/backports/makefile.py +++ /dev/null @@ -1,53 +0,0 @@ -# -*- 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) <= {"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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py deleted file mode 100644 index 190c023..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/six.py +++ /dev/null @@ -1,868 +0,0 @@ -"""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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py deleted file mode 100644 index d6594eb..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py deleted file mode 100644 index 970cf65..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +++ /dev/null @@ -1,156 +0,0 @@ -"""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 in Python 2.7. -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py deleted file mode 100644 index fe5491c..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/poolmanager.py +++ /dev/null @@ -1,450 +0,0 @@ -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 - 'key_server_hostname', #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.copy() - - 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) - - # Strip headers marked as unsafe to forward to the redirected location. - # Check remove_headers_on_redirect to avoid a potential network call within - # conn.is_same_host() which may use socket.gethostbyname() in the future. - if (retries.remove_headers_on_redirect - and not conn.is_same_host(redirect_location)): - for header in retries.remove_headers_on_redirect: - kw['headers'].pop(header, None) - - 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 containing 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py deleted file mode 100644 index 8f2f44b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/request.py +++ /dev/null @@ -1,150 +0,0 @@ -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 = {'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 NotImplementedError("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() - - urlopen_kw['request_url'] = url - - 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 mimic 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py deleted file mode 100644 index c112690..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/response.py +++ /dev/null @@ -1,705 +0,0 @@ -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, 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 = b'' - 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 GzipDecoderState(object): - - FIRST_MEMBER = 0 - OTHER_MEMBERS = 1 - SWALLOW_DATA = 2 - - -class GzipDecoder(object): - - def __init__(self): - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - self._state = GzipDecoderState.FIRST_MEMBER - - def __getattr__(self, name): - return getattr(self._obj, name) - - def decompress(self, data): - ret = bytearray() - if self._state == GzipDecoderState.SWALLOW_DATA or not data: - return bytes(ret) - while True: - try: - ret += self._obj.decompress(data) - except zlib.error: - previous_state = self._state - # Ignore data after the first error - self._state = GzipDecoderState.SWALLOW_DATA - if previous_state == GzipDecoderState.OTHER_MEMBERS: - # Allow trailing garbage acceptable in other gzip clients - return bytes(ret) - raise - data = self._obj.unused_data - if not data: - return bytes(ret) - self._state = GzipDecoderState.OTHER_MEMBERS - self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) - - -class MultiDecoder(object): - """ - From RFC7231: - If one or more encodings have been applied to a representation, the - sender that applied the encodings MUST generate a Content-Encoding - header field that lists the content codings in the order in which - they were applied. - """ - - def __init__(self, modes): - self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')] - - def flush(self): - return self._decoders[0].flush() - - def decompress(self, data): - for d in reversed(self._decoders): - data = d.decompress(data) - return data - - -def _get_decoder(mode): - if ',' in mode: - return MultiDecoder(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, will attempt to decode the body based on the - 'content-encoding' header. - - :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, msg=None, - retries=None, enforce_content_length=False, - request_method=None, request_url=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 - self.msg = msg - self._request_url = request_url - - if body and isinstance(body, (basestring, bytes)): - 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 isclosed(self): - return is_fp_closed(self._fp) - - 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: - if 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 - - 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: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) - elif ',' in content_encoding: - encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS] - if len(encodings): - 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 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. - """ - 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.") - - with self._error_catcher(): - # 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 - - # If a response is already read and closed - # then return immediately. - if self._fp.fp is None: - return - - 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() - - def geturl(self): - """ - Returns the URL that was the source of this response. - If the request that generated this response redirected, this method - will return the final redirect location. - """ - if self.retries is not None and len(self.retries.history): - return self.retries.history[-1].redirect_location - else: - return self._request_url diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py deleted file mode 100644 index 2f2770b..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py deleted file mode 100644 index 5ad70b2..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/connection.py +++ /dev/null @@ -1,134 +0,0 @@ -from __future__ import absolute_import -import socket -from .wait import NoWayToWaitForSocketError, wait_for_read -from ..contrib import _appengine_environ - - -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 - try: - # Returns True if readable, which here means it's been dropped - return wait_for_read(sock, timeout=0.0) - except NoWayToWaitForSocketError: # Platform-specific: AppEngine - return False - - -# 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 - - # App Engine doesn't support IPV6 sockets and actually has a quota on the - # number of sockets that can be used, so just early out here instead of - # creating a socket needlessly. - # See https://github.com/urllib3/urllib3/issues/1446 - if _appengine_environ.is_appengine_sandbox(): - return 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py deleted file mode 100644 index d3d379a..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/queue.py +++ /dev/null @@ -1,21 +0,0 @@ -import collections -from ..packages import six -from ..packages.six.moves import queue - -if six.PY2: - # Queue is imported for side effects on MS Windows. See issue #229. - import Queue as _unused_module_Queue # noqa: F401 - - -class LifoQueue(queue.Queue): - def _init(self, _): - self.queue = collections.deque() - - def _qsize(self, len=len): - return len(self.queue) - - def _put(self, item): - self.queue.append(item) - - def _get(self): - return self.queue.pop() diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py deleted file mode 100644 index 3ddfcd5..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/request.py +++ /dev/null @@ -1,118 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py deleted file mode 100644 index 3d54864..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/response.py +++ /dev/null @@ -1,87 +0,0 @@ -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: - # get_payload is actually email.message.Message.get_payload; - # we're only interested in the result if it's not a multipart message - if not headers.is_multipart(): - payload = get_payload() - - if isinstance(payload, (bytes, str)): - unparsed_data = 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py deleted file mode 100644 index e7d0abd..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/retry.py +++ /dev/null @@ -1,411 +0,0 @@ -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. - - :param iterable remove_headers_on_redirect: - Sequence of headers to remove from the request when a response - indicating a redirect is returned before firing off the redirected - request. - """ - - DEFAULT_METHOD_WHITELIST = frozenset([ - 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) - - RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) - - DEFAULT_REDIRECT_HEADERS_BLACKLIST = frozenset(['Authorization']) - - #: 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, - remove_headers_on_redirect=DEFAULT_REDIRECT_HEADERS_BLACKLIST): - - 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 - self.remove_headers_on_redirect = remove_headers_on_redirect - - 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, - remove_headers_on_redirect=self.remove_headers_on_redirect - ) - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py deleted file mode 100644 index dfc553f..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/ssl_.py +++ /dev/null @@ -1,381 +0,0 @@ -from __future__ import absolute_import -import errno -import warnings -import hmac -import socket - -from binascii import hexlify, unhexlify -from hashlib import md5, sha1, sha256 - -from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning -from ..packages import six - - -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 - - -# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in -# those cases. This means that we can only detect IPv4 addresses in this case. -if hasattr(socket, 'inet_pton'): - inet_pton = socket.inet_pton -else: - # Maybe we can use ipaddress if the user has urllib3[secure]? - try: - from pip._vendor import ipaddress - - def inet_pton(_, host): - if isinstance(host, bytes): - host = host.decode('ascii') - return ipaddress.ip_address(host) - - except ImportError: # Platform-specific: Non-Linux - def inet_pton(_, host): - return socket.inet_aton(host) - - -# 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 - 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): - 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, - } - return wrap_socket(socket, ciphers=self.ciphers, **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 abbreviation. - (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) - - context.set_ciphers(ciphers or DEFAULT_CIPHERS) - - # 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 - - 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. - :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.7 - 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 we detect server_hostname is an IP address then the SNI - # extension should not be used according to RFC3546 Section 3.1 - # We shouldn't warn the user if SNI isn't available but we would - # not be using SNI anyways due to IP address for server_hostname. - if ((server_hostname is not None and not is_ipaddress(server_hostname)) - or IS_SECURETRANSPORT): - if HAS_SNI and server_hostname is not None: - return context.wrap_socket(sock, server_hostname=server_hostname) - - warnings.warn( - 'An HTTPS request has been made, but the SNI (Server 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) - - -def is_ipaddress(hostname): - """Detects whether the hostname given is an IP address. - - :param str hostname: Hostname to examine. - :return: True if the hostname is an IP address, False otherwise. - """ - if six.PY3 and isinstance(hostname, bytes): - # IDN A-label bytes are ASCII compatible. - hostname = hostname.decode('ascii') - - families = [socket.AF_INET] - if hasattr(socket, 'AF_INET6'): - families.append(socket.AF_INET6) - - for af in families: - try: - inet_pton(af, hostname) - except (socket.error, ValueError, OSError): - pass - else: - return True - return False diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py deleted file mode 100644 index cec817e..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/timeout.py +++ /dev/null @@ -1,242 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py deleted file mode 100644 index 6b6f996..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/url.py +++ /dev/null @@ -1,230 +0,0 @@ -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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py deleted file mode 100644 index 4db71ba..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/urllib3/util/wait.py +++ /dev/null @@ -1,150 +0,0 @@ -import errno -from functools import partial -import select -import sys -try: - from time import monotonic -except ImportError: - from time import time as monotonic - -__all__ = ["NoWayToWaitForSocketError", "wait_for_read", "wait_for_write"] - - -class NoWayToWaitForSocketError(Exception): - pass - - -# How should we wait on sockets? -# -# There are two types of APIs you can use for waiting on sockets: the fancy -# modern stateful APIs like epoll/kqueue, and the older stateless APIs like -# select/poll. The stateful APIs are more efficient when you have a lots of -# sockets to keep track of, because you can set them up once and then use them -# lots of times. But we only ever want to wait on a single socket at a time -# and don't want to keep track of state, so the stateless APIs are actually -# more efficient. So we want to use select() or poll(). -# -# Now, how do we choose between select() and poll()? On traditional Unixes, -# select() has a strange calling convention that makes it slow, or fail -# altogether, for high-numbered file descriptors. The point of poll() is to fix -# that, so on Unixes, we prefer poll(). -# -# On Windows, there is no poll() (or at least Python doesn't provide a wrapper -# for it), but that's OK, because on Windows, select() doesn't have this -# strange calling convention; plain select() works fine. -# -# So: on Windows we use select(), and everywhere else we use poll(). We also -# fall back to select() in case poll() is somehow broken or missing. - -if sys.version_info >= (3, 5): - # Modern Python, that retries syscalls by default - def _retry_on_intr(fn, timeout): - return fn(timeout) -else: - # Old and broken Pythons. - def _retry_on_intr(fn, timeout): - if timeout is None: - deadline = float("inf") - else: - deadline = monotonic() + timeout - - while True: - try: - return fn(timeout) - # OSError for 3 <= pyver < 3.5, select.error for pyver <= 2.7 - except (OSError, select.error) as e: - # 'e.args[0]' incantation works for both OSError and select.error - if e.args[0] != errno.EINTR: - raise - else: - timeout = deadline - monotonic() - if timeout < 0: - timeout = 0 - if timeout == float("inf"): - timeout = None - continue - - -def select_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - rcheck = [] - wcheck = [] - if read: - rcheck.append(sock) - if write: - wcheck.append(sock) - # When doing a non-blocking connect, most systems signal success by - # marking the socket writable. Windows, though, signals success by marked - # it as "exceptional". We paper over the difference by checking the write - # sockets for both conditions. (The stdlib selectors module does the same - # thing.) - fn = partial(select.select, rcheck, wcheck, wcheck) - rready, wready, xready = _retry_on_intr(fn, timeout) - return bool(rready or wready or xready) - - -def poll_wait_for_socket(sock, read=False, write=False, timeout=None): - if not read and not write: - raise RuntimeError("must specify at least one of read=True, write=True") - mask = 0 - if read: - mask |= select.POLLIN - if write: - mask |= select.POLLOUT - poll_obj = select.poll() - poll_obj.register(sock, mask) - - # For some reason, poll() takes timeout in milliseconds - def do_poll(t): - if t is not None: - t *= 1000 - return poll_obj.poll(t) - - return bool(_retry_on_intr(do_poll, timeout)) - - -def null_wait_for_socket(*args, **kwargs): - raise NoWayToWaitForSocketError("no select-equivalent available") - - -def _have_working_poll(): - # Apparently some systems have a select.poll that fails as soon as you try - # to use it, either due to strange configuration or broken monkeypatching - # from libraries like eventlet/greenlet. - try: - poll_obj = select.poll() - _retry_on_intr(poll_obj.poll, 0) - except (AttributeError, OSError): - return False - else: - return True - - -def wait_for_socket(*args, **kwargs): - # We delay choosing which implementation to use until the first time we're - # called. We could do it at import time, but then we might make the wrong - # decision if someone goes wild with monkeypatching select.poll after - # we're imported. - global wait_for_socket - if _have_working_poll(): - wait_for_socket = poll_wait_for_socket - elif hasattr(select, "select"): - wait_for_socket = select_wait_for_socket - else: # Platform-specific: Appengine. - wait_for_socket = null_wait_for_socket - return wait_for_socket(*args, **kwargs) - - -def wait_for_read(sock, timeout=None): - """ Waits for reading to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, read=True, timeout=timeout) - - -def wait_for_write(sock, timeout=None): - """ Waits for writing to be available on a given socket. - Returns True if the socket is readable, or False if the timeout expired. - """ - return wait_for_socket(sock, write=True, timeout=timeout) diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py deleted file mode 100644 index d21d697..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/__init__.py +++ /dev/null @@ -1,342 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py deleted file mode 100644 index 29cbf91..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/labels.py +++ /dev/null @@ -1,231 +0,0 @@ -""" - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py deleted file mode 100644 index 295dc92..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/mklabels.py +++ /dev/null @@ -1,59 +0,0 @@ -""" - - 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py deleted file mode 100644 index e12c10d..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/tests.py +++ /dev/null @@ -1,153 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py b/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py deleted file mode 100644 index d16e326..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/pip-19.0.3-py3.8.egg/pip/_vendor/webencodings/x_user_defined.py +++ /dev/null @@ -1,325 +0,0 @@ -# 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/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools-40.8.0-py3.8.egg b/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools-40.8.0-py3.8.egg deleted file mode 100644 index 31cddce2f1ed4f6cc2fe9a106cb11fe3f05cd12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 571910 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�|&dmFJ$RQMZMrLJzYg+Q~I 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%0D<6 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 Ls*6z&tVmgrT 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⪚r4#7 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 diff --git a/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth b/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth deleted file mode 100644 index 61cb752..0000000 --- a/submissions/k17pine/data_structures/venv/Lib/site-packages/setuptools.pth +++ /dev/null @@ -1 +0,0 @@ -./setuptools-40.8.0-py3.8.egg diff --git a/submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 b/submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 deleted file mode 100644 index 7e51fde..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/Activate.ps1 +++ /dev/null @@ -1,375 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current Powershell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0,1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - $VenvDir = $VenvDir.Insert($VenvDir.Length, "/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" - -# SIG # Begin signature block -# MIIaVgYJKoZIhvcNAQcCoIIaRzCCGkMCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDq2sTPEIJ8JE5n -# msRhacE7nmlm6ccumO/BwpdDqNYl5KCCFBgwggPuMIIDV6ADAgECAhB+k+v7fMZO -# WepLmnfUBvw7MA0GCSqGSIb3DQEBBQUAMIGLMQswCQYDVQQGEwJaQTEVMBMGA1UE -# CBMMV2VzdGVybiBDYXBlMRQwEgYDVQQHEwtEdXJiYW52aWxsZTEPMA0GA1UEChMG -# VGhhd3RlMR0wGwYDVQQLExRUaGF3dGUgQ2VydGlmaWNhdGlvbjEfMB0GA1UEAxMW -# VGhhd3RlIFRpbWVzdGFtcGluZyBDQTAeFw0xMjEyMjEwMDAwMDBaFw0yMDEyMzAy -# MzU5NTlaMF4xCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3Jh -# dGlvbjEwMC4GA1UEAxMnU3ltYW50ZWMgVGltZSBTdGFtcGluZyBTZXJ2aWNlcyBD -# QSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsayzSVRLlxwS -# CtgleZEiVypv3LgmxENza8K/LlBa+xTCdo5DASVDtKHiRfTot3vDdMwi17SUAAL3 -# Te2/tLdEJGvNX0U70UTOQxJzF4KLabQry5kerHIbJk1xH7Ex3ftRYQJTpqr1SSwF -# eEWlL4nO55nn/oziVz89xpLcSvh7M+R5CvvwdYhBnP/FA1GZqtdsn5Nph2Upg4XC -# YBTEyMk7FNrAgfAfDXTekiKryvf7dHwn5vdKG3+nw54trorqpuaqJxZ9YfeYcRG8 -# 4lChS+Vd+uUOpyyfqmUg09iW6Mh8pU5IRP8Z4kQHkgvXaISAXWp4ZEXNYEZ+VMET -# fMV58cnBcQIDAQABo4H6MIH3MB0GA1UdDgQWBBRfmvVuXMzMdJrU3X3vP9vsTIAu -# 3TAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnRoYXd0 -# ZS5jb20wEgYDVR0TAQH/BAgwBgEB/wIBADA/BgNVHR8EODA2MDSgMqAwhi5odHRw -# Oi8vY3JsLnRoYXd0ZS5jb20vVGhhd3RlVGltZXN0YW1waW5nQ0EuY3JsMBMGA1Ud -# JQQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIBBjAoBgNVHREEITAfpB0wGzEZ -# MBcGA1UEAxMQVGltZVN0YW1wLTIwNDgtMTANBgkqhkiG9w0BAQUFAAOBgQADCZuP -# ee9/WTCq72i1+uMJHbtPggZdN1+mUp8WjeockglEbvVt61h8MOj5aY0jcwsSb0ep -# rjkR+Cqxm7Aaw47rWZYArc4MTbLQMaYIXCp6/OJ6HVdMqGUY6XlAYiWWbsfHN2qD -# IQiOQerd2Vc/HXdJhyoWBl6mOGoiEqNRGYN+tjCCBKMwggOLoAMCAQICEA7P9DjI -# /r81bgTYapgbGlAwDQYJKoZIhvcNAQEFBQAwXjELMAkGA1UEBhMCVVMxHTAbBgNV -# BAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1l -# IFN0YW1waW5nIFNlcnZpY2VzIENBIC0gRzIwHhcNMTIxMDE4MDAwMDAwWhcNMjAx -# MjI5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29y -# cG9yYXRpb24xNDAyBgNVBAMTK1N5bWFudGVjIFRpbWUgU3RhbXBpbmcgU2Vydmlj -# ZXMgU2lnbmVyIC0gRzQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi -# Yws5RLi7I6dESbsO/6HwYQpTk7CY260sD0rFbv+GPFNVDxXOBD8r/amWltm+YXkL -# W8lMhnbl4ENLIpXuwitDwZ/YaLSOQE/uhTi5EcUj8mRY8BUyb05Xoa6IpALXKh7N -# S+HdY9UXiTJbsF6ZWqidKFAOF+6W22E7RVEdzxJWC5JH/Kuu9mY9R6xwcueS51/N -# ELnEg2SUGb0lgOHo0iKl0LoCeqF3k1tlw+4XdLxBhircCEyMkoyRLZ53RB9o1qh0 -# d9sOWzKLVoszvdljyEmdOsXF6jML0vGjG/SLvtmzV4s73gSneiKyJK4ux3DFvk6D -# Jgj7C72pT5kI4RAocqrNAgMBAAGjggFXMIIBUzAMBgNVHRMBAf8EAjAAMBYGA1Ud -# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBzBggrBgEFBQcBAQRn -# MGUwKgYIKwYBBQUHMAGGHmh0dHA6Ly90cy1vY3NwLndzLnN5bWFudGVjLmNvbTA3 -# BggrBgEFBQcwAoYraHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5jb20vdHNzLWNh -# LWcyLmNlcjA8BgNVHR8ENTAzMDGgL6AthitodHRwOi8vdHMtY3JsLndzLnN5bWFu -# dGVjLmNvbS90c3MtY2EtZzIuY3JsMCgGA1UdEQQhMB+kHTAbMRkwFwYDVQQDExBU -# aW1lU3RhbXAtMjA0OC0yMB0GA1UdDgQWBBRGxmmjDkoUHtVM2lJjFz9eNrwN5jAf -# BgNVHSMEGDAWgBRfmvVuXMzMdJrU3X3vP9vsTIAu3TANBgkqhkiG9w0BAQUFAAOC -# AQEAeDu0kSoATPCPYjA3eKOEJwdvGLLeJdyg1JQDqoZOJZ+aQAMc3c7jecshaAba -# tjK0bb/0LCZjM+RJZG0N5sNnDvcFpDVsfIkWxumy37Lp3SDGcQ/NlXTctlzevTcf -# Q3jmeLXNKAQgo6rxS8SIKZEOgNER/N1cdm5PXg5FRkFuDbDqOJqxOtoJcRD8HHm0 -# gHusafT9nLYMFivxf1sJPZtb4hbKE4FtAC44DagpjyzhsvRaqQGvFZwsL0kb2yK7 -# w/54lFHDhrGCiF3wPbRRoXkzKy57udwgCRNx62oZW8/opTBXLIlJP7nPf8m/PiJo -# Y1OavWl0rMUdPH+S4MO8HNgEdTCCBTAwggQYoAMCAQICEAQJGBtf1btmdVNDtW+V -# UAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD -# ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGln -# aUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAy -# MjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -# MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hB -# MiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQAD -# ggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtFmbE620T1f+Wondsy13Hq -# dp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funRZ9PG+yknx9N7I5TkkSOW -# kHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPpiCwgla4cSocI3wz14k1g -# GL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRXu0q16XTmK/5sy350OTYN -# kO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIPEvTFjg/BougsUfdzvL2F -# sWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEAAaOCAc0wggHJMBIGA1Ud -# EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF -# BwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln -# aWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j -# b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4MDqgOKA2 -# hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 -# Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB -# c3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYKYIZIAYb9bAACBDAqMCgG -# CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAoGCGCGSAGG -# /WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAfBgNVHSMEGDAWgBRF -# 66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsFAAOCAQEAPuwNWiSz8yLR -# FcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrfIFU3sOH20ZJ1D1G0bqWO -# WuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+QsRsHDpEV+7qvtVHCjSSu -# JMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wgXNlxsQyPu6j4xRJon89A -# y0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0ZGuy62ZD2rOwjNXpDd32 -# ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6EpQYhS6SkepobEQysmah -# 5xikmmRR7zCCBkcwggUvoAMCAQICEAM+1e2gZdG4yR38+Spsm9gwDQYJKoZIhvcN -# AQELBQAwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG -# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBB -# c3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTAeFw0xODEyMTgwMDAwMDBaFw0yMTEy -# MjIxMjAwMDBaMIGDMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNTmV3IEhhbXBzaGly -# ZTESMBAGA1UEBxMJV29sZmVib3JvMSMwIQYDVQQKExpQeXRob24gU29mdHdhcmUg -# Rm91bmRhdGlvbjEjMCEGA1UEAxMaUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24w -# ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqvaRLsnW5buglHGWx2sRM -# CMpqt+gflMjw9ZJPphvbE+ig/u8dPiJpVfIvkvN7V/ncnDrtKn67nbh8ld/fSodW -# IRbG6bLZFYbSdyJTZ36YyrOOVoBZJk0XS7hFy/IMmiQRXRFQ6ojkIbnM8jdb25Do -# uJSTccJhbqSkfXvsDlPenD8+jw7woSskafVqdqq0ggKr33JLGsxp3/aE8wFF/o11 -# qHt/sc+fWCRJJMCh6PK6oXmH4HSojj4krn5Uu/Prn1VNsBYmxhqSTFnFVZikW/gp -# 5BJLCijQPMy+YRGxPM29UExaG706uIk2D5B8WZ/3rNVO73dxn6vvEyltfJ8g4YqE -# cxpG5nyKG5YjHeAj1YcMVfp8EpHz4eWF2RqIERYixdGjL4RBTIrvNSz4Wo6jaxFi -# 21uzwxMX1gMoVnDI+Of1af6AsZ3k1QRXI28P1BUYES03u/Hztt24lQHwXgPKUSwy -# 1lN+PD9q7oCY6ead4rlRypIm7BHJloY2TvLeqPTq63H4dNOoeCL3vlSnF/KvACqS -# i+hkRYFVKm+S7w9WGQFdwuY17owQeUWJoyiIAMB4qZflEVGQ35WuZgZODjNqPF90 -# d4hjxO8t/jy1N+adAl33yB4lC//TU1TL8XG7CoC5ORp7Pk2XUvE/QKlMeGCHM7gV -# EPiK1PbCpOHiOmiPD1BmewIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoK -# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFPwqv37Uvqzzgpykz3siATu4jwfyMA4G -# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg -# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx -# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl -# ZC1jcy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC -# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsG -# AQUFBwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t -# ME4GCCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl -# cnRTSEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADAN -# BgkqhkiG9w0BAQsFAAOCAQEAS3WhLbVfRrGJp8+PJj6+ViqNYq5S79gW5hYgSrqJ -# FFoVps0OGP1EEVAX9omITmaytAQ58APr/qBVIf3WVlYGqDo0R4b1P1JduIA+8n0I -# RYWx2RdSuNtaG8Ke5nuSpS5TkEC6YjVBFuliBkvdQD6JleSaNsaHWWfytSFYjFsF -# gvhKDaeqkHjinsJQViQ+P8xvBTaC8FXaleOPlZqyShm2wAIy/mDjYE2hUuhECL56 -# /qzTs8634m0dEibzuVPK5zzCHSzBM9TCSwpstTVl2P0Kmq3Nee5UTTDnR7Em9FIr -# dW3iD7S+KCkjeo+YN2mR/37gy/LRcw1yqu2HDbRH4+QiUzGCBZQwggWQAgEBMIGG -# MHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsT -# EHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJl -# ZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEAM+1e2gZdG4yR38+Spsm9gwDQYJYIZIAWUD -# BAIBBQCggdAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB -# CzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIDwkNFE0J7lFqDFWlO8g -# a0Vg8TqicqZe2fbuhTmOCdCDMGQGCisGAQQBgjcCAQwxVjBUoFKAUABCAHUAaQBs -# AHQAOgAgAFIAZQBsAGUAYQBzAGUAXwBtAGEAcwB0AGUAcgBfAHYAMwAuADgALgAw -# AF8AMgAwADEAOQAxADAAMQA0AC4AMAAyMA0GCSqGSIb3DQEBAQUABIICAJVRHHyG -# aSg/QAce2Gk2vae47EiAxljo70Tygvew++CoLy67kRcb03qFNxlfcO033TA7muKF -# IbRaEU2o8gIWArJmPZmMfmSB0vF+YzISbWEWBGJuHOEeNuCQIR2DRziWvmrfdwdo -# dNpoUnD6M/i8pI5asDc6BxyR33WCrH2xNJlXDg8XGuG7df+nymqXucGwydAB6DoB -# +QbIjnRMr1ZCFtWsetCKRX2zS4tKQxFmB7cOjsWKsilC1fgDf7/YGoPlrvaPuVpR -# i1OzhsZksi0M2os3S3NDa0Dsdc+pg8+tZrk3F7az4dskqrbv5++3o7xYv3c63Z33 -# dExvW6Jm6YexPE82gZnfGhtnt0shk8ga+JJkaE7/QBxVsUSHZHBZsXgZsLz6p6NO -# YsYgMQJoIb1Z7gxHrOIOto/7fvVYdkcHKTZ7OWcmzd5lvwn47cX0ElfEeiseR/K6 -# dVM2y7NMMyz33Aa2arGDIatrudFpCuop/Tk/PxqpiA99MkcUKOMPNs5RXpeR+VyJ -# ncR8Wktx9PtQKzbK9VVAg/iw5l0PDgvn9pIBLNKFxj/nAF+KNYVV4IyyCnseFMMT -# LetKz0LN+NhvUrHsq9NFwxMW3TCUUUqSdPTTOHnzmwVdLynqNsMd+Dx39qKADPBd -# i6Q1XEluhGhdxrRCo9xnF6orI37ozzVMYFSOoYICCzCCAgcGCSqGSIb3DQEJBjGC -# AfgwggH0AgEBMHIwXjELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENv -# cnBvcmF0aW9uMTAwLgYDVQQDEydTeW1hbnRlYyBUaW1lIFN0YW1waW5nIFNlcnZp -# Y2VzIENBIC0gRzICEA7P9DjI/r81bgTYapgbGlAwCQYFKw4DAhoFAKBdMBgGCSqG -# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE5MTAxNDE5NDEx -# MVowIwYJKoZIhvcNAQkEMRYEFIMEvvUpkO4r3hcHdhB8ezxwvYT3MA0GCSqGSIb3 -# DQEBAQUABIIBAG6a8VUP727ARM++rUjHHi5e4yk8drKTw10/4pUNOI0PtNY1vpc8 -# XFssjutk/kiVCAzA96cZfoB14N3vTzgMhvg9KlxqWFlJyBR6vVI/1uXypfBWD6rY -# CiTWZjRvNWqGsY4yPmGv5t4hHdcMwz4pSXCgSNCzlPwAK5tZT1DVXZt/MS5tieHF -# PNw2phbMYyvFOrkQrtLF0bjBY0sWd+ABRnw9Ng3cu6IE42kqVqrCl4l/RF90hcTd -# V9TQOc9vYgbsuwDI7VILxI3WruqQhbhIj5KGb3N8qWayeNpAj2A16Pt4TIR9lTj/ -# T2hLH+2yqwga3KDkVcxVwxIibAYHjZkdCfE= -# SIG # End signature block diff --git a/submissions/k17pine/data_structures/venv/Scripts/activate b/submissions/k17pine/data_structures/venv/Scripts/activate deleted file mode 100644 index 4f1c24c..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/activate +++ /dev/null @@ -1,76 +0,0 @@ -# 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="D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/Scripts:$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(venv) " != x ] ; then - PS1="(venv) ${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/submissions/k17pine/data_structures/venv/Scripts/activate.bat b/submissions/k17pine/data_structures/venv/Scripts/activate.bat deleted file mode 100644 index 6f09370..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/activate.bat +++ /dev/null @@ -1,33 +0,0 @@ -@echo off - -rem This file is UTF-8 encoded, so we need to update the current code page while executing it -for /f "tokens=2 delims=:." %%a in ('"%SystemRoot%\System32\chcp.com"') do ( - set _OLD_CODEPAGE=%%a -) -if defined _OLD_CODEPAGE ( - "%SystemRoot%\System32\chcp.com" 65001 > nul -) - -set VIRTUAL_ENV=D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv - -if not defined PROMPT set PROMPT=$P$G - -if defined _OLD_VIRTUAL_PROMPT set PROMPT=%_OLD_VIRTUAL_PROMPT% -if defined _OLD_VIRTUAL_PYTHONHOME set PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME% - -set _OLD_VIRTUAL_PROMPT=%PROMPT% -set PROMPT=(venv) %PROMPT% - -if defined PYTHONHOME set _OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME% -set PYTHONHOME= - -if defined _OLD_VIRTUAL_PATH set PATH=%_OLD_VIRTUAL_PATH% -if not defined _OLD_VIRTUAL_PATH set _OLD_VIRTUAL_PATH=%PATH% - -set PATH=%VIRTUAL_ENV%\Scripts;%PATH% - -:END -if defined _OLD_CODEPAGE ( - "%SystemRoot%\System32\chcp.com" %_OLD_CODEPAGE% > nul - set _OLD_CODEPAGE= -) diff --git a/submissions/k17pine/data_structures/venv/Scripts/deactivate.bat b/submissions/k17pine/data_structures/venv/Scripts/deactivate.bat deleted file mode 100644 index 1205c61..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/deactivate.bat +++ /dev/null @@ -1,21 +0,0 @@ -@echo off - -if defined _OLD_VIRTUAL_PROMPT ( - set "PROMPT=%_OLD_VIRTUAL_PROMPT%" -) -set _OLD_VIRTUAL_PROMPT= - -if defined _OLD_VIRTUAL_PYTHONHOME ( - set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%" - set _OLD_VIRTUAL_PYTHONHOME= -) - -if defined _OLD_VIRTUAL_PATH ( - set "PATH=%_OLD_VIRTUAL_PATH%" -) - -set _OLD_VIRTUAL_PATH= - -set VIRTUAL_ENV= - -:END diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py deleted file mode 100644 index 1700fd5..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install-3.8' -__requires__ = 'setuptools==40.8.0' -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('setuptools==40.8.0', 'console_scripts', 'easy_install-3.8')() - ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest deleted file mode 100644 index f0cff0b..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/easy_install-3.8.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ -<?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="easy_install-3.8" - 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/submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py b/submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py deleted file mode 100644 index 62126a8..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/easy_install-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'setuptools==40.8.0','console_scripts','easy_install' -__requires__ = 'setuptools==40.8.0' -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('setuptools==40.8.0', 'console_scripts', 'easy_install')() - ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe b/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest deleted file mode 100644 index 9c19e18..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/easy_install.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ -<?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="easy_install" - 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/submissions/k17pine/data_structures/venv/Scripts/pip-script.py b/submissions/k17pine/data_structures/venv/Scripts/pip-script.py deleted file mode 100644 index 98442a6..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/pip-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip' -__requires__ = 'pip==19.0.3' -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('pip==19.0.3', 'console_scripts', 'pip')() - ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip.exe b/submissions/k17pine/data_structures/venv/Scripts/pip.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD zu_-L8NU*G<xQC7$Bg`f~d>lC{d0L!!VW10^+~>qmNB~Y8H+F}!P8_d(PpvjzMJQmr z)F<LB!IdzF`7%cck^aLb_J<@DD#CfB0B$E^bzV@-Vr`q!&`=<s^68_Wa_GZ_v^?aY zU=VZGXAzm5x{LcyVkUd8JxnNsqtS!3fw-nje@5tui@0AmI$b-*P5O7)s<z9AVj!{a zusK!aLirXkGmKBs9|=}}+<^)RB1ao<^{^>kX;2B~<|3JfJeWv@IXo~nTtp$}Gjie> zs8UDG*kid(%i5QCBp~MA;#I186PI-nZ&k7!k8BiLJSuR>h7ArSYHD~<iO|JiNP|OD zR=9Lm@@Ua+Eq87EAwAZBPGrH*)zP)xEF>B0I<PUu3WRluor4HwG59U@*GT3C4#)*> z=T6L{zqglekt0JjG5z&|GWb4?+B5+{p^fgTufl_KesA{@I&g7rNq==^SGc5GcM%$N zDBG2)qExz*Z;jGN_-iD-y8i2BCq)p}2lKcspLg>w-;qwg(()HXrZa3jd!}spuwBVX zwmX!iwU<Qo&ds@10tJ4pnneT?LI)M|HS1v7YY$x9Bv-SsJ$Cl+xPAV;6Eqk-srxG9 z{LT5_#k!V#{GO}ibh%Xvw5jxHs@yzGY~@?`(yJD$GqsX;X$pypI5DT^o5eVu9#Z@z zw!tumU}_j8#vZXTB&Vb!;K(WYBw))aIfHo=I@urFFfxYS9PyXWVFQN5U;5Dw%tIz$ zw`nTQR_c;mZr;Y5QwPf3_^KR#GvcZKkFXD~jQGWdi~_bGh!>?#7uoQnunw|OlU~+c z^L5Ak3zWhaA4B^FhMMboO0k*O2GL)lD9_<$5b>czbCvKcSt+u*gA*=%dH>Q-Bc11h zzO7jbXN)&5mBf=w2anK6P$YcJZQoWa2#E!v{hFKxxm7Fc)Fc9iC35{|Lp7bIDjrhC zgMiGf4r2yquH{U7WdMio;XS4Y%Ry{q7#kv#gZ07i`7eo#MMh_o68E*Fd_#nrri^4b zX+slbsv>+8pmck%oLDU<yTk`c&RTk8mVQAOK~qMQ#2raos*zaqlvJZo>L()8NRJ#Z z8DReF_eq2zsjEXGs)yS{k}ykS1B!ZrY0f6O65^lslJv3g&wfpDg-&EwF8wrc=hSwm zPlV&n%%yE_@onOwK?)`GNJ6MQ0drMuBYWCH5dkD)uErh@*k}#GcFl<-;;TN+5vb|b zctkCv;*zL7f)A;QuO%(81r0)&aUz4EQu;kA!k@7i8RZ)koMaWW`5cC6n@{w!!J$5d zx}l)4VP4xL=BKi&c^{n_Qi`q@G{vimblcVR53b#<Dz&@nl0LRIeY=p^I1%{g=J)$y zJ4tny{}tcKG0i7qLLJtU;jl;LnJu8bQak(kB&;UDjom{#=dp=&3s}YXYz3C()*?Ie zpOr>*X$FUOQFm!A8JKahNSiBdY+x3bJZfD8n{--FLUM4+Mx@{vM<W!B9QJEa7>_ep zkk)U=K8R(rhU(X_faI*ZO}cn`5t*O}lx^j8|0rt-)o=Axn^DGcQTi!#7hxLTq?|HQ zB;T6(nrsCeYK0_o%)IO+CP{n#+|;w1ZmvD2c-J{i88bp63RjyKOE!B!D3U{RCs*Zh z&^%65VM(J34230U4bHS}M@SYS9TEK}c%)2<$h1|T;##zRtjRt@#1T%J=kAhOiw+Z% z7DpyWVK@6%9K^uVD9LDKj)dR^aZK6$@Lt)l;sj@`QSzBm{TlLG{JKM_^60Zr2w~nr zr>P-BaV8OjjWm?hQ3$ZCx+lyD%q`~4iNF9xWKi$t&pzBhwN9Dq-o^v9@=abLR#|<P zZAhQVQAqt{KX8b!o72`jV*h~V{I<6~6`|CSYi!tcFRq-OP_ri!l#8;keBk$FyRh37 zh-vx<nho1V<uSlQEH;(ry7_afSZop_PK$8boQKoq+i)shoyMOs4}aFK<j<xGJnq14 zb2)CC*WtE#b4An68qy4#ciQ16Pbjcq3r`~(syir#2qbbvYtKWddcXwdfk_9bi9C9n ze)1pT^3siP-~5MsCpR}_o2eh^LneJBm*p>KZqkLal4YCRR9VNhIM|rBqmzzcImvcx z66fD`zj4}M-A;gyA17cSC-oI$`q?*q&8~)Qv|C#(aSFd|hYbf}FFVB?n3Q?Svt+Td z#AW4x=9X}?aizE|`r{}3l-H&b6-{_j#STR!lD001vu;K>KT;*^ChCevBwCMFpg{JI zv``4YsjK1&142Pl%%A#u3rbGso1<_fngd1`+}!pMu@z5Me_5UFxiPYKqFL4_`WXmY zeWJrZUKzrrMuBcHupOq4Wr12sE*T-*CXh;FA=)Q+BMN(?DJ!kq?%Ww`xlG3e;lz2t zY?tl;i?gHO_79VwJ_cThq^>FqRUPlqS?IuI+CfSbNkv_1l~7eGaCwRmuOF|ic1ac2 z9ldo$TN~LhX~J01P75nyi&d8=Y@QNZ5e<=6v_R3rM}nN}5ae`^LV&sAD<=;*z=!~` zvJ0@i!orMuT*5kyXNzJnxfU!+#FTW(syy@yj7XX8#zD_9TWBSg(;KZ25VO;is;-&R zf(29n3U}agkC`j4sjX{=`D1EkCC@enOA~v{GOLYQKAdPN6+?W+QE4fLMhrW4RG<SI z@?qI-KY>bH5^K(rm4T}`=ra<6GP2}cRBE9K8^r(O+ZvKpJDL~qNguPmwQZp-8m7V@ zN^KFU8@Q*E7UJswZD=OYtct4KqA&NDKSOfc-#M>@o#)4;YLqtENdFS^3K9&dFBr|M z*loqE3X2sMmi8hv#7H5<kgna*Z>rqGc_y=ShEbHT^m7S`?4d%B+(-6dYGI-*t5E+< z^P3gqvBIHjFQNKiDKj-p;Y*MmMAXOK^8{gVhrBn?Un}%9(JqaGPiann?Ll$aX-{n1 z!AnT<v!xN*zo+dH+)yR$d)}fNUUOcJ)Xz$%vH5mur0%L;@p((;IW$raH52Q@7``Z{ z?rO>WyjwZ7y=hrziEYVZVX)-}D^!8a+Bc<5#*3h1xvWqS7I$WL>iwNNvp;P<;TX`| zOF6ZibFB4T(YJC~mj~?Ev*ln|9sgYVFTcLiEi{YE;!ZWj>X*aK9|va;HulW-D`RH9 zw=O#R&of(j+rwMS%oCi;+oFskQ}@q2q4x)O3<fKs&%WtzzFD};-G{Hxx)V?F$WHWF z7(*i07&g=2&}`P4G>k5e6yDx`kLvQs@M`+D)vGA+`X6%Dl9YOA?Qrurfg>XqT9E@^ zgWxOT&hX+yo>7=HCb!3BO$p54I3{j@qbN!+nu>Ti*O~vw`5RU!f_JXS+*x#-zFp@m zr}GGVhgT1=p-TFp#dtAVjM3QdpDoi{l*z?1s=d~(E;Fkn=*i8+oB<M)E&5W?I^M)M zknOw+hdKDcP%Q}tuai)WoEa!7&-Iumsf3KA>cJ3Ib?Vh+rZWNZ$pO`dl8LcBv_cAA zc18lYB|rc<0u%wEdTGEup|%_S`L>@ui4LTkvnNApm<q=y*er!iCv8V>#>+b4WIF<} z^J}=w7L&$J%unXCb|Wy{z3WVlMDNhz3o7S-3)6oqjx)7WX0HTEH<C-Do)>{-=9>q+ zXXtoVPHKfVJMk8bt&h;MII}u~0l79^#`5CdW6Ef!eb|E&Q{UJ$n$yP;^Jd)qhw~ej zB?c~nN*%0zm%$}MD%|<q*x?^2$-sGY)_qDIsjoQeKH{k^*%_~Mm`JG>VZuS8W+Qtf zS+Uu?;oSPL<h#s;p3UgxZ3c;@9(LZhh9?&RH`z;Ufi?^GL|RbrQ|i$u#k>L}G`jMH zn3`(J{6K%B(Gykos(!d}z)Wr!%sjC6=V@s)qG1MJN~uoVlq{jeI#XKPMI;@L^`RBZ z<X%K$e<C_&9&p~HQ%fuI$-p5?U{jDsR}QoVqzzw}E77mP5v&U`27f1F&0F8zlxE2) ze=M@fh-;2;q_!ewec2frY%fKQkh6Y#Ck=~JBu;z6vOFXzd7O1mkt`yaC)8Gn>0Fhm zEI{|uQr0z1gk4W{mj*%4Z*00DBL5ko{4X}2{Dl0wAi#aSmq_r~FBHL|;}P&0k>OU! zhx64h5vSKwffV0W4JQs2dFBrfQx(B{AK=BGc`U!}S&BFnE6QSvw?`~m^}8j(4$IzQ z_WzjR?fD!VI8Aa=N;O96$f<JeDN}@@k24)dnpa7nV{o~|y480HWd%qi09M-w5HA7H z5t)dJA9OeU2(Ddz+nofIxgaM#sfN{v)}n+p872aEFyGb(<(TUTpJ(1Bv9RRP<lWbe zn*X9W;yA^EqlAv1#u2Gg|1wrNw~{@z1W#o_GFNuVYLs|BsZ*hkg_h`Il0YDiCHm+W zmS~Y0wwCC%sMd>IWzW@IV2KtfOm4MwFVU~FM5pwL+-yY-+$4mvEEjvjP+5JUm8n(w zTE>U0(q9W!VAi2soP~_07HUw%Pt_tTYxD^79a6Fw-(PjP4xwLxv3Ycv!%RV}m`xvC zX`nx*(H@IF+EJ)392Ul)-t@Oj>L>VGb7%C~V}eWde6yYkCcYR2>L5_BFiz*D#3I_* zY)|v0XvW#xv=Y0=d;t!!=&NUW2H8t2>2H>>rUwQga=@Hd8s$Z+x+rNk0%K7J*cGvn za#2GFTwHgcx}(hY&AoeJJ>OtvvdouZfGLkWz?5@JX6KrhfDJ0`xz(qU+f2hY)2ykx zl5dMrs#`m^OO;aljpVNpXHI7j?NBazjFr-P<5NZ{lysyym6ILI!i}auR#r=s8-sHH zo|F}x&aDr!mLdRfA3dBON<#lrL!uSm7=o9syd*hDuX`F0HkX``(5Ixonj|KOyUg3^ zQc-Q1zi|oXoEJ7t`z@l)r8HbVnV=3@R147(4T%Z?MF>|u+vhb+dmd}f?PMV8SW8Om zNGeF;<~ukE61hiT7Fejt`7XmU^|R{ev+p#`i$*Qly)%e2TjDu=LV)p<*h6u5gyTBv zF2X}pxW+%<Fj!P}AZas9RZ`k$Jvv1owwn8%W?{}x!+bkqQCghlz9l!;d?w_cXMXg@ z&=}JPT7tF@L2ahnMB72@q!wG|Y3@>;eRIVAvq#45Tg=WlQSFR|)0f>5G`p(9xM7}| zFKtPEbWZkN=1qLjD*3c&W=C5QZ78nOyIt7^bEIKqkTQs5B8y0Tx?-c7F3RU`pPOs` z_?hl<U&@p~CMd0Mfz5AN1#S&Vwsi0NvWloHbK|_KEOMjJm}q8E=E&9JuvOv6IZ8ov zcoQ8$o#cQM?=kPAi}LePW480inT%^k+4bRRjjowT_3NF_?RV~cwfUrD02;pIjR9GK zQO@U%q%4cq2SOIu>A-(AYe*|k@#n%-mt4P66m+?M)nmWXqWP-^>As_PEzQPQQFQR8 z8-h3Q39C3Q91oVz2*#A-KL%2bY;8!cmJ9uHA`|<v{z~0`eQ`+GHZb5=o_|mCd#>C8 z$NX`>3!Xc-34zzMQ(s0p^HbkPL0@}t>MK)QkhQHnsYONA8Y3sjLq95yD8o_vXX;;L z>_rtUVz~Yrx{&>y!BX_$%=h%m(WLsmNbc^@hvIY`rx=`G3p{Y^ZC06YKwy@l-|)Hh zU=6u>PjJFvP!kJ(Tc+sbM_EIjrY|G=W}4NvvWB>k^nM4`K&TNt=8t0byviN1Lph6= zm_yLKL?eam;`vUGWXllNQpvgH+$3sPb_yL=Bg|EjmK*vv&mK-$JqW8%=|ASK>2#&P z_Hr|Y5Dkgu7#^X*C_?v-?p6bh!n7?WmSW!JeSwnSm}M7T5((zV1Sgd@d05#6N@`iq zIof-m%Wyrh&Os_zmvwFpf)UBIy{<8BeDtovo%NaL&_|tBV$bJ-C;E$apFPY)zG1$1 z&owMVml>CDJKAdL5zE6EYkt$pYmLfF?wDG0`I8N*#DQu4-A7E6KcN`U27=18Fz;s6 zgRIKZJ=&bE;>8osoUL9Ryh=TbC>SSDx$a_ae4Sb3Y{(ciQKVJ&x*C=an(TMl4xLH2 zXX$$5{C?<{&`X7#bw|C!?@WU>(wf=M60Egk4C)t`yyBd`(C=(qFld4VoFf6R4+pHN zK8Ll6cJ>?zJRuIOK|)?8A%{uGgm6egv3W?S%i_2=V{%GzdHk`#X)(c}lhxAXtow#+ zFHp)}cHUdTEBD@=-@HTIVx!PQ#~t7^T8*<#^hS~|xc9~6%di^At;m{`IHO;U1JyJ& z?$6LV#Y%45gWjnIu3a5-`VNydN5;meS;L)mKjUK-hMMbbbJA&Cbq9~|S=gw!q$wS} z<Z(t^y7;u%;xGk;LG3lcOw_zt$NHvB?!ZTuJIo+vtIY)W*7UDg7nZYhgoJ`|`U@?# zf&SRW>>!$M`UNJWuIMmgl*gmkLk_ZS(?`c%lMZ(&XFK8NP#)0^vSl6vFEG>}Yt=qY z>WCarV-#iQR(@uObO3d9Zj~Ae<}6f(n;Hky?Oz`=r|lj-I0#^gmZN5;ee)19uN-uf zbLW7xnioz$Qqpv@afoy00q1WU<dahvrqv*^Tb#kb-RY_O47=@EAgz1AjGqJEU%$BD z#{P{%{LcENgC^i$Gs0h&&6#v8aM9Ug50ykMQMk~#qpD^cswS=IIHD-)jLMD@Eu?Zl zXzx^j#tYp#^O##HK)x^gH2Y8oBzw6P^DLtqvNE>|&pEgH8343To6masFPXZZ+i2fw zw(TOJh6NWV1zH#tgBTU7eP2E-U^0`E%lVvRweM3##v6R|Hc)r2ZWu6UP8uu_SKF^7 z5Ei+b&tX|(bW>KeN_C)b7q?VhC2@*pFT<#gaK20zQb%f_ppm8Xf&=AdHBgp?2g=0N zzUt06{THYVS>0fh!O|&%MP5GTWr9DpB_rmtxWJV%cw()<Th-`+9pNw^epR)x<&H5y zNn}p<5E>yvDADh1(g)ek#K;gD6diD^_G>B>y~3*2ri=>?y@k#|fr6r^y=jEkKl3E7 z4M}aqf+KgXac<4$1&vT`xA250AV##H0=5ek@I!)vK3Iwme$0oDmHS)WNy*wIdYTYj zZRu7LFxIS58JMfP!&x-K4>+HK()5vW=nSz9Me#w3T`4{giqU44ixK<NS-`KgQcF~+ z$)Xx~#$%3oPu5N7C1^%ShRb#_>rd!tunBaOeaO;`@Gg0VSi}FyYeUlc*jfuoTFFEd zOR8Z4RTBHrnM_v=qLS_KTIyGvYt1|?i!+C4y??`sV=b9MS0Ju6Q)C6T`W3;Z%o85d ziENh~l0#_RtCgzGELP8JHB9M!#^AHfT3W1T^h?P+q1$V+gEe9y%{FPzuSsRs@Ay-r z&&$%MWa*cg*GZ8R;SHL@d5gHczoSYe+a|;+l&uAZooROH4pP=g`GeNXPLfFzb`#S1 z2_-JE19Kg4B`^wb`OGw9drEbu!t~n%qeIJiU}$Ld55)5#)skz}?aZlPlQ8z#UJ#-| zYO^vmzd2P;V*j5ETWQQ}A;NIjCB|%xCEmF;jXrG6JdLv!xSAK@X@Sdl!B-26nk^;Q zowGGGn&>N2cRRN_tq77S`L(hZ^0u`V19Af$;OpSM*@-NJvG_<B4C7r?o87^iy*8Wb zMrpq6c67@_sMBrzt2>@@hy5J^v<IIiJ1y|!Q!YK$isdqQoTPDML_TG>d5CVZ8v5tF zwQ7lkRx1I6-#=R@`m)Md`q#Na+?08k)vz7fn~b?P7;2Kt8t}>IiMVUrKGxYujGZWb zLanz`MzcgG7IDuLahiX|7e$b)I}hh9p%{<(HOiH54&kp~Ytv~>ArTCn#S8~^$oQ)X zh^?`%yGTMs6NUtL_ntBL;MAmDP#8v#36b}%i_U$y`ln#i)B;*>S*Pvjco$ClL? z%=q~elnuXpj0WVh4c6?B5^b?x@W;C;BYJ#|yQV(-^BV8xS@qdyP_7}XGtF%KKWAjn zLectNCDB|O$s?N`pgU^fn(!runKLO{ZL*IDdN#goZ=z)9FDy|a4b+7tIf&rq{hz40 z&UP~#62@?Yv#|LPJJk&HQ3e)?F*x^tH_b5TT8Z=h%QKll3XntrekU{W1ucz%R_!vl zu6JTwtI@B2wku%k4*@aLHLf+aS<jd)!%M#cTQ)o{<ty6y;vrvlB!}@s{CO0_`ltZs z3fJ>dHs*_rgZ{Wh2W%`KXEPa`u}qU^8Nd`Gtzm`f-1-zBi0iySJ$H?3COIw5Sts}8 z<+Vm%m)h*yTBpLCW?Q^x1F!Vd+Cd-yYm=~2?%cW>C+BZ7&rJ<xIqNRtBg?sU36IuH zGk8uOY8JK)$4P80(iq7HrP*8qcI&NRs5o4XL)iMFv+i5c$~Hy3oMB$wp_-Th?yNKL zAangr28eU(Pbpw+wfW(1ey17vQuDUsxUj8DIfV^QQ0G0jGyEy5^P3)CLis=cawvai z-5gx4GVHJ%DF#_>{WkI2`jH<!Izhz8W}oAaF^s~#^M*_X2XtOm#D*kvo)l8G*-}>+ z<t5PsS#I^dD)cT0YpM^@RaIwOUV(>b9w~ZgNut<T7H`U!4Nfz|w82YY^r-kX#J6>( zRG;4bHiKMr_Jpiv$aIiF9yPwvac%awnv<K8gmQS^5Q443>2~cp8C&!2=C}j(2#tMi zjAaHm5bPpSUwa%RYp-#*{ngfz;(tXArj2S*S=&8{L(57D#>Sy>ye}&aBu|6{WXYoR zJy=+9jhe&f&&Pd^I=}K3&D!?hXM~&KKNL|-rI@I}J}9IBm%CT4Pr(h2lA`RU!W}#z zTt1O71J@X3uEEEm16dpYC#BMwiUd{3p3PQWl4fnzvSl_Q9@M}hNeE;-!hE}nWGGc1 zPd%s4GDneKLvjGcS1HB`9XaviNE~IJ5)rQKQ@w;(FbQa{p*Dyv{NvkHXAi;5a-v(C z`r^gH3Wfzd%G^(xROzgOnu~kNc%v|Y{{$u`D4$wu6mDT|WDAsPz{x$PmVRmi?cZF+ z-U3yHJ4XL3ya%Jx{3B1Os@RU`W_KkhwTO`EP<`_mS~KR8U+7dTIE{Ja&Tt#Gon$nl zE(dWJp-%nLFGR6dIAy<_TXIXDnE(n>ay2-K8OIy5nAx_qmLyOgtQ6Fj%*-=qe@HKi z0nCq$syuW4!}7)5RiQ;?m+>J6id0FQbux>KbU4=#b?)3Fg%G{}A@pSk=NYO@J@Gx( z+{gD5$inzGt&2vIBM=9%&Ys$We)D#=;$X>?T(d~*H3&8|nSsg$L4-o()4BCDnT9d8 zE_0<UD}u4Lw;fd;UFHK1Sw-$AMSfUDn)r(v5hd^Sk`)Y2*Ymsk6l$eaD9LZJB+_ZC z?#wseq9VdWMx##Wq_ehmu!z%RL@#$oFo~*F_DyBDl?uh~G*>`&P_=OS)^ylwt2<5* zvwCk}v{^^0RD(Mo4Ce-R%T811{Z?J%>mVhkZSqsZUab`AH#ms$5NI#mLjx`}s<cDr zd(bT?x#j~c4Ean`t;tA{$e7DliznxUyYchy8+U-d7c;x*N+iTJseQy>ob@d<%w|L( zocFxQ+iwIN$`Lbg(^wA>sk1CDaCHq1dn;88aoAtv)vqavty0V_rw}n1A$&%RTW^fp zY)}2T(vF=bG5SC~B*4=@Q8ksK&3H(1Umvsi=+-mqUO_!8b(bJ>RT_kck`^w4=oz2- zwmQq2dD6<s{fq(TOjQ^`MAUW8j=)Q)pKZQtBiUBnNhi3h<-*+j`^bGNgVvX9{sEGR zNO&hvNz2S>)<X=Yal0`ZAdBD?=G#SKJjZ;G*RVweNW@0_IHN=HbIvdd$%?KtCDDXl zS-puTv{HE}Vwupja?ML6W68l~ZcsT0fl8=k*}`^H<U@)jw_TZWQdA3@6ACGl0(xdK zv6O82hzlWrpNr9j5G_^2VwJ3Rizru3uw+-GLsw+ulN!^ZTID%+Zm>hOs(rtPvK;BG z{Y=ms-NO?H{RW<b%v>f<@R!l@1ap~PGv8k0k3-q__{PCC@7C5Fh^ikPxV*RPmYM_6 z0kfvSzBw?k$ERj&%~qlI8?ow$vto~Q!31rW=wT=8P}xDGS$oy?u<(xFOYiHeWgsP# zT)aFG=O0)ID^^KfcN36{h|5_lk9ol<i^Xs#!VJ1=)5TyRo4{4=Mm$HcD9|-JJ&<fh zkv<f^_enN#g)O(Tku&Sh7?;YX7>2Erhw1%VG`GJQ^J0PAl8jr?Yx*E!U4=K2it(Ud zQ6rhrtZtLI1dW*3;fTHQ-7(GY#w6b|7=sK8vsi6UF!k;QP1I`7T{{)D%r}j9f6JY_ z`axh=-H>^}`P?qy;<rl2GrJD5de^xKlln23Oy<F+EPK<&BrJD#Zc35s&LNx|Ji}&J zXm_K>er7j3=la1cXR(2P^}~G5U@)^Y9R^W~(Yf&ei6pNG>XS)n>Z@{y@SU?&+x_PP zwi4TIm{g4?h9h`GI^_u<CDQ?3teJ-(%{L@AWgch0dr;Ksu;h1GD-v@Vd?KD%8=f^m z;~-ZoK9U+x<NkT(4r1pAmLrJ72_nawwuDKdgr0<*Fp4!2$;P1$QjoiH>ccL{tvDS( zC7i=<#ERSNqK5joFl%3Dof%|KBvEU5qQ@ea%d`kN0xVuIHgfZRyPgfKsk;4%Cssd! zRZy@kcG~O{Xfb=dB)TDUpTCpV$~J|+y5e-hioLf6Tpsh<?=bFK?P5~WABz$q<20L1 zgK^Njk^zL6F8vdO>o_n_hSP(E;qsV|s#j?^8BAB(5Hf@{N#z(eFM>tMXu;~1uk&K# zE;Rzpm%)M=;(^<h1j!5clYZyCd5BydPFZnUI5nru$8oe_LALrZ21JRzsDzD_MOjK( zk00E|rj4;t{uou#?P7|O!p$-N?LHWDp|9zbIyggai<?WN4itPete-Y-G=orT;ji9@ zLZ=ymGJHhw=e8|l=poY$b}_LL$-0_PXX|5f%|!A;LiZHb1)@|=P1CS_a;kCA%$JSh zxHn`U3rtF09;IJZvp#yJae2*p+iYVjBMKEb-&RqNfxq_i50rAjaJMzrB+u3l!Dye9 ziMZoyHmr2-3XD;W@iY-=yLLglF9DNcS7U9=rn>O${@GT2SY*Q<WH6{6fu7s|*TK2< zT3P#Nn0GR%^BYE+f1!axn_2WK8jB`q6;Wudt(Y3NX71&$7WkD1)-24lgPvS-^RHD$ z_24>}7pOi8US|%YNHQuI9Dx}gPKACg9BY2xSRbtn$9iuY9oSBsmKgV3c(wEn=%-nK zD|%o2NhvE{vveJc2sn-K3I^M)_Ob0-oNJyT-AUD_7&*4H{_58PGyIvmsB7>#GLE9O zM_%Yt+6~?L-bud7E~=~mV~m!R6?=_4{MCo0O}Rex{k}23X2mR8`5ssCbIoY$sMFI9 zV=R9en4=k(1bGJ`JxbOSr0X_SY1>&{IxnuM;$(R1rZhlZsNjrRzXB)?&li~var z?B}%klDLWDf^4)nO#Q>nX4L#{frSueKHj{6e&Bw?L>`d{`ZHFsWS3ZmQoc`R>p!Zt z)MWNo*@Q0+(@KUAHQ#)n2!1ZmKjktmg>5tXOlEwvo@l;@bE{CFH1qfBRZ%~VD0^FK zYxkW_5R7B$+uR~XI@m1DA|0`t2h;L9#E9HeM)1wN?ybHta2K0&yD%+>v34#tOPGE6 z`4T2CtnhJRUgKcr&fU(Poo6zxgN->hy>T#X%%RSme-YWd)|AY6<Q>vM0lNYNQ&yn% zUR-P#5K5nU)Yx-dWQHOQ5Jo1y$g%9Mk}!8IeeMr47nESfX>;2=StXRpPm!JqVOg!O zss1JtXWbeChf1w%MT>HGxYweE6iHzp10k|K23P|lvUm(HB!wrCOfHOAC+sN2t35LB zOh)u5<f*#!IgOW4DXvp=1(w6XCDf~{2e47@U+w>B9syRTR=6tT`Fqj2nANt5guo2m zFRo1DZ{oTuaTy*M?|e>p@X=?|N4fNYq|h*m3`rtjb3S)K(tr~W*Ak!p*pjtM&|QE` z1g;w|3YQ_Trwmq5RfH^6ge+BrELDUoRfH^6gsiVr1gXj)W9({XO@BJWxitVf8QE40 zLOB<V*u~}OEb%~M+|m&GzUoKm-f$<4BQ9%Yue(_y!71{a^buyY_Xq#|XDDPs%>2Ws z#?1K7`D%?yj@5<1AMJ1LLKc%*@PGU7yMNKNXMh&qIPd`w1JXJYm<B8WRsu!9-9SC? zFz__+B5(jW4s-yHF5&^nKrT=M+zs3V+z<Q!*a;j0jsd5DGl2bbjG6(Xfr&seun_n< zPy*Z!JPqsx{seRYgCIwZ1g-=!fTchQPzP)SegOOo_$_c4I0bY7age!&1CxR40S|CH zPzG!S?gbtLegW(T4g>E39l%IX`-wm@a3j$7_kLoU_KWm1ZQ4y~+M(s#*}g5UJIHUI zPSYM7*7F_qSY1$D>MeBZ<?cJYy4$<HSa+`~FZ8-sSC+4FS5%g-@>W$%;b7krZdIkX zK=(%axhGU<{MY7`8>NNrvT{ksyGmSfD<~6()x~9nZqEk2sJu*h8hXL)rCx%Nv^H*R zh4Ps~G%44(vEA{?E4*bY)KyihDvK-hDHR(epUO-M>aj|vX=}79ZIxE8Rcc=TP0<Rq zQvT7GTA603_bVh>ZDN^GT57!tV<JYH(52a8w3uj@Ju@@2pZumLX&x2Wo$Og2>(H)C zO3L#<8gjb@-_RT@i&pZ}wDlG1`8fyy(bwVN;ozTqYEO+#*R)Fkeo@gjd%u`iNB_71 z@dF1rU4t(gk}&k*OA?0-A2D*&=rQiGmyR1h;j+soUUB85$yZIeI_a8gr%szb<GSRO znW?j8U;nkV^c&`6WX_$JHUGw&7Gy76<XOBVXDJptm*;=|=37?WdfUo^+gBBOSKm=o zTykgWnzHhWyDF=6W9_>28}9zb#_CO*6`47+OuE!lUR<VoD=E`WTBf!{Tgcx9+EndY zS}cRN1**Im-riy7mR8NJ^m;X(IbJ=tpwv+B^CI5UOH0dFN#shSOfO#Jb$cr-%PZZQ zHjvI;x?oXGj^!esTF(51^CCXAj78b$^B4BGESZrsb=ttV^fGrrMMY`xssg>3AyZUP z<z7?3uq?n`*S%{hbQ!Xx<pm7gBCmUnJDhiE@$Hobl^fi})VZ?KyGk$JFeT1Y>Mf}9 zGO)|^f>p#MMnvkDSGlW<ii+||e7pr~+^Z@4n(|67Y4Ey6m0*f0Jmr`2O&u6_l{>ws z7zSx)=geOaF>~~y;wpDRRh4(m?WG&sg+^s@*&XgOl3FXppd!U(#d>i;Y4P1E`M9ML zo;e~F_7c;5yKx8K?hWNeWn@{WxaaF`g03mA(%q%ScX~-(s#EE$GD>xK`D*v7g3?mS zjFyrzUA3xwO@*4`6R%!XT6u+gwNbW8wW*rn1wDl-tI{itRXUaDzw*o|EzK?{E>m@v zdS5H`R@1wz+_<C2T~$%Aij{)k41fZrb3}thw%0X%+N-<nUaRw#EVbHOFQU-pWvjeX zzIuB|K2o+M$zu*FN%?v*C=B^un=JlDnOb!iIXxlVMc#r6tF)wZ?R8&L$92UK5mmqS z#G7%!cvX7gm&BVc@hS{P+uGtv-6$yS=^*Jzm4TFtIdOruzpcDXmhGz<II?=Hg|)j} z*Q7|io_eeGlzC89PInc0*A}nx_Jj?!k#~Is^M*}9TBc`as&>9cwU0rLp)hM0cEx%T zdqSa%f;;<$zi_*RA{7?s1r%YR)#VY>Qce0w?_GwsN(v*Rd`W15p#xdT))X_L7<AI# zGTe<aqe>cZUBTaR%G35qstwOO?!9I7T6x(TZ<$UVB&=$~^M);`yu*-yRjR=yteQ`& zS;TaiuobdCcdtZ}ge-4fHG(xQyLeS)c~$vp-JM&kYB^`pr0(`uU@dwqPg)%FVak*# z+AQ|&J1SYt$_iMKjj}t-%GZ@$PalSwFjLm(v2k&1q7rPTTO#x0<g^R2zWR;gT^RfF zdm!SyiFdUb;*JiC?svpDyWh7(yu<A4cIU1@_xpDu-eYQN?y0G*VMDgvQ*+OjnuLD+ z*patx-AaLyl4?9P^_oMQczLoXuZI1WP1)nACwuqAn)(`IX>7|yMMVxr?D~p|brlu8 z_G7&NzyG<lzW*kIA6ftU`ke1O3ry+D{?%z;{MS2tt=97|O8aX6B2(C+_56#5xcycB zh2y*bzwdwT3;pj#!{h(q5fD||{SSfXuk;J|pggxk_56#D`fC5e@y|D=|6^`{Z3akA z3H%G^C|^DAE)ntm5B&Ou|7x}E3FXpy-mSN&D47H`wOf33TkrX1eM6)F-llKex9!{a zf9Jd3d*J&IKJ@TEJo1k}_~E15AKUTx6Hor=sUQE3pFI83pZ(J_KmWxqfA#Fn=bnGz z*S~r3rQiN;SM%;Ydw<{3x^Mr1mk<8o&?|?Jyn6JtKfeCPu{Ym(`}jZq>75fN-+k}Y zzx?@qv+Z94r~mDP58FTb_m4Y1Idiu2)4zPy#pTGq`9O5x1J74F5dCM@|35qbzq$SY z+JW@K{^~&bpI!f~teI=p%&Zd9gjUFJvOAlfTV6Ks)3UR#E-bv77k-{>O-lzj6LXGJ zM`vwe`P%OHMVywzImcVUk<<#1Zrov1>6&(<QL56o5nNf)O0TFa7MetMLFK9<o^!po zR~j5t#qY*~GWAM6lD<Z|lBPylk`7QtybY3u#Fw}dN6RVDjmkniB)!UF^|rLgsH_UP z<#`LsyrGY!pwZ%-U0$YqbBxflK$o~0@if9~gp)8D{u+n;5RD~|qiOlN99<oH#C=(n zw{p?#C7cuH_Z*Ui;(_0Sf+{_oGv-=I4i!d)a<jgzWVCE(N(Fa#Zzx}%t}V;STr&0A zDH#hOKaeL`QvwP?c_<b&wAzO%Q*#=CcAz<E6&i;&qN!*xX*hm!7A;(~Z0UGy3TIyV z4%3sS+^&+reNCZqzlFRuaH?3dq`X`*;Fo1R{+IsNT$HXIhC^v1_TlT;X^TN)A3A?h zkaeNtX&N+m^$dT%0qstH;qQHY{9hc`+y7vM|Bol6X)git3&+1V!hhEEG%XE?^zWPh zdoz3cAC8DG@qV7#+dndY@lTy?`OAAO@8NRv&1cv3R=5lKfBdxz`;SUb(^3HWT`2xl z^LqRDE$3%9_V({vzB?Cwx&Kc+J#~9A;{8~k_9|b}6Yd)k?|t)|p5Hsa$aLQRdYbkj zAir>ZBmJ+sIZe9;i1gppryTXS_V$nL*F@;USBGfC;q?2K?~0NO$CrF(miG4V8~^$Z zz5OHem-q{7zuf=oExrBw_UHKT_4e<Z{!8Ega{r~<d;9k-|I1JG_U}6{zx^Z2U*q?O zCwuz5Z#fqHtamzn{fl<@_U~KI0SD5wrJs^X=r>3MojVc!>izt0p32|GQ&|!<&s*lL zgt#=vqLj_iD@!xiLc4)ag`Y0mhdDx04|5>O?0E&n`rPu$94I-ZUTbI6zNgJmypm8b zw#R?6K}3&8G^?PjuoMj96G=6@ywE81&V^XJ5Sk64-_kOLVn3%6QZdB99CllX;qZc@ z7kCTSdcWZQm!4Ftg!43Ql0B!?3odbKG&x8?(hCbA7K8uvi;85TR7l)8<!jbZq6Nie zWZy1jwbFsHBXz%C(#X*ZEk}505=Y9rbVG$#n`QYHK*g*Oq##}U9hg(8msadkf$Qu` z!_>R(7W^M7e*=<zSs3Zivh2&sic|{~X0Bfal11&wPBAgY*eTrwy<d->UzOp7hJJ^) z(nEEn>)w|f1UFHnFHL(gIt%)yVs2=UsdtN!af>R6N2;LxK6<|NfDkslh4af`eF+6m z)0!jQ!9K$7ITAO0jz`lHq%{_0X3P5tN(1MlxKNE5FdyxD`_j@X0$BW%S@IR)qI^x> zyE!eh<x3T@LwX~k^goMeuceCoIv?ET`}REAT8$y?O!NZihau7+qv_X_ImC15+au{^ zg*g?)WmY%e6eSsE_E0u+bm3l9rE9w+&o6pt3oZ~NPph-%6&HHv6cto1EzcH8@eLbv zueSUA=`dO!SN&kk8ci#(=UOyz)dKmp#fG<XgU4H`xH7N_RC$>_CDPVQi&xzl8mB*r zXq(Ugqj7T7_*7`$Qn*y<Rchq&raf$1qL(f!TL+S>{aBS?iP!3mTf-#?^-i5iIkYIy zvkydkGkwAIZ-|;(YE%_T+BX=hS9>d&X@8DhFekg9!fHo)VvMc3EtZyt8%Q%FL(vv# z)_jt-m-$7!IlWy7(<b>ZP|O!=%4zS*IFa1D*?m7zHOeWzo6==yb4tsryrBtvuQggi z>ruM)a71ku8G41G%jkWeSExKKMrK~bDzG86%1Nf!ErdI}rlO$I+g;n--Y%5-n3OSM z9OV{N77Jr0UArlB$->M9oCgX^IV_dgmcUk!bT#ddR-D2`tF7<Lq%A_7EAtph04cpH zgwBAy-GGlqoBj9i|LzvpB?|HQ$<v}xh05y+JtH0nS_#&3!JqgG{P*v_Ti~m<z`{SL z{pRPxewXpD<I>dFDt#B-`T)nMV2ubY{4f4woL&rs$D}RvZs(Z@^aBP0$f0Qcfmk3O zaD<-XCf`y7@e`h0*iX`xxbj3Rhsr~yi?|I2E((F<Jr)r6>41EvhrZ{8zFFW^oFyUm zoY0eHTBV=QQ}SjxR_Uza=>}MEkw-%21CX*xJ)}G}fRwp5^xVQz{C$A<*8x%<xd3<t z@Pp9zcAiqc#{tRjM}UNT4v;z>0>u9fK>QPF6ltGuoAKJcHblus#4r3Eeullm-+iBb z{ri6ZweT1652y2A@9DbW&#J5Yg1`S7ZE<0ygjK%_6UF~))L&|G!66XZ$uBqr-2Zjj zfSUY2J`{?Ef`>)h9gnkNt=zI<%h*uoJo%3Gvi%9`S^L8iUGkQ;sYX4YB7F0Xw|2NK z?=SqVMfO#GX`$z{Uom`oDEv;szw+3r$A)YF@|gM9%~oO&f4kG)v|Ysz-BF9*y7eu$ zcH3JeZ(SP^(t52udhAappr>84$%<L}Zx-!tPAFt}4gW&KztLga@bq3O{H@<o&c0<8 zd)47zQ6Nog|1eFf_$W=QADON_Nd6LDp3>KX=g3d?)=o1`;TQ*b%AWlwPua^IJY^Ce ze?Lv_#ZU7T9HXA+5T3X26r5%}&tW{f{+y-_=ed{X2%h)y6kMT@=V+c8Jjd`n@h@qb zo99zJ$MSsURGP91=Hj`YZ;j^$9_{a?X?OEH!BYm?ah^e*2YDWXzWY^x;iK><NmuF= zT9h<tpA!21!H?6l?*iL^dx3hO4yXav0~J6Ka0}o8vVd7YGB6ED0wx0!f$@MF7zrc- z34jZT2kb!Sztbmx2}t-8JdXi~fxW<sz%#((z@xw;z&2nbPyzI}_w>2+=@jadL7(4y z#b1Zbp`VPADB?+6d4_+|PVRo+k#0QiPsT~)ucpF^-~N%s&+_Cfjr9Hxzk4$Nw)lss zmkZ@sGN!|sN4^W6LqL8q7E^(*12QhY4?GLJ27C+*reTtRg@9a?3CEd<Up}x7cmVhn sa1{7=KrVY;4P*nQ!2j#Nzb3L0-REZu{lfJw?Z8eMa0{>$=sSM?C)~1m4*&oF diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest deleted file mode 100644 index dd6f562..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/pip.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ -<?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="pip" - 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/submissions/k17pine/data_structures/venv/Scripts/pip3-script.py b/submissions/k17pine/data_structures/venv/Scripts/pip3-script.py deleted file mode 100644 index 1414b9b..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/pip3-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3' -__requires__ = 'pip==19.0.3' -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('pip==19.0.3', 'console_scripts', 'pip3')() - ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py b/submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py deleted file mode 100644 index f98e908..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/pip3.8-script.py +++ /dev/null @@ -1,12 +0,0 @@ -#!D:\Git\python-2019-homeworks\submissions\k17pine\data_structures\venv\Scripts\python.exe -# EASY-INSTALL-ENTRY-SCRIPT: 'pip==19.0.3','console_scripts','pip3.8' -__requires__ = 'pip==19.0.3' -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('pip==19.0.3', 'console_scripts', 'pip3.8')() - ) diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe b/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest deleted file mode 100644 index 1c292c0..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/pip3.8.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ -<?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="pip3.8" - 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/submissions/k17pine/data_structures/venv/Scripts/pip3.exe b/submissions/k17pine/data_structures/venv/Scripts/pip3.exe deleted file mode 100644 index b1487b7819e7286577a043c7726fbe0ca1543083..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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[c}i<OXTz6k>I#RErv3nvcIClH@!{vM)zJ_weD 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 diff --git a/submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest b/submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest deleted file mode 100644 index cdf9df4..0000000 --- a/submissions/k17pine/data_structures/venv/Scripts/pip3.exe.manifest +++ /dev/null @@ -1,15 +0,0 @@ -<?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="pip3" - 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/submissions/k17pine/data_structures/venv/Scripts/python.exe b/submissions/k17pine/data_structures/venv/Scripts/python.exe deleted file mode 100644 index a0260f74e01ce82a65ef0109254d3f408f8cfcf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416840 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 wtz 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ⅅ$``YU$zP!tdiWLui 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�r+_tZwV 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 X!fiUceI0`g(hsx}r?$v(zCq$&XUXj^ diff --git a/submissions/k17pine/data_structures/venv/Scripts/pythonw.exe b/submissions/k17pine/data_structures/venv/Scripts/pythonw.exe deleted file mode 100644 index a45b937a70077302aae6ad22a89936e8679d3785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 415816 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 diff --git a/submissions/k17pine/data_structures/venv/pyvenv.cfg b/submissions/k17pine/data_structures/venv/pyvenv.cfg deleted file mode 100644 index f55dc78..0000000 --- a/submissions/k17pine/data_structures/venv/pyvenv.cfg +++ /dev/null @@ -1,3 +0,0 @@ -home = C:\Users\K9\AppData\Local\Programs\Python\Python38-32 -include-system-site-packages = false -version = 3.8.0 From 9705de32d234dad0b5c3e8411d118efcd0ecb759 Mon Sep 17 00:00:00 2001 From: k17pine <47183551+k17pine@users.noreply.github.com> Date: Thu, 9 Jan 2020 20:16:15 +0200 Subject: [PATCH 3/4] minor changes --- .gitignore | 2 ++ submissions/k17pine/wheater_app/.idea/wheater_app.iml | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 .gitignore create mode 100644 submissions/k17pine/wheater_app/.idea/wheater_app.iml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e984e23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.xml diff --git a/submissions/k17pine/wheater_app/.idea/wheater_app.iml b/submissions/k17pine/wheater_app/.idea/wheater_app.iml new file mode 100644 index 0000000..d7db3b1 --- /dev/null +++ b/submissions/k17pine/wheater_app/.idea/wheater_app.iml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="PYTHON_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="jdk" jdkName="Python 3.8" jdkType="Python SDK" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> + <component name="TestRunnerService"> + <option name="PROJECT_TEST_RUNNER" value="Unittests" /> + </component> +</module> \ No newline at end of file From c2799ea90caf98a10065bd1e96b8f0b83755786b Mon Sep 17 00:00:00 2001 From: k17pine <47183551+k17pine@users.noreply.github.com> Date: Thu, 9 Jan 2020 20:20:07 +0200 Subject: [PATCH 4/4] Weather app Minimal edition --- .../k17pine/wheater_app/.idea/.gitignore | 3 + submissions/k17pine/wheater_app/Locations.txt | 62 +++++++++++ .../k17pine/wheater_app/my-weather-app.py | 104 ++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 submissions/k17pine/wheater_app/.idea/.gitignore create mode 100644 submissions/k17pine/wheater_app/Locations.txt create mode 100644 submissions/k17pine/wheater_app/my-weather-app.py diff --git a/submissions/k17pine/wheater_app/.idea/.gitignore b/submissions/k17pine/wheater_app/.idea/.gitignore new file mode 100644 index 0000000..0e40fe8 --- /dev/null +++ b/submissions/k17pine/wheater_app/.idea/.gitignore @@ -0,0 +1,3 @@ + +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/submissions/k17pine/wheater_app/Locations.txt b/submissions/k17pine/wheater_app/Locations.txt new file mode 100644 index 0000000..51baf93 --- /dev/null +++ b/submissions/k17pine/wheater_app/Locations.txt @@ -0,0 +1,62 @@ +Kyiv +Krim +Karpati +Lonhon +Kherson +Kherson +Mexiko +Brasilia +Brasilia +Brasilia +Bon +Bon +London +London +London +Kyiv +Kyiv +London +Kyiv +London +lat=12&lon=134 +Kyiv +Kyiv +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=1&lon=66 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +London +London +London +London +London +London +London +London +London +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 +lat=12&lon=134 diff --git a/submissions/k17pine/wheater_app/my-weather-app.py b/submissions/k17pine/wheater_app/my-weather-app.py new file mode 100644 index 0000000..b0d4e15 --- /dev/null +++ b/submissions/k17pine/wheater_app/my-weather-app.py @@ -0,0 +1,104 @@ +import urllib.request +import argparse +from collections import Counter + +apikey = '2ae04d95d78eb539f7b8cce05a16f9e5' + + +def top(): + line_list = [this_line.rstrip('\n') for this_line in open('Locations.txt')] + l_sorted = Counter(line_list).most_common() + try: + print('Most popular queries:') + print(l_sorted[0][0]) + print(l_sorted[1][0]) + print(l_sorted[2][0]) + print('What query do you like?') + by_location(input()) + except IndexError: + pass + exit() + + +def by_location(city_name): + if city_name[0:4] == 'lat=': + q = 'http://api.openweathermap.org/data/2.5/forecast?' + city_name + '&APPID=' + apikey + else: + q = 'http://api.openweathermap.org/data/2.5/forecast?q=' + city_name + '&APPID=' + apikey + try: + fp = urllib.request.urlopen(q) + mybytes = fp.read() + mystr = mybytes.decode('utf8') + fp.close() + except urllib.error.HTTPError: + print('Wrong city or cords!!!') + exit() + if mystr == '{"cod": 500,"message": "Internal server error"}': + print('Wrong city or cords!') + exit() + else: + decode(mystr) + f = open('Locations.txt', 'a+') + f.write(city_name + '\n') + f.close() + exit() + + +def last_city(number): + try: + with open('Locations.txt', 'r') as f: + lines = f.read().splitlines() + line = lines[-int(number):-1] + line.append(lines[-1]) + return line + except IndexError: + print('Please enter the location') + + +def decode(page): + new_data = page.split('"') + pa = [i for i, x in enumerate(new_data) if x == 'temp'] + if args.range == 'day': + print("Temp = " + translate((new_data[pa[8] + 1]).strip(':,'))) + else: + print("Temp = " + translate((new_data[pa[39] + 1]).strip(':,'))) + + +def translate(temperature): + if not args.degrees: + new_temperature = float(temperature) - 273.15 + else: + new_temperature = float(temperature) * 9 / 5 - 459.67 + return str(format(new_temperature, '.2f')) + + +parser = argparse.ArgumentParser(description='Weather app #37462189') +subparsers = parser.add_subparsers() +parser.add_argument('--l', '-location', dest='location', default=None, type=str, help='Location by city') +parser.add_argument('--r', '-range', dest='range', choices=('day', 'week'), default='day', + type=str, help='Range (week/day)') +parser.add_argument('--c', '-cords', nargs=2, dest='cords', type=str, + help='Location by coordinates, 2 floats, lon&lat') +parser.add_argument('--d', '-celsius', action='store_false', default=False, dest='degrees', + help='Show Celsius degrees (default)') # false +parser.add_argument('--f', '-fahrenheit', action='store_true', default=False, dest='degrees', + help='Show Fahrenheit degrees') +parser.add_argument('--q', '-resent', dest='resent', + help='Show N resent towns, or 0 for all locations') +parser_top = subparsers.add_parser('top', help='list of 3 favorite cities') +parser_top.set_defaults(func=top) +args = parser.parse_args() +try: + args.func() +except AttributeError: + pass +if args.resent is not None: + print(last_city(args.resent)) +if args.cords is not None: + by_location('lat=' + args.cords[0] + '&lon=' + args.cords[1]) +if args.location is not None: + by_location(args.location) +if (args.cords is None) and (args.location is None) and (args.resent is None): + last = (str(last_city(1)[0])) + print(last) + by_location(last)